| blib/lib/Time/OlsonTZ/Download.pm | |||
|---|---|---|---|
| Criterion | Covered | Total | % |
| statement | 38 | 385 | 9.8 |
| branch | 0 | 202 | 0.0 |
| condition | 0 | 30 | 0.0 |
| subroutine | 13 | 52 | 25.0 |
| pod | 19 | 19 | 100.0 |
| total | 70 | 688 | 10.1 |
| line | stmt | bran | cond | sub | pod | time | code |
|---|---|---|---|---|---|---|---|
| 1 | =head1 NAME | ||||||
| 2 | |||||||
| 3 | Time::OlsonTZ::Download - Olson timezone database from source | ||||||
| 4 | |||||||
| 5 | =head1 SYNOPSIS | ||||||
| 6 | |||||||
| 7 | use Time::OlsonTZ::Download; | ||||||
| 8 | |||||||
| 9 | $version = Time::OlsonTZ::Download->latest_version; | ||||||
| 10 | |||||||
| 11 | $download = Time::OlsonTZ::Download->new; | ||||||
| 12 | |||||||
| 13 | $version = $download->version; | ||||||
| 14 | $version = $download->code_version; | ||||||
| 15 | $version = $download->data_version; | ||||||
| 16 | $dir = $download->dir; | ||||||
| 17 | $dir = $download->unpacked_dir; | ||||||
| 18 | |||||||
| 19 | $names = $download->canonical_names; | ||||||
| 20 | $names = $download->link_names; | ||||||
| 21 | $names = $download->all_names; | ||||||
| 22 | $links = $download->raw_links; | ||||||
| 23 | $links = $download->threaded_links; | ||||||
| 24 | $countries = $download->country_selection; | ||||||
| 25 | |||||||
| 26 | $files = $download->source_data_files; | ||||||
| 27 | $files = $download->zic_input_files; | ||||||
| 28 | $zic = $download->zic_exe; | ||||||
| 29 | $dir = $download->zoneinfo_dir; | ||||||
| 30 | |||||||
| 31 | =head1 DESCRIPTION | ||||||
| 32 | |||||||
| 33 | An object of this class represents a local copy of the source of | ||||||
| 34 | the Olson timezone database, possibly used to build binary tzfiles. | ||||||
| 35 | The source copy always begins by being downloaded from the canonical | ||||||
| 36 | repository of the Olson database. This class provides methods to help | ||||||
| 37 | with extracting useful information from the source. | ||||||
| 38 | |||||||
| 39 | =cut | ||||||
| 40 | |||||||
| 41 | package Time::OlsonTZ::Download; | ||||||
| 42 | |||||||
| 43 | 1 | 1 | 749 | { use 5.008; } | |||
| 1 | 4 | ||||||
| 44 | 1 | 1 | 7 | use warnings; | |||
| 1 | 1 | ||||||
| 1 | 35 | ||||||
| 45 | 1 | 1 | 4 | use strict; | |||
| 1 | 2 | ||||||
| 1 | 18 | ||||||
| 46 | |||||||
| 47 | 1 | 1 | 4 | use Carp qw(croak); | |||
| 1 | 2 | ||||||
| 1 | 54 | ||||||
| 48 | 1 | 1 | 474 | use Encode 1.75 qw(decode FB_CROAK); | |||
| 1 | 8131 | ||||||
| 1 | 60 | ||||||
| 49 | 1 | 1 | 6 | use File::Path 2.07 qw(rmtree); | |||
| 1 | 16 | ||||||
| 1 | 44 | ||||||
| 50 | 1 | 1 | 561 | use File::Temp 0.22 qw(tempdir); | |||
| 1 | 13636 | ||||||
| 1 | 50 | ||||||
| 51 | 1 | 1 | 358 | use IO::Dir 1.03 (); | |||
| 1 | 9355 | ||||||
| 1 | 25 | ||||||
| 52 | 1 | 1 | 6 | use IO::File 1.03 (); | |||
| 1 | 13 | ||||||
| 1 | 22 | ||||||
| 53 | 1 | 1 | 393 | use IPC::Filter 0.002 qw(filter); | |||
| 1 | 11039 | ||||||
| 1 | 49 | ||||||
| 54 | 1 | 1 | 592 | use Net::FTP 3.07 (); | |||
| 1 | 72012 | ||||||
| 1 | 33 | ||||||
| 55 | 1 | 1 | 440 | use Params::Classify 0.000 qw(is_undef is_string); | |||
| 1 | 1830 | ||||||
| 1 | 61 | ||||||
| 56 | 1 | 1 | 505 | use utf8 (); | |||
| 1 | 20 | ||||||
| 1 | 4896 | ||||||
| 57 | |||||||
| 58 | our $VERSION = "0.009"; | ||||||
| 59 | |||||||
| 60 | my $keyring = unpack("u", <<'KEYRING'); | ||||||
| 61 | MF0(-!$R` | ||||||
| 62 | M:3J?AIQQ=&`])CYT4)W/#X;24$@-\M+9TL:GX[EY73`%+BVXYZ | ||||||
| 63 | M'E&=M]7F``MF7J>95(87_4%2]Z?#S?XQA$FF_R[+;8$/0=4=QNX[Q`Y*A38I | ||||||
| 64 | MY;EM%W68#SU8@=[@QT[`NPI[BP[>-OGH#3`E*`E\*8#9S;#-"0&$;I8W>?9( | ||||||
| 65 | MO/=>(^%60-X6^D@AR^/Z:NZ/K((A8K:>N:[7#=;V+2U>GW2LF$W0CJ?1J(_` | ||||||
| 66 | MVN>\),PLO7>_6*W\$SLZQ[XB3:J(W`%'ZBE`A#JI,G=_FL2$2-%M[Z#B.U9* | ||||||
| 67 | M0,K]:F5/DGC?/F)(2J=A@!U#E$=PWXL1.?Z5\F9PTQ?J3Z/*$XZ+<%>?SLTD | ||||||
| 68 | M;@X&.1?\OC&V2?UMDY>4\,!BR-_;9TW;*-C-8,I.##00PN/\XD8+D7VP!QQ, | ||||||
| 69 | M`A!QP;#59N=SQ#9)U"V57NC".)5QJVDEC!,]$38N4&J=[Y`6V+7K+PZ^,N(L | ||||||
| 70 | M'%`8`@1K[^* "+%Y9(VO*FW'$>"3ME. |
||||||
| 71 | M@[Q9$.-@PS+^?=*H^#Z2H"\11Q)*L\:WL5?(XMZ"GK0SO);!GZ@Q=@"NYBV] | ||||||
| 72 | M)U0"8K"8OJEV4R%/`*^=H]]_UC.73XFV\WZCUP`1`0`!M"!0875L($5G9V5R | ||||||
| 73 | M="`\96=G97)T0&-S+G5C;&$N961U/HD"/@03`0(`*`4"3(!R9`(;`P4)$LP# | ||||||
| 74 | M``8+"0@'`P(&%0@""0H+!!8"`P$"'@$"%X``"@D0[9?I#F*J?C11&P_^(CTW | ||||||
| 75 | M=A8?8E_@751BNS5U@&K;'D^MG?K(_"[?`>H%S0YM5@5BG2A:/D9HT'3/?U\Q | ||||||
| 76 | MZ(#$=`B.\,JHURIT"M'FS&,")YTHX&K@?CEKZ@_^OM$.*;AE>LS-V7I)OIP, | ||||||
| 77 | MV0@&OG_E:3+4N\/']:163L[J))9***`;XLQ8<]V%>A/NZ%.#T=#BRAE#`JXE | ||||||
| 78 | M.5VF=!IS0;BHCH9S0+,0PCI@"3*VY[V>*]$.$0R243A7K2(SZ`2>GIX-83%' | ||||||
| 79 | ML]MN)0O7D]@9#=/2EW;I^X[=&QEQ$6+I!(,[S(.-PXDLX:S@3\GO#9Q`Y(9' | ||||||
| 80 | MMOJ!E)+!.;88T+>ZU6ITRW3E!#AVJ=*\>8+XVZ6XL<$,2NB@Y@;\.`M0B!6Z | ||||||
| 81 | MDVL&4QQ>BO\HO6N\8`9@*)?NH6(^N1G,$==KN8\)LH,YX*:*O9BDD*LV;@UG | ||||||
| 82 | M=M+5S'I)ZJ%9"[05C>'4AZ_!F@O=C6/98%3M-^*`]"67W&0**@-WNN]\\RSG | ||||||
| 83 | M#[+G!]\3X$4'U'`_&G?!J,5U@IS3O/ | ||||||
| 84 | MOS"G8HX*A*+I%4F][HD3*1V+6WQ9S$6X<+26.W\[,3*W"S#.QYJ>ZLX:]U9N | ||||||
| 85 | M9,_C_30=3+#:J-G\WD`X'JX\4'78Q<(A^-=\D_WPZE%NH*TPK.%BRPC+Q^TN | ||||||
| 86 | .KYCFF;> | ||||||
| 87 | KEYRING | ||||||
| 88 | |||||||
| 89 | sub _verify_signature($$) { | ||||||
| 90 | 0 | 0 | my($self, $localname) = @_; | ||||
| 91 | 0 | my $krfile = $self->{top_dir}."/kr.gpg"; | |||||
| 92 | 0 | 0 | unless($self->{have_keyring}) { | ||||
| 93 | 0 | filter($keyring, "tee", $krfile); | |||||
| 94 | 0 | $self->{have_keyring} = 1; | |||||
| 95 | } | ||||||
| 96 | 0 | my $subjfile = $self->{top_dir}."/".$localname; | |||||
| 97 | 0 | filter("", "gpgv", "--keyring", $krfile, "$subjfile.asc", $subjfile); | |||||
| 98 | } | ||||||
| 99 | |||||||
| 100 | my $archive_hash = <<'HASHES'; | ||||||
| 101 | P$`IAK1/'QW'S,*892Y(QHOJBH5H}S8Y%YO)[;GZKP$ | ||||||
| 102 | ^+'@Q[[<#EOR3!YLOVNPT049W7$>C:B+`U'(QD"0>&8 tz32code2006b.tar.gz | ||||||
| 103 | VKM[][KTE |
||||||
| 104 | W4VW8\YND-$}}SJ>K:&1PQ]"&I2'B'WA@>J8U])7D"0 tz64code2006b.tar.gz | ||||||
| 105 | MNA!Y(:V"8<)JH;*GH\8."0W"SK"^AGOF"`U%P<$0!X | ||||||
| 106 | R(Y3G'R:4?_W0]Z[L\4H1;A*`1/ZY(FON0&9_>]U8#\ tzcode1996m.tar.gz | ||||||
| 107 | ]A@KB.+SZ%WC[W%D740$5'WZ8*P(7.K46497CNJX7OD | ||||||
| 108 | P\0,)Z7_3B:1`#%JX63KZO2AP6CVCHJQ4JKT#"TX.HT tzcode1996n.tar.gz | ||||||
| 109 | >$LQ?T8},4/8PYSXAC%T | ||||||
| 110 | ]KY>N'1E-HL@;('"0AHGC8'-BT/"@\J(Q!!#](PR$\L tzcode1996o.tar.gz | ||||||
| 111 | (@:9K9#^4'YP@O`[1L*"L/S]TZVG,)?_;/MA- | ||||||
| 112 | 8%!.RF90V24VGA>FC8 |
||||||
| 113 | K,ZBCE^VW6*_AKQPGJ'5&1A>`K!?ES.(+R&G!GNSF2@ | ||||||
| 114 | "?G4I0H3[78@"K2`YX)>(J#!JYV(3Q4/4;$'VQYA_VD tzcode1997b.tar.gz | ||||||
| 115 | /*LHT0+AE;#6'ZCVZ6S@VP0$#G@?4Z/:ELZ%`ML^JPP | ||||||
| 116 | _O147ENUT'-}4F.NKO}LS'I:N),^H`) | ||||||
| 117 | 09S8MCYT"Z}'8X**'W5G&B*MK\:#7?$)K75S6K'%MY, | ||||||
| 118 | #`2^59N!B6(9\$5:XDIZKB*P@<'JLV6%4UK2@:-SF3P tzcode1997d.tar.gz | ||||||
| 119 | $HQI06E:FD2S;'-AO/U08IXL:GYKV,2LF'%S\ | ||||||
| 120 | Z&DDN6JC6`.D']B,:205L%LE0CIA!G42P*O1)H">J?H tzcode1997e.tar.gz | ||||||
| 121 | QKZ[["IJ6[7VWJ)!-S("[_M02XCM:E8CGI-&!GW4;AX | ||||||
| 122 | A]9CKZY}%ZW&_? |
||||||
| 123 | #FPZ-(Q?,Z7^}^4 |
||||||
| 124 | D[JK;$_XM)V_K+Z33J)>AEO9TM^G0D@YGI63&2F(CY0 tzcode1997g.tar.gz | ||||||
| 125 | ;>XM4,W*LTZ9B+JI./#Z7X'?8F[$GYH`:1Q1LR%/&D\ | ||||||
| 126 | JH+4K2EZ1XM%6$R^`NU4Z[*,BC2@P6F"5KM[}[`2+M\ tzcode1997h.tar.gz | ||||||
| 127 | #":0$VMCE7ZE@Q,Z!P"1@"*/N^2:T"@!JIMXDJ5;!E( | ||||||
| 128 | @9QB]GO&%(18/1T4SCM)QE0'B[!9/'X>}>9OL+35*SH tzcode1997i.tar.gz | ||||||
| 129 | [X%-#X4H;7[LUBSM`/ | ||||||
| 130 | M4\7'_UDFM!.Q1]'-T}B:VBKD?9\A0^&A'7)G`+I"K( tzcode1998a.tar.gz | ||||||
| 131 | 1':-`"GE233?Z+^#23T72*U1B7})_?P#,?FR0%[<4,< | ||||||
| 132 | _-$XL/Q$5INX@7T'N:D@)LV:RXYWCD9}U\?E:U&RR:4 tzcode1998b.tar.gz | ||||||
| 133 | F6@N8$>[<+#8`:L`"%I-L:)4ZQO)Q0J"MG8EHL}UQ6L | ||||||
| 134 | "%;]G2:!.*Q`^+"3HE\9UTIX-"O6]%U"+'$,7?H0;$< tzcode1998c.tar.gz | ||||||
| 135 | OGT#:)(S_L`'6`%96EGNJ[D'OK3-LZD-H&2S8MD!@ | ||||||
| 136 | 1.1L+NNJR&2E2,0PPMN!:S)TMUK&'\V(G$8AI,N"W!P tzcode1998d.tar.gz | ||||||
| 137 | J$>9-;<)+Z,U2-F\KECK;>@L4U!C%MG)B7H6H>6SJ80 | ||||||
| 138 | A;/YMV00%LL`^L0%QBC;E | ||||||
| 139 | 3;!<]_[C8UTV6NO`1&8[)[FZF4$BKK7@9^_6J/\VNEL | ||||||
| 140 | 25#9+JU6@MJQ@(OG[H>N41Q;#Z$8.D].311#CF+C#@4 tzcode1998f.tar.gz | ||||||
| 141 | ,%7V%)L1<.UQD}6:AI%FJEW4G-T;L91JPA+T`C!#&HT | ||||||
| 142 | V28})%G&$\/BPP+9D!8,A?1>O2ABCKW@JHD"4_SL`X( tzcode1998g.tar.gz | ||||||
| 143 | UUSM!AZ#D);N[IXQ9U6ZZ)GYN`I;+T?01#P>/SD:/Q@ | ||||||
| 144 | HTSY\4#- |
||||||
| 145 | B8X9%$4VK"1:?$&9;)H3!_-F5X*L`5>J*YD1W*OUE$8 | ||||||
| 146 | _`YLN'QT:E\J}YBN*)Z1$>K_^A$F8WY7%#J3"*Z#!ZL tzcode1999a.tar.gz | ||||||
| 147 | 0M7Z,7(`*KF1"SGY%V0;#}+U`HY,__@S3%+F_Q#}<+, | ||||||
| 148 | (W%J0QU9OZ.UFJM_Z<1OHA(_OU[(N5-SDJP}P0SROGP tzcode1999b.tar.gz | ||||||
| 149 | C}T642QR'*@$DP5P]AM)]1,*H;LD^Q(X-`3^K-;EI60 | ||||||
| 150 | BJR`4,G@Z<9+E1M>ZEZC6<8O;JELN-)3IG@VZ:,`8^, tzcode1999c.tar.gz | ||||||
| 151 | $&N/VK]JF)"D"OUAU7U4I^N`.]@!0)3@UJ2K]N#;]$8 | ||||||
| 152 | #0M&UN-:"]\]&9/P8POORT@I**@
| ||||||
| 153 | Y4IXT]3HZBWYI*[EZ09%34OX}3D]2S#J%QN$Q#*VY&, | ||||||
| 154 | 50:56X>(&I'!Z8 |
||||||
| 155 | 'I%Q%3}}1T!+RBD4YRHC+>ZO+1&8};MH3O}_9MW}K>( | ||||||
| 156 | D%J)Q[R0!]6H184H-T"K%V;!@M>^VS?05W1+GVM@LV\ tzcode1999f.tar.gz | ||||||
| 157 | V*L0,}B.+3MP419UKZN$A_D6L].#:MC3PI?;8O43:CD | ||||||
| 158 | 1A}`Z"S/%U'@YJRRE9SN?BOY)3"047+"7IW%W}U88 tzcode1999g.tar.gz | ||||||
| 159 | IPA/8;KIQLJBG&:]B!J:LE}`/*AY,CB><'>("ATUII4 | ||||||
| 160 | Z@2W8@66O+V6@0GU,49S:7U)DS^.^;+S?(PK@(<]0*P tzcode1999h.tar.gz | ||||||
| 161 | AK_%4;>J&XQ,NL[XLUO?T\T^@N._KXKOX)L59:)/?K$ | ||||||
| 162 | 2?%P.Q];2-W%UQI_2%\[!1U4OXY]EG]V(_\1J$&Q0 tzcode1999i.tar.gz | ||||||
| 163 | 1"}X)FO | ||||||
| 164 | 6` | ||||||
| 165 | RC/M"+CQOOS+%U#BL6&Y\ | ||||||
| 166 | DJ(8Z}J).%@E_#F?7N'/V}RKCK5[NWV)+KDV&VGY*ML tzcode2000b.tar.gz | ||||||
| 167 | ,#`3><[;_M`"4^,5XKQHX&5,C[3_(J%HM?P'UH[585( | ||||||
| 168 | S:/:T"]P%M4E%]!,:ZO!URXU_:,Q!Y\_S9ZXEHJC*2L tzcode2000c.tar.gz | ||||||
| 169 | (<\&.}-1)HEVTL0A^>MC^9[OTA_F | ||||||
| 170 | F/@1W";,1P%#BU%^8VSY_NQ**\'H_C0-9.KA2S%A4L\ tzcode2000d.tar.gz | ||||||
| 171 | +I<;KTO/A5^*45]&(4KP9RJ/UI>Y.+" | ||||||
| 172 | $MPO9HF_E*&%R'\V4FV>VQ}ZT7MWI"5(UEWOW?['<]P tzcode2000e.tar.gz | ||||||
| 173 | 2&}YVT"CI\+K*\0?N>,GC"?ZU0Z&(RYEP | ||||||
| 174 | BS}Y6*&G2+/M9VONR%0"6'A#MR7C??`]Z+2W.\BQPAX tzcode2000f.tar.gz | ||||||
| 175 | 7#P3%J2%7A#YSM.FY2#XG'I$O6<1M`VE(IB';(0[*3D | ||||||
| 176 | 6A.L+/TX(K8%M:8? | ||||||
| 177 | +*"8*,CII+E`H9A?AQ0LH#*-9YE1&]4;8D]+&RNGKWX | ||||||
| 178 | *3GE?JMMDF7N |
||||||
| 179 | TC7WXM34$`?6H8*)2\FY!\F&}:Q:98PL$%/G3YY$Z$` | ||||||
| 180 | }) | ||||||
| 181 | **DQ2N>YE-HJJ;0\[:)!9J+/<`4<_F8+N61^8441A,$ | ||||||
| 182 | ^A90}%',RV/]O1UMEJV3C5C3NRU`W*S:DQ@ZAVI#<#8 tzcode2001b.tar.gz | ||||||
| 183 | MV/V,C9&LLT@.5M#:>B/`T.D)N<4^?%I?F*!4#O | ||||||
| 184 | 6@#J6GD*6*G$&00J<:Z:Z}F$P+>VX1)T--`})[1)AX` tzcode2001c.tar.gz | ||||||
| 185 | 3QU-.}YK84}19:9G)5]@M2$%A7M@49 | ||||||
| 186 | )X6#$TJ`RUQBBKF;B%P9@Y`'8I}C"%UK?+HT`8B+6`P tzcode2001d.tar.gz | ||||||
| 187 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
| 188 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzcode2002a.tar.gz | ||||||
| 189 | T.%Z>O^9.S8JS?`/23&@2M&%PJ\K-1:+_N3R;0Z;J1@ | ||||||
| 190 | ;}L$L$_ILD*@"WY<_*O:F4ZG]X[&}L*F@/]801!"C^( tzcode2002b.tar.gz | ||||||
| 191 | 1/6}?:Q[*'ESZ4W4ZPLB,UGJDE.C'JP3HJ+/")+WH&L | ||||||
| 192 | 5/86VN'P(?}^+-RQ?MO\?`}9@I^R$_'NJTC,)X1_2ZD tzcode2002c.tar.gz | ||||||
| 193 | JR,QLT`-V>MKT3<-\@6Q3(<}/;1*$*LXD2L%J$L%F:< | ||||||
| 194 | `WN7U1E-81^7>KJDWY1%#205QE_P`N07MQ\DSI3?0ML tzcode2002d.tar.gz | ||||||
| 195 | ?UK(}H/#"%PORWZ0^$ | ||||||
| 196 | -YX7B$L]M[K"8!,E[G.} | ||||||
| 197 | N/G+J1V(.++FW9+IA$.(WU4M[#./>%@[9AX,EVGCT | ||||||
| 198 | ._F/:VBL%G_T!U/8)K}Y1MZ^\`^: | ||||||
| 199 | #3^/+OXE@&_V/DJ\_3D&P`GS2ZV`6ZN##4"S@+%C#Y( | ||||||
| 200 | #?'KUM:?&NQ.BMY9I\U_MTY}V1RHDSO7%$M0}7M9&+< tzcode2003c.tar.gz | ||||||
| 201 | !CBY7S<9&:Q#*,!ZOVX;'I&9 |
||||||
| 202 | MVF8;A6X_,>!%<<^L^8]34L\`9M}27K$EUQP,$)2'(X tzcode2003d.tar.gz | ||||||
| 203 | S9W}"ZQ@.+];?HJKMR6,3-7%K7>H6`Z([O9JZ.)A:O$ | ||||||
| 204 | F,KUSRP?)RO$0ZD*B]ZJQ`L6;%2C0+D#J@V7AORX76L tzcode2003e.tar.gz | ||||||
| 205 | `+0}U\YKO7D8TGDOW3VQU#WDMH@.D&6>'!,+V@KN*RP | ||||||
| 206 | ?[9E)T;IQEF`RMGQTG.4+?U;83H`<8-'Z7]>UM+J3Q8 tzcode2004a.tar.gz | ||||||
| 207 | 6+Z;]QTTA!ER6/Y8QT4?DZ'1X1F-W]-^&3^W^&[>4:8 | ||||||
| 208 | :AD\%WF#/`}]WIGU20*X[K83+B#JGPW#8F}-U!!"478 tzcode2004b.tar.gz | ||||||
| 209 | P-,&A>PX)7WP6A&IE>+]WX*5L3?Y,}(3\*O8^>E*`30 | ||||||
| 210 | NH`MY*`7A[W/DI^\&?XT*O__I<%@GP+9LM,H3/YO&_4 tzcode2004c.tar.gz | ||||||
| 211 | ["LMMYE#'#@HF@W3WKMMZSGMA_6Y"A6}@/R]A0*LC3\ | ||||||
| 212 | :HJ28L+C8S3G5 | ||||||
| 213 | _+'A`<`;^H'F&U:[,&^Q'7;&: | ||||||
| 214 | @,EDOQ5,9X\F}U+"@7P@.YA(Q3$D!?)4>#%J[2 | ||||||
| 215 | -X]#/^GF-;R5O;OPL;)!PRKM,AVZ"ZG"-2\0)]5S?J, | ||||||
| 216 | NEU>F?]}K!7!A9DW/B1*]TMNBA8BY:H:;.K039)8A`4 tzcode2004f.tar.gz | ||||||
| 217 | %$&HJA/+)M/#>B/4_'&ZG8XDG!<;S8\&;2-D.8W.$ | ||||||
| 218 | 5TC}&[-3V*Y[QF!}L]E".>T_SGI:"(_%FGE^NG3W0UT tzcode2004g.tar.gz | ||||||
| 219 | *L}R5"A1]0M6,0`8X\R$LKPWZ&U/05PATMRL+3P!8A$ | ||||||
| 220 | M+?V@C,>N)XG1XOW1HM`@H)!A*)14??,8LN-7]X*}EH tzcode2004h.tar.gz | ||||||
| 221 | /DA%)8']P1H0$F0&C,`AL<6^R[DY!*RF3H.BI,U_[ZT | ||||||
| 222 | *Q5X]:E`[5*V9<`7&"5O]$PIEOR<347DQB1]YA("`L4 tzcode2004i.tar.gz | ||||||
| 223 | `(WD0#KWDTL8NX;-U+";PR(`M@^)_NBVR,4ZI(EJ+#$ | ||||||
| 224 | 1!E#SX}_-56)++GFJS)G(4]/0\/9Z'N"_6-$RC!>}K` tzcode2005a.tar.gz | ||||||
| 225 | 4(!D94,CPK]]!O4]\R\UWL!!GLO#E#?I!`FSBMOIONH | ||||||
| 226 | I(B<]#W}4BS2;A<}0`O9L@:)92O#3M"\+*KX5#>6474 tzcode2005b.tar.gz | ||||||
| 227 | CQCMWN> |
||||||
| 228 | I^Z$TX}].:FK*KF$"*:;)>D"/@?1"4Y^@"?,+>,1RTD tzcode2005c.tar.gz | ||||||
| 229 | ^T76E[M;_9.N'.}1+KPP,CE[;DZHGC1$+]NZV[H%.ZT | ||||||
| 230 | '+HY]/EHH"!,U#4/?&BX^&9T/XNK1`7GH>X]@0M}E6( tzcode2005d.tar.gz | ||||||
| 231 | M]1HTD2U/\ZA_WGM2M6)?RF,:BYRZKPJCD2BJ!L!N[< | ||||||
| 232 | QWJ5.N`E<8#&Z}O27}>[H5&?]3$M?6G(9>%NH11X;"\ tzcode2005e.tar.gz | ||||||
| 233 | 04RHVS!UC[$ | ||||||
| 234 | $:H$^4K/K[9BM'>6JJ%9%9^]HX\UBCWG["LXAP?R+RD tzcode2005f.tar.gz | ||||||
| 235 | #")G:1:>2+?\9L(S:_@Y%C([NC?Z1M]JZG?C%#;UP(L | ||||||
| 236 | OL^>8SJVSR2B?>5A>+6-!2**4:;>9:+VE! | ||||||
| 237 | [};+`0M2"]\'DI!'F&@O_&P:}!N<\_6@,XA9"#K_1V( | ||||||
| 238 | B[ZV,F^;8,[105J_Z7G | ||||||
| 239 | 7VX/+BVEU!M^[-)H&'US-NTIARYZ`IK-^2}T#48TZ#H | ||||||
| 240 | AGJS#D4$0[?0<35*!N>ZH7#?#PX3K8SZ?&,[_H.X6IL tzcode2005j.tar.gz | ||||||
| 241 | KU&312RMUH%H.[KEP4*]^7GPIVJK[SNO[A?D0DT/9,P | ||||||
| 242 | ;0#'LBR$M0#&KH1G&9-@4;?Q&)']MCV5T?IK$J&4QL, tzcode2005k.tar.gz | ||||||
| 243 | 8[9+^VIG+D9J7+:AD6072WD,\9PS*YK-1/7P6DI}&\4 | ||||||
| 244 | C1$P^RGJV4I8LYOLV]Q600D>?N*ZT&1E>$A}W#IU+(` tzcode2005l.tar.gz | ||||||
| 245 | W@+W#1`4?(R^)$4^N7[9DX+/T?J0LYM8N4WQR-#34!D | ||||||
| 246 | [LN98?,_W,`Y}[5;R"I#I?7_XH_83^*+^$B5W7*S]NH tzcode2005m.tar.gz | ||||||
| 247 | 1K0M)`5<.A[VA3(Z)B!%VF4MG$J_Q-};2)7___3D0 | ||||||
| 248 | *G\Y}!A?HJN@!/EQ2&0:#SH |
||||||
| 249 | E#4.YX^HQQ)A}N.:}?MW+W+;EXC_I(Y%[D]7I5JCX'P | ||||||
| 250 | ]ZNVA1-?(TBVI'E@VQ7\ZI^HWE^H(?%/Z9PKV"Z#('X tzcode2005o.tar.gz | ||||||
| 251 | R91\O!/V+* |
||||||
| 252 | E`H"$IH)%7]/9$QZA\-DE1S?F)@SC9I88-%}W;^?26L tzcode2005p.tar.gz | ||||||
| 253 | ZC(%^8I,2}R$XU&^+KPN#F\K$,QDK&Z*^'"!?XN)YF$ | ||||||
| 254 | @8Q1T5W!IG._S)W;;QWT9+8W07[9,EU?R6VP[JN(S]0 tzcode2005q.tar.gz | ||||||
| 255 | 3@;MB | ||||||
| 256 | O$;Z+}[ML/^LWR5S}TE | ||||||
| 257 | W}XN&$-]L\D"'!IU9.C`QTD;]0BUQ5YQK7P3!N]MP`L | ||||||
| 258 | ]SU(?0#Q0HN5@O!I217?UMJX+3VI^C%OSCS#N6NU+^X tzcode2006a.tar.gz | ||||||
| 259 | ]VZ+6E4Z)\)"^V,0"89WBZ0EY,AH>8V-B1XV!&[Z\%\ | ||||||
| 260 | XOUW'?I7&"KRV}0V"<;*ONG[UY[,)"T*?R&/1'X8}7@ tzcode2006c.tar.gz | ||||||
| 261 | B}8VJ8@$W._U)3KK*K2/LKE!LHM4^H_}U | ||||||
| 262 | LE$%A'/>*`'Y!-?./7(XD[G/KBX>`%W'KQE>1V?YT-\ tzcode2006d.tar.gz | ||||||
| 263 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
| 264 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzcode2006e.tar.gz | ||||||
| 265 | Z.[$%PGQJJ)).]X;N/%#T`IBGY;8}'E(AWP&<-5HA_D | ||||||
| 266 | 7GJB!Q6?'5*.WWO1_,R+.L3#34I_B5D@]W;-?D6:5K` tzcode2006f.tar.gz | ||||||
| 267 | 1R[3I66V8Y)QI.*466A^W/..6A#}9%V) | ||||||
| 268 | 01BME5QF*S/#*OK?5?C7(6, tzcode2006g.tar.gz | ||||||
| 269 | 0F4"C%,LLNEMD2:()!;-9PLX5Y8J0J+K`"\3BQ\C.UP | ||||||
| 270 | 7+560Y^#7A3:/#&K!()Z:E_LRML?VZ;HFI6DE%#;YB4 tzcode2006h.tar.gz | ||||||
| 271 | ZBQD>[}0}5D]V0B>9"6?DUUL8/XDY:9RH"<-@C5-#+8 | ||||||
| 272 | "}'O2FOX]UR9RR'!GP#?WN&82Y | ||||||
| 273 | CELV`-F$?+?U1:A3'1TKB??H#B;`!AS#Q;0_KK]Z/TX | ||||||
| 274 | )L`T#FB6-YAUJ(;3A?$*(74$A5'S/ | ||||||
| 275 | M9L,63Z$Y![++\QR@H-NNEHH&[*'H6$R!6_CNR6-?)8 | ||||||
| 276 | }T!(I:ZE(].H5^5F(JX**Y#8P>8-3#'/C&5A9!}NPQ< tzcode2006k.tar.gz | ||||||
| 277 | ,@%IK`@E32)LAY_`5:,)%7Q$1VQ`W3/CC*'QE*U!}L4 | ||||||
| 278 | B([2E@K?C)[OST4N,-#K@A*$%^QJL7&)$;:$OZ6IL"( tzcode2006m.tar.gz | ||||||
| 279 | ^C]TE)CXC9CS.`:,D"/EI6O#9+7:!,C[_"IJFSJ+*(H | ||||||
| 280 | /L6'R7?".GAJ6+QL":L'OF[.\Y}3?B7+KBB!ISFI:LD tzcode2006n.tar.gz | ||||||
| 281 | KO[C!UHRFP$3/.*_LKBN1BBV[C*`MJE}A]VYA30IT', | ||||||
| 282 | :S?CSBSI$NC+U7W<2'F0(}'R[+2I7TWZAPXGWAI?BWX tzcode2006o.tar.gz | ||||||
| 283 | @M4"3/@RZLNR^F@_CKQXE\+`B.@@G>SA!TOXLC}[[PD | ||||||
| 284 | QF}_:;,Z/- | ||||||
| 285 | \G+SJ4<#052;^V4%W1KDX,*DY}111\C:BF@NG/P+>%0 | ||||||
| 286 | 0%T7`I/M<_54QY\/LH)#"X"&Z5,*;&^(\]RR*EQ*L tzcode2007a.tar.gz | ||||||
| 287 | FF0!Y}I4:8W_\E!KYD_#T&7}&4I%G%20CMMQ\1/V^?` | ||||||
| 288 | H59(IH()IJVF!;L+A.+X/G?#?83:B9+]^ZCE}3QBPP0 tzcode2007b.tar.gz | ||||||
| 289 | (&9OZNGI-MWQAKGK_8Y]JS`&KP-}?E/.!H'MOVT(1V( | ||||||
| 290 | Z-AS^*UXV5BM7(5P0Y<*'@X@#;T4\Z^E5-*!E:I[N3H tzcode2007c.tar.gz | ||||||
| 291 | /,V'0JX:9/V9RI?]7X5L576T8.#&_5Y\1ZCF>CE1)Y$ | ||||||
| 292 | 8'7G.R)CLF8}V4Z0\_WQ-[F^OEH' |
||||||
| 293 | Q(.3RJ3L`J9"I+BO^NA/O2X+&?S&}Y>DJTS5_C8]R0@ | ||||||
| 294 | T76<+I)`/.U2.$:I,&-R_0?U5S(;VM:EN/OJ) | ||||||
| 295 | E/68(PB*:V;W"S8'$\'7O@5>("YA;>8UF'[M/*A\HP( | ||||||
| 296 | 9:$?X`R2Q4T<."-.\L24!M[U\SYY1G,.KQ\DO*0S'$0 tzcode2007f.tar.gz | ||||||
| 297 | GZ_/G!0"\@HI?D(9*;.G;\M;'Y[@'_M4Q44]>IB*MQT | ||||||
| 298 | &U.L_@`$.H6}9%S]ZY]M(,[L8S]A%X!DM&]YJ"R-01L tzcode2007g.tar.gz | ||||||
| 299 | !DLU(10X_Q%5:2I:4CV&*B+WOV#+^}DU5});+E>..;( | ||||||
| 300 | @S5EVJ&(:`!7#L)`>4NK6R$W>3>4EZ6Z:`6OQG/_0Z, tzcode2007h.tar.gz | ||||||
| 301 | :LRJXSUR@B9RF&Z&J}>+<#HD#\+K--'M_MO | ||||||
| 302 | Q'*FY@&Z0`C'L,%/CXWZ6)QN8?D(]^+]>& | ||||||
| 303 | 5;C5L)V82N2!9\F)?;LT\'?:GT?`9U+TJS6:F`+\@8$ | ||||||
| 304 | Q3Y/5>"JN4BAM^?'4S}:]V6#D/`GW$,+(.Y`@RC3M)T tzcode2007k.tar.gz | ||||||
| 305 | LBV/*G*8^!)1VZP.2X*/A,-?R19X!>]_/^&/<,T?X?` | ||||||
| 306 | 6X:\AOD7?/`QE-}^AU)Y>K`(A?K+W#UGN687<[WOQ)L tzcode2008a.tar.gz | ||||||
| 307 | \?K\-4HMR'!L/0!T]%HY,?.Q\;>;>IQ.R90,[`G--F< | ||||||
| 308 | 7N`"DJ5AJ]>>!\>T]*4@ tzcode2008e.tar.gz | ||||||
| 309 | KSA;C__8G-Z([[:IF:6DG%(BZS;>*NP]$+A./\N-\SP | ||||||
| 310 | | ||||||
| 311 | /R95)8>6T0NK92!;+HH@(,P/%DX!E8W'OGP:4R/+OK, | ||||||
| 312 | }1]V}:J-\-!1*@RVD$W?[:HAVL(IPX9.;_[[P/YL%R, tzcode2008h.tar.gz | ||||||
| 313 | %#&NNJP&>RM#6#ZSXQN}6NH"MKL.L-5R199@}\-(>6@ | ||||||
| 314 | 5&:2_?&0EV-H`D#C>RK:.<7M2:6CVW`[&1^T51<9>/< tzcode2009a.tar.gz | ||||||
| 315 | -PUP%I)[1I0W'HN.Y"*5S2)'2MP3}O&+V4QG`}FFN)D | ||||||
| 316 | ]TN\#,![&-3D\X1B5!ES$PJ1N\/Q`}SH?C4-8)VW56< tzcode2009b.tar.gz | ||||||
| 317 | *Z}0Y;V6J"40BXFN+}0.5DRP%0:V5'?-5_A]7//&6#D | ||||||
| 318 | ,12VK4$LWWI#WOC0Z7I0_I>8BG;$V[XTLU:?%W;6EFD tzcode2009d.tar.gz | ||||||
| 319 | .K)*P'^+'^&;.U}-#G61@$EZ6:B;^0J,"''VXY!Y^C( | ||||||
| 320 | D#$/8@9;E1S-XP*P9[[5F>AG_$':83/%IB@979.0*B, tzcode2009e.tar.gz | ||||||
| 321 | QF5:9)&KZ4*T":]1Z(;/#4FZLW.X^$I}MVV7H*`Q_)< | ||||||
| 322 | U6'YM$J\NMH_8\S^ | ||||||
| 323 | ;69$E8O$#3;K^V*T8$Q+>\)^)P\"R-]?BF8RKLQJCJ0 | ||||||
| 324 | )16*ZL48A&R?9&5'XZRB%T95>_+E*\77'E?8+ | ||||||
| 325 | 1W@/D4]7DAQ50#"P},W])S5(,AX-&H0EU1NQR^IS&U8 | ||||||
| 326 | )62'!9;5N@S18-%5CP>%9V)'?$8[^S}7*G`7UDZT14( tzcode2009k.tar.gz | ||||||
| 327 | PRM0FP,`] |
||||||
| 328 | $!`UJWO9Q'8Y8.91/G(%UM$"R%-BW?3%*4.M[3G}M., tzcode2009q.tar.gz | ||||||
| 329 | @W-!V<)4;]K#V\<''LC3]OZ>#G`"J-8F5F]TW15IEMX | ||||||
| 330 | G1P"X-!@>VD&D'69_X3MH2+0$@>;A8+SG\'\D_8[PI$ tzcode2009r.tar.gz | ||||||
| 331 | *_G1P(#L[^*@59%V-E]FKW9]A1!!Z>N.V\}T)ZH7X`P | ||||||
| 332 | @W_U5PX!J'G-0*^HV.C)!I1<@ | ||||||
| 333 | GM]HD2'[NY0AC}^?EZ6N%>DJI'$ZJC1[J+S`41,4+H( | ||||||
| 334 | *3&4!:)"F8>?1,@;&7\EQN8*-ZXI._<}F`Z"!);^M`8 tzcode2010a.tar.gz | ||||||
| 335 | 0_*2/IJR*_@HUB7!/(C`G.D"_M.Q]G:%49K@;"EF7O$ | ||||||
| 336 | W6"('R;'*49%WL\4)}VBM#PKB>1/-,D!QT5<]R_46P$ tzcode2010c.tar.gz | ||||||
| 337 | O:Z-IZBEO.<,P<]4Z#X\%A>}2-7**5^33>>?.5O}`\$ | ||||||
| 338 | FA2ZX79K"8BU<([.0<>X*\:?1}6"2&_,N1Q_/I2E+ST tzcode2010f.tar.gz | ||||||
| 339 | |
||||||
| 340 | $-\.J"D\:#`[T;4G#K+,/H#}D+F;Z&:AM2UP,%*IXP, tzcode2010j.tar.gz | ||||||
| 341 | 37Q]>ZF"HK>^$^MF1Y2`!OAAGN\_L;:8*/4;J@@E[_( | ||||||
| 342 | ,9$]Y-'!55L]C>?M+$D"Q"YR:B^D$(FZ+Y/**J8PXP( tzcode2010k.tar.gz | ||||||
| 343 | -!OW8RU0"0NX[2M-WB]&Z3}>QT61ZT`TG2+UJ2'+R8@ | ||||||
| 344 | 6}S]4VB_&TD:*776%3:+(M}:12@FSRBO7MC#8\ZZ4L` tzcode2010l.tar.gz | ||||||
| 345 | ,Y}B8)?@L(3S+*- |
||||||
| 346 | 7XFW5J*`P%B3A&KT).G51FL2$ESC-I$,LK7?T?,T[XP tzcode2010m.tar.gz | ||||||
| 347 | 26}UZNT | ||||||
| 348 | W&[KR/<@'2LQ_8E]N.;D#BL48W889 4*, tzcode2010n.tar.gz |
||||||
| 349 | "Q:Z7?C;[HQ[,SZ)(>*>K(4J:EHCJH"DUB.]X]AX]S$ | ||||||
| 350 | }J#+>XW8F0IG/}%IF*+)7:SE>']PFGCZYV/!^D,>298 tzcode2011a.tar.gz | ||||||
| 351 | ?#>.,@!UM+EL'N-1!CDDC}.$*-?C8M2/>O0MF1&]M[0 | ||||||
| 352 | J)IO5FK/BM24VNX>1[J&P[6B*&8W0CA}P!+XSFLXS3, tzcode2011b.tar.gz | ||||||
| 353 | 92GZP1+">/G1$%5Z0_E.0G1(LWR?/&AHKRYC&,,0YH8 | ||||||
| 354 | S8)K/A:XV%)E7-Y:PRLWV@8)_)!$E)PJE4^-FT97WN0 tzcode2011c.tar.gz | ||||||
| 355 | OT5'Q8BZCY;'MOS?%_QOV^OED@]H@DIY6PSUPR%VD>@ | ||||||
| 356 | ;4'WS-'T!S`<@2,CZ@X2_+ | ||||||
| 357 | CS'^:RQA,QX#E$K.)*9_]EP"M#_SCTPZA8:5/T(JC2< | ||||||
| 358 | V*S33`};*1[/?M>2$LU&V7/8[@>;]@1ZV[E[$4,R&)X tzcode2011e.tar.gz | ||||||
| 359 | |
||||||
| 360 | O#.*US:8E&0\ACJ?0/A2+ | ||||||
| 361 | 3^NQ6-EYG+FG`7)9UVMTU4T*CYW[1D0_IY | ||||||
| 362 | L}9-@>[#C!'\N%KL\Q]"OT)#?7}753?%F,-Z96EV5I8 tzcode2011i.tar.gz | ||||||
| 363 | PWV5"!H0E[I&T8A^\3OQ$B%KQ%\A5"OU671/,I8"X0D | ||||||
| 364 | PZFGIW!>U!0R!)K3D%^'IT?}O&]\$4, tzcode2012a.tar.gz | ||||||
| 365 | $K8+:P#;464:A>1$C(>5R/#0^^[L9K[$Z&$]_T'^PS( | ||||||
| 366 | 2@L@]]9A@U0:.)[_#2J3LS1J!%I8H-EW | ||||||
| 367 | IUWJ3H4(1UVN[^]?"GIA^;1$0;TNI(5O8*T7TL)H!98 | ||||||
| 368 | ^T6>N0"R\<:CG]RS]I^&?4>]RYMV1LDHD5I5)N(MRT< tzcode2012c.tar.gz | ||||||
| 369 | :-,C4\CDMQQ_;RHI4.:CY&}2WG?C;YCKV_)SV__3X:8 | ||||||
| 370 | RJ'VHW0E.OF86MCE*;KFA9#PN9%)T2R$LTQZKW5:Z"T tzcode2012e.tar.gz | ||||||
| 371 | 9>Z"?D3]+KAR-]GX/F:EZP}}2O-C4!)U/_Z5+5+Z-DP | ||||||
| 372 | ,G0^1Y&GDY3`B]-Z%6'90VL]GVRS%J3YF.>J^[3_\&H tzcode2012f.tar.gz | ||||||
| 373 | (M;V!@S((UG0#@33(@2}*&UM>.)OPB:7WIK[C9619ML | ||||||
| 374 | M#--09N*J0L`J71,""!H8LU)K+Z70M+SLUJ$B2[`$.$ tzcode2012g.tar.gz | ||||||
| 375 | \+}G;?[6}SPI9@&!6[K)\-&PFJ?9}UMG?5%(9GA8RHD | ||||||
| 376 | V>3H[Q8*&T&)`IB!K^KW+/N\W+^][SV%H28\^:EKN>< tzcode2012h.tar.gz | ||||||
| 377 | ?%\ZDR>KQB]6';YKUN3HJ,.5S_WE';0:5KZ0CB>BFEX | ||||||
| 378 | 57KX7*+.)9*J&%B%``#(4,W/#B78.2@TF&A^AG\9*\` tzcode2012i.tar.gz | ||||||
| 379 | H!@D./[;'85;4L!S3U*_U-TW!]9<;S1X,]6FBJL3*F@ | ||||||
| 380 | \K}Z#A@M?L_GQ8&%)%UQ@:L!VI"<+]R$MQ%0PPD#@L( tzcode2012j.tar.gz | ||||||
| 381 | SP+B+,7}>H]V%/?_RX44BK](&J)X]8XF]*$>&OG9\D< | ||||||
| 382 | F:IH]KBGMJ()U7T[$@YW_ | ||||||
| 383 | VM\19NOZKI4?9QZ*ZA.(QQ_5`.[5LWZSC^2K_:-T^,\ | ||||||
| 384 | 8`)"#]}I2TY.^Z}8$+J5D?*089^%IZM*VCT"1>ST\?\ tzcode2013b.tar.gz | ||||||
| 385 | #7JTII71T^2?'1>(5*[2I&WWJI%GXB"54HRN4(!2(L, | ||||||
| 386 | Q?\+I`T-0&(G7,0KJ:NZ\S'AA&BAF22(N1U.>47L_Z\ tzcode2013c.tar.gz | ||||||
| 387 | (H9(HK?}?QY#3'GCIMG/??!-_B)6:D+'JX8SIDE3EQT | ||||||
| 388 | \PR>,.LHA"[2+A"OF}`]N;Y9YY5_'^X',Z2)%F]WB)H tzcode2013d.tar.gz | ||||||
| 389 | GU%<;GC7(<)_#DU2X(8^VV#I<@8.7[2%2278}VB`G<` | ||||||
| 390 | MZK!GW>-2TA |
||||||
| 391 | @`%30 |
||||||
| 392 | ;3WHF`:A%KI^0^#RR,#RCI'+[B`BN?D16GG?)M!&O68 tzcode2013f.tar.gz | ||||||
| 393 | W41UD6_C9@D577+/Y#2SAT5;J.X5^[NURO-\QW}7T | ||||||
| 394 | 1GQ*Z`Z!.6*`Z-/[:.$Q-S%1Z-#NZ;OX9TN6^9X*G+T tzcode2013g.tar.gz | ||||||
| 395 | R%<#EK7WCXAKV&6"!ONX8T*-_AW+U1)BT23QH;UE#E< | ||||||
| 396 | OTQ5CN"#J,TD1>(Y0K*8(2&ECCPDD}9WHH->I;FBZ/$ tzcode2013h.tar.gz | ||||||
| 397 | ACT8$SG8M$KIAVH"Y#;:,[ | ||||||
| 398 | P8[4(KAC'B<#)VEB`R/)3(2/.KR2;8O"@'33U+2[BB@ tzcode2013i.tar.gz | ||||||
| 399 | O4C.BPOJ(^>K}FK.Y\KW*\U16M/@.:M]`U;-X]*5T&H | ||||||
| 400 | E$E^1`"R | ||||||
| 401 | #'*N420//5U6RO[7:7?@#_:H\BB@?Q>@_-HM&H:R4U$ | ||||||
| 402 | $4JO>>C*C7"B-+P/")UIG^!2@*(H7$ZCG@9_Y}RR!<4 tzcode2014b.tar.gz | ||||||
| 403 | ^62VJ.F^0([6J5`2%FGMRK@>}>[6FH#X!0Z'KQN-V'H | ||||||
| 404 | P'AKW>XB>[9.K/T;JF]M"%)5\JJDZ6>_@D8R9\*1YH( tzcode2014c.tar.gz | ||||||
| 405 | A$C-`C,BL+'}H(&A`C!<2P9M(7}1;BD@N\KM4**-\TH | ||||||
| 406 | | ||||||
| 407 | \;XMR*$!>\P/^<$/1G!]T"SZR9)<6S0'K*C%&Y#X%[@ | ||||||
| 408 | 2M?_@?1*]*536#C9EG\K\8G8`V-'XJ | ||||||
| 409 | MNWL!B$}ASSD/"\`895)`2DZZN3 |
||||||
| 410 | -'R@75PH#HC+P-SF]`(BL],S,9PKN689@]TE1TS59,L tzcode2014f.tar.gz | ||||||
| 411 | ?# | ||||||
| 412 | 7<3B/>>M[MH_%`+7@S['A7G&W\MI[8>#`XG3J(N$$B` tzcode2014g.tar.gz | ||||||
| 413 | ]3O'83Y%5[]3}$/U06&P9**)KABE7/,JY;%H.6SV`!< | ||||||
| 414 | E#_%6&<@B]MW1P*5`%I-$^WUD9S(>N:LK7DZA&YQLQ( tzcode2014h.tar.gz | ||||||
| 415 | [7@(%:'B"6%L>1F7\4VE;+DQ'&6%MPQ0.S*A'H[!7@T | ||||||
| 416 | P$PWO>JEH:$WBMIQ236BV3%GG0JDJT*`C1A;8`Y}!8( tzcode2014i.tar.gz | ||||||
| 417 | $@}G#!:*@/Z}N&,'`H[Z.OC*,$@7Z^-M];7"TK9]ZZ0 | ||||||
| 418 | *4\%]-:OH$(@P[)5K1D#XH4+^P9)LNW[+75#1:2R20H tzcode2014j.tar.gz | ||||||
| 419 | @-.].NMPXA52I9G&(#9P_G0LJ-)PP_Q#"C!%V.BF80X | ||||||
| 420 | O^})05,L!Y'5J9UN2_7[WV*1C>5]-WT_TFY_?WAL9J0 tzcode2015a.tar.gz | ||||||
| 421 | V;5LCLF-D5C1#/@-\!@89,1GI#A[C.U7`?1FQ`B%ZE( | ||||||
| 422 | 2\'4FPX7P*&-@`:D(]H<&YI^}&)L2I%MTWR[A>!+*PH tzcode2015b.tar.gz | ||||||
| 423 | `?5^)\$#%#3GVHAV\P"$W^^}OC:8A3G(5_ | ||||||
| 424 | ^"R?Y}K3+>T2&%Q30SM_&@53V(2*+9}2F8$"'_UPW[$ tzcode2015c.tar.gz | ||||||
| 425 | ++3ZSM@YT"YC$Z>JS*32W^9%08;9AD[DJ@-/ | ||||||
| 426 | }1SL(H6]XM5Q*6*W,^$'I&\B@D:?91"T+9.7+6PT0DH tzcode2015d.tar.gz | ||||||
| 427 | _<5HIH](}KEGLYXA^E/P8]Q75NB&XJ)SS`1M6@%.M1< | ||||||
| 428 | Z |
||||||
| 429 | 7/OKWHH+Y7Z#B*>VTUKKJ9$PIRP:0?F[U}6&11&D | ||||||
| 430 | 7I,@JR$%6T.#YDL[G7:"P-,#}\Z$!V&9A[YG)#8!1Q` tzcode2015f.tar.gz | ||||||
| 431 | 1-J#/:.OVX)C:I4WA3 | ||||||
| 432 | WDU(#A"X?+LVQ%ZJ_\JFN8E#}>+U4[?19E7<%GS4H1\ tzcode2015g.tar.gz | ||||||
| 433 | ,Z$'BZ%J[QD$BJE\X8%OQ3:`8;_D#MW`Y^)&RE?$I34 | ||||||
| 434 | ZO+P.$<2CI<:;96?-.IW(DOS/]4]QJ#`!D4-WC4B(B, tzcode2016a.tar.gz | ||||||
| 435 | 4_}`7]!&;UK,71W5D%1JNVX_0D#6IXSGZ660C9,0Z+@ | ||||||
| 436 | :&R/OHAY1\43I-YEX^/\`XUD(5HS`F | ||||||
| 437 | @3,)M&Y"%,OGTBN94;K153;UTY32]E&V"N9L%-V,(RT | ||||||
| 438 | 49D:V`]_`L,D^);F@,?OL#(:GD>9R6 | ||||||
| 439 | QO8EFGCZVJLI.^"D$CPB;1HR}8ACG/J-K;6G2]6%4HD | ||||||
| 440 | *@R'S].C.(CXAO4:_S1&7(E07PB2YKR^)"1ZD6#G,HP tzcode2016d.tar.gz | ||||||
| 441 | W*]A6MJ6D@Y@_[,V)3]35!AA%3WLP5;4%F'T/@O[$HP | ||||||
| 442 | ;",;"W}KOC\A}E231B}?Q:AY!T])}]44$BCEC+,Z0<8 tzcode2016e.tar.gz | ||||||
| 443 | E]"$]+"FB/[PE]RB5@@\J92#DX2-}\CN8WO})OA9%0P | ||||||
| 444 | SGTK)OP19:.T2RC,')!UX0&2,R)A[6B9"TLAJ%0XL", tzcode2016f.tar.gz | ||||||
| 445 | @X.^UM`:`DKTC9OS-72BVP1]PAUULT`0%*M?7)SABCP | ||||||
| 446 | T>#9$ROJ:,#E |
||||||
| 447 | V0#I+Y | ||||||
| 448 | 7&VY>X'M[]!SV",E}7*+PNP`1L'5T_%}(O0F8H5`O/8 tzcode93c.tar.Z | ||||||
| 449 | $#P9]X&N*+)O4}S+[\2[@E#<;4743)
| ||||||
| 450 | `]WQCNO2:V`:X&S?>]%E355U5/DVLM[N6/9#!}79+]T tzcode93d.tar.Z | ||||||
| 451 | G%>'44/-V(*7_!GZ}OJY9P'P,5 | ||||||
| 452 | ,N??4)N$YU&TD/:]VSEY9"0H8?#--NR4T/*R0X[.8 tzcode93e.tar.Z | ||||||
| 453 | 8C/Z_(/K8KZAL-K^\-QY0O60<%2I1)C`N?XXDFDK,I$ | ||||||
| 454 | 5(*N^X%*V)2PDHBM,<-}],@DB_;4>"1TWA?2'FI6< tzcode93f.tar.Z | ||||||
| 455 | _>['WQ9$AX,M]L"_6.ARH).&5J<_PLOFIC&}U24G:}( | ||||||
| 456 | 35_W,VHAB&Z?6$NK>&,}#"MDVRZWDB?E>)NCO;}"Z`` tzcode93g.tar.gz | ||||||
| 457 | UHSP"W@@&3-.V!`P,WFQ82S}S2[6M;6B!$ | ||||||
| 458 | _*1#?Z.U.+HQ,!}[H(___`$2[:P(%:Z\JX/Z'L/J.QX tzcode94b.tar.gz | ||||||
| 459 | Z@H]7[O0$1D(FE0'T6COG#W"T]B',RRL<3HW:LQ:@U@ | ||||||
| 460 | &"YS^X-0&5PXC&2#LKFV<<*"(}MA4\A",;7']/<]C70 tzcode94c.tar.gz | ||||||
| 461 | CI]EX%GS46?,.Z;!JE+U,\N}:TPW,W?!'D141$@B28X | ||||||
| 462 | [U;F)'V*"$5J?@`/IEOR_EF9I-SNKV>HN89N%0%+:Y4 tzcode94d.tar.gz | ||||||
| 463 | C | ||||||
| 464 | +;-&YM!F?'Z%;B>}4#4JZQ7KB^(:!X+J#/$H}05@2)H tzcode94e.tar.gz | ||||||
| 465 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
| 466 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzcode94f.tar.gz | ||||||
| 467 | C601R.Q+I2LKZ%.X`):%S85HPA8C`1]32:W0T!,% | ||||||
| 468 | %?X>Z;P9*L3H:-]661E@H`@]4CMOXWATG*[\HT]3F)H tzcode94g.tar.gz | ||||||
| 469 | 3H]S/<4?5\$!]9`RS$M"$69+*Z%^QR@\.<%N($1W,9, | ||||||
| 470 | >OW7;@)Q[U4\]VMG%Y?4C\'XDB | ||||||
| 471 | $K$*^`1JPQ.C;_*C:L4VPX"^,5S.^/-"AD}$6+5*U&, | ||||||
| 472 | `CP8;[+7}HZ&AT_KF\HSN)UL%W(W514O5C$`+4L1)/H tzcode95b.tar.gz | ||||||
| 473 | M!1BT7ZMVBJ;V6D8F#*WS.I+&E,HK]?G;N[U9H2]NX, | ||||||
| 474 | 0'',HHJ9"DHP0^)6HBPG;Z>%(V_\7"8J4\EH?"TBR'X tzcode95c.tar.gz | ||||||
| 475 | ^18`.?/@J:8,+Z0M&P6*U8M[U[LW#I:H:M9!H@A&G,4 | ||||||
| 476 | :&I,GDPN3,;)4#J8'>D7GU(LR$45^C_8*D3C53W86Q< tzcode95d.tar.gz | ||||||
| 477 | :JV/F-C<-V}N`LA]Q\64$G;$;8!C_J>+HWZ2?^V0W6$ | ||||||
| 478 | UKESK8* |
||||||
| 479 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
| 480 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzcode95f.tar.gz | ||||||
| 481 | LIKL}.(61$@8(4E[&4X&X?M+,K#.<5A%[%"[V)M??Q< | ||||||
| 482 | 0<03E<(T8#H6'KB1P[PS,C2*DFKH`AHJ!<7-*.J:SC\ tzcode95g.tar.gz | ||||||
| 483 | 1#7!LTVEP;0FYMP15(2<-`5YT>YBQ<]DB10&PAW'"L( | ||||||
| 484 | P/MBQFM'}$H%,NTX7'D%5DQ*:>L8D_']L,R3)[ | ||||||
| 485 | \TFH^'Z"SN>!A+44DB.>0B@!K4M'L3B)$1I:-D,TSM( | ||||||
| 486 | NZ/!%L&!YKS#Y`V1".$Q}.J&Y3L#K:PO}TE3>:&UA?X tzcode95i.tar.gz | ||||||
| 487 | HQ_C*X'3$'*L3#MUMI):5EZR | ||||||
| 488 | PNR^RQ*H>9A#TXK#"(4@\@-9 | ||||||
| 489 | DK;*H#9MB^MAK1L*<8B&;$R%J#142^+R'P;T_7C'R30 | ||||||
| 490 | P5.,30) | ||||||
| 491 | RU(]55WM[MS#Y6+$6@'<[ | ||||||
| 492 | 7X;M13S0T`B]7J0?18G)B0AN5K;R?LG8S0G5}&\]G:@ tzcode96c.tar.gz | ||||||
| 493 | %B(J?MW:0Q%ON]!(7GV(*#P/'26H]'QA>PGCW-;3$U$ | ||||||
| 494 | _&EB6G8W+#'$.SR0;( | ||||||
| 495 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
| 496 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzcode96e.tar.gz | ||||||
| 497 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
| 498 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzcode96f.tar.gz | ||||||
| 499 | W5_\LD9F@_F9GC1TWW*TBA*GI#:K2# | ||||||
| 500 | *DF">7IJK<^G};KT3Z8_Y<#'C_EMS*S`,`/7C\#%_+@ tzcode96g.tar.gz | ||||||
| 501 | _NC+93_%GSW;S\$]G9IQ1FBX\)Y,^P/\B/-]_&]?M1, | ||||||
| 502 | &%@7I9&GS76SZ&CB;(}7`/MUT0$FD25P8HG;Y^]8@;\ tzcode96h.tar.gz | ||||||
| 503 | 3D1WX#T-E*6970%:Y`9//<$>/?S&G4&Y<2GX7IH[]'H | ||||||
| 504 | L:R/3XZA2KF`?2V_LIJ488G4F]/K8^09\W]6KXBH!.D tzcode96i.tar.gz | ||||||
| 505 | J\U)4A\T>OFX$YC)0F;FU)U%F7GK72;MI`P9Y*&QWOL | ||||||
| 506 | :O;VH'V}(VP,1[>9K\;K\A>#MO^.6[:#\,YSEDL*QXP tzcode96j.tar.gz | ||||||
| 507 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
| 508 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzcode96k.tar.gz | ||||||
| 509 | R/1+A,DR4),)DH/["Y*',/YD9!`@/YJ1Y"K`472P7+P | ||||||
| 510 | HL^O6\ZYTHRM,45-JCT1Z;PA[X#&G"F>`SW!26BW]%@ tzcode96l.tar.gz | ||||||
| 511 | ,FX+>DZN1`#WZA_R6B>-YX2X&$F2+AWNQPIQJ%$`,\H | ||||||
| 512 | FG5VE<*AV%LC}]%8Z?>S2W-SYJU[S9)VH$F:+[P:D4P tzdata1996l.tar.gz | ||||||
| 513 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
| 514 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata1996m.tar.gz | ||||||
| 515 | EH1!U*N648,0\DN:ZLF04Y]%"J,6_D$4K1EI\}\G$P0 | ||||||
| 516 | DC#*;W^907TS.NJ_YVS^Y*!%VA7V>QW&6Z2J0O- | ||||||
| 517 | VNM<-^9.5M.UICPV5:;UV);$*(L9!3(*'28LOR*)?N$ | ||||||
| 518 | \M9A3^Y%8$]I;@P%#1>,6L$[S9XKA,04}"-HNGT_+*< tzdata1997a.tar.gz | ||||||
| 519 | -2F$!<%`TLV8RI)C+[NNG,*)}Z"G;L}]#7SZ+>_4Q+X | ||||||
| 520 | )FQM(G`Q(J7_&VM-G5 | ||||||
| 521 | `.*%![}<(CG-%'9};:/&5^<2P*HR3P/P7-2_RRS1(R$ | ||||||
| 522 | ]/.U}EC!_^;5B#;:$X$%,#+L'A)#"LM2&9+'%155$6X tzdata1997c.tar.gz | ||||||
| 523 | S2[ |
||||||
| 524 | G(%Z1TS8#6%NS6Z?R)?O91+}P;/MX4!##[C!E]CS$&< tzdata1997d.tar.gz | ||||||
| 525 | "HA$YIA'OO0[&^N0K0F1O'#5?T%MOM};;#<[Y"@;Q8` | ||||||
| 526 | 6R!UU2W.TVH2-[1UK0[6@%@^HD^[9#J!O>/A$R$9A}4 tzdata1997e.tar.gz | ||||||
| 527 | -\Z<[5H;(K`I9/0UC40N$%8FCE_C?PA'!X.\*/#A>'X | ||||||
| 528 | U0PA9L<(/OU^QS9Y29-1.6}^!>*)UO5IL1!WT>;*8]( tzdata1997f.tar.gz | ||||||
| 529 | N?>$G,1)%Q(8YD7*L-ZX$&*Z8:4N<@8D[ZO7MO,VD7D | ||||||
| 530 | VYJ.\-Y'*}&![O2'U\$9"1"<<,`,V6/>S%T46K/&.J4 tzdata1997g.tar.gz | ||||||
| 531 | A9%`&65UI%/3#-$M;`X+!EJ'I+\[/&A)25!P-9?V/`\ | ||||||
| 532 | +%@@43C"5R9UV_"5^8WH3}H"N"R1"`ZYZ10"5M5` tzdata1997h.tar.gz | ||||||
| 533 | %UE;&/:"J-8#J@],ECT)@}UPFAXBGX}YKUVJPT(Z3,P | ||||||
| 534 | .+D'`Q?P\X021ABI+U^BQ/9A6'S>].L1'D1A8WUV6:D tzdata1997i.tar.gz | ||||||
| 535 | )%(/R#7$(V^(<_%>_/-O-O@R:].57,#P'^G0"``]!#4 | ||||||
| 536 | WC'N#8)H6O,K%UO2QNV#BA(P9;L@E2C*6NX"3;:?-K, tzdata1997j.tar.gz | ||||||
| 537 | 8Q+HC%KI[QUX*#,/F;"J\C_,A7GW;"ZX}FB@E3#BJBD | ||||||
| 538 | |
||||||
| 539 | P!A+ |
||||||
| 540 | >K$,-Z-X[C]*TM&98HS;(&*^*7}?7`[;UK2R}E_(W'X tzdata1998a.tar.gz | ||||||
| 541 | O'H$^0.*'C3!W]U_TF`2+0*61%+$&YZG30&C`]BX4 | ||||||
| 542 | SY3&)`[B?`YC?8B-BW"(H(5&X`P19L2`HT%?*Y9NY"H tzdata1998b.tar.gz | ||||||
| 543 | -L)')/BY4RP&1M51*38QB;YGULZ*]:%FO}B:J`1BMF4 | ||||||
| 544 | ]M0?P_7O3+D>^2K#H?}3G-,4H$B+"-^PF:B0P985#]H tzdata1998c.tar.gz | ||||||
| 545 | _U937D;GD,RHR>@;"?GZL0').T2<(FM-?T#K7(D[,%P | ||||||
| 546 | >L!20&\FO; | ||||||
| 547 | Z9I*7`-GAHTPM`1#06>'*\\:1_<$&@P#@PQ$DH%7&$T | ||||||
| 548 | W.R8OWRZ!S];}"YX>%JE[X904.17T0X994'/}Y6^FP@ tzdata1998e.tar.gz | ||||||
| 549 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
| 550 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata1998f.tar.gz | ||||||
| 551 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
| 552 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata1998g.tar.gz | ||||||
| 553 | 0I"M | ||||||
| 554 | (15Q("K7}Y<}`/6}.Z-U!G;E;+WRG\>>6':0F-."C6, tzdata1998h.tar.gz | ||||||
| 555 | T@C4[YQJ>A+O$AL$ | ||||||
| 556 | +WSM9Y,0}O+;D:&`Z^,I[CD*7BP^S3[74;*U)!(K;%L tzdata1998i.tar.gz | ||||||
| 557 | R-T3W14O0<8^#S | ||||||
| 558 | I\S^L(K, | ||||||
| 559 | ,WC#S,0O`E;+ | ||||||
| 560 | |
||||||
| 561 | %:?JRV;Y#S1\V8M(A$ELG@V'P%A\P\_#L"E7[B:WN/( | ||||||
| 562 | 5'8$G!W12!5A;\?I#Z2,OH11M0)!1CHZ[VI2@+'}JBD tzdata1999c.tar.gz | ||||||
| 563 | CHQO;?K+#EG8!@+K-Z5G>O%'5C8+)6X@'8C!}ISX_KX | ||||||
| 564 | `*1;Q]WY3`5GY}$*CKVV.0!BB`GG^F".SWXWSA!N^@\ tzdata1999d.tar.gz | ||||||
| 565 | C`YJ53,E^X`2!(T:PI*!<4C^&5R2NC6Y>.!CDHQQ0RH | ||||||
| 566 | U2_}PPA><*#&YGQ\Z})E]\QTY**@A;U0KS}[}QJ-S)H tzdata1999e.tar.gz | ||||||
| 567 | 0Y | ||||||
| 568 | 5BC\T%K'7K3I4A?Y6D<}%RD.ULQXLVT?/XD5!VHM+O` tzdata1999f.tar.gz | ||||||
| 569 | 1"Y@ZIN1L-.?'P-5.OY:(2P-4,Z,1?4O5)XX1M6I*I( | ||||||
| 570 | S;]IB3:D^MQ&1"&6XPO?}1}?4<$Y6@-2V3ZLM[AL-V\ tzdata1999g.tar.gz | ||||||
| 571 | /P29#6V2Y0VJ! |
||||||
| 572 | J#E&JQ$ICO^RN_P/I"\*G!.L7WZT)0B^(ZRSI2.Z%*4 tzdata1999h.tar.gz | ||||||
| 573 | N.[5"H(5K&U#`'D^N^HWM_"$O\EH*.5C]80;?)-?2V4 | ||||||
| 574 | | ||||||
| 575 | |
||||||
| 576 | 8["(&T?^M+$F]/'M.)H[W)/C9E/%QO$@EV-}]}^+7Q( tzdata1999j.tar.gz | ||||||
| 577 | _JR*R]:37,/DDB)6)%<<>S#@ZINCIK+X@"AM>K<-+GL | ||||||
| 578 | E[/.;1]ZYC"C}}FP%]AP.SR2WT?8I;ZH(`UL*0A#J(\ tzdata2000a.tar.gz | ||||||
| 579 | L6$2NW\KJ)YVNBDTV9.2WS5T#R:Q?>KSWL_E}>0YJR< | ||||||
| 580 | 8&_UY*+I%$C5UB-5Z%J9:8"0#NN$J1[?2_MYX!E'IEP tzdata2000b.tar.gz | ||||||
| 581 | G*F}(Z_ES1XG,#-&13B'`7T}`+N,94FNREV+9X_]F%` | ||||||
| 582 | 2Z>,5VQ@ZE9$86D60V&V_R\O8CSUK#\+%^7*S(/%WJH tzdata2000c.tar.gz | ||||||
| 583 | )F9O-TJ".F;KPT^7&5C:G-,]*4?X,AIT68!}[PZNTMH | ||||||
| 584 | F$?0Z9/P%WU&MF'C([@X;1P]S]?EH!M6LOM')W'&A^, tzdata2000d.tar.gz | ||||||
| 585 | 56UF8TB#P]FPNZ3BVP#I\M@CJ\L+2P`/T9;/%Y9__B@ | ||||||
| 586 | WJ@O^:996D6?7OM25>E+$%$.KS;"6ZJ):4[Q/OG[#C, tzdata2000e.tar.gz | ||||||
| 587 | YM%:>0QR-2IG-U.,__4E^FFPYG7FT&+DS'}B$ZI0?!0 | ||||||
| 588 | G7Q)5],._6T%"3D.S+Z9>`5^RX&@:D"CN`UD@79WF,@ tzdata2000f.tar.gz | ||||||
| 589 | )-]G`$W | ||||||
| 590 | F9D4.>+XD-&3@A<0[IT+Z5<3!#'G7KF"/MY>]5U;J?` tzdata2000g.tar.gz | ||||||
| 591 | A | ||||||
| 592 | XB7Q1BYV!!D&XTO;B2L?U)[JNN_(/)"OGH.NMIMPZFT tzdata2000h.tar.gz | ||||||
| 593 | <^-:IAH`@8V60GLL?@_8M\)EQSI!?G;U'4[* | ||||||
| 594 | *$0GQ-A:3\>8X135/)/RO^RDH6/_R_AX;6?[]\UD tzdata2001a.tar.gz | ||||||
| 595 | ,C+2}E_'*1I[WF96HX?%HN962+!7.)F,.)5S][?3M1D | ||||||
| 596 | 5 | ||||||
| 597 | "2)`IF)WK)QM-.F3B0LC'"5J&O}W7TY$7MDBW2.N??4 | ||||||
| 598 | }[PV#XJ^,]$0!'*]^";^S.4`E%M2)[Z5@,`%^K.`DAD tzdata2001c.tar.gz | ||||||
| 599 | :,GWLT*Y-2$5>(NX>D}X561`YMN(^I.J;^$V4,JEP*H | ||||||
| 600 | V,ZZE@DLB#.ZW,,8#@D_K[*0I;U]E@G;@ZI0O8M@$+H tzdata2001d.tar.gz | ||||||
| 601 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
| 602 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata2002a.tar.gz | ||||||
| 603 | *!&'%Y | ||||||
| 604 | \TO_Y^$'G%B)-}$0(QX8W$B#(KYBPX8C1E61,B'O5\T tzdata2002b.tar.gz | ||||||
| 605 | 6G@?R$W3VCOX5\}DY87,@B!X@,"4[GD9J*<3?$G_]#D | ||||||
| 606 | P(T@!A1:Z`VL;&<\'A/DU9'D#J"X51#,?,}IMU0,/WX tzdata2002c.tar.gz | ||||||
| 607 | P809;Q2G!%G |
||||||
| 608 | H%JAKHMJ(07G\/_*G7G_6RHL@#5YH"S.A[*I_2<`V>4 tzdata2002d.tar.gz | ||||||
| 609 | G^)?2OG*:}AA'&?GU[!35MM_*]-_I@2VTZGV'EE09/< | ||||||
| 610 | )}6O$:<'O+'GZM/7D2HQ.2Q%-:M+_OI;[H)'8!??"F, tzdata2003a.tar.gz | ||||||
| 611 | KJY4Q_:(%011`,^(TF*QSO]6KQ7N#}*FO.'0I; | ||||||
| 612 | @+C[G%UI>/?LL-,[IU0M8_/I7CNV?EI;1`5MS!!J&"( tzdata2003b.tar.gz | ||||||
| 613 | E8*K>ZZ3['JP%(B0/\D_`O(PQE,\#*OL;5K#`W1NT | ||||||
| 614 | -Q:^}TSJ\MT(.E&[P5B9K>8?30_H`/-G!]J#1:8":V8 tzdata2003c.tar.gz | ||||||
| 615 | 3*-1#/W/OC_YE$+]FM6M0WQD\0(G5_,'M)*,$F0&7_P | ||||||
| 616 | /S^BK_W4HKXW^}HF+IJ"::R)P".IQ*)((VMU#A@M-_4 tzdata2003d.tar.gz | ||||||
| 617 | G\37!6&/HW$G(:D5`%Z@OW60;3?RII`%L+Q@AAYTOZH | ||||||
| 618 | }ZD^9E74"-:>53>#W('K*A/"6QU>Y896MK.`\[>8F,$ tzdata2003e.tar.gz | ||||||
| 619 | JXL*2@+S$9^X%$]#2,V}H>M4,*IV | ||||||
| 620 | ,+0+\MPWAEE@&$RUV3!!U4F}Q43:!FJ;/}>1\#"/:3X tzdata2004a.tar.gz | ||||||
| 621 | _O[+P853D*ZU@<5E16N@LE/Q2R@VK_5;22(&L7X#X*@ | ||||||
| 622 | TN(P6(UA2H$6'"3^Q#M5PIJ6)>H"G.F"/B5}>\5)>}X tzdata2004b.tar.gz | ||||||
| 623 | `,%G^A7`%F?ODM-B`B6&5N&!A62;@?VA-VKEK7A9E&P | ||||||
| 624 | D"!WC,>HNA:-5<2RI@}W54})>S66,0LU+B%DMJ/<^%` tzdata2004d.tar.gz | ||||||
| 625 | O*CVSS/3+2_4%\H<&E(7L;*3$LX&E(10_I"!0?$,/)D | ||||||
| 626 | ^J}AR>P:L/SU,V@X1U\D["X;0\2K0$Y56FZ';)D^";H tzdata2004e.tar.gz | ||||||
| 627 | .V"?>"^?!N/7NE2O>\TJTXS;IC7}8_A<_P78'_Z,I+H | ||||||
| 628 | )9DQNHLL$4B%]W($M@]`?%-(.>}^;)%"5>T5^/JF,I$ tzdata2004g.tar.gz | ||||||
| 629 | 2>OXZ]877,Y3.H/9&4Q,?^4*2RU(F1:^2[DH9G43*'8 | ||||||
| 630 | [\1JJUWRLEM*LFOCFM,B4BX)TOQQ%/(LR!L}6OC)@6D tzdata2005a.tar.gz | ||||||
| 631 | @MVM("T}#E8F).X@1!@'>>-MI$),Z.G01^&LD#T3Q+L | ||||||
| 632 | }/!;IP@BIFPB1I:P0NP8(SC}._9*FP2?)910^[02U}D tzdata2005b.tar.gz | ||||||
| 633 | GR^[YL6T/#J^]R&$U/%R?S$NVT!N*O>227++_(700 | ||||||
| 634 | S88TM@098U.T(&G4ON;; | ||||||
| 635 | -S$-%D | ||||||
| 636 | L6PFP1\(:HK]9R?-"6BL&*BK>(9!U^#H7*O,0*-CEMH tzdata2005e.tar.gz | ||||||
| 637 | :,F92[)JZX4F)_WO1.Y@:!L3GC[Y&T)%*.T,^SP6NT@ | ||||||
| 638 | T7,'^9G*EILZ5ICBC[>6OA[AY2\6+R%Q`G#*B$2}%+\ tzdata2005f.tar.gz | ||||||
| 639 | -9<#**-X5G%H$B7BL8L:?4;KF/.S+X$)8$M5`WIQ2D< | ||||||
| 640 | *P]%.W)S@&)^&G8P`IPWI(Z8W+}FULY%C^U;P.K/-}` tzdata2005g.tar.gz | ||||||
| 641 | >_4'\9RP[&H8#Z+/<[^^TJ4)3R-(-^83.1L/5}P#>)4 | ||||||
| 642 | QYUVFD@Z}M-:'FM`\ZN(7119?!LF24+Q[GN<>A0*KN\ tzdata2005h.tar.gz | ||||||
| 643 | 0L_<}.?5:)RAVLOU[W"1I6""&BF\&V@EY<'4'SJ%3]< | ||||||
| 644 | 234)%[]K.8^#CAFB3B!NOGWQ7A8H%Z_$D6S_+.W(UE$ tzdata2005i.tar.gz | ||||||
| 645 | +#.RI\+OJ2]M.K}\J,7*B;)(#?+9},O-9*,L1Y+ | ||||||
| 646 | 1PCK>DN9JZ3\Q02"\/LTV>4RQKO4',<}7N+9K!+,75< tzdata2005j.tar.gz | ||||||
| 647 | :`(:.6(VL;:*#$V!@H./0`DY#:@.:A?@A1%USAC#!7\ | ||||||
| 648 | _T]2G}9UXV3W?<'655[,[W)#-?^3>M1X<`.%NSR>`<4 tzdata2005k.tar.gz | ||||||
| 649 | $\`;5HH(N4D+[-)0-T"L)U6%_:GS\ | ||||||
| 650 | `D:ZV(:1E}&;?YF?`:]`&I"}DU:GR?+"1^G!@TF9,^< tzdata2005l.tar.gz | ||||||
| 651 | ]XP?Y/R@:#/$-"?7Y_:@TB)E,F,\/>7R";@2+DG<\CP | ||||||
| 652 | 8`H:XMG>ZT89&XP4BG&'AI:MT]M<'?)<\L5QYUZ(2T0 tzdata2005m.tar.gz | ||||||
| 653 | M'-/T;7BH#DSE.GYS$%58N/N*X??`>I`}(^RXY0U@(@ | ||||||
| 654 | D@.Q"57'&0@C01W)5._E5+0'2V21}]53$^8$75((5I4 tzdata2005n.tar.gz | ||||||
| 655 | )1CF2?*H:3>1$E1%5OTBE@<8>JW'^P(NQ8U8S3\V)-< | ||||||
| 656 | $+HT2$W6:N)>WLK?<58H@$Y@>F9%"+GX)CT45/$ | ||||||
| 657 | L.?)VFJXZBON09#Q$?.MXL;SA/3M[`U,43C5'A_KB[T | ||||||
| 658 | QS#^9DYGX:<>.Z9H"T14OT<;A)[MF!;Z[T>I*Y8$-.$ tzdata2005p.tar.gz | ||||||
| 659 | H$))'Y\8_V8'U]A'55[*'#[ | ||||||
| 660 | +MZ}G^}?O}'F.)*@6J"_^Y;+_$\N!'GR?`TVS)6]B.P tzdata2005q.tar.gz | ||||||
| 661 | VT[/$2K2&Q])-Z}+.2;Q&VVK.'4[05HU'Q7TC'(1X0@ | ||||||
| 662 | M%`@#^^E_\""HK0L-RO10AX<*'@@\:NI1XCP@20)CD\ tzdata2005r.tar.gz | ||||||
| 663 | ^/E".Y()9@FALYIV!J5&E(@7<.IU5J6L*YRR>?!+01( | ||||||
| 664 | 0T?K+11S483Y`';FL(VD@)NG(/}%0>]@<8??E">1P%$ tzdata2006a.tar.gz | ||||||
| 665 | XMH%#7P:N67@G9N4E5"[KI;8__,:H2?)B(B$EBCGDA@ | ||||||
| 666 | UT!&0XRJW(?\WK\QE/ZQ4L]%P#[GQ.*J | ||||||
| 667 | :S7+"D)F2T@Y`\ZU%DS*\-1I5:H41GU$EO:XZ4I6Q9( | ||||||
| 668 | E+'71)J#,.OA^R141TM>%E_0V]PX*I3\A%RW0/$6XD, tzdata2006c.tar.gz | ||||||
| 669 | WPZTL%>)HNF | ||||||
| 670 | Q%6_ZILW*>!JC(YQTNY9J,X_U'?IC`47S!FY*K;Z` tzdata2006d.tar.gz | ||||||
| 671 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
| 672 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata2006e.tar.gz | ||||||
| 673 | ,^YGL#VHJZ!$$A2J4S8N\U[MR[?^(2,NB10;+LXJT[L | ||||||
| 674 | );VKQ_}!DU\0RJ}-)2C`#SP-6B0[K_#JP_/!8H+1'', tzdata2006f.tar.gz | ||||||
| 675 | 1COG_P,W,-L)>^5XZ-,)R79S;?2C"8I8*I3-R8&JF34 | ||||||
| 676 | 2K?\*317-RALJHHQ.Q4R3XN3B5!&;%`O*')#!XMW.D0 tzdata2006g.tar.gz | ||||||
| 677 | Y:G!6]O8YJ*%7OXBB23AS"B'8#-H[4<[NB@`GX)(?JL | ||||||
| 678 | OD>0<>,+YM#GO5IALO"#(83.\YM1?NR#E8+WCZ}.9$D tzdata2006j.tar.gz | ||||||
| 679 | $F7_E9WUU9\]_6F"RL>N]>!'$NSBF*$52J1H}Y1WAJ( | ||||||
| 680 | 2#_+@K[?&/4CQ!.T7/#H^G/JP}[)/6H1ZF,-M`@;X,, tzdata2006k.tar.gz | ||||||
| 681 | /+C_7^QJ}EOCHL-$O2_^-FNX1/4.L[?V_ARE_*9&`]L | ||||||
| 682 | 8/$'B*]R199V^*RW!F}&80>S+^WV./%RI"7$-$X/\Q\ tzdata2006l.tar.gz | ||||||
| 683 | ))BX4%ZAH48%]J@YE"MBU(*FR0_@WKE$PRVQ5D'IYDL | ||||||
| 684 | TXR0-(,"B21"*>2?K;%)/\L?0%0NC)CVQ>S_^4`&@0$ tzdata2006m.tar.gz | ||||||
| 685 | `'23S4..:P#XN`.NP`&;J*MWI9?#@ZL7X"+\2`%$< | ||||||
| 686 | N?4]H.GN8GSX}'"$}I:^%_IPB))NBY>'(8&`Z5)%4:H tzdata2006n.tar.gz | ||||||
| 687 | K+<3?XER_(}[>]6#526UK6}_WN>&L1Q | ||||||
| 688 | R];IVH,&&;[2)^I0-X4B4G>*[8KE&UXQM+TX[1&H^-X tzdata2006o.tar.gz | ||||||
| 689 | I%D+W.22&\0QIG".@FHF<.D?<;>+7J>#6XBD#O+;}7D | ||||||
| 690 | GLW:T.")MMDP#2(7+FXZ`$NZ+YMF,/(NUZ&Q<7@\J^8 tzdata2006p.tar.gz | ||||||
| 691 | VM(A'&GIQ11&/R8U^K\72K.[U+_;6*"ETFC_$"(^DK< | ||||||
| 692 | U12QXAJ'R_(+'A87O1/M(!+-X9YS119.KP?:-5H1\-, tzdata2007a.tar.gz | ||||||
| 693 | M/R"1ZYKQQV4HPU&$'Q;>NR/%DEJ8U("5[;(X%3XS?H | ||||||
| 694 | [K)H0,N0_YU@2O,E/O!;%R!ADZT<4#[.[:-JV18N4'\ tzdata2007b.tar.gz | ||||||
| 695 | K!W@Q6:5?201L)>^&3BRIO1:/E]0.-X[E.Y%\:B!<44 | ||||||
| 696 | YZ*Y\L_AL*P0LP5]L2&O&M&X3DHC]!8W9D#1[QF,L#$ tzdata2007c.tar.gz | ||||||
| 697 | J3.L]CD4/E+RQ6J98F)FG((T;TX,CR,/M^!O_Q^^DY8 | ||||||
| 698 | }-P$>19#@2"GF?VH#):^EH2"IQ'\?*C}R'+8M$Q"P%D tzdata2007d.tar.gz | ||||||
| 699 | 5H/->R!8(ITT7_3I@W?)OD2}5U/D"Y2?@)HAC.'ZG:H | ||||||
| 700 | F*+]3$2.5_%BO\X&AOD6$A_C"+:[0}7\,.L_^&D#\XH tzdata2007e.tar.gz | ||||||
| 701 | $K"R<20)>9BS$,9,2CR1Q4]\0(HU"@DD8:R.NXJ8;04 | ||||||
| 702 | 1VT2$+1.@NV,2##L8+O!!&A',T)64U_!\Y3&O"]/NA0 tzdata2007f.tar.gz | ||||||
| 703 | ($AGR}!34DV1ZX8B$}5E*\A]N`Q9&]8ZZ%QIEB$GT7@ | ||||||
| 704 | &,VAF'F2GD_]Y0X,Z: |
||||||
| 705 | -U..)K#H805PX_QP'K+]30<'MVFV<)YO^-1M}!903'X | ||||||
| 706 | LFWCC/"#2V`*4I9BIU#>:!Z?Q\%[3']KVG24E!UWWS< tzdata2007h.tar.gz | ||||||
| 707 | | ||||||
| 708 | K?6SOQV^F#}[GDL"PZ"F_WN4SXO[?`5D"1,Z+X7XUS$ tzdata2007i.tar.gz | ||||||
| 709 | .PF] | ||||||
| 710 | QWK.T8^(DUZMN+FW?K}8VB-12(MWA_?Q.QP_4C%@.VP tzdata2007j.tar.gz | ||||||
| 711 | ?;1\RH&;](C#R5_K]25^N+]}K#%`-'ZCAFY,09_1J/4 | ||||||
| 712 | D@4I;_%FZ/6-U2`;^:[9]Z:` |
||||||
| 713 | V,`!(`:RFB#Z_%/}:R>`P$ZJDA,,$MLB/ZP.#%39/.< | ||||||
| 714 | ,-VZLY`#F1TP?E.`K%<+Q3UVP(5LN4?:I4.;56*.Y0X tzdata2008a.tar.gz | ||||||
| 715 | 6F9W_15TBSC | ||||||
| 716 | MQ\L*+&O,J,AV\L`7`]]+EEDRH:F_R}1+ZR7PZZW(OL tzdata2008b.tar.gz | ||||||
| 717 | TW5^5CWB.3^;HPT<*R_8B??COH:<@CT-?G*D# | ||||||
| 718 | \_6A*GQ3CP"!:S)+MH3(22#1>P}+J106%AP1JD.HI@, tzdata2008c.tar.gz | ||||||
| 719 | #0S*GF+-B;66>."J%7*27?2*!(X7VXA$)6VQ]&$X_-T | ||||||
| 720 | 8Z4KHNK9G+"E5J;/<2D}?FZ2AU^]*.5@;8[-;]R*UW< tzdata2008d.tar.gz | ||||||
| 721 | BK"`9R/&?M[X | ||||||
| 722 | ]1(:HM17MJ%F.:P1(!]U@W)HT#CY3YJ'2-4W6'T7'K4 tzdata2008e.tar.gz | ||||||
| 723 | %PW]-WOQ0N:F`[2J>D%Z!\)[D>#M`G7A4QQ1FH%)\0$ | ||||||
| 724 | M,'BEY5(&(E(%`H'%@+"JEWS@1V'1[94<8C94/<}RK, tzdata2008f.tar.gz | ||||||
| 725 | 3_FR*4O9H?F$_Q$'#_LAX0N'OX/WX22#V&):>$/6QOX | ||||||
| 726 | W6>A)NY\.,_]L- |
||||||
| 727 | XD*$C0^8.Y:$'4CVJ21IN*)QN"L10U;_R35HZZ9PH6H | ||||||
| 728 | >19LX@MU7HT:341).X<_3L,I4 tzdata2008h.tar.gz | ||||||
| 729 | 3.;-)")%M7LOOMM_%382EGGF$SJ@0$H@LIJ#*:P.VT, | ||||||
| 730 | >U<[MXBA_W(``9T>D%2H#1$T27X6GX'+G1H+D@T#A:L tzdata2008i.tar.gz | ||||||
| 731 | L[*C4^I$_$\B1N`Q?1Q')JB"G+LJ<-_WU#/4IG[M:Y` | ||||||
| 732 | [X`L&)P0[;Q | ||||||
| 733 | R\F5HE-G7@6IP<3Y(%?U#_`;NC | ||||||
| 734 | "NF\86`/N!1/$.\0:S@S@?TL_I7TL<-$[E8?.")9IV$ tzdata2009b.tar.gz | ||||||
| 735 | 3.(#+U3]Y:`/L_[)S-J"O)U3IL4QTQ:E)5DX`P;]?2H | ||||||
| 736 | _A$"8W)'#>Q+F87C:C$B82&;F-&3QAS`4\^%?#MWR^P tzdata2009c.tar.gz | ||||||
| 737 | /X?YT@VB];Y&+A$[BK^;^}2_<`NX9ORUS/4IWF.NI10 | ||||||
| 738 | *%Y?"N<@#ML2A#*D'R[^U[*(85[S0J@;PY?@''+]6(( tzdata2009d.tar.gz | ||||||
| 739 | \;OV^R[LDT*[G2+0/.W7P)@TZ11!4J'F*+'FA%RSK9T | ||||||
| 740 | VU]2V#X"9JZX`86*W;<(_LO}\AG0>-}<)PQ:(T7NO28 tzdata2009e.tar.gz | ||||||
| 741 | DV:XP0J_L6X4X.<*O!L+XJTA)Y2EEB;P6Y26;&BP([4 | ||||||
| 742 | N1J+L8}.6(1F |
||||||
| 743 | _W92&R5J-VW2PY8?SA_02'NR0$!5C:I#0W&T_YFPM5P | ||||||
| 744 | M\_3)W][;5BP%)F?<@VSMB1EJ[_*Q9%D;FI&9`,EW?\ tzdata2009g.tar.gz | ||||||
| 745 | T$F#G6L1I[_*&,"[K,UB0XXM_>U8]TS%X,VT9`0CI^0 | ||||||
| 746 | :YP&64E4@(JSDN8MK+GY6I:$Y<01D64W56&HS`[26[0 tzdata2009h.tar.gz | ||||||
| 747 | KMTWX9>_(O+$2'A/!;78] | ||||||
| 748 | -$]:$AN`'4:DNK}6T"-XY:*&N%0%O:]NY[R`4UXJS,P tzdata2009i.tar.gz | ||||||
| 749 | >YE)J*HBK}?$`\\F48Y%@6&ATF5$8-LU&;N8;`\#0SL | ||||||
| 750 | CTEVCPH&:8&V>]ZWKY.H6D!_Z&:[3%B3O;I/KHQ^9X4 tzdata2009j.tar.gz | ||||||
| 751 | \%IK&EO}6:'*Z*BG\9^L",DG(;36}Z_#QE0-V`-4"9X | ||||||
| 752 | PA>,4U`+FMP?GD |
||||||
| 753 | )04'3-X\W5}NB[Z9(1UQ;<^@$%/;>YIC}48&5OR_^#T | ||||||
| 754 | A*"@Z,1VG5#%S;H | ||||||
| 755 | [''#H!7O'OER;7DP*;IUHW | ||||||
| 756 | H[K"*}D"*P,DQ))C,F\^$ZK,(AI8T_0@K0"$92T!_K( tzdata2009m.tar.gz | ||||||
| 757 | /WB&"WM\8`@-)C6?@&M+SNZ(8[\/ZB)>OLB8\_&^3%0 | ||||||
| 758 | 08W!\N,3STG[F$OP)WKUE]/EXA*)_M7]^/;/DXQ`!3\ tzdata2009n.tar.gz | ||||||
| 759 | $^YYF/`,PM40'2#Z9RAE6N<#Y1%Z&%OJAF13E%_-._\ | ||||||
| 760 | @OP0B)LT*M3_1#+6$#XDNF.H"I`B8XJ:M;Q(4BR%4#` tzdata2009o.tar.gz | ||||||
| 761 | Q6Z%Y,[L3OEK9-#}.DFWXPS92RD69L)F}0\}S$5C/L\ | ||||||
| 762 | ^/G9$!_/^L8V#,#$$4CC@*@F5^6JM0[,E}AV"[^T&NP tzdata2009p.tar.gz | ||||||
| 763 | C4D% |
||||||
| 764 | +AO;>S)3G3`>?X:)8M9SA.9S)JDWT-JKPD9>K40MA"$ tzdata2009q.tar.gz | ||||||
| 765 | I@!#C04A`'+9J0GNR.}M`FGM]^#5$02YO#9*!V-J.T` | ||||||
| 766 | '21_WK$R:&Z7;K'A; | ||||||
| 767 | /^!.[I,"Z`EE%9)S6.T:?1V4->L;J;+@L'A'S6KH_%T | ||||||
| 768 | _FJ5_/HR:@-L;}6*JF8B<}!?MDF5[>[E5O6*S"U5&"0 tzdata2009s.tar.gz | ||||||
| 769 | ?UW)-YCO0#RTO3G;)-X'NBW'4A`+DV | ||||||
| 770 | !,KZS9<@)HQ*5!ZKA:J(H-5((C)07GH | ||||||
| 771 | WTDT-TU`,W\+(>J1M<'`V}`)}`:EV,/}N9^[:Q)HE/8 | ||||||
| 772 | LR()WC//2]^-D[/\CHY%4@+F2?:Y!V7K*3FP0@+C5HL tzdata2009u.tar.gz | ||||||
| 773 | @K*:(ZZ;XMZ^F:6.'#HH`C]#,*U | ||||||
| 774 | SC!5JB-/B\539RIIE.H'M$WLC%S}}}+[:PF^JY9M1S8 tzdata2010a.tar.gz | ||||||
| 775 | ^U}H@R(/G9WNOI?KD#D}^N&]IM:$'G>(V*HB_(PQD:< | ||||||
| 776 | \%%`2}1RZ$F`*6@WDO&\[1B6^LZ] | ||||||
| 777 | '[`\)#1HWDF[5#41G?,KIF)}1E:9]Q}N#X&0:X!XYE4 | ||||||
| 778 | X7W;/SDX?QIZ72WN}?LQ45'B2(*R;KMXSZMK"3K3E,L tzdata2010c.tar.gz | ||||||
| 779 | ')J.M``AE98./-?0BV-}S-(D5P1/#BI"5BM0?\*RXI4 | ||||||
| 780 | AN2^OF/V?^"L1JT4F!JI`;,?UV6L-7*)UDR:LRS3J#0 tzdata2010d.tar.gz | ||||||
| 781 | `FZS)XR%Z4Q4^?I]@Z.<4X[#`&]?[G3FPHZ3,[YU0 | ||||||
| 782 | #-N]RGDEJQ^4GCOM)_&YB$.SS?[]IYPN:ZXIF&9VNU` tzdata2010e.tar.gz | ||||||
| 783 | A\0QA`R<4U<66A@S7#>;:2VUSSW,3F_NRZ]UXNF7-7( | ||||||
| 784 | 0E/<0\^[#5%>G8>:A3 | ||||||
| 785 | J`8`S(U/P.>6)?#2Z:FG4'\9.%7U0_GUTEM+5!'@UTD | ||||||
| 786 | 3"B@O | ||||||
| 787 | ]6E:V`GM3`I1MI7.Z3W9C)4X;]AN!S(ZE(\;FQ_-B%T | ||||||
| 788 | 1GY5+RZFUXA-E\>5ZEME[R | ||||||
| 789 | VQ(D85;` | ||||||
| 790 | 50^28+YLV8Z#5S?K^B601P-"`5XL.!,];@5U0K#[B@\ tzdata2010i.tar.gz | ||||||
| 791 | H`K_CX_%MXTZNSF(H^.SM,'%"'\(TWDD9)15' | ||||||
| 792 | $}[5_H/01&BS"A+G,DZ-:*PI_#Z0(Y33(U0V+3>*)_( tzdata2010j.tar.gz | ||||||
| 793 | #QP7FZPF@O\,!,:-$^>(6JP+B3Y'_VF# | ||||||
| 794 | !;E/\'JY>P@!E?%W%1TQ*_;ZA+(PCEJ)-/.6G}^Y:J( tzdata2010k.tar.gz | ||||||
| 795 | (-P#&S5%1?*UHY}D4S5]D-@>N^!$@,D?)#'O}EB?$Z( | ||||||
| 796 | .TE/F(_5UHO(G&OQ4*?@MS;O+-7F":)ADZE]0+8WV(0 tzdata2010l.tar.gz | ||||||
| 797 | %EF^`-J3:,DWYM,C9WAG"@A",.8_[-VU',3*:C+J(Q, | ||||||
| 798 | ZRTEO&!(-B5[7Y9I]9H7&}VBES0<&'2'?'62@.98MG< tzdata2010m.tar.gz | ||||||
| 799 | NOR_E@$3-^K/]KI8I}SR*5S;\^T&Z^7%(YI4%RV@5CP | ||||||
| 800 | KOHD'7VY0_,ME%QYX]\%0;??^GHW,`0WD6(L;>7@KC4 tzdata2010n.tar.gz | ||||||
| 801 | *FC%\!_?:J;%]#$4?*ROIF/+3,[4Z,TW#O9^/*E2ZS4 | ||||||
| 802 | XIR$!#A4REBY"^N)JI7X9,K]8;N.V/!!+AE]W";BT_0 tzdata2010o.tar.gz | ||||||
| 803 | P0^N}X:_[,G}A1M#(17TTAT}UD*RHDU9J8BTX8-8",D | ||||||
| 804 | FH&%S,/KWKZL$2!T-``RZ]J9B*9(2 | ||||||
| 805 | | ||||||
| 806 | S}Z?5-5.S'%X2+5[V4G<:J49D*:P9\YW_)@NX52USFD tzdata2011b.tar.gz | ||||||
| 807 | \EE5?&}^"]R55-(Z^N'UMVV^&M3N`>6 | ||||||
| 808 | ?1L17[Q.O!9F]SZLE,X*3R^--<.QRT6%}FD1^!`47(( tzdata2011c.tar.gz | ||||||
| 809 | LL7. |
||||||
| 810 | +:Z}GT&7"N^?JKYG5[]09`BAQ[M\,Q$?N?GVD>*FG | ||||||
| 811 | 09KW77(UL,X`TIH!-3)*._3PZ.#XZA5599`ZER | ||||||
| 812 | @OJ^90PI:"-)!IN^\N3OP_W#GFDLERD%QTU/ID0$"OT tzdata2011e.tar.gz | ||||||
| 813 | .U_`:AE'1VB3BY2&)9M\6 | ||||||
| 814 | | ||||||
| 815 | Z[7JB).D[/[;2RH,%'O>EJ8'N724Z:)N>OPK0$}#A$$ | ||||||
| 816 | OAGQ;O"S3R9&N);*#-0V5&:V<\SJ?!B/IIAK_Y<5KNX tzdata2011g.tar.gz | ||||||
| 817 | `!@WF*M3/#C1G^8-/L5D"E*WG+R)O8+J:6?9)\@.*C4 | ||||||
| 818 | ]1>W6J}N$>X,D)2Y>W\}0:$D`83?B0!&WH&"W.'K[\$ tzdata2011h.tar.gz | ||||||
| 819 | N._[>U]@<"K#&ZM9N-G.'(2X(NVG7)5D#&8B4I7'$7X | ||||||
| 820 | !JO,PD(^3GRA8K6UP][CRK5&*G2U/]/$,SXMUX2X(_` tzdata2011i.tar.gz | ||||||
| 821 | SALXB\R7^73<)"1'4,O%-Y_EB-YMI$"[%*0-5N90"0( | ||||||
| 822 | 3WC"E)BG}M#7?KOTNP:8YZ<\@@;^%-"[STFSL#+C!$0 tzdata2011j.tar.gz | ||||||
| 823 | <7T^0V1O"_PX;9A3OH>EM;6J%U.;@;ZXQOETND7RL\` | ||||||
| 824 | GX>Z5\H"9VEF(E | ||||||
| 825 | H}+}:-W3@B^4S8%Z/G`G?FZ>-'P2JGB%,]-JT*T#\.P | ||||||
| 826 | .}DE,!UDQJLG@E(2W_T.P#PY1`EN]'DQB!6HX?-BR$$ tzdata2011l.tar.gz | ||||||
| 827 | 33>M+T\MB??:W'"EJ[B\E&_T9H4! | ||||||
| 828 | ^0}U.N`J&XU5Z`T#STPB_*K%Y`.IH[A3440Q(31!Z6, tzdata2011m.tar.gz | ||||||
| 829 | (('Z1/`*SF4Y[,$I;T5/N6NTKZ81%/^\6/1O@N^+HL\ | ||||||
| 830 | HBU^2$5J*34"0SW,RFV2';CW#6QN&*!TF6S^MT4TTM\ tzdata2011n.tar.gz | ||||||
| 831 | W_&7MZYZ($^BQQ;2>M@\#RG[H[WMX`6}!0>M/T$7A)P | ||||||
| 832 | D.5XWUNZ8L.7X7";SAPF."IAL.J |
||||||
| 833 | "//P?@J_}})X(0_)(W-$MF$[:P5;[?ETMU0WOZ%3O:\ | ||||||
| 834 | (X$U2'K-XX\U+E6`6UO)L]N3V<"/VSS[IHLV" | ||||||
| 835 | Q#8P\+\9<[-H(IQXC:D)9}?(L-; | ||||||
| 836 | X>LARN!2@M\NNF[)ID?%/`+]DOZI']7+DX58"#A^4KD tzdata2012c.tar.gz | ||||||
| 837 | `O2N7#IH76B+[<#!<_3NU1?/^`&.'\E.[J__-5R0M`T | ||||||
| 838 | L_FE*)&V:6#.*-XR.NTJ2QENDS\@K[^_/<]X>K#A8?8 tzdata2012d.tar.gz | ||||||
| 839 | 9JM[SW!PH*;9NBQ>^}7`\)DD8OI#H)F8HVR:9`2;$!8 | ||||||
| 840 | 3[:_<]9JM}+[N0X'JEY.8V(A)FIIMUD.S/S6L:S_O9@ tzdata2012e.tar.gz | ||||||
| 841 | N-M3^"EG1RPZH9&@3PJ71SU#,< | ||||||
| 842 | $H61?C];;\>A9J.3<9$V4%`?ZXCK_$"\:F3C.3T.K5T tzdata2012f.tar.gz | ||||||
| 843 | 'Q.A`DU.C+WP8X>M%1X7G+[+"Y7WWW[;P`_47BMV)WH | ||||||
| 844 | I-R0?U"@H;}3@M\&7(I,`"C]LGC2^.O%3O\)XBC->I0 tzdata2012g.tar.gz | ||||||
| 845 | DO'>5<6/;CPQHT/J.9079.PW?6+(?_T_M\*IO\*>:34 | ||||||
| 846 | >Z_)RV-;?(-J_?0H/!$1_Q5#I)RD1$Y?.ZEKH?QPC}< tzdata2012h.tar.gz | ||||||
| 847 | X@^Y"3PCXJ0.L1$+.BGZ);R'"U3.KEO"4]G]&P_H1&L | ||||||
| 848 | WGTHO##WZF^:/\7HZMR>^[MX4<+W#B)J\HTY-)(/?[< tzdata2012i.tar.gz | ||||||
| 849 | F%%;DB:*+N23AO:54A'!2Y_D}&"Z'#[%U@:!L:DT:(P | ||||||
| 850 | />1%+X]U?*.FDDX5>$6%EGQVCGR&OG,#>-`S+"25A/X tzdata2012j.tar.gz | ||||||
| 851 | Q;!R1B&/7#QU&WW<7$[A)T,OP9&'`9,AON_UB5EJZ1P | ||||||
| 852 | 361`"F.VXS7/:C!D.HV | ||||||
| 853 | $C},NF^7[>3`!:ZH$8^N0R6,5,NV_)M:DU | ||||||
| 854 | 74AV&A}HX1)>)_4WOPL3KG#]7)$'W+RPKY)I7Y4][JT tzdata2013b.tar.gz | ||||||
| 855 | GZ_':K,7}G(SF@Z4\`@_`?B571;TF/S3T5Q^+T-O?YT | ||||||
| 856 | FXTC3C6YK/V>I8Y;^NS,HFI8#P28X'1T55R6.S'/;>D tzdata2013c.tar.gz | ||||||
| 857 | W$(@R,(1/8F;B0%6&A,UZTWC&(%B+]>/)'#&)6B>_@@ | ||||||
| 858 | U05UKKDGUHC]721SGQUD(BU`(A"1_R7YK6&F7PR@.}` tzdata2013d.tar.gz | ||||||
| 859 | S;HAB^/6;&6B}T}($JN$J#,'5O84N!9:RS)@$W'H\2@ | ||||||
| 860 | ):IFLK%R;TH;HDL&&+I-8MJ:#'E1249OO563L]*F3(T tzdata2013e.tar.gz | ||||||
| 861 | 2)QCAK.2:\U<)7[[_?Y/QBOO][T##BQH;'WDA7V+BZ$ | ||||||
| 862 | /0E2(UBNW&PR2@W%U$G@V_2.PHFEZ1L | ||||||
| 863 | A!!]INN+O)!CL&Y"+K;O2EE2`YN0M,AO;,;,[+-PT4@ | ||||||
| 864 | +}WXOD |
||||||
| 865 | 3UA.2G%R88+IS"\3NNHO`K%?3%8#65]DDS&*.2"0,'0 | ||||||
| 866 | K0L'.TQOB(NJ,_9(0BH"8`IOV-,T42#T7:#UU44_N-@ tzdata2013h.tar.gz | ||||||
| 867 | 9Y9%@WN4#`U,8\L'#B;`0D8:4@RJ7[X>T2B7IK^UQ$` | ||||||
| 868 | -2U4J>'_N+<)BA#}GB\SSTQOG+"V_(3`W\.)A0'.0(( tzdata2013i.tar.gz | ||||||
| 869 | D4DZ7JA;XMMC-,<}}"Y)#A"8EMXHL(]J}OILTPP#[;@ | ||||||
| 870 | M%PNU,JR5$9/'E6:KR*Q4S]K-8)QCU84(107B$;-6I8 tzdata2014a.tar.gz | ||||||
| 871 | CTB$PE}JN1W@8NUB}X&+(@[D/ZR^5R'U'3.IG]Y;/BD | ||||||
| 872 | F3;I35>68MV!,'89GOHTC8\F__'`:Y(%6P[[J8P.TB8 tzdata2014b.tar.gz | ||||||
| 873 | IO2M/Y48J.0*HQF2:NE!3,RDQ`C81N/0`"2#E9RU#}8 | ||||||
| 874 | XS8Z>HPY\^<&WVSD1D^*9NYK36\X?L`+!JLU1QP$V[< tzdata2014c.tar.gz | ||||||
| 875 | 47E*HK`/$27UHF?[C?[]!}^26B.+\Q}#`"S'-GH]*[( | ||||||
| 876 | P |
||||||
| 877 | H`<;@0%/2H(RDU0A,.VW | ||||||
| 878 | ?%#D^CGON/!*BOC<5"?VRB"XHNE.4E(]P2A49@KP:+` tzdata2014e.tar.gz | ||||||
| 879 | J',G03SUWN4;1SEJ2)2WTO#EX!2CW_3W&ZJJ\.QG'NL | ||||||
| 880 | _KIF2Q"-(<^Y}U3ZQC`;@G1-E5$CS?D"%GA[W)L11CH tzdata2014f.tar.gz | ||||||
| 881 | \!GWNBM5C2ZDA7IJGX:A:Z[W)>/PN#U3[`W#,"TM'HX | ||||||
| 882 | IVE7UO$*5&/4O0.OW.LH2!'4X96#L,+_@3PC;P}?)8X tzdata2014g.tar.gz | ||||||
| 883 | MT&!*_IV9H5`<_FN[Z1V3@EQI | ||||||
| 884 | _^:"BX,'F6:3]U4>->X_Q#-,-A'K?^R;4I"K[<@W@]` tzdata2014h.tar.gz | ||||||
| 885 | V(DW`\Z_HS | ||||||
| 886 | V#Y.$UGNPZ}RBTZ__23I$A%ZP?}"6A4,K4TSX@`SQ`X tzdata2014i.tar.gz | ||||||
| 887 | 3"EYOCJ6^1^%}C!.R075<;<]\(0L@P#!US%X&;1:L^( | ||||||
| 888 | F4CMD1JB9;$J2M6'U | ||||||
| 889 | _S;^M# |
||||||
| 890 | BT$QKW7D0+1&<0G)[;H3XEW:]P'R_.NRHEBTK)M7*3P tzdata2015a.tar.gz | ||||||
| 891 | }G>"N'YBJ/>DV\KEE}%J5!E\G@3*ETUP%M$?D.NO)3< | ||||||
| 892 | N`31$?($KY!2QHU&<*_@KPKYY;%0AGHU?\&9NU03:-` tzdata2015b.tar.gz | ||||||
| 893 | RHG"!!R$(.>Q5&8.(G(1M@NB#HUPMH<+7`H4F#C%B-$ | ||||||
| 894 | ,&4@*Q)FQ9RO(JF}\CA]J5K`0$FY[+>3G-0&Q_`'ISX tzdata2015c.tar.gz | ||||||
| 895 | -[6J/%X-8!R+(/K`C7)GPYBH-N09#OA6)}7H:H!KH;H | ||||||
| 896 | SK(Q6Z@:FFR%3JY/SD#IR/D,]:VMX_2*U$/W?"(}B8, tzdata2015d.tar.gz | ||||||
| 897 | ADF!D*(,7&>">J}??IQJIL&}6*B*<$) | ||||||
| 898 | .&ZRAG^D5?S\WMQJ$%K7#[O"?'I8I1O2'7:A-9@\X tzdata2015e.tar.gz | ||||||
| 899 | V&YLGDQMG-7>,'8G(]>I"L:7_NMMT?!&2?:C7DX}QC@ | ||||||
| 900 | )APR!FVTKJ^G9ZPSG,T0##C}X$3.K}8>E | ||||||
| 901 | K7W@X^AU.&'28/#\O+RC)U%J3<@F]V63<*?[EYYA5/$ | ||||||
| 902 | HFLCTF":SVX7D,C%G:"W;$+TJ4OS84"<%VJ/^F^'D tzdata2015g.tar.gz | ||||||
| 903 | FJ7V&G.OI0<-^QT9@I1})HZH(59CT,U90A90"O\4>7X | ||||||
| 904 | I5D | ||||||
| 905 | ;3`A6Z,HFEN%IC+6-;}J5,/`C9?D)M:]B?@\3OTE+D, | ||||||
| 906 | E963LAS*G2L87SA%-8D(E&S#"#9:S+[I3Q)JTP5\^#@ tzdata2016b.tar.gz | ||||||
| 907 | `^JW?(LQ}MH}T7T}D&*Q40-K`}(D\>2V#S2BVVB9%00 | ||||||
| 908 | ,?-/39\Y929(JN.E4R;];X76WN_C\GLVZNV>\Y[3]3P tzdata2016c.tar.gz | ||||||
| 909 | \;ZQ>3Q,?1CRVMKTJ2BQ1V]FM`"]H,A[!A5<#}'$M*( | ||||||
| 910 | :[+S?<%Z-G:BN^G!YQI}BR>A<<>7J&1DL+P-$ZO[+YD tzdata2016d.tar.gz | ||||||
| 911 | VLX/;\AZ | ||||||
| 912 | ]W9G;%1\0O%-[G\>CBA | ||||||
| 913 | !'+Y46ML/8/`I}"5.E4U],2-FY%QX27U*!B-K%$O-58 | ||||||
| 914 | O!@%MP*<3T9Z$BR\X;ZTZ`3}2N8[)9E2WCNR%_CHE!T tzdata2016f.tar.gz | ||||||
| 915 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
| 916 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata93.tar.Z | ||||||
| 917 | B_U+6HPPV]^'/H7%1Y#W+[(}KPGP'Q |
||||||
| 918 | 61A5*V'*IGK<6CP}T2["&>62E?G'%IUXHG;C39(_:$\ tzdata93b.tar.Z | ||||||
| 919 | $^<@A"D*D:!U".7!7?Z1K. | ||||||
| 920 | K2E>KRL!V.9]N3WP$M>`*0:V'X<[)\(:L?4]L]6"4YD tzdata93c.tar.Z | ||||||
| 921 | F!]4&XCG:R-_O+ZK$MR?28(NFZ0Q.J6[1*A8>,}D\#\ | ||||||
| 922 | G}?XMB,""B8"7.$MC3Q_D1X8&OXI]DNMTI@(`C5$':$ tzdata93d.tar.Z | ||||||
| 923 | L4AXY>[::W7`
| ||||||
| 924 | *3`>N%_X8'>@?6}L13GJ/NB50G"0FS} | ||||||
| 925 | T.LMG-V:2Y"G??QG72'P5>%G@-XUJ?.]F8>}!IG[V)< | ||||||
| 926 | -V/('@H\4`DWY;UM"&}$J,SDDHS@DD_-Y\!!,$WP";< tzdata93f.tar.Z | ||||||
| 927 | V/,C#A;3+F%HL-$&KF0W$K^`B+LK6/"XWQ8YJR]!>AD | ||||||
| 928 | _[WT"BS['40P#PD>P3ZM"'$\+WF-?6[*U'\N;9B1H2$ tzdata93g.tar.gz | ||||||
| 929 | TWT\F"YH+HL1\6L%(.\)2XAPG#J0W5EPD1W>TTQ@&64 | ||||||
| 930 | Q#I"WP\@Z48F5`:#C9ZB |
||||||
| 931 | V3X"B/MQ>V+Z^P]\LRGIZ0@AZSG&8HBIR@$K6"RT7F8 | ||||||
| 932 | H?:Y(+Z!6_-MZ!_MY@%0O6W,A-R>$/PYP}\*'2WQ>U0 tzdata94b.tar.gz | ||||||
| 933 | 4Q5*'`0U7[8T'PB!ZK0TLQF |
||||||
| 934 | HJI9PL[@OZ(PACO-DE%D9+P>IP27ZT[ADI^A*&.`[;$ tzdata94d.tar.gz | ||||||
| 935 | !&26XQE}R73F;Z+N^EZ6[ | ||||||
| 936 | %JRW?E*V"8ZL?">,+<9-46(2(O]QPH}2\7O1_B0CZH8 tzdata94e.tar.gz | ||||||
| 937 | N@[B'6*E*#`_S?V\9H'@KCL/-"X2@-_T4BB_$ZF92LD | ||||||
| 938 | &E_U6&'R'G;/96WT<%@}>B>}9P)E-$WF2Q$U*^NV^W0 tzdata94f.tar.gz | ||||||
| 939 | \S"*"*"]S*(4J*?0`!?JK*J3VB$K>:H'*3I+B2,/,/< | ||||||
| 940 | \HFZD[/9S\^0"^>;YX:}VM'@6V'<+G'?3T7B@8"GI>, tzdata94h.tar.gz | ||||||
| 941 | Q%}QNT@"/22*!A*Q_N8:89!B2}R | ||||||
| 942 | :P0'8'B\L@YW5TA?5N&;&5/`2G)D\YU:#4&VFSNG0I$ tzdata95b.tar.gz | ||||||
| 943 | 58M_*[QVF[$TIHIH]T&/II@8'3,X;8**ZGC;C}V5ZB\ | ||||||
| 944 | ?D))*MLAA1MG/.YBV8\:4GE'D/\[NY9]L<9}<9'NE3H tzdata95c.tar.gz | ||||||
| 945 | KQ<*10('\BR:?)GP?@4JIXCD:I8('8Y2^&84UZ&7FY, | ||||||
| 946 | >N_$OG\/G)DD.[J#[^0[C*%&LV5,(`R^-[?M;@JCS\( tzdata95d.tar.gz | ||||||
| 947 | /6U6ZXX(+>?\U03Z9}:-7"!L^>MEIK7)'9C5HH(WSW` | ||||||
| 948 | UK10ZN/RN8-;Y,;"E1"1#PGX&0HM]PDH | ||||||
| 949 | H"&BY$<4KZ7!71S&04)J#\'6]&82]AQKAB68P6\*0*P | ||||||
| 950 | <[D\C}_8PJ&_MSU"^[@H?-52}C5V]TDBRLH7X>J/U#, tzdata95f.tar.gz | ||||||
| 951 | G/2,5}W49@O:M}9(A#N3FT6-<**<")+G.<9@Y!;V!B\ | ||||||
| 952 | -ENM9%.#MB3?+1&68?/K//E7ZH^CUN<4B45(LNG5;?\ tzdata95g.tar.gz | ||||||
| 953 | L9}F1W`&)"$P@T&SBE2T*DFK.;&8>,M/"-BS:YD:#`0 | ||||||
| 954 | E@B_'/TXJ);[-4/'>CZG&EM;@$M_E2>'CHQC:?/QMWX tzdata95h.tar.gz | ||||||
| 955 | /U5IZ<;%-%/U0<3P^3(5M2BVT7\ | ||||||
| 956 | S(-M | ||||||
| 957 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
| 958 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata95j.tar.gz | ||||||
| 959 | R$]+?^89IS3!}FN8+,S!&,H8(S>I#C45MES$S#KX^%\ | ||||||
| 960 | :Y/7DH,A]95[+ZA9O#]&Y&BMV]"37)%(N/Y9G%0EV}L tzdata95k.tar.gz | ||||||
| 961 | G8T8F^UF`0M!R6LW3KR;}+^&G^KKZI4P,.]#D$5]6X@ | ||||||
| 962 | 2%^`'Y'VSV0/<<&?3W9074X%$*9:<^(#2*]S8UI>&7X tzdata95l.tar.gz | ||||||
| 963 | 'F$H':/>%]H>`OD"!3N.:6\\,V}IO.@&`3:I!2N:H`D | ||||||
| 964 | '7_ |
||||||
| 965 | &.W1T1O<\(IUQ$;3%]#N5OR4%2CBS((Q+%2W9WBA)RT | ||||||
| 966 | H2",;_G2S,IK6S/:9Z@5SQOC>35#};%\H0\(QZX3E7X tzdata96a.tar.gz | ||||||
| 967 | ;[5--'"@UVZ<6_7R2'69K9]LI^_NKK$Z7'?[?D)J"0\ | ||||||
| 968 | IYG-A$2V]JTJ4^.199<0M86/'#2_%F.1!&%}4A"?2Z$ tzdata96b.tar.gz | ||||||
| 969 | OH08*[]G6C7"1+()`Y$>W6}4}_>*A^}:;F]>^R!9^I( | ||||||
| 970 | $A'.>.)S}"N^:S}Z:/00BM8'90_MHJ*D^QIAYVV_;3\ tzdata96c.tar.gz | ||||||
| 971 | QB,?UNF6I/Y3#3+;P6.>6-@H_"Y*]/#4`;>CW_I<:SH | ||||||
| 972 | %M}$M):,^\^?Z[4,;_JH>SN+#H_<5,}^*!"H+XEEA`D tzdata96d.tar.gz | ||||||
| 973 | #O,UW,"*#<15#()N,GQC_/Y9O/L` | ||||||
| 974 | :2-JT#KZI0FJP-.LLXC#CW\!%L-U*C?>J*:@8K,)V>@ tzdata96e.tar.gz | ||||||
| 975 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
| 976 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata96f.tar.gz | ||||||
| 977 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||||
| 978 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tzdata96g.tar.gz | ||||||
| 979 | ._'Q1`S6W[R?9_ZX1*JPC\TW,O5CW^DE"%YZ`6,:]/T | ||||||
| 980 | "+M_K7?DY5;W//<.`D}"/V;Z7_.??E\559ME4;1+(WH tzdata96h.tar.gz | ||||||
| 981 | ^5CS5<:'C?A'@"FA&EC'UJUN.,MD?Z5WP;A@ZA(/RG4 | ||||||
| 982 | FW'}]S6G:+FDJ"QZJ<}/0FC[RY^?ZQGKXY8OWE&P3%T tzdata96i.tar.gz | ||||||
| 983 | FD'\3M:VB7HFI+JI;(LKG^FYW6@W)IW'1+S-I-E)944 | ||||||
| 984 | '99V)&RW@>Z!4WB6N[`2!I64*`#DIN.?VO9P!2JAG>$ tzdata96k.tar.gz | ||||||
| 985 | ?&*!2]H`X6N>54;SG#YC#IF&4**`'5NIX4EV*%E>(2` | ||||||
| 986 | 6:CTF"UF/}I<`(QMUXUB | ||||||
| 987 | HASHES | ||||||
| 988 | |||||||
| 989 | sub _verify_sha512($$$) { | ||||||
| 990 | 0 | 0 | my($self, $localname, $canonname) = @_; | ||||
| 991 | 0 | 0 | unless(ref $archive_hash) { | ||||
| 992 | 0 | pos($archive_hash) = 0; | |||||
| 993 | 0 | my %ah; | |||||
| 994 | 0 | until($archive_hash =~ /\G\z/gc) { | |||||
| 995 | 0 | 0 | if($archive_hash =~ /\G([!-`\}]{43})\n([!-`\}]{43}) | ||||
| 0 | |||||||
| 996 | \ ([!-~]+)\n/xgc) { | ||||||
| 997 | 0 | my($h0, $h1, $name) = ($1, $2, $3); | |||||
| 998 | 0 | tr/}/=/ foreach $h0, $h1; | |||||
| 999 | 0 | $ah{$name} = unpack("u", "\@$h0`\n"). | |||||
| 1000 | unpack("u", "\@$h1`\n"); | ||||||
| 1001 | } elsif($archive_hash =~ /\G\~{43}\n\~{43} | ||||||
| 1002 | \ ([!-~]+)\n/xgc) { | ||||||
| 1003 | 0 | $ah{$1} = ""; | |||||
| 1004 | 0 | } else { die } | |||||
| 1005 | } | ||||||
| 1006 | 0 | $archive_hash = \%ah; | |||||
| 1007 | } | ||||||
| 1008 | 0 | my $rh = $archive_hash->{$canonname}; | |||||
| 1009 | 0 | 0 | defined $rh or die "attempt to check SHA-512 of unknown file\n"; | ||||
| 1010 | 0 | 0 | if($rh ne "") { | ||||
| 1011 | my $ch = filter("", "sha512sum", | ||||||
| 1012 | 0 | $self->{top_dir}."/".$localname); | |||||
| 1013 | 0 | 0 | $ch =~ /\A([0-9a-f]{128})\ +[!-~]+\n\z/ | ||||
| 1014 | or die "bizarre output from sha512sum\n"; | ||||||
| 1015 | 0 | 0 | pack("H*", $1) eq $rh or die "SHA-512 hash mismatch\n"; | ||||
| 1016 | } | ||||||
| 1017 | } | ||||||
| 1018 | |||||||
| 1019 | sub _init_ftp($$) { | ||||||
| 1020 | 0 | 0 | my($self, $hostname) = @_; | ||||
| 1021 | 0 | $self->{ftp_hostname} = $hostname; | |||||
| 1022 | 0 | 0 | $self->{ftp} = Net::FTP->new($hostname) | ||||
| 1023 | or die "FTP error on $hostname: $@\n"; | ||||||
| 1024 | } | ||||||
| 1025 | |||||||
| 1026 | sub _ftp_op($$@) { | ||||||
| 1027 | 0 | 0 | my($self, $method, @args) = @_; | ||||
| 1028 | $self->{ftp}->$method(@args) | ||||||
| 1029 | 0 | or die "FTP error on @{[$self->{ftp_hostname}]}: ". | |||||
| 1030 | 0 | 0 | $self->{ftp}->message; | ||||
| 1031 | } | ||||||
| 1032 | |||||||
| 1033 | sub _ftp_login($$$) { | ||||||
| 1034 | 0 | 0 | my($self, $hostname, $dirarray) = @_; | ||||
| 1035 | 0 | _init_ftp($self, $hostname); | |||||
| 1036 | 0 | _ftp_op($self, "login", "anonymous","-anonymous\@"); | |||||
| 1037 | 0 | _ftp_op($self, "binary"); | |||||
| 1038 | 0 | _ftp_op($self, "cwd", $_) foreach @$dirarray; | |||||
| 1039 | } | ||||||
| 1040 | |||||||
| 1041 | sub _ensure_ftp($) { | ||||||
| 1042 | 0 | 0 | my($self) = @_; | ||||
| 1043 | 0 | 0 | unless($self->{ftp}) { | ||||
| 1044 | # Always use IANA master. Could possibly look at mirrors, | ||||||
| 1045 | # but the IANA site is probably reliable enough. | ||||||
| 1046 | 0 | _ftp_login($self, "ftp.iana.org", ["tz", "releases"]); | |||||
| 1047 | } | ||||||
| 1048 | } | ||||||
| 1049 | |||||||
| 1050 | sub _cmp_version($$) { | ||||||
| 1051 | 0 | 0 | my($a, $b) = @_; | ||||
| 1052 | 0 | 0 | $a = "19".$a if $a =~ /\A[0-9]{2}(?:[a-z][23]?)?\z/; | ||||
| 1053 | 0 | 0 | $b = "19".$b if $b =~ /\A[0-9]{2}(?:[a-z][23]?)?\z/; | ||||
| 1054 | 0 | return $a cmp $b; | |||||
| 1055 | } | ||||||
| 1056 | |||||||
| 1057 | 0 | 0 | sub _ge_version($$) { _cmp_version($_[0], $_[1]) >= 0 } | ||||
| 1058 | |||||||
| 1059 | my $split_rels = q( | ||||||
| 1060 | 93 AA -b cc dd ee ff gg | ||||||
| 1061 | 94 -a bb c- dd e- f- g- -e -f hh | ||||||
| 1062 | 95 bb c- -c -d -e -f -g d- -h -i e- fj gk hl im | ||||||
| 1063 | 96 aa b- c- -b dc e- -d -e -f fg -h g- h- -i i- j- kk l- | ||||||
| 1064 | 1996 ml -m n- on | ||||||
| 1065 | 1997 aa bb -c cd de ef fg gh -i hj ik | ||||||
| 1066 | 1998 aa bb cc dd ee f- -f -g gh hi | ||||||
| 1067 | 1999 aa bb cc dd ee ff gg -h hi ij | ||||||
| 1068 | 2000 aa bb cc -d d- ee ff gg hh | ||||||
| 1069 | 2001 aa bb cc dd | ||||||
| 1070 | 2002 aa bb cc dd | ||||||
| 1071 | 2003 aa bb cc dd ee | ||||||
| 1072 | 2004 aa bb c- -d d- ee f- gg h- i- | ||||||
| 1073 | 2005 aa bb cc d- ee ff gg hh -i jj kk ll mm nn oo pp qq rr | ||||||
| 1074 | 2006 aa bb cc dd ee ff gg h- i- jj kk -l mm nn oo pp | ||||||
| 1075 | 2007 aa bb cc dd ee ff gg hh -i jj kk | ||||||
| 1076 | 2008 aa -b -c -d ee -f gg hh -i | ||||||
| 1077 | 2009 aa bb -c dd ee -f -g hh ii -j kk -l -m -n -o -p qq rr -s tt -u | ||||||
| 1078 | 2010 -a -b a- cc -d -e ff -g -h -i jj kk ll mm nn -o | ||||||
| 1079 | 2011 aa bb cc dd ee -f gg -h ii -j -k -l -m -n | ||||||
| 1080 | 2012 aa bb -c cd ee ff gg hh ii jj | ||||||
| 1081 | 2013 aa bb cc dd ee ff gg hh ii | ||||||
| 1082 | 2014 aa bb cc dd ee ff gg hh ii jj | ||||||
| 1083 | 2015 aa bb cc dd ee ff gg | ||||||
| 1084 | 2016 aa bb cc dd ee ff | ||||||
| 1085 | ); | ||||||
| 1086 | sub _split_rel_versions($) { | ||||||
| 1087 | 0 | 0 | my($version) = @_; | ||||
| 1088 | 0 | 0 | unless(ref $split_rels) { | ||||
| 1089 | 0 | my(%sr, $year, $cver, $dver, $lastver, $lastnum); | |||||
| 1090 | 0 | $lastver = ""; | |||||
| 1091 | 0 | foreach(split(" ", $split_rels)) { | |||||
| 1092 | 0 | 0 | if(/\A[0-9]/) { | ||||
| 1093 | 0 | $year = $_; | |||||
| 1094 | } else { | ||||||
| 1095 | 0 | my($cl, $dl) = (/\A(.)(.)\z/s); | |||||
| 1096 | 0 | 0 | $cver = $year.($cl eq "A" ? "" : $cl) | ||||
| 0 | |||||||
| 1097 | unless $cl eq "-"; | ||||||
| 1098 | 0 | 0 | $dver = $year.($dl eq "A" ? "" : $dl) | ||||
| 0 | |||||||
| 1099 | unless $dl eq "-"; | ||||||
| 1100 | 0 | 0 | my $ver = _ge_version($cver, $dver) ? | ||||
| 1101 | $cver : $dver; | ||||||
| 1102 | 0 | 0 | if($ver eq $lastver) { | ||||
| 1103 | 0 | $lastnum++; | |||||
| 1104 | 0 | $ver .= $lastnum; | |||||
| 1105 | } else { | ||||||
| 1106 | 0 | $lastver = $ver; | |||||
| 1107 | 0 | $lastnum = 1; | |||||
| 1108 | } | ||||||
| 1109 | 0 | $sr{$ver} = [ $cver, $dver ]; | |||||
| 1110 | } | ||||||
| 1111 | } | ||||||
| 1112 | 0 | $split_rels = \%sr; | |||||
| 1113 | } | ||||||
| 1114 | 0 | my $cdv = $split_rels->{$version}; | |||||
| 1115 | 0 | 0 | defined $cdv or die "no such Olson DB version `$version'\n"; | ||||
| 1116 | 0 | return $cdv; | |||||
| 1117 | } | ||||||
| 1118 | |||||||
| 1119 | sub _latest_version($) { | ||||||
| 1120 | 0 | 0 | my($self) = @_; | ||||
| 1121 | 0 | my $latest; | |||||
| 1122 | 0 | _ensure_ftp($self); | |||||
| 1123 | 0 | foreach(@{ | |||||
| 1124 | 0 | _ftp_op($self, "ls", "tzdb-[0-9][0-9][0-9][0-9][a-z].tar.lz") | |||||
| 1125 | }) { | ||||||
| 1126 | 0 | 0 | if(m#(?:\A|/)tzdb-([0-9]{4}[a-z])\.tar\.lz\z#) { | ||||
| 1127 | 0 | 0 | next unless _ge_version($1, "2016g"); | ||||
| 1128 | 0 | 0 | 0 | $latest = $1 | |||
| 1129 | if !defined($latest) || | ||||||
| 1130 | _ge_version($1, $latest); | ||||||
| 1131 | } | ||||||
| 1132 | } | ||||||
| 1133 | 0 | 0 | unless(defined $latest) { | ||||
| 1134 | 0 | die "no current timezone database found on ". | |||||
| 1135 | 0 | "@{[$self->{ftp_hostname}]}\n"; | |||||
| 1136 | } | ||||||
| 1137 | 0 | return $latest; | |||||
| 1138 | } | ||||||
| 1139 | |||||||
| 1140 | =head1 CLASS METHODS | ||||||
| 1141 | |||||||
| 1142 | =over | ||||||
| 1143 | |||||||
| 1144 | =item Time::OlsonTZ::Download->latest_version | ||||||
| 1145 | |||||||
| 1146 | Returns the version number of the latest available version of the Olson | ||||||
| 1147 | timezone database. This requires consulting the repository, but is much | ||||||
| 1148 | cheaper than actually downloading the database. | ||||||
| 1149 | |||||||
| 1150 | =cut | ||||||
| 1151 | |||||||
| 1152 | sub latest_version { | ||||||
| 1153 | 0 | 0 | 1 | my($class) = @_; | |||
| 1154 | 0 | 0 | croak "@{[__PACKAGE__]}->latest_version not called as a class method" | ||||
| 0 | |||||||
| 1155 | unless is_string($class); | ||||||
| 1156 | 0 | return _latest_version({}); | |||||
| 1157 | } | ||||||
| 1158 | |||||||
| 1159 | =back | ||||||
| 1160 | |||||||
| 1161 | =cut | ||||||
| 1162 | |||||||
| 1163 | sub DESTROY { | ||||||
| 1164 | 0 | 0 | my($self) = @_; | ||||
| 1165 | 0 | local($., $@, $!, $^E, $?); | |||||
| 1166 | 0 | 0 | rmtree($self->{top_dir}, 0, 0) if exists $self->{top_dir}; | ||||
| 1167 | } | ||||||
| 1168 | |||||||
| 1169 | =head1 CONSTRUCTORS | ||||||
| 1170 | |||||||
| 1171 | =over | ||||||
| 1172 | |||||||
| 1173 | =item Time::OlsonTZ::Download->new([VERSION]) | ||||||
| 1174 | |||||||
| 1175 | Downloads a copy of the source of the Olson database, and returns an | ||||||
| 1176 | object representing that copy. | ||||||
| 1177 | |||||||
| 1178 | I |
||||||
| 1179 | the database is to be downloaded. If not supplied, the latest available | ||||||
| 1180 | version will be downloaded. Version numbers for the Olson database | ||||||
| 1181 | currently consist of a year number and a lowercase letter, such as | ||||||
| 1182 | "C<2010k>". The letter advances with each release in a year. | ||||||
| 1183 | |||||||
| 1184 | Historical vesrions make the version numbers a bit more complicated. | ||||||
| 1185 | Prior to late 1996 the century portion of the year number was omitted, | ||||||
| 1186 | giving version numbers such as "C<96g>". Prior to 1994 the first release | ||||||
| 1187 | of each year omitted the letter "C", giving version numbers such as | ||||||
| 1188 | "C<93>" (with the second release of the year being "C<93b>"). | ||||||
| 1189 | |||||||
| 1190 | From 1993 to to late 2012 the database was split into `code' and `data' | ||||||
| 1191 | parts that could each be released without releasing a new version of the | ||||||
| 1192 | other part. Each part had its own version number, sometimes advancing | ||||||
| 1193 | independently of each other, and sometimes skipping sequence letters | ||||||
| 1194 | in order to catch up with the other part. Where the two parts of some | ||||||
| 1195 | version of the database have different version numbers, the version | ||||||
| 1196 | number of the database as a whole is whichever part's version number | ||||||
| 1197 | is higher. If this would give two database versions the same number, | ||||||
| 1198 | due to multiple releases of one part happening while the other part has | ||||||
| 1199 | a higher version number, a digit "C<2>" or "C<3>" is appended after the | ||||||
| 1200 | letter to distinguish the second and third such versions. | ||||||
| 1201 | |||||||
| 1202 | This module does not currently support downloading database versions | ||||||
| 1203 | earlier than version 93. One can expect to successfully download most | ||||||
| 1204 | versions from then on, but a handful are missing from the public archive. | ||||||
| 1205 | The public archive is complete from version 2006f onwards. Details of | ||||||
| 1206 | historical version availability may change in future. | ||||||
| 1207 | |||||||
| 1208 | =cut | ||||||
| 1209 | |||||||
| 1210 | sub _download_file($$$$$) { | ||||||
| 1211 | 0 | 0 | my($self, $remote_name, $local_name, $with_sig, $enoent) = @_; | ||||
| 1212 | 0 | my $tdir = $self->{top_dir}; | |||||
| 1213 | 0 | _ensure_ftp($self); | |||||
| 1214 | 0 | 0 | @{$self->_ftp_op("ls", $remote_name)} or $enoent->(); | ||||
| 0 | |||||||
| 1215 | 0 | $self->_ftp_op("get", $remote_name, "$tdir/$local_name"); | |||||
| 1216 | 0 | 0 | if($with_sig) { | ||||
| 1217 | 0 | $self->_ftp_op("get", "$remote_name.asc", | |||||
| 1218 | "$tdir/$local_name.asc"); | ||||||
| 1219 | } | ||||||
| 1220 | } | ||||||
| 1221 | |||||||
| 1222 | sub new { | ||||||
| 1223 | 0 | 0 | 1 | my($class, $version) = @_; | |||
| 1224 | 0 | 0 | 0 | die "malformed Olson version number `$version'\n" | |||
| 0 | |||||||
| 1225 | unless is_undef($version) || | ||||||
| 1226 | (is_string($version) && | ||||||
| 1227 | $version =~ /\A[0-9]{2}(?:[0-9]{2})? | ||||||
| 1228 | (?:[a-z][23]?)?\z/x); | ||||||
| 1229 | 0 | my $self = bless({}, $class); | |||||
| 1230 | 0 | 0 | $version ||= $self->_latest_version; | ||||
| 1231 | 0 | $self->{version} = $version; | |||||
| 1232 | 0 | my $tdir = tempdir(); | |||||
| 1233 | 0 | $self->{top_dir} = $tdir; | |||||
| 1234 | 0 | $self->{olson_dir} = "$tdir/c"; | |||||
| 1235 | 0 | filter("", "mkdir", $self->{olson_dir}); | |||||
| 1236 | 0 | 0 | if(_ge_version($version, "2016g")) { | ||||
| 0 | |||||||
| 1237 | 0 | $self->{code_version} = $version; | |||||
| 1238 | 0 | $self->{data_version} = $version; | |||||
| 1239 | _download_file($self, "tzdb-$version.tar.lz", "tzdb.tar.lz", 1, | ||||||
| 1240 | 0 | 0 | sub () { die "no such Olson DB version `$version'\n" }); | ||||
| 0 | |||||||
| 1241 | 0 | _verify_signature($self, "tzdb.tar.lz"); | |||||
| 1242 | filter("", "tar", "-xO", "--lzip", | ||||||
| 1243 | 0 | 0 | "-f", $self->{top_dir}."/tzdb.tar.lz", | ||||
| 1244 | "tzdb-$version/version") eq "$version\n" | ||||||
| 1245 | or die "tzdb.tar.lz is not the expected version\n"; | ||||||
| 1246 | } elsif(_ge_version($version, "93")) { | ||||||
| 1247 | 0 | my($cver, $dver) = @{_split_rel_versions($version)}; | |||||
| 0 | |||||||
| 1248 | 0 | foreach(["code", $cver], ["data", $dver]) { | |||||
| 1249 | 0 | my($part, $pver) = @$_; | |||||
| 1250 | 0 | $self->{"${part}_version"} = $pver; | |||||
| 1251 | 0 | 0 | my $zext = _ge_version($pver, "93g") ? "gz" : "Z"; | ||||
| 1252 | 0 | my $rname = "tz$part$pver.tar.$zext"; | |||||
| 1253 | 0 | $rname =~ s/\Atz(?=code2006b.tar.gz\z)/tz64/; | |||||
| 1254 | _download_file($self, $rname, "tz$part.tar.gz", 0, | ||||||
| 1255 | sub () { | ||||||
| 1256 | 0 | 0 | die "file $rname is not available on ". | ||||
| 1257 | 0 | "@{[$self->{ftp_hostname}]}\n"; | |||||
| 1258 | 0 | }); | |||||
| 1259 | 0 | _verify_sha512($self, "tz$part.tar.gz", $rname); | |||||
| 1260 | } | ||||||
| 1261 | } else { | ||||||
| 1262 | 0 | die "Olson DB version $version is too early for this module\n"; | |||||
| 1263 | } | ||||||
| 1264 | 0 | delete $self->{ftp}; | |||||
| 1265 | 0 | delete $self->{ftp_hostname}; | |||||
| 1266 | 0 | $self->{downloaded} = 1; | |||||
| 1267 | 0 | return $self; | |||||
| 1268 | } | ||||||
| 1269 | |||||||
| 1270 | =item Time::OlsonTZ::Download->new_from_local_source(ATTR => VALUE, ...) | ||||||
| 1271 | |||||||
| 1272 | Acquires Olson database source locally, without downloading, and returns | ||||||
| 1273 | an object representing a copy of it ready to use like a download. | ||||||
| 1274 | This can be used to work with locally-modified versions of the database. | ||||||
| 1275 | The following attributes may be given: | ||||||
| 1276 | |||||||
| 1277 | =over | ||||||
| 1278 | |||||||
| 1279 | =item B |
||||||
| 1280 | |||||||
| 1281 | Local directory containing Olson source files. Must be supplied. | ||||||
| 1282 | The entire directory will be copied into a temporary location to be | ||||||
| 1283 | worked on. | ||||||
| 1284 | |||||||
| 1285 | =item B |
||||||
| 1286 | |||||||
| 1287 | Olson version number to attribute to the source files. Must be supplied. | ||||||
| 1288 | |||||||
| 1289 | =item B |
||||||
| 1290 | |||||||
| 1291 | =item B |
||||||
| 1292 | |||||||
| 1293 | Olson version number to attribute to the code and data parts of the | ||||||
| 1294 | source files. Both default to the main version number. | ||||||
| 1295 | |||||||
| 1296 | =back | ||||||
| 1297 | |||||||
| 1298 | =cut | ||||||
| 1299 | |||||||
| 1300 | sub new_from_local_source { | ||||||
| 1301 | 0 | 0 | 1 | my $class = shift; | |||
| 1302 | 0 | my $self = bless({}, $class); | |||||
| 1303 | 0 | my $srcdir; | |||||
| 1304 | 0 | while(@_) { | |||||
| 1305 | 0 | my $attr = shift; | |||||
| 1306 | 0 | my $value = shift; | |||||
| 1307 | 0 | 0 | if($attr eq "source_dir") { | ||||
| 0 | |||||||
| 0 | |||||||
| 1308 | 0 | 0 | croak "source directory specified redundantly" | ||||
| 1309 | if defined $srcdir; | ||||||
| 1310 | 0 | 0 | croak "source directory must be a string" | ||||
| 1311 | unless is_string($value); | ||||||
| 1312 | 0 | $srcdir = $value; | |||||
| 1313 | } elsif($attr eq "version") { | ||||||
| 1314 | croak "version specified redundantly" | ||||||
| 1315 | 0 | 0 | if exists $self->{version}; | ||||
| 1316 | 0 | 0 | 0 | die "malformed Olson version number `$value'\n" | |||
| 1317 | unless is_string($value) && | ||||||
| 1318 | $value =~ /\A[0-9]{2}(?:[0-9]{2})? | ||||||
| 1319 | (?:[a-z][23]?)?\z/x; | ||||||
| 1320 | 0 | $self->{version} = $value; | |||||
| 1321 | } elsif($attr =~ /\A(?:code|data)_version\z/) { | ||||||
| 1322 | croak "$attr specified redundantly" | ||||||
| 1323 | 0 | 0 | if exists $self->{$attr}; | ||||
| 1324 | 0 | 0 | 0 | die "malformed Olson part version number `$value'\n" | |||
| 1325 | unless is_string($value) && | ||||||
| 1326 | $value =~ /\A[0-9]{2}(?:[0-9]{2})? | ||||||
| 1327 | [a-z]?\z/x; | ||||||
| 1328 | 0 | $self->{$attr} = $value; | |||||
| 1329 | } else { | ||||||
| 1330 | 0 | croak "unrecognised attribute `$attr'"; | |||||
| 1331 | } | ||||||
| 1332 | } | ||||||
| 1333 | 0 | 0 | croak "source directory not specified" unless defined $srcdir; | ||||
| 1334 | 0 | 0 | croak "version number not specified" unless exists $self->{version}; | ||||
| 1335 | 0 | foreach(qw(code_version data_version)) { | |||||
| 1336 | 0 | 0 | $self->{$_} = $self->{version} unless exists $self->{$_}; | ||||
| 1337 | } | ||||||
| 1338 | 0 | my $tdir = tempdir(); | |||||
| 1339 | 0 | $self->{top_dir} = $tdir; | |||||
| 1340 | 0 | $self->{olson_dir} = "$tdir/c"; | |||||
| 1341 | 0 | 0 | $srcdir = "./$srcdir" unless $srcdir =~ m#\A\.?/#; | ||||
| 1342 | 0 | filter("", "cp", "-pr", $srcdir, $self->{olson_dir}); | |||||
| 1343 | 0 | $self->{downloaded} = 1; | |||||
| 1344 | 0 | $self->{unpacked} = 1; | |||||
| 1345 | 0 | return $self; | |||||
| 1346 | } | ||||||
| 1347 | |||||||
| 1348 | =back | ||||||
| 1349 | |||||||
| 1350 | =head1 METHODS | ||||||
| 1351 | |||||||
| 1352 | =head2 Basic information | ||||||
| 1353 | |||||||
| 1354 | =over | ||||||
| 1355 | |||||||
| 1356 | =item $download->version | ||||||
| 1357 | |||||||
| 1358 | Returns the version number of the database of which a copy is represented | ||||||
| 1359 | by this object. | ||||||
| 1360 | |||||||
| 1361 | The database consists of code and data parts which are updated | ||||||
| 1362 | semi-independently. The latest version of the database as a whole | ||||||
| 1363 | consists of the latest version of the code and the latest version of | ||||||
| 1364 | the data. If both parts are updated at once then they will both get the | ||||||
| 1365 | same version number, and that will be the version number of the database | ||||||
| 1366 | as a whole. However, in general they may be updated at different times, | ||||||
| 1367 | and a single version of the database may be made up of code and data | ||||||
| 1368 | parts that have different version numbers. The version number of the | ||||||
| 1369 | database as a whole will then be the version number of the most recently | ||||||
| 1370 | updated part. | ||||||
| 1371 | |||||||
| 1372 | =cut | ||||||
| 1373 | |||||||
| 1374 | sub version { | ||||||
| 1375 | 0 | 0 | 1 | my($self) = @_; | |||
| 1376 | die "Olson database version not determined\n" | ||||||
| 1377 | 0 | 0 | unless exists $self->{version}; | ||||
| 1378 | 0 | return $self->{version}; | |||||
| 1379 | } | ||||||
| 1380 | |||||||
| 1381 | =item $download->code_version | ||||||
| 1382 | |||||||
| 1383 | Returns the version number of the code part of the database of which a | ||||||
| 1384 | copy is represented by this object. | ||||||
| 1385 | |||||||
| 1386 | =cut | ||||||
| 1387 | |||||||
| 1388 | sub code_version { | ||||||
| 1389 | 0 | 0 | 1 | my($self) = @_; | |||
| 1390 | die "Olson database code version not determined\n" | ||||||
| 1391 | 0 | 0 | unless exists $self->{code_version}; | ||||
| 1392 | 0 | return $self->{code_version}; | |||||
| 1393 | } | ||||||
| 1394 | |||||||
| 1395 | =item $download->data_version | ||||||
| 1396 | |||||||
| 1397 | Returns the version number of the data part of the database of which a | ||||||
| 1398 | copy is represented by this object. | ||||||
| 1399 | |||||||
| 1400 | =cut | ||||||
| 1401 | |||||||
| 1402 | sub data_version { | ||||||
| 1403 | 0 | 0 | 1 | my($self) = @_; | |||
| 1404 | die "Olson database data version not determined\n" | ||||||
| 1405 | 0 | 0 | unless exists $self->{data_version}; | ||||
| 1406 | 0 | return $self->{data_version}; | |||||
| 1407 | } | ||||||
| 1408 | |||||||
| 1409 | =item $download->dir | ||||||
| 1410 | |||||||
| 1411 | Returns the pathname of the directory in which the files of this download | ||||||
| 1412 | are located. With this method, there is no guarantee of particular | ||||||
| 1413 | files being available in the directory; see other directory-related | ||||||
| 1414 | methods below that establish particular directory contents. | ||||||
| 1415 | |||||||
| 1416 | The directory does not move during the lifetime of the download object: | ||||||
| 1417 | this method will always return the same pathname. The directory and | ||||||
| 1418 | all of its contents, including subdirectories, will be automatically | ||||||
| 1419 | deleted when this object is destroyed. This will be when the main | ||||||
| 1420 | program terminates, if it is not otherwise destroyed. Any files that | ||||||
| 1421 | it is desired to keep must be copied to a permanent location. | ||||||
| 1422 | |||||||
| 1423 | =cut | ||||||
| 1424 | |||||||
| 1425 | sub dir { | ||||||
| 1426 | 0 | 0 | 1 | my($self) = @_; | |||
| 1427 | die "download directory not created\n" | ||||||
| 1428 | 0 | 0 | unless exists $self->{olson_dir}; | ||||
| 1429 | 0 | return $self->{olson_dir}; | |||||
| 1430 | } | ||||||
| 1431 | |||||||
| 1432 | sub _ensure_downloaded { | ||||||
| 1433 | 0 | 0 | my($self) = @_; | ||||
| 1434 | die "can't use download because downloading failed\n" | ||||||
| 1435 | 0 | 0 | unless $self->{downloaded}; | ||||
| 1436 | } | ||||||
| 1437 | |||||||
| 1438 | sub _ensure_unpacked { | ||||||
| 1439 | 0 | 0 | my($self) = @_; | ||||
| 1440 | 0 | 0 | unless($self->{unpacked}) { | ||||
| 1441 | 0 | $self->_ensure_downloaded; | |||||
| 1442 | 0 | 0 | if(_ge_version($self->{version}, "2016g")) { | ||||
| 1443 | filter("", "tar", "-C", $self->dir, | ||||||
| 1444 | "-x", "--strip-components=1", "--lzip", | ||||||
| 1445 | 0 | "-f", $self->{top_dir}."/tzdb.tar.lz"); | |||||
| 1446 | } else { | ||||||
| 1447 | 0 | foreach my $part (qw(tzcode tzdata)) { | |||||
| 1448 | filter("", "tar", "-C", $self->dir, | ||||||
| 1449 | "-x", "--gzip", | ||||||
| 1450 | 0 | "-f", $self->{top_dir}."/$part.tar.gz"); | |||||
| 1451 | } | ||||||
| 1452 | } | ||||||
| 1453 | 0 | $self->{unpacked} = 1; | |||||
| 1454 | } | ||||||
| 1455 | } | ||||||
| 1456 | |||||||
| 1457 | =item $download->unpacked_dir | ||||||
| 1458 | |||||||
| 1459 | Returns the pathname of the directory in which the downloaded source | ||||||
| 1460 | files have been unpacked. This is the local temporary directory used | ||||||
| 1461 | by this download. This method will unpack the files there if they have | ||||||
| 1462 | not already been unpacked. | ||||||
| 1463 | |||||||
| 1464 | =cut | ||||||
| 1465 | |||||||
| 1466 | sub unpacked_dir { | ||||||
| 1467 | 0 | 0 | 1 | my($self) = @_; | |||
| 1468 | 0 | $self->_ensure_unpacked; | |||||
| 1469 | 0 | return $self->dir; | |||||
| 1470 | } | ||||||
| 1471 | |||||||
| 1472 | =back | ||||||
| 1473 | |||||||
| 1474 | =head2 Zone metadata | ||||||
| 1475 | |||||||
| 1476 | =over | ||||||
| 1477 | |||||||
| 1478 | =cut | ||||||
| 1479 | |||||||
| 1480 | sub _ensure_canonnames_and_rawlinks { | ||||||
| 1481 | 0 | 0 | my($self) = @_; | ||||
| 1482 | 0 | 0 | unless(exists $self->{canonical_names}) { | ||||
| 1483 | 0 | my %seen; | |||||
| 1484 | my %canonnames; | ||||||
| 1485 | 0 | my %rawlinks; | |||||
| 1486 | 0 | foreach(@{$self->zic_input_files}) { | |||||
| 0 | |||||||
| 1487 | 0 | 0 | my $fh = IO::File->new($_, "r") | ||||
| 1488 | or die "data file $_ unreadable: $!\n"; | ||||||
| 1489 | 0 | local $/ = "\n"; | |||||
| 1490 | 0 | while(defined(my $line = $fh->getline)) { | |||||
| 1491 | 0 | 0 | if($line =~ /\A[Zz](?:[Oo](?:[Nn][Ee]?)?)? | ||||
| 0 | |||||||
| 1492 | [ \t]+([!-~]+)[ \t\n]/x) { | ||||||
| 1493 | 0 | my $name = $1; | |||||
| 1494 | die "zone $name multiply defined\n" | ||||||
| 1495 | 0 | 0 | if exists $seen{$name}; | ||||
| 1496 | 0 | $seen{$name} = undef; | |||||
| 1497 | 0 | $canonnames{$name} = undef; | |||||
| 1498 | } elsif($line =~ /\A[Ll](?:[Ii](?:[Nn][Kk]?)?)? | ||||||
| 1499 | [\ \t]+([!-~]+)[\ \t]+ | ||||||
| 1500 | ([!-~]+)[\ \t\n]/x) { | ||||||
| 1501 | 0 | my($target, $name) = ($1, $2); | |||||
| 1502 | die "zone $name multiply defined\n" | ||||||
| 1503 | 0 | 0 | if exists $seen{$name}; | ||||
| 1504 | 0 | $seen{$name} = undef; | |||||
| 1505 | 0 | $rawlinks{$name} = $target; | |||||
| 1506 | } | ||||||
| 1507 | } | ||||||
| 1508 | } | ||||||
| 1509 | 0 | $self->{raw_links} = \%rawlinks; | |||||
| 1510 | 0 | $self->{canonical_names} = \%canonnames; | |||||
| 1511 | } | ||||||
| 1512 | } | ||||||
| 1513 | |||||||
| 1514 | =item $download->canonical_names | ||||||
| 1515 | |||||||
| 1516 | Returns the set of timezone names that this version of the database | ||||||
| 1517 | defines as canonical. These are the timezone names that are directly | ||||||
| 1518 | associated with a set of observance data. The return value is a reference | ||||||
| 1519 | to a hash, in which the keys are the canonical timezone names and the | ||||||
| 1520 | values are all C |
||||||
| 1521 | |||||||
| 1522 | =cut | ||||||
| 1523 | |||||||
| 1524 | sub canonical_names { | ||||||
| 1525 | 0 | 0 | 1 | my($self) = @_; | |||
| 1526 | 0 | $self->_ensure_canonnames_and_rawlinks; | |||||
| 1527 | 0 | return $self->{canonical_names}; | |||||
| 1528 | } | ||||||
| 1529 | |||||||
| 1530 | =item $download->link_names | ||||||
| 1531 | |||||||
| 1532 | Returns the set of timezone names that this version of the database | ||||||
| 1533 | defines as links. These are the timezone names that are aliases for | ||||||
| 1534 | other names. The return value is a reference to a hash, in which the | ||||||
| 1535 | keys are the link timezone names and the values are all C |
||||||
| 1536 | |||||||
| 1537 | =cut | ||||||
| 1538 | |||||||
| 1539 | sub link_names { | ||||||
| 1540 | 0 | 0 | 1 | my($self) = @_; | |||
| 1541 | 0 | 0 | unless(exists $self->{link_names}) { | ||||
| 1542 | $self->{link_names} = | ||||||
| 1543 | 0 | { map { ($_ => undef) } keys %{$self->raw_links} }; | |||||
| 0 | |||||||
| 0 | |||||||
| 1544 | } | ||||||
| 1545 | 0 | return $self->{link_names}; | |||||
| 1546 | } | ||||||
| 1547 | |||||||
| 1548 | =item $download->all_names | ||||||
| 1549 | |||||||
| 1550 | Returns the set of timezone names that this version of the database | ||||||
| 1551 | defines. These are the L and the L. | ||||||
| 1552 | The return value is a reference to a hash, in which the keys are the | ||||||
| 1553 | timezone names and the values are all C |
||||||
| 1554 | |||||||
| 1555 | =cut | ||||||
| 1556 | |||||||
| 1557 | sub all_names { | ||||||
| 1558 | 0 | 0 | 1 | my($self) = @_; | |||
| 1559 | 0 | 0 | unless(exists $self->{all_names}) { | ||||
| 1560 | $self->{all_names} = { | ||||||
| 1561 | 0 | %{$self->canonical_names}, | |||||
| 1562 | 0 | %{$self->link_names}, | |||||
| 0 | |||||||
| 1563 | }; | ||||||
| 1564 | } | ||||||
| 1565 | 0 | return $self->{all_names}; | |||||
| 1566 | } | ||||||
| 1567 | |||||||
| 1568 | =item $download->raw_links | ||||||
| 1569 | |||||||
| 1570 | Returns details of the timezone name links in this version of the | ||||||
| 1571 | database. Each link defines one timezone name as an alias for some | ||||||
| 1572 | other timezone name. The return value is a reference to a hash, in | ||||||
| 1573 | which the keys are the aliases and each value is the preferred timezone | ||||||
| 1574 | name to which that alias directly refers. It is possible for an alias | ||||||
| 1575 | to point to another alias, or to point to a non-existent name. For a | ||||||
| 1576 | more processed view of links, see L. | ||||||
| 1577 | |||||||
| 1578 | =cut | ||||||
| 1579 | |||||||
| 1580 | sub raw_links { | ||||||
| 1581 | 0 | 0 | 1 | my($self) = @_; | |||
| 1582 | 0 | $self->_ensure_canonnames_and_rawlinks; | |||||
| 1583 | 0 | return $self->{raw_links}; | |||||
| 1584 | } | ||||||
| 1585 | |||||||
| 1586 | =item $download->threaded_links | ||||||
| 1587 | |||||||
| 1588 | Returns details of the timezone name links in this version of the | ||||||
| 1589 | database. Each link defines one timezone name as an alias for some | ||||||
| 1590 | other timezone name. The return value is a reference to a hash, in | ||||||
| 1591 | which the keys are the aliases and each value is the canonical name of | ||||||
| 1592 | the timezone to which that alias refers. All such canonical names can | ||||||
| 1593 | be found in the L hash. | ||||||
| 1594 | |||||||
| 1595 | =cut | ||||||
| 1596 | |||||||
| 1597 | sub threaded_links { | ||||||
| 1598 | 0 | 0 | 1 | my($self) = @_; | |||
| 1599 | 0 | 0 | unless(exists $self->{threaded_links}) { | ||||
| 1600 | 0 | my $raw_links = $self->raw_links; | |||||
| 1601 | 0 | my %links = %$raw_links; | |||||
| 1602 | 0 | while(1) { | |||||
| 1603 | 0 | my $done_any; | |||||
| 1604 | 0 | foreach(keys %links) { | |||||
| 1605 | 0 | 0 | next unless exists $raw_links->{$links{$_}}; | ||||
| 1606 | 0 | $links{$_} = $raw_links->{$links{$_}}; | |||||
| 1607 | 0 | 0 | die "circular link at $_\n" if $links{$_} eq $_; | ||||
| 1608 | 0 | $done_any = 1; | |||||
| 1609 | } | ||||||
| 1610 | 0 | 0 | last unless $done_any; | ||||
| 1611 | } | ||||||
| 1612 | 0 | my $canonical_names = $self->canonical_names; | |||||
| 1613 | 0 | foreach(keys %links) { | |||||
| 1614 | die "link from $_ to non-existent zone $links{$_}\n" | ||||||
| 1615 | 0 | 0 | unless exists $canonical_names->{$links{$_}}; | ||||
| 1616 | } | ||||||
| 1617 | 0 | $self->{threaded_links} = \%links; | |||||
| 1618 | } | ||||||
| 1619 | 0 | return $self->{threaded_links}; | |||||
| 1620 | } | ||||||
| 1621 | |||||||
| 1622 | =item $download->country_selection | ||||||
| 1623 | |||||||
| 1624 | Returns information about how timezones relate to countries, intended | ||||||
| 1625 | to aid humans in selecting a geographical timezone. This information | ||||||
| 1626 | is derived from the C |
||||||
| 1627 | source. | ||||||
| 1628 | |||||||
| 1629 | The return value is a reference to a hash, keyed by (ISO 3166 alpha-2 | ||||||
| 1630 | uppercase) country code. The value for each country is a hash containing | ||||||
| 1631 | these values: | ||||||
| 1632 | |||||||
| 1633 | =over | ||||||
| 1634 | |||||||
| 1635 | =item B |
||||||
| 1636 | |||||||
| 1637 | The ISO 3166 alpha-2 uppercase country code. | ||||||
| 1638 | |||||||
| 1639 | =item B |
||||||
| 1640 | |||||||
| 1641 | An English name for the country, possibly in a modified form, optimised | ||||||
| 1642 | to help humans find the right entry in alphabetical lists. This is | ||||||
| 1643 | not necessarily identical to the country's standard short or long name. | ||||||
| 1644 | (For other forms of the name, consult a database of countries, keying | ||||||
| 1645 | by the country code.) | ||||||
| 1646 | |||||||
| 1647 | =item B |
||||||
| 1648 | |||||||
| 1649 | Information about the regions of the country that use distinct | ||||||
| 1650 | timezones. This is a hash, keyed by English description of the region. | ||||||
| 1651 | The description is empty if there is only one region. The value for | ||||||
| 1652 | each region is a hash containing these values: | ||||||
| 1653 | |||||||
| 1654 | =over | ||||||
| 1655 | |||||||
| 1656 | =item B |
||||||
| 1657 | |||||||
| 1658 | Brief English description of the region, used to distinguish between | ||||||
| 1659 | the regions of a single country. Empty string if the country has only | ||||||
| 1660 | one region for timezone purposes. (This is the same string used as the | ||||||
| 1661 | key in the B |
||||||
| 1662 | |||||||
| 1663 | =item B |
||||||
| 1664 | |||||||
| 1665 | Name of the Olson timezone used in this region. This is not necessarily | ||||||
| 1666 | a canonical name (it may be a link). Typically, where there are aliases | ||||||
| 1667 | or identical canonical zones, a name is chosen that refers to a location | ||||||
| 1668 | in the country of interest. It is not guaranteed that the named timezone | ||||||
| 1669 | exists in the database (though it always should). | ||||||
| 1670 | |||||||
| 1671 | =item B |
||||||
| 1672 | |||||||
| 1673 | Geographical coordinates of some point within the location referred to in | ||||||
| 1674 | the timezone name. This is a latitude and longitude, in ISO 6709 format. | ||||||
| 1675 | |||||||
| 1676 | =back | ||||||
| 1677 | |||||||
| 1678 | =back | ||||||
| 1679 | |||||||
| 1680 | This data structure is intended to help a human select the appropriate | ||||||
| 1681 | timezone based on political geography, specifically working from a | ||||||
| 1682 | selection of country. It is of essentially no use for any other purpose. | ||||||
| 1683 | It is not strictly guaranteed that every geographical timezone in the | ||||||
| 1684 | database is listed somewhere in this structure, so it is of limited use | ||||||
| 1685 | in providing information about an already-selected timezone. It does | ||||||
| 1686 | not include non-geographic timezones at all. It also does not claim | ||||||
| 1687 | to be a comprehensive list of countries, and does not make any claims | ||||||
| 1688 | regarding the political status of any entity listed: the "country" | ||||||
| 1689 | classification is loose, and used only for identification purposes. | ||||||
| 1690 | |||||||
| 1691 | =cut | ||||||
| 1692 | |||||||
| 1693 | sub country_selection { | ||||||
| 1694 | 0 | 0 | 1 | my($self) = @_; | |||
| 1695 | 0 | 0 | unless(exists $self->{country_selection}) { | ||||
| 1696 | 0 | my $itabname = $self->unpacked_dir."/iso3166.tab"; | |||||
| 1697 | 0 | my $ztabname = $self->unpacked_dir."/zone.tab"; | |||||
| 1698 | 0 | local $/ = "\n"; | |||||
| 1699 | 0 | my %itab; | |||||
| 1700 | 0 | 0 | my $itabfh = IO::File->new($itabname, "r") | ||||
| 1701 | or die "data file $itabname unreadable: $!\n"; | ||||||
| 1702 | 0 | while(defined(my $line = $itabfh->getline)) { | |||||
| 1703 | 0 | $line = decode("UTF-8", $line, FB_CROAK); | |||||
| 1704 | 0 | utf8::upgrade($line); | |||||
| 1705 | 0 | 0 | if($line =~ /\A([A-Z]{2})\t(\S[^\t\n]*\S)\n\z/) { | ||||
| 0 | |||||||
| 1706 | die "duplicate $itabname entry for $1\n" | ||||||
| 1707 | 0 | 0 | if exists $itab{$1}; | ||||
| 1708 | 0 | $itab{$1} = $2; | |||||
| 1709 | } elsif($line !~ /\A#[^\n]*\n\z/) { | ||||||
| 1710 | 0 | die "bad line in $itabname\n"; | |||||
| 1711 | } | ||||||
| 1712 | } | ||||||
| 1713 | 0 | my %sel; | |||||
| 1714 | 0 | 0 | my $ztabfh = IO::File->new($ztabname, "r") | ||||
| 1715 | or die "data file $ztabname unreadable: $!\n"; | ||||||
| 1716 | 0 | while(defined(my $line = $ztabfh->getline)) { | |||||
| 1717 | 0 | 0 | if($line =~ /\A([A-Z]{2}) | ||||
| 0 | |||||||
| 1718 | \t([-+][0-9]{4}(?:[0-9]{2})? | ||||||
| 1719 | [-+][0-9]{5}(?:[0-9]{2})?) | ||||||
| 1720 | \t([!-~]+) | ||||||
| 1721 | (?:\t([!-~][ -~]*[!-~]))? | ||||||
| 1722 | \n\z/x) { | ||||||
| 1723 | 0 | my($cc, $coord, $zn, $reg) = ($1, $2, $3, $4); | |||||
| 1724 | 0 | 0 | $reg = "" unless defined $reg; | ||||
| 1725 | 0 | 0 | $sel{$cc} ||= { regions => {} }; | ||||
| 1726 | die "duplicate $ztabname entry for $cc\n" | ||||||
| 1727 | 0 | 0 | if exists $sel{$cc}->{regions}->{$reg}; | ||||
| 1728 | 0 | $sel{$cc}->{regions}->{$reg} = { | |||||
| 1729 | olson_description => $reg, | ||||||
| 1730 | timezone_name => $zn, | ||||||
| 1731 | location_coords => $coord, | ||||||
| 1732 | }; | ||||||
| 1733 | } elsif($line !~ /\A#[^\n]*\n\z/) { | ||||||
| 1734 | 0 | die "bad line in $ztabname\n"; | |||||
| 1735 | } | ||||||
| 1736 | } | ||||||
| 1737 | 0 | foreach(keys %sel) { | |||||
| 1738 | 0 | 0 | die "unknown country $_\n" unless exists $itab{$_}; | ||||
| 1739 | 0 | $sel{$_}->{alpha2_code} = $_; | |||||
| 1740 | 0 | $sel{$_}->{olson_name} = $itab{$_}; | |||||
| 1741 | die "bad region description in $_\n" | ||||||
| 1742 | 0 | if keys(%{$sel{$_}->{regions}}) == 1 xor | |||||
| 1743 | 0 | 0 | 0 | exists($sel{$_}->{regions}->{""}); | |||
| 1744 | } | ||||||
| 1745 | 0 | $self->{country_selection} = \%sel; | |||||
| 1746 | } | ||||||
| 1747 | 0 | return $self->{country_selection}; | |||||
| 1748 | } | ||||||
| 1749 | |||||||
| 1750 | =back | ||||||
| 1751 | |||||||
| 1752 | =head2 Compiling zone data | ||||||
| 1753 | |||||||
| 1754 | =over | ||||||
| 1755 | |||||||
| 1756 | =item $download->source_data_files | ||||||
| 1757 | |||||||
| 1758 | Returns a reference to an array containing the pathnames of all the source | ||||||
| 1759 | data files. These express the database's data (i.e., a description | ||||||
| 1760 | of known civil timezones) in a textual format, and are intended for | ||||||
| 1761 | human editing. They are located in the local temporary directory used | ||||||
| 1762 | by this download. | ||||||
| 1763 | |||||||
| 1764 | There is normally approximately one source data file per continent, | ||||||
| 1765 | though this arrangement could change in the future. The textual format | ||||||
| 1766 | is machine parseable, the same format intended for input to C |
||||||
| 1767 | when interpreted this way the files do not necessarily correspond to the | ||||||
| 1768 | the official content of the database. There may be transformations that | ||||||
| 1769 | the database code would normally apply between the source data files | ||||||
| 1770 | and the actual input to C |
||||||
| 1771 | |||||||
| 1772 | If you intend to parse the source, taking the place of C |
||||||
| 1773 | should prefer to use the L method, which provides the | ||||||
| 1774 | input that C |
||||||
| 1775 | |||||||
| 1776 | =cut | ||||||
| 1777 | |||||||
| 1778 | sub source_data_files { | ||||||
| 1779 | 0 | 0 | 1 | my($self) = @_; | |||
| 1780 | 0 | 0 | unless(exists $self->{source_data_files}) { | ||||
| 1781 | 0 | my $list; | |||||
| 1782 | 0 | $self->_ensure_unpacked; | |||||
| 1783 | 0 | my $mf = IO::File->new($self->dir."/Makefile", "r"); | |||||
| 1784 | 0 | 0 | my $mfc = $mf ? do { local $/ = undef; $mf->getline } : ""; | ||||
| 0 | |||||||
| 0 | |||||||
| 1785 | 0 | my $datavars = "\$(TDATA)"; | |||||
| 1786 | 0 | 0 | 0 | if($mfc =~ m# | |||
| 0 | |||||||
| 1787 | \nfulldata\.zi(?:[\ \t]+[0-9A-Z_a-z]+\.zi)*[\ \t]*: | ||||||
| 1788 | [\ \t]+\$\(DSTDATA_ZI_DEPS\)[\ \t]*\n | ||||||
| 1789 | \t[\ \t]*\$\(AWK\)\ -v\ outfile\=\'\$\@\' | ||||||
| 1790 | \ -f\ zidst\.awk | ||||||
| 1791 | \ \$\(TDATA\)\ \$\(PACKRATDATA\) | ||||||
| 1792 | \ (?:\\\n\t[\ \t]*)?\>\$\@.out\n | ||||||
| 1793 | \t[\ \t]*mv\ \$\@\.out\ \$\@\n[^\t] | ||||||
| 1794 | #x || $mfc =~ m# | ||||||
| 1795 | \ntzdata\.zi:[\ \t]+\$\(TZDATA_ZI_DEPS\)[\ \t]*\n | ||||||
| 1796 | (?:\t[\ \t]*version=\`sed\ 1q\ version\`\ \&\&\ \\\n)? | ||||||
| 1797 | \t[\ \t]*LC_ALL=C\ \$\(AWK\) | ||||||
| 1798 | (?:\ -v\ version="\$\$version")? | ||||||
| 1799 | \ -f\ zishrink\.awk | ||||||
| 1800 | \ (?:\\\n\t[\ \t]*)? | ||||||
| 1801 | \$\(TDATA\)\ \$\(PACKRATDATA\)\ \>\$\@.out\n | ||||||
| 1802 | \t[\ \t]*mv\ \$\@\.out\ \$\@\n\n | ||||||
| 1803 | #x) { | ||||||
| 1804 | 0 | $datavars .= " \$(PACKRATDATA)"; | |||||
| 1805 | } elsif($mfc =~ m#\ntzdata\.zi:#) { | ||||||
| 1806 | 0 | die "don't know how to extract source data file names ". | |||||
| 1807 | "from this form of Olson distribution\n"; | ||||||
| 1808 | } | ||||||
| 1809 | 0 | $list = filter("", "make", "--no-print-directory", | |||||
| 1810 | "-C", $self->dir, "names", | ||||||
| 1811 | "ENCHILADA=$datavars", "VERSION_DEPS="); | ||||||
| 1812 | 0 | $list =~ s#\n\z##; | |||||
| 1813 | $self->{source_data_files} = | ||||||
| 1814 | 0 | [ map { $self->dir."/".$_ } split(/ /, $list) ]; | |||||
| 0 | |||||||
| 1815 | } | ||||||
| 1816 | 0 | return $self->{source_data_files}; | |||||
| 1817 | } | ||||||
| 1818 | |||||||
| 1819 | =item $download->zic_input_files | ||||||
| 1820 | |||||||
| 1821 | Returns a reference to an array containing the pathnames of all the | ||||||
| 1822 | data files that would normally be fed to C |
||||||
| 1823 | database's data (i.e., a description of known civil timezones) in | ||||||
| 1824 | the format expected by C |
||||||
| 1825 | They are located in the local temporary directory used by this download. | ||||||
| 1826 | This method will build the files if they didn't already exist. | ||||||
| 1827 | |||||||
| 1828 | The C |
||||||
| 1829 | editing. In older versions of the database they are such source files, | ||||||
| 1830 | but from database version C<2017c> onwards there is a single C |
||||||
| 1831 | file, which is generated from the source files and omits the niceties of | ||||||
| 1832 | the source files. From database version C<2018d> onwards there is some | ||||||
| 1833 | transformation between the source files and the C |
||||||
| 1834 | they do not necessarily express the same data when parsed by C |
||||||
| 1835 | These arrangements could change again in the future. | ||||||
| 1836 | |||||||
| 1837 | The textual format of C |
||||||
| 1838 | to the Olson database. Parsing it directly is in principle a dubious | ||||||
| 1839 | proposition, but in practice it is very stable. | ||||||
| 1840 | |||||||
| 1841 | If you want the human-editable source form of the data, use the | ||||||
| 1842 | L method instead. | ||||||
| 1843 | |||||||
| 1844 | =cut | ||||||
| 1845 | |||||||
| 1846 | sub zic_input_files { | ||||||
| 1847 | 0 | 0 | 1 | my($self) = @_; | |||
| 1848 | 0 | 0 | unless(exists $self->{zic_input_files}) { | ||||
| 1849 | 0 | $self->_ensure_unpacked; | |||||
| 1850 | 0 | my $mf = IO::File->new($self->dir."/Makefile", "r"); | |||||
| 1851 | 0 | 0 | my $mfc = $mf ? do { local $/ = undef; $mf->getline } : ""; | ||||
| 0 | |||||||
| 0 | |||||||
| 1852 | 0 | 0 | if($mfc =~ m#\ntzdata\.zi:#) { | ||||
| 1853 | 0 | filter("", "make", "-C", $self->dir, "tzdata.zi", | |||||
| 1854 | "VERSION_DEPS="); | ||||||
| 1855 | 0 | $self->{zic_input_files} = [ $self->dir."/tzdata.zi" ]; | |||||
| 1856 | } else { | ||||||
| 1857 | 0 | $self->{zic_input_files} = $self->source_data_files; | |||||
| 1858 | } | ||||||
| 1859 | } | ||||||
| 1860 | 0 | return $self->{zic_input_files}; | |||||
| 1861 | } | ||||||
| 1862 | |||||||
| 1863 | =item $download->data_files | ||||||
| 1864 | |||||||
| 1865 | Returns a reference to an array containing the pathnames of all the | ||||||
| 1866 | source data files, provided that the database code would feed the | ||||||
| 1867 | same data to C |
||||||
| 1868 | L or L depending on which aspect of | ||||||
| 1869 | the data files you are interested in. In older versions of the database | ||||||
| 1870 | the same files were both human-editable and used as C |
||||||
| 1871 | this single method served both roles. From database version C<2018d> | ||||||
| 1872 | onwards there is some transformation between the source files and the | ||||||
| 1873 | C |
||||||
| 1874 | |||||||
| 1875 | =cut | ||||||
| 1876 | |||||||
| 1877 | sub data_files { | ||||||
| 1878 | 0 | 0 | 1 | my($self) = @_; | |||
| 1879 | 0 | 0 | unless(exists $self->{data_files_dual_role}) { | ||||
| 1880 | 0 | my $list; | |||||
| 1881 | 0 | $self->_ensure_unpacked; | |||||
| 1882 | 0 | my $mf = IO::File->new($self->dir."/Makefile", "r"); | |||||
| 1883 | 0 | 0 | my $mfc = $mf ? do { local $/ = undef; $mf->getline } : ""; | ||||
| 0 | |||||||
| 0 | |||||||
| 1884 | 0 | 0 | 0 | if($mfc !~ m#\ntzdata\.zi:# || $mfc =~ m# | |||
| 1885 | \ntzdata\.zi:[\ \t]+\$\(TZDATA_ZI_DEPS\)[\ \t]*\n | ||||||
| 1886 | (?:\t[\ \t]*version=\`sed\ 1q\ version\`\ \&\&\ \\\n)? | ||||||
| 1887 | \t[\ \t]*LC_ALL=C\ \$\(AWK\) | ||||||
| 1888 | (?:\ -v\ version="\$\$version")? | ||||||
| 1889 | \ -f\ zishrink\.awk | ||||||
| 1890 | \ (?:\\\n\t[\ \t]*)? | ||||||
| 1891 | \$\(TDATA\)\ \$\(PACKRATDATA\)\ \>\$\@.out\n | ||||||
| 1892 | \t[\ \t]*mv\ \$\@\.out\ \$\@\n\n | ||||||
| 1893 | #x) { | ||||||
| 1894 | 0 | $self->{data_files_dual_role} = 1; | |||||
| 1895 | } else { | ||||||
| 1896 | 0 | $self->{data_files_dual_role} = 0; | |||||
| 1897 | } | ||||||
| 1898 | } | ||||||
| 1899 | 0 | 0 | if($self->{data_files_dual_role}) { | ||||
| 1900 | 0 | return $self->source_data_files; | |||||
| 1901 | } else { | ||||||
| 1902 | 0 | die "source data files and zic input are distinct in ". | |||||
| 1903 | "this form of Olson distribution\n"; | ||||||
| 1904 | } | ||||||
| 1905 | } | ||||||
| 1906 | |||||||
| 1907 | sub _ensure_zic_built { | ||||||
| 1908 | 0 | 0 | my($self) = @_; | ||||
| 1909 | 0 | 0 | unless($self->{zic_built}) { | ||||
| 1910 | 0 | $self->_ensure_unpacked; | |||||
| 1911 | 0 | filter("", "make", "-C", $self->dir, "zic", "VERSION_DEPS="); | |||||
| 1912 | 0 | $self->{zic_built} = 1; | |||||
| 1913 | } | ||||||
| 1914 | } | ||||||
| 1915 | |||||||
| 1916 | =item $download->zic_exe | ||||||
| 1917 | |||||||
| 1918 | Returns the pathname of the C |
||||||
| 1919 | the downloaded source. This is located in the local temporary directory | ||||||
| 1920 | used by this download. This method will build C |
||||||
| 1921 | already been built. | ||||||
| 1922 | |||||||
| 1923 | =cut | ||||||
| 1924 | |||||||
| 1925 | sub zic_exe { | ||||||
| 1926 | 0 | 0 | 1 | my($self) = @_; | |||
| 1927 | 0 | $self->_ensure_zic_built; | |||||
| 1928 | 0 | return $self->dir."/zic"; | |||||
| 1929 | } | ||||||
| 1930 | |||||||
| 1931 | =item $download->zoneinfo_dir([OPTIONS]) | ||||||
| 1932 | |||||||
| 1933 | Returns the pathname of the directory containing binary tzfiles (in | ||||||
| 1934 | L |
||||||
| 1935 | This is located in the local temporary directory used by this download, | ||||||
| 1936 | and the files within it have names that match the timezone names (as | ||||||
| 1937 | returned by L). This method will generate the tzfiles if | ||||||
| 1938 | they have not already been generated. | ||||||
| 1939 | |||||||
| 1940 | The optional parameter I |
||||||
| 1941 | desired. If supplied, it must be a reference to a hash, in which these | ||||||
| 1942 | keys are permitted: | ||||||
| 1943 | |||||||
| 1944 | =over | ||||||
| 1945 | |||||||
| 1946 | =item B |
||||||
| 1947 | |||||||
| 1948 | Truth value, controls whether the tzfiles incorporate information about | ||||||
| 1949 | known leap seconds offsets that account for the known leap seconds. | ||||||
| 1950 | If false (which is the default), the tzfiles have no knowledge of leap | ||||||
| 1951 | seconds, and are intended to be used on a system where C |
||||||
| 1952 | flavour of UT (as is conventional on Unix and is the POSIX standard). | ||||||
| 1953 | If true, the tzfiles know about leap seconds that have occurred between | ||||||
| 1954 | 1972 and the date of the database, and are intended to be used on a | ||||||
| 1955 | system where C |
||||||
| 1956 | seconds (which is a non-standard arrangement). | ||||||
| 1957 | |||||||
| 1958 | =back | ||||||
| 1959 | |||||||
| 1960 | =cut | ||||||
| 1961 | |||||||
| 1962 | sub _foreach_nondir_under($$); | ||||||
| 1963 | sub _foreach_nondir_under($$) { | ||||||
| 1964 | 0 | 0 | my($dir, $callback) = @_; | ||||
| 1965 | 0 | 0 | my $dh = IO::Dir->new($dir) or die "can't examine $dir: $!\n"; | ||||
| 1966 | 0 | while(defined(my $ent = $dh->read)) { | |||||
| 1967 | 0 | 0 | next if $ent =~ /\A\.\.?\z/; | ||||
| 1968 | 0 | my $entpath = $dir."/".$ent; | |||||
| 1969 | 0 | 0 | if(-d $entpath) { | ||||
| 1970 | 0 | _foreach_nondir_under($entpath, $callback); | |||||
| 1971 | } else { | ||||||
| 1972 | 0 | $callback->($entpath); | |||||
| 1973 | } | ||||||
| 1974 | } | ||||||
| 1975 | } | ||||||
| 1976 | |||||||
| 1977 | sub zoneinfo_dir { | ||||||
| 1978 | 0 | 0 | 1 | my($self, $options) = @_; | |||
| 1979 | 0 | 0 | $options = {} if is_undef($options); | ||||
| 1980 | 0 | foreach(keys %$options) { | |||||
| 1981 | 0 | 0 | die "bad option `$_'\n" unless /\Aleaps\z/; | ||||
| 1982 | } | ||||||
| 1983 | 0 | 0 | my $type = $options->{leaps} ? "right" : "posix"; | ||||
| 1984 | 0 | my $zidir = $self->dir."/zoneinfo_$type"; | |||||
| 1985 | 0 | 0 | unless($self->{"zoneinfo_built_$type"}) { | ||||
| 1986 | 0 | filter("", "make", "-C", $self->unpacked_dir, | |||||
| 1987 | "${type}_only", "TZDIR=$zidir", "VERSION_DEPS="); | ||||||
| 1988 | 0 | my %expect_names = %{$self->all_names}; | |||||
| 0 | |||||||
| 1989 | 0 | my $skiplen = length($zidir) + 1; | |||||
| 1990 | _foreach_nondir_under($zidir, sub { | ||||||
| 1991 | 0 | 0 | my($fname) = @_; | ||||
| 1992 | 0 | my $lname = substr($fname, $skiplen); | |||||
| 1993 | 0 | 0 | unless(exists $expect_names{$lname}) { | ||||
| 1994 | 0 | die "unexpected file $lname\n"; | |||||
| 1995 | } | ||||||
| 1996 | 0 | delete $expect_names{$lname}; | |||||
| 1997 | 0 | }); | |||||
| 1998 | 0 | 0 | if(keys %expect_names) { | ||||
| 1999 | 0 | die "missing file @{[(sort keys %expect_names)[0]]}\n"; | |||||
| 0 | |||||||
| 2000 | } | ||||||
| 2001 | 0 | $self->{"zoneinfo_built_$type"} = 1; | |||||
| 2002 | } | ||||||
| 2003 | 0 | return $zidir; | |||||
| 2004 | } | ||||||
| 2005 | |||||||
| 2006 | =back | ||||||
| 2007 | |||||||
| 2008 | =head1 BUGS | ||||||
| 2009 | |||||||
| 2010 | Most of what this class does will only work on Unix platforms. This is | ||||||
| 2011 | largely because the Olson database source is heavily Unix-oriented. | ||||||
| 2012 | |||||||
| 2013 | This class also depends on the availability of some tools beyond | ||||||
| 2014 | baseline Unix. Specifically, it requires GNU C |
||||||
| 2015 | C |
||||||
| 2016 | |||||||
| 2017 | It also won't be much good if you're not connected to the Internet. | ||||||
| 2018 | |||||||
| 2019 | This class is liable to break if the format of the Olson database source | ||||||
| 2020 | ever changes substantially. If that happens, an update of this class | ||||||
| 2021 | will be required. It should at least recognise that it can't perform, | ||||||
| 2022 | rather than do the wrong thing. | ||||||
| 2023 | |||||||
| 2024 | =head1 SEE ALSO | ||||||
| 2025 | |||||||
| 2026 | L |
||||||
| 2027 | L |
||||||
| 2028 | L |
||||||
| 2029 | |||||||
| 2030 | =head1 AUTHOR | ||||||
| 2031 | |||||||
| 2032 | Andrew Main (Zefram) |
||||||
| 2033 | |||||||
| 2034 | =head1 COPYRIGHT | ||||||
| 2035 | |||||||
| 2036 | Copyright (C) 2010, 2011, 2012, 2017, 2018 | ||||||
| 2037 | Andrew Main (Zefram) |
||||||
| 2038 | |||||||
| 2039 | =head1 LICENSE | ||||||
| 2040 | |||||||
| 2041 | This module is free software; you can redistribute it and/or modify it | ||||||
| 2042 | under the same terms as Perl itself. | ||||||
| 2043 | |||||||
| 2044 | =cut | ||||||
| 2045 | |||||||
| 2046 | 1; |