readxl/0000755000176200001440000000000013442230012011520 5ustar liggesusersreadxl/inst/0000755000176200001440000000000013442224517012512 5ustar liggesusersreadxl/inst/extdata/0000755000176200001440000000000013426473436014154 5ustar liggesusersreadxl/inst/extdata/deaths.xls0000644000176200001440000022200013172305601016132 0ustar liggesusersࡱ> -/  !"#$%&'()*+,123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Root Entry Fϡ޴.WorkbookUSummaryInformation(0XDocumentSummaryInformation8 #i\pMicrosoft Office User Ba==p4D8@"1Calibri1Calibri1Calibri1Calibri1Calibri1*h6 Calibri Light1,6Calibri16Calibri16Calibri1Calibri1Calibri1<Calibri1>Calibri1?Calibri14Calibri14Calibri1 Calibri1 Calibri1Calibri1Calibri1 Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)                                                                       ff + ) , *     P  P       `            a      " ||Ar&}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-} 00\);_(*}-} 00\);_(*}-}> 00\);_(*}-}? 00\);_(*}-}@ 00\);_(*}-}+ 00\);_(*}-}, 00\);_(*}-}- 00\);_(*}-}. 00\);_(*}-}: 00\);_(*}-}; 00\);_(*}A}1 00\);_(*;_(@_) }A}2 00\);_(*?;_(@_) }A}3 00\);_(*23;_(@_) }-}4 00\);_(*}A}0 a00\);_(*;_(@_) }A}( 00\);_(*;_(@_) }A}7 e00\);_(*;_(@_) }}5 ??v00\);_(*̙;_(@_)   \{= =c}}9 ???00\);_(*;_(@_) ??? ??? ???\{= ???=c}}) }00\);_(*;_(@_)   \{= =c}A}6 }00\);_(*;_(@_) }}* 00\);_(*;_(@_) ??? ??? ???\{= ???=c}-}= 00\);_(*}}8 00\);_(*;_(@_)   \{= =c}-}/ 00\);_(*}U}< 00\);_(*;_(@_)  }A}" 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}# 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}$ 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}% 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}& 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A}  00\);_(*23;_(@_) }A}' 00\);_(* ;_(@_) }A} 00\);_(*ef ;_(@_) }A} 00\);_(*L ;_(@_) }A}! 00\);_(*23 ;_(@_)  20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L˭ % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  L % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23 % 60% - Accent3M( 60% - Accent3 23 % 60% - Accent4M, 60% - Accent4 23f % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23Ў % "Accent1AAccent1 [ % #Accent2A!Accent2 }1 % $Accent3A%Accent3  % %Accent4A)Accent4  % &Accent5A-Accent5 Dr % 'Accent6A1Accent6  pG %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 DTj%[2 Heading 2G Heading 2 DTj%?3 Heading 3G Heading 3 DTj%234 Heading 49 Heading 4 DTj% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  e%3Normal % 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title DTj% <TotalMTotal %[[= Warning Text? Warning Text %XTableStyleMedium9PivotStyleMedium78dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\` s?arts ZJotherIUSCLots of people some notesatthetopoftheir spreadsheetssimply cannot resist writingormergingcellsactor Date of death ProfessionName David Bowiemusician Carrie Fisher Chuck Berry Bill Paxton Alan RickmanFlorence Henderson Harper LeeGeorge MichaelPrince Date of birthAgeauthor Zsa Zsa Gboralso like to write stuffSometoo! Mohamed Ali Morley Safer Fidel CastroAntonin Scalialawyerathlete journalistJo Cox Janet Reno Gwen Ifill John Glenn astronaut Pat Summit politiciancoach Vera Rubin scientist For the sakeof consistencyabeautiful thing,which is reallyI willkeep making notesin the data layout,This we're signingoffnow!has been really fun, butup here.Has kidsat thebottom,J/ 0t\00>6111gp22;- PK!pO[Content_Types].xmlj0Eжr(΢]yl#!MB;.n̨̽\A1&ҫ QWKvUbOX#&1`RT9<l#$>r `С-;c=1g;#=\;S8MklX(*|C:]g.Gp m2:ȍc _nLkjt>.&< :bo~PS4J3.OC^Wx}sǗ?@o?E@{^z^2|oT:=a($9AWW[@f[-4j .9Ō%b_K@IZ@qJS2(a+ʠR#tf-y3$8|h_WW<_:GLDdϪ(qo&skM݄o7uĘ;Ű8 8(Bİ@Ct6\㞥06uKA,3Df،Wb1Dg½b;Wk&$Lu zPI=C,$E¢)ݯSYM[{`F((APb~*8%^ThN ,lS[)]ElE򎢋yWR^QgE |P-$y#eՃjtӢkdvݫd4LCUd״1ú lvM^c1h3ޖZ Etk4f2d+RQwx4 Mۭ=: ުvlTV@>`@   N@>@C@>`@  V@>@>@   N@ >@>@   L@   >@> @    @Q@   >u@>@    T@   >X@>@@   @V@   >@>`@    X@  >g@>@@  J@>@> @   A B *hF:T|]]]]]]]]]  >@d ggDqqrr@#iTable110Name0 Profession0Age6Has kids0 Date of birth70 Date of death7w6ww(wTableStyleMedium4ww #i KQ  dMbP?_*+%@"@333333?333333?eMU } } U }  @@@@@@@@@ @ @ @ @ @@@@@@ 1 2 8 9 5 3 4 6 ?7 ??? ?    @   / 0V@ LLyA_>`@> @  %R@>@>@ ! &U@>@>@ " -V@>@>`@ # $ S@  >@>@ ' - D@   >@> @ ( $ S@   >@> @ ) & N@   >@@>@ * + W@   >Ⱦ@>@ , .P@ >@>@ : > ; < @=@*}h**:T|]]]]]]]]]  =>@dggDqqrr@#iTable1320Name0 Profession0Age6Has kids0 Date of birth70 Date of death7w6ww(wTableStyleMedium4ww  ՜.+,0 PXd lt| ' artsother  Worksheets F$Microsoft Excel 97 - 2004 WorksheetBiff8Excel.Sheet.89q Oh+'0(HPp 'Microsoft Office UserMicrosoft Office UserMicrosoft Macintosh Excel@}y@|b޴GLl] S EMFD@   ^  ^Qx]^P(x ^(^ ýúýýúýýͰʹͩʬͰʰƳͰʶʬ۽ʶʩƬмʬʬʬгúúƼҿéʬƷʺʶͬƩʬʬͰƬպưʬʽʶʬʼʰʰʬƥóƷʬպպƷͷóʷʰͬʰưƷóȂAOyA...‘fA\A\Ȃf\...yy.y͂fyyyO\yҟppO\yҟpfA.‰.y.y\pȂ.y͂fy....OAOO\f.͉.\...‘.O..Ҙ.OOAOȂ\fO.OA͟Op.\.OȂAOȂ.Apȉ\fO..OOAOAOfOy.͉yA.fȂ..OOAOȂAןOOy\pAOpOy\ҘA͉A..OȂAOȂ.fȑAןO.OOAAAOҟO͉.͉p\fOp.OAOȂ\yܷyOAܷAҘO.AҘ·fҘA.\Ay.͉yҘ\yܷy.\yOұpOA.͉׷ȱOAOȂO͉yyy׽ȥyҷO͉ȱܽȂfpA.A‚A‚A‚fpܱܱܱO͉Ap͂...yy\yfA...\\A..yyyyO\yҟp\pȂ.yyyҘf..\\..ҟ\OAOAOȂAf.OAOOAOܥOȂO.ApȉOȂȂAApA\AyA..׫.p.AOAAOȂAȂ.O..OAAf.ұO‚Oy\pA.fȑOȂȂA\AOfp\OA\yAyyO\.pA‰.O±OAܷAҘOyҘOȂȂA\fff׷ͫܽOAܽyȫy.OyyyҷOȂȂAཥA.p͘.ApfA‚Ȃ.ܱܱpA\yyO.\yfApypA.fȑO..pAff..\\A.OO.ܱpOpO\.yy.yyfO.fpȉA.AҘA.OAf\OAOAOA\OAOܥO͉.ҘOȂOȂ..A.fȂ.AOAȂy.AfOAAAf.OAAf.ұO͉AypOpҘOȂAy‚O.A\\͑f.ͷyAͽOA\yA.ܽȱA‰.\\AA\O.\·A.pɟyyȫpAͫyȫyyܽyy׷y.pf.ȫyy׽ܽyfApfܫf\Ȃyf.ȑ.OpO..yyO\yҟppAff.\pȂ͂.pyOyfO.ґA\.AOAO.OAOO\.ApȉpO.pȉ\AAf¥Ay.OAO.O..Oy\pAAf..fȑOOyp\pyOAOfͽO͑A.Af.ȱO\.pOAܷAҘOA.ܽȱyҘOyy.׷A.בyyȫམpAy.Oyyy׷yҷ͂AyAAAOOҥp.AȂ.ܱCompObjpreadxl/inst/extdata/type-me.xls0000644000176200001440000021300013172305601016242 0ustar liggesusersࡱ> &(  !"#$%*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Root Entry Ft'WorkbookFSummaryInformation()dDocumentSummaryInformation88 #i\pMicrosoft Office User Ba==t g=8@"1Verdana1Calibri1Calibri1Calibri1Verdana1h8Cambria1,8Calibri18Calibri18Calibri1Calibri1Calibri1<Calibri1>Calibri1?Calibri14Calibri14Calibri1 Calibri1 Calibri1Calibri1Calibri1 Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)"mm\/dd\/yyyy\ hh:mm:ss\ AM/PM                                                                      ff + ) , *     P  P        `            a>         ||B}-} PM\);_(*}-} PM\);_(*}-} PM\);_(*}-} PM\);_(*}-}; PM\);_(*}A}1 PM\);_(*;_(@_) }A}2 PM\);_(*?;_(@_) }A}3 PM\);_(*23;_(@_) }-}4 PM\);_(*}A}0 aPM\);_(*;_(@_) }A}( PM\);_(*;_(@_) }A}7 ePM\);_(*;_(@_) }}5 ??vPM\);_(*̙;_(@_)   \{V Vc}}9 ???PM\);_(*;_(@_) ??? ??? ???\{V ???Vc}}) }PM\);_(*;_(@_)   \{V Vc}A}6 }PM\);_(*;_(@_) }}* PM\);_(*;_(@_) ??? ??? ???\{V ???Vc}-}= PM\);_(*}x}8PM\);_(*;_(??? ??? ???\{}-}/ PM\);_(*}U}< PM\);_(*;_( }A}" PM\);_(*;_(}A} PM\);_(*ef;_(}A} PM\);_(*L;_(}A} PM\);_(*23;_(}A}# PM\);_(*;_(}A} PM\);_(*ef;_(}A} PM\);_(*L;_(}A} PM\);_(*23;_(}A}$ PM\);_(*;_(}A} PM\);_(*ef;_(}A} PM\);_(*L;_(}A} PM\);_(*23;_(}A}% PM\);_(*;_(}A} PM\);_(*ef;_(}A} PM\);_(*L;_(}A} PM\);_(*23;_(}A}& PM\);_(*;_(}A} PM\);_(*ef;_(}A} PM\);_(*L;_(}A}  PM\);_(*23;_(}A}' PM\);_(* ;_(}A} PM\);_(*ef ;_(}A} PM\);_(*L ;_(}A}! PM\);_(*23 ;_( 20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L渷 % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  Lմ % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23ږ % 60% - Accent3M( 60% - Accent3 23כ % 60% - Accent4M, 60% - Accent4 23 % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23 % "Accent1AAccent1 O % #Accent2A!Accent2 PM % $Accent3A%Accent3 Y % %Accent4A)Accent4 d % &Accent5A-Accent5 K % 'Accent6A1Accent6  F %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 I}%O2 Heading 2G Heading 2 I}%?3 Heading 3G Heading 3 I}%234 Heading 49 Heading 4 I}% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  e%"Normal 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title I}% <TotalMTotal %OO= Warning Text? Warning Text %XTableStyleMedium9PivotStyleMedium78dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\`d:logical_coercion>numeric_coercionA date_coercionC text_coercionI,numerictext boolean true boolean falsecabbageF explanationFalsethe string "true"empty 0 (numeric) 1 (numeric)the letter "F" "cabbage"datetime "False" preceded by single quotemaybe boolean? descriptionmaybe numeric?the string "123456"the number 123456maybe a datetime?date only formatdate and time format 4.3 (numeric)another numeric"$, x,`,-{ PK!pO[Content_Types].xmlj0Eжr(΢]yl#!MB;.n̨̽\A1&ҫ QWKvUbOX#&1`RT9<l#$>r `С-;c=1gDJKK2e,$nE<@#Jem)4 Pc`{w8!A=2̙<&JꅐfM T5BNd tY#9~#*@ K/AKחFF]et`~!کկm Y\n?aZ]'2Gc"ry Ǹ8E/ԡnޙ`5xsѵɷrΚ\xpK*y7NF~b\c|‰8'VD5N(B<=. |z]ң}'D;4L|6CGM|VoC Gao±eǬXE>%qm #8j>-~ ..R(zys^FnVԇ$*cߓqrB3's}'g7{t4Mf,t,Q;7ɛ1Ѝmmƍ` F$vNyad@}m }w^-/m z<}%s7CXWM->Y°t`Qә")Mi?F$@3ɌHK8ۙe/o}'U}f@bvyE/G9#sh [1/"ZXZըfZ#0b8k,ބ] xy Z4M0#w;(5!ʬDx@l7&vy ;H)Okള0i1?tr`d]v%b :j8mC88IolW;6kϬESSEÜq8RmcWYX%YWk:.beRB톖 $T`Vc XэGbCڞp` Z?My֬Ӕ ήcF8&%8 7V`Jm^ݍq7EWeRN)zie#EHk#BEPѰ#`A,SphStq"A%}g0fDzd#Q%uejCzRt s \oN)F{b:P3,!gdbKU z=uAYk;֌˫rYaϤpg?0jCoEAV_] 2H7HhIv>kj!f.6Q8/ٙ_۵Ȟ.QXQ݈B~$“tO$ɤ6F#YOG [BkFE6hM \\ I,&.(dh&1oYYG;&kŕ{%e (w䳨A񍁺]y 7x5R`8tMc3ݤPK! ѐ'theme/theme/_rels/themeManager.xml.relsM 0wooӺ&݈Э5 6?$Q ,.aic21h:qm@RN;d`o7gK(M&$R(.1r'JЊT8V"AȻHu}|$b{P8g/]QAsم(#L[PK-!pO[Content_Types].xmlPK-!֧6 -_rels/.relsPK-!kytheme/theme/themeManager.xmlPK-!{֩theme/theme/theme1.xmlPK-! ѐ' theme/theme/_rels/themeManager.xml.relsPK] #i  ;t=  dMbP?_*+%"D3333333?333333?U } D} D       ~   ~ ?  ~ >@      truetrue    @ :  >@dggD #i >@  dMbP?_*+%"333333?333333?euU } }       ~ >@  123456 123456 ~ $@    >  >@*ggD #i A~C  dMbP?_*+%"333333?333333?45U } }     ~ >` @ AUUUUO@     ~ z@ ~ ?C@ t >@dggD #i D.F  dMbP?_*+%"333333?333333?45U } }        ~ @`@ ~ >@ ~  @x>@dggD  ՜.+,0 PXd lt| ' logical_coercionnumeric_coerciondate_coerciontext_coercion  Worksheets F$Microsoft Excel 97 - 2004 WorksheetBiff8Excel.Sheet.89q Oh+'04 PXp 'Hadley WickhamMicrosoft Office UserMicrosoft Macintosh Excel@@Va@@ގtGLl] S EMFD@   ^  ^Qx]^P(x ^(^ ͽͱȘ꽘ŸͱȘf\fȂ.‚fp\yOOyܫppA.«p‚f\.Op.꽂\..y.Ȃ꽂\꽂ffAҥ꽂꽂yOAy͟pOyA\ffyfAffO.AAOpOOp\pf.˜yOO\A\f\.ܷyA.O\\yfOܷAffO.AAOpfҫyȉpȉy\OOȑyȉypOAO‘p\\OȂ‘p‘\Oͫ‘‘pȟȫŸҽҥfȉOypfp\OfO‘pܫ‚ppAA.ypAy\ȑyOȂyyApp‚AOҽf͟f‰\ט.OfffO\AOམApp\y\OpO.AOfpfApf\\O\fpff\AŸyApp\y\OfO\\\fȟOApAO\f.OAOfAOܱ.pOA׫ff\O..A෉fy\fffOApOffץp\OO.A\‘\͟y͘\OOAAOpA\yy.ffff\fͥpffyO\ͥOOyAOO׫yͽͱҟŸȥͱҟȘpұͽͱȘ꽘ŸͱȘyO\.p.AA.ApyOAApyҥApyO...y‚f\.OpOyA\ffyfAffO.AAOpOOp\pf.˜yOO\A\f\.ܷyA.O\\yfOܷAffO.AAOpypA.yfAf.OAOOȉȉypOȟȫŸҽҥ\ҘpAOpyOȂp.AA.f‰ppAA.y.OfffO\AOམApp\y\OpO.AOfpfApf\\O\fpff\AŸyApp\y\OOOO\\O.fyfpff.Af\\׫yfffp\.Af\\Ыy..pO\OfOp.Aෂfy\fffͽͱҟŸȥͱҟfyy.Affy.pOpOO꽂\..y.Ȃ꽂\꽂ffAҥ꽂꽂yOAy͟pyy‘p\\OȂ‘p‘\Oͫ‘‘py\yy\ȑyOȂyyApp‚AOҽf͟f‰\טpy\yן\OO.A\‘\͟y͘\OOAAOpA\yy.ffff\fͥpffyO\ͥOOyAOO׫yOO\fO.Oұױy\\fp\ypppfppܱffyf\fҫOO\˜y\\yf\ұf\\\˜yO\yfұy\Oױ\yp\\\py\\‰pfO͑OA\fAf层p.pfOApґAOyO‰\yOfOp.A‰.\‰ppA\\fpȉyO\App͉O.OfȑO\͉OֽfAO‘\y\yyfffyy\OAO‰AO͑yȂA.AyA\pץpȉypf彂ȂA.OO\yཟO..ApAfҽA.yAy¥ppҘ\‘y\\O·O...Aן\ͽ.}ypOOҫO‚yffOטOy.Afy׽‰·ȷOȱȷyyyyܷ¥ܷyyyܷ͟ȟyyOOypfyO\\fp\Ofyypܱpy\fppfppf\O\yfOOy\ff\\མfffȟ\Ofyypܱfp\\fױfppy\\OfyypܱfO\\py\\\O\y‰\AfȑpOAOfOpOOOȂAOܫȑ\\y‰\pff\͑\\y‰\OAOfp҉Opfp\yȑ\AOyfffyy\O҉OOȂAOpfyfp͑pfp\yȑ\͑yAȂp‰ypfp\yȑ\y͑OA.AyA\pץpf.fȱȽf͑OAAf͑\Oy\.·O.fAyͷAȂ\ұ͑\AAȽf͑O\O«O.p.OyOҘ\Ƚf͑OOO.OOOҫO‚ͽpOȽȷyȥ·ͷ‰yͽpppͷͽȷ꽑fp͟͟ҟyȒ}`}٥f\\\˜yױױA\fffܷ\AOܱpA\yȉpA.Ȃ.pfffOfA\y\yyf͑yOA‚A͑yAȂpOyҘfy\\OOA\fOpOA«\.pfAp½nטOf.yȷf.f±ǷpAAAy\.Opy.OOfApyOyA.yy\...Of.\pO\.yȉ꽂\p.AA.ff.«\OAy\Op‚f.ApOןffͷpAAOyyO\ͥyȂA‘pA.yyp͉O‚yȉy.OpAA.ypAA.ץypOŸf.OOyOAA͟.Ayy.pҘOy\AOpyO\ȉpܫ‚pfOfy\ffff\fyŮ.Af\\׫ff\ffױҘfy\..pO\OyA.yypfOy\\\OO.A\‘\fyfpff.y\\AͷfOOOpOff\..A෉O\ypCompObjpreadxl/inst/extdata/datasets.xls0000644000176200001440000030100013104247650016474 0ustar liggesusersࡱ> B  !"#$%&'()*+,-./0123456789:;<=>?@ACDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~R Fz|$^eWorkbookqSummaryInformation(DocumentSummaryInformation8 F\pHadley Wickham Ba==`A58X@"1Calibri1Verdana1Verdana1Verdana1Calibri1Verdana"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)                + ) , *  8dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\`  iris3;mtcars%KchickwtsZquakesf' Sepal.Length Sepal.Width Petal.Length Petal.WidthSpeciessetosa versicolor virginicampgcyldisphpdratwtqsecvsamgearcarbweightfeed horsebeanlinseedsoybean sunflowermeatmealcaseinlatlongdepthmagstations 8rh#?@ݴ`4oX|%˛ 5 5d|v⛛ owNț 5(wT 5wca xw&@"\4+w?L\4+>-Xw^e@"T4+8w?LT4+@"*T4+Xwz\ hw?L\ ze@"\ w\ zwaBz\ (xzw]zw%wU%8zuzU%4+=hx:>4+4+4+)hxO4+x4+x*'xz4`-x?L`-xVz%yJ zJ y$yq%8y% "y|ۛy=^4+XyzۛD xybTzy&z yyzzyyyz:>Xwh9y~D OD 8zC~D zz]z(z(D8% F $ i) )3:  dMbP?_*+%,&ffffff?'ffffff?(?)?" d,,333333?333333?U ,,,$,$,,,,$, , , , , ,,,,,,,,,,,,,,,,, ,,     ffffff@ @a@4@ @@a@4@ `}@t@@`@4@ ffffff@`s@?4@ @v@a@4@ @`x@@e@D@ ffffff@@u@a@>@ @@u@?4@  @  r@a@4@  @ `s@?$@  @ w@?4@  ~@@u@d@4@  ~@@a@$@ z@@?~ $@  @@^@4@ ~ Ё@@?D@ @`x@@`@D@ ffffff@ @a@>@ Ё@w@@e@>@ ffffff@w@?>@ @@u@@e@4@ ffffff@ w@?D@ ffffff@v@?4@ ffffff@t@@e@? ~@@u@g@4@ @@d@4@ @@u@d@D@ @@ @?4@ @@@u@a@4@ `}@t@d@4@ ~@`s@d@4@ DB lF<<0<00<0<<000D0D0<0<0<<<000000 ,!,",$#,$$,%,&,',$(,),*,+,,,-,.,/,0,1,2,3,4,5,6,7,8,9,:,;,<,=, >,?, @@u@?D@ ~ !@@!ffffff@!?$@ !"@@z@a@4@ "#@#`s@?4@ #$@t@^@4@ $%@ @@`@4@ %&@&v@a@$@ &'@'@@`@4@ '(ffffff@(@u@?4@ ()@ @@`@>@ )~ *@*ffffff@*@`@>@ *+@+t@@`@4@ +,@ @d@N@ ,-ffffff@-w@g@D@ -.~@@a@>@ ./ffffff@/w@d@4@ /0ffffff@0t@a@4@ 01@ w@?4@ 12@t@a@4@ 23@t@`}@a@ 34@t@@? 45@`s@5@~ 5? 5~ 6@6ffffff@6@@`@ 67@q@7ffffff@~ 7? 78Ё@q@@@`@ 89@t@`}@d@ 9:@:n@t@? :;@ r@;ffffff@~ ;@`@ ;<@@p@`x@a@ <=@@ @? =>p@@@z@? >~ ?@?@?@? ?Dx l0D0<00<<<0D<0<0<<0000DDD00<D000@,A,B,$C,$D,E,F,G,$H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,[,\,], ^,_,@@ r@`}@a@ @A@ r@v@@`@ AB@`s@B@~ Ba@ BC@@@? CD @p@Dffffff@~ D? D~ E`@E@E@? EF@@`x@F? FGp@t@~@f@ GH@q@@@`@ HI@@I@~ I? IJ@q@`}@^@ JK@ r@z@@`@ KL@@L@~ La@ LM@@q@~@a@ MN@@@@e@ NO@ r@@? OPЁ@@p@ @? PQ@n@w@Q? QR@n@ w@? RS @p@`x@^@ ST@p@Tffffff@~ Td@ TU@@@? UV@@u@@d@ VW@`s@`}@? W~ X@Xffffff@X@~ X@`@ XY@@Yffffff@~ Y@`@ YZ@@@@`@ Z[@@p@[@~ [^@ [\@@\ffffff@~ \a@ \] @@p@@^@ ]~ ^@^ffffff@^t@? ^_@p@@z@@`@ _D~ l00D0DD<00D00D0000<00D000ND0DD0D`,a,b,$c,$d,e,f,g,$h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,{,|,}, ~,,`Ё@@@z@^@ `aЁ@ r@@z@@`@ ab`@ r@z@@`@ bcffffff@c@@c? cdЁ@q@dffffff@~ d@`@ de@t@@@ ef @p@fffffff@~ fg@ fg0@@p@@j@ gh@ r@@f@ hi@@ @i@ ij@@@@j@ jk@k@@@e@ klІ@ r@@f@ lm@@ @f@ mn@v@@@ no@t@offffff@~ o@ op@p@@g@ pq@@@@@j@ qrЁ@@@@ rs @q@sffffff@~ sn@ st@t@@tffffff@ tu@@@f@ uv@w@@v@ vw@@p@@wffffff@ w~ x@x@x@? xy@t@Ё@yffffff@ yz@q@z@~ z@ z{@q@@@ {|@p@|@~ |f@ |}@t@Ё@@j@ }~@t@@f@ ~`@q@~@f@ Dl l000HD0D00<0<000D000D<0<<D<D0D00,,,$,$,,,,$,,,,,,,,,,,,,,,@@@~ f@ @q@@@j@ @@ @d@  @q@@g@ @w@@@ @q@@@ @q@ffffff@~ ? @@p@@a@ @@@ffffff@ @@u@@n@ @`s@@f@ @@~@f@ @`s@@@j@ @`s@@n@ @`s@ffffff@ffffff@  @p@ffffff@~ g@ @@t@p@ffffff@ @t@Ё@@ @@@@ffffff@ @@@g@ @@@@@ `@@u@@ffffff@ p@@ffffff@~ f@ 2D0000<D0<00000HD<0<00<>@@7 F !#<IJ  dMbP?_*+%,&ffffff?'ffffff?(?)?" d,,333333?333333?U !  , , ,$ ,$ , , , ,$ , , , , , , , , , , , , , , , , , , , , , ,  , ,           H5@@d@[@`x@`p@@?@@ H5@@d@[@`x@@@?@@ $С@@[@@W@x@(\@$@??@? *@@ p@[@@s@t@q= ףp3@?@? H8@ @v@e@s@u@@@@ 2@B@ l@@Z@@q@u@@?@? HX@ @v@n@t@Pv@@@@ @@fffffVb@6O@w@s@4@?@@  С@@ a@6 W@x@s@@?@@ H @@^@^@x@u@@?@@ * Л@@^@^@x@u@ fffff2@ ?@@  ffffff0@$  @@f@0s@py@ ffffff1@ @@ * @ @@f@0s@Pw@ 1@ @@ H@ @@f@0s@w@2@@@ H@@ @}@i@Pr@@@@@ $@@ @|@j@@V-@$؛@@@ *@ @{@l@0t@@Qk1@@@ $P@@@P@y@@$l@??@? H@@@J@~@0d@@??@@ |@@fffffQ@@P@`z@f@fffff3@??@? *5@@u@@X@ w@n@(\4@?@? H/@ @s@b@@q@v@\@@@ H@ @s@b@s@xu@@@@ HȔ@ @u@n@Pw@x@@@@ H@ @y@e@@s@x@@@@ *T@@S@P@y@0h@fffff2@??@? H:@@@V@{@j@@?@@ $@@@@\@w@h|?5?fffff0@??@@ H@ @u@p@`z@s@-@?@@ HȞ@@ b@e@v@Pq@/@?@@ H.@ @r@t@ v@Pv@Ж@?@ @ D lLLbbLXLbbLbnbLLbbbLxbLLLLbLnLL , @@@^@@[@ q= ףp@~ `q@ 2@ ??@@ >@@7 F HL1RyXAZ  dMbP?_*+%,&ffffff?'ffffff?(?)?" d,,333333?333333?U H,,,$,$,,,,$, , , , , ,,,,,,,,,,,,,,,,, ,,  ~ `f@ ~ d@ ~ a@ ~ `l@ ~  k@ ~ e@ ~ [@ ~ _@ ~ a@ ~ a@ ~ Ps@ ~ l@ ~ f@ ~ a@ ~ @p@ ~ `i@ ~ b@ ~  e@ ~ j@ ~ p@ ~ n@ ~ p@ ~ `n@ ~ l@ ~ o@ ~ pt@ ~ t@ ~ @o@ ~  h@ ~ p@ ~ s@ Dl ,!,",$#,$$,%,&,',$(,),*,+,,,-,.,/,0,1,2,3,4,5,6,7,8,9,:,;,<,=, >,?,~ p@ ~ !h@ !~ "`e@ "~ #c@ #~ $o@ $~ %pz@ %~ &@u@ &~ 'x@ '~ (0u@ (~ )Pu@ )~ *@l@ *~ +t@ +~ ,pr@ ,~ -t@ -~ . t@ .~ /r@ /~ 0s@ 0~ 1Pt@ 1~ 2p@ 2~ 3r@ 3~ 4s@ 4~ 5w@ 5~ 6 c@ 6~ 7pp@ 7~ 8@n@ 8~ 9i@ 9~ :u@ :~ ; p@ ;~ <w@ <~ =`x@ =~ >w@ >~ ?@p@ ?Dl@,A,B,$C,$D,E,F,G,$~ @@y@ @~ As@ A~ Bv@ B~ Cpv@ C~ Dk@ D~ Ek@ E~ Fq@ F~ Gt@ G>@@7 F \dm]v!͇əea1uU(1:}C=LT]1fnuq  dMbP?_*+%,&ffffff?'ffffff?(?)?" d,,333333?333333?U ,,,$,$,,,,$, , , , , ,,,,,,,,,,,,,,,,, ,,     Qk4@@~@D@$@P@@z@.@$:@E@@E@@@ffffff@~ 3@Qk4@H@@&@$@`h@@(@$H8@T@~@E@A@@h@@~ .@$ t@`j@`}@A@$ L@p@z@3@ A@8@ @~ *@ (d@ o@ ffffff@~ 0@ @P@ @~ 3@5@@@~ $@$,@`a@@W@$@ s@z@&@$P5@I@@T@Gz1f@p@@5@7@Ё@@~ *@@@@~ 2@$H@@@1@$(>@`j@@z@(@4@@@~ 2@$f@@_@`}@6@$@z@@L@q= ף1A@Ȁ@@.@[@`c@ffffff@~ 2@$@ @@@S@$b@0@@9@A@t@@~ 1@@H@ffffff@~ 5@DlF4((<4((<((<<<<(((4<<((<((4<((< ,!,",$#,$$,%,&,',$(,),*,+,,,-,.,/,0,1,2,3,4,5,6,7,8,9,:,;,<,=, >,?,$ H@I@`}@>@$!LA@@r@~@E@$"f@u@@$@$#x@g@H@@$@$$,A@@z@*@$%D@i@@1@&@@&ffffff@~ &1@'@H@'ffffff@~ '1@(hA@l@(@~ (&@)(\B)C@pp@`}@A@*,@X@*ffffff@~ *@@+@@+@~ +7@$,4+@W@z@:@- A@n@-ffffff@~ -;@.@L@.@~ .A@$/@t@@8@0d>@Q@0@~ 02@$1آ@~@z@5@2(g@ `@2ffffff@~ 2@R@$32@P@@z@*@4(\B34@k@@.@56@G@5ffffff@~ 5:@$6@@z@*@747@~@@z@0@838A@@8@~ 8?@$9f@{@@1@$:<@@@@&@;Л@@;@~ ;7@$<@@z@(@$=*@0@`}@A@>@@p@>ffffff@~ >(@$?@(@@N@Dl((((((<<<4<<(<<(<(<(4<(4H((<((<@,A,B,$C,$D,E,F,G,$H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,[,\,], ^,_,@;@U@@ffffff@~ @@@A(A@@A@~ AD@B1BA@q@`}@9@Cx@X@Cffffff@~ C*@$D(@@@F@EQk4E@@@;@$F(AW@D@@V@$G%@c@@&@$H@ i@@>@$I ;@X@z@,@$J@@@@R@K@@K@~ KA@$Ld@@z@.@M @h@Mffffff@~ M&@$NP@p@@7@$O @0t@@z@.@$P@s@@N@Q(\AQA@R@@@@P@$R@v@@;@S@@Sffffff@~ SC@$Tp@q@z@.@$U@ |@@&@$V@@e@z@.@$W5Pe@@]@`}@@@$Xx@Ѐ@@:@$Y1@^@@z@0@$Z5@@Q@z@E@[0A\@`@[ffffff@~ [N@$\P@m@`}@6@$] @@@@P@$^О@p@@z@,@$_ @l@@z@5@D0l<<4<(4(((((<(<(((4(<(((((((<(((`,a,b,$c,$d,e,f,g,$h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,{,|,}, ~,,$`Ԟ@pw@@2@$aH@v@@5@$b`A@ s@@@K@cXC@I@cffffff@~ cF@$d2@@~@`}@@@eA @[@effffff@~ e(@fxAl@8@fffffff@~ f9@$g@@`}@>@$h@@R@`}@6@iA@@iffffff@~ i=@jq= ףp3jf@Pr@@z@.@kB@E@k@~ k9@l= ףp=4lA@Y@lffffff@~ l6@$m'@E@Ё@S@nyBnA]@@b@@A@$o/@q@@<@p0p@@x@@z@,@q(\3qA@}@@0@$rfi@H@~@C@sxj@@s@~ s5@$tji@@@z@9@$uX@G@@P@$v A@P@`}@,@$wЖY@@f@~@J@$x@o@@z@*@$yAN@T@~@<@zfffff3zx@@T@z@&@${:@@`}@;@$|@؁@@7@}h@t@}@~ }2@~Ae@H@~ffffff@~ ~E@$(@(@@z@5@D|l(((<(<<((<4<H(4(44(<((((((4((<<,,,$,$,,,,$,,,,,,,,,,,,,,,,,,,,,, ,,$Ap@@@@Q@$@W@~@M@q= ף03@0s@z@3@$<@g@@6@$@x@@z@8@$@O@@5@@@ffffff@~ >@$@@z@,@= ףp=0h@J@`}@(@8K@E@ffffff@~ Q@@h@ffffff@~ ,@@b@@~ ?@$p@@j@@z@1@ȓ@@ffffff@~ E@$"@0@@,@$Q@k@@G@^@i@@~ A@$\e@0@@z@7@4@@g@@z@$@ЛA@@X@@~ 6@A@H@@~ E@$lA@|@@O@fffff1f@@@3@$<g@L@Ё@Z@$P^@_@@^@$@l@z@8@$p1@\@@z@4@$H`@a@`}@0@$"@@`}@C@$'7@@Q@@z@,@$bf@@|@z@3@T@@W@@~ ?@Ddl((4(((<(4<<<(<((<(4<<(4((((((((,,,$,$,,,,$,,,,,,,,,,,,,,,,,,,,,, ,,<@Y@ffffff@~ >@f@@ffffff@~ 3@$@@~@A@S@@i@ffffff@~ >@ȫ@E@ffffff@~ @@= ףpA@M@~@A@A@D@@B@$:@i@@X@$@n@@@R@$Nf@H@`}@D@$@m@@;@$؛@@z@8@@ {@ffffff@~ D@@@ffffff@~ &@ @X@ffffff@~ ,@|A@x@ffffff@~ $@$,@k@Ё@V@$@@@I@Qk1@i@@6@@@ffffff@~ 4@x@0u@ffffff@~ ;@$0f@@@G@$8f@P@z@9@@ d@@~ 1@$f@pw@@z@.@A@@ffffff@~ ,@Q1AE@F@@~ O@$l@Ps@z@&@3A@@@~ K@@X@ffffff@~ 8@ĘA@ r@ffffff@~ =@$HA@@m@@Q@Dl<<(<<44(((((<<<<((4<<((<(<H(H<<,,,$,$,,,,$,,,,,,,,,,,,,,,,,,,,,, ,,(\2@k@`}@A@f@ȁ@ffffff@~ (@Тpf@@ffffff@~ 5@@A@`z@ffffff@~ D@$П@@@z@7@A@i@ffffff@~ ;@$8f@e@@,@$@Ѐ@z@?@$@@@@R@Q3@v@z@7@$@{@@(@$\@v@`}@A@$@g@@B@$<A@@@3@$*@Pp@z@*@$(@؂@@@P@$A@@@,@$@u@`}@@@$@@@z@&@$A@y@`}@E@Q+0@ u@z@*@@<@@l@ffffff@~ 3@$"@@W@@@U@$f@@z@6@$\@@z@5@$֤@@g@@z@1@T@P@ffffff@~ D@@@n@@~ =@(\O2@`u@@z@,@$Й"@V@`}@>@xA@@`@ffffff@~ C@@@P@@~ H@Dpl4<<H(<(((4((((((((((4<((((<<4(<,,,$,$,,,,$,,,,,,,,,,,,,,,,,,,,,, ,,$ԟ@x@@z@6@$@@@:@TF@Q@@~ J@$֠@i@@z@2@= ףp=08g@@c@@6@$A@m@@K@$t@Z@@E@ffffff3@@`}@A@$@A@x@z@8@0@z@@~ 0@@L@@~ ?@$A@h@@.@$dA@@@(@@R@@~ 4@$@H@@O@$AC@F@`}@;@$@`}@~@D@Gz4@r@@@@@b@ffffff@~ 0@$d@H@@0@$p@Z@~@J@fffff0@@k@@J@L@@ffffff@~ <@$ A@X@z@:@$/@@G@`}@2@$@A@H@@N@fffff&30e@b@@z@(@$$<@f@`}@:@$4U@@X@@:@Л@X@ffffff@~ G@6@Z@@~ C@@`f@@~ 3@Dpl((<(4((4(<<((<(((4<((4<(((4((<<,,,$,$,,,,$, , , , , ,,,,,,,,,,,,,,,,, ,,$@@@@z@6@$A@s@ffffff@~ A@$A@o@`}@A@$@H@@z@7@A@p@@~ E@@p@ffffff@~ R@$T@ @`}@@@(\3A@c@@~ $@@@@~ ;@$ TA@r@@z@0@ r@@P@ @~ B@ \U@@`@ ffffff@~ 0@ D|@T@ @~ ,@ A@ ~@ ffffff@~ B@$A@@@7@(\3A@@Z@@~ .@B@p@@~ A@@ @ffffff@~ (@$@@@z@&@$J@@Ё@Z@q= ףp1@@ffffff@~ 9@$:@@@M@$\@~@z@0@$6@@@3@$@@@@L@@y@@~ 6@$p@@@z@(@A\@@a@ffffff@~ 1@$ g@w@@$@  @@p@@~ 5@$A@P@`}@=@$(@@@z@0@Dl(<((<<(H<(<<<<(H<<((H((((<(<(<( ,!,",$#,$$,%,&,',$(,),*,+,,,-,.,/,0,1,2,3,4,5,6,7,8,9,:,;,<,=, >,?,$ @^@`}@B@$!<A@@@:@$"@@@I@$#A@@@H@$$ؔ;@P@~@2@%Xf@@%ffffff@~ %?@&ƣA@@&ffffff@~ &A@$'ЗA/@c@@L@(ffffff0(&@b@@G@$)2l@@@T@*q= ף1*@Ȃ@@0@$+@e@@0@, @@p@,ffffff@~ ,7@-t@p@-@~ -6@$.@@n@~@D@/q= ףp0/#@_@`}@>@0z@X@0ffffff@~ 0.@$1l@@z@5@$24@@@`}@=@3@@3ffffff@~ 33@46A@8@4@~ 44@5@P@5ffffff@~ 5B@6(\O@6f@K@~@:@7d@ @7@~ 7Q@84@@8ffffff@~ 8L@929@{@@T@$:A@}@@5@;Ƞ@i@;@~ ;K@<ffffff1<@}@<@~ <,@=@@=ffffff@~ =*@$>T@@k@@J@$?ppf@~@@9@Dl(((((<<(4(4(<<(4<((<<<4<<4(<H<(@,A,B,$C,$D,E,F,G,$H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,[,\,], ^,_,@Q@Pt@@@~ @:@$A(W@^@~@<@$B@@j@@@@Q@CGz3C@@C@~ C7@D=@ `@D@~ D,@E?@R@E@~ EK@Fd@H@F@~ F&@$Gp@0~@@z@$@HؐA0@@W@Hffffff@~ H4@I8A$@]@Iffffff@~ I.@$Jԑ<@T@@K@K3K@N@@E@$Lf@@@&@MZ@E@M@~ M&@$N(E@`k@@<@OZ|@@Offffff@~ OM@$P<@L@@,@$Q(@Q@@:@$R>@@Q@@Q@$SN@F@@0@$T,@E@`}@1@$UD@@P@@z@,@$Vd@T@~@*@$WNf@I@@*@$Xf@Q@z@(@$Y@@@Q@z@,@$Z@Y@z@&@[@N@[ffffff@~ [&@$\d@@Q@@(@$]Ԡ@I@@=@^B@K@^ffffff@~ ^$@_A@K@_ffffff@~ _.@Dl<((H<<<(<<(4(<(<(((((((((((<((<`,a,b,$c,$d,e,f,g,$h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,{,|,}, ~,,`ĒA=@M@`@~ `;@aH@@affffff@~ a1@$b@L@@Q@$cN@@P@`}@5@$d̛@X@@H@eV@b@effffff@~ eH@f1f@0y@@T@g<A@N@gffffff@~ g5@$h0A@@`@`}@3@$i@p@@z@,@jfffff0j#@`@@6@$k,@8@@P@$l@`y@z@3@m`A@k@m@~ m0@nA@D@nffffff@~ n6@oA@`@offffff@~ oH@$p@Y@@,@$q@pz@@z@5@rPA@c@rffffff@~ r4@s@x@sffffff@~ sH@$t@`k@@@Z@u|A@@uffffff@~ uN@v@@vffffff@~ vK@w(\O4w@ o@w@~ w5@$xXg@H@Ё@^@yp@H@y@~ y,@z:@\@zffffff@~ zL@{4@ c@{ffffff@~ {?@$|;@@`@@W@}= ףp=0}f@g@}ffffff@~ }Q@~ R@@l@~@~ ~:@$9@_@@9@D l<<(((<4<((4((<<<((<<(<<H(<<<(H<,,,$,$,,,,$,,,,,,,,,,,,,,,,,,,,,, ,,$`AW@i@@H@PA@@ffffff@~ H@@k@ffffff@~ O@$؛A@@@z@,@$F@y@@C@$5@`h@@,@;@L@@~ B@$П.@Y@z@5@$:@F@~@;@\@`@@~ 5@$H@z@@z@,@p@x@@~ F@$@0@@z@5@$@@@@V@$̘A_@J@@>@$@@Ё@\@$@@@@W@$@D@`}@8@,9@@[@ffffff@~ B@$@D@z@1@$tp@ @@@P@g@]@@~ >@$ f@@z@0@$@~@z@7@$[@^@`}@<@r@}@@~ :@@@ c@@z@5@$>@\@@A@$`@X@~@L@$\@P@~@B@$@~@z@.@5@`a@@~ .@D@l(<<(((<((<(<((((((<((<(((<4((((,,,$,$,,,,$,,,,,,,,,,,,,,,,,,,,,, ,,PU@`j@ffffff@~ I@U@b@@~ 1@Y@@`j@@~ D@$@n@z@7@$Ȟ/@G@~@3@$@@~@z@;@$ȤA@]@@=@>@Q@ffffff@~ 6@D@@ffffff@~ M@$x@L@`}@F@@@f@ffffff@~ <@$@Ђ@`}@F@@~@ffffff@~ (@l@b@@~ .@$L@@@z@7@ffffff2@pu@ffffff@~ $@$:@@`}@6@$@@@1@$pm@Ȁ@~@@@@Pt@@~ 3@$A@T@z@,@@0p@@~ 5@$@}@@$@$@0@@=@0@p@`}@>@$ȓA?@d@z@2@$r @a@`}@=@$u@@b@~@@@Gz3@`@ffffff@~ ,@A@T@ffffff@~ Q@$h@V@`}@3@$!@@a@z@5@Dl<<H((((<<(<(<<(H(((<(<((4(((H<(,,,$,$,,,,$,,,,,,,,,,,,,,,,,,,,,, ,,J@0@ffffff@~ V@$~f@Ѐ@@Z@$ƣ@0}@@9@$f@g@z@&@$Ң@Ѐ@z@5@$`@F@`}@7@$@m@z@2@$B @@d@z@4@|W@a@ffffff@~ 4@(\2@@@7@$3 @Z@@.@$b@Ѐ@@U@h@@ffffff@~ C@x>@F@@~ &@$2@@@Y@Gz2@@@@R@4@@@~ .@\@j@ffffff@~ I@T@`@@~ 1@dd@`@@~ 5@$ @r@~@9@@@@~ 6@$A@e@`}@C@$@p@`}@?@2@a@@~ =@$|(@W@z@(@$ܐ7@a@@D@$F'@Z@@3@@ e@ffffff@~ ;@$T@@P@@@P@@K@ffffff@~ 7@$h@}@@*@Dl<(((((((<4((<<(4<<<<(<((<(((<(<,,,$,$,,,,$,,,,,,,,,,,,,,,,,,,,,, ,,3@@_@@~ *@$@H@@2@4 @`r@ffffff@~ $@$@f@@*@TA@G@@~ C@fffff1@@ffffff@~ *@$l@W@@@S@f@ i@@~ D@@Ȁ@ffffff@~ &@vA@@@~ E@@@ffffff@~ 4@$@T@@1@= ףp}2@`j@~@>@$R@@@@z@3@$@x@@z@7@Ț@k@ffffff@~ .@$@K@@Q@ؘ@L@@~ 3@$x@H@~@4@$Ƣ@@@z@7@$@@n@~@B@(\0E@O@@~ G@41@O@ffffff@~ 3@$tA@`i@@A@lK@`@@~ 8@TA@@ffffff@~ <@$T@h@@z@3@$t5@I@`}@<@`5@F@@~ I@$0@O@@I@@P~@@~ H@$@P@`}@A@DlH(<(<H(<<<<(4((<(<(((HH(<<((<(<,,,$,$,,,,$, , , , , ,,,,,,,,,,,,,,,,, ,,$T@M@@W@= ףp0`g@Q@`}@>@TA@@ffffff@~ @@(\1@@ffffff@~ ,@$H@I@`}@<@<6@Y@ffffff@~ 5@$4@b@z@9@3@@M@@~ 4@$t@|@`}@F@$ $A$@@Q@z@9@ @Ё@ ffffff@~ 6@$ HA@Q@`}@>@$ X@ a@@0@ 9@ @D@@@T@$@P@@1@ S@a@ffffff@~ F@AO@j@ffffff@~ Q@ؗA@x@@~ <@$:@I@`}@A@$AO@P@@@R@J@F@ffffff@~ C@$5@r@@0@pM@I@ffffff@~ 8@$0@F@~@A@0d@Q@`}@B@$@(@`}@@@$AG@b@@z@4@$W@G@@U@(\1@@ffffff@~ A@$ؘY@D@@U@$L@Y@@z@.@$ȘAK@@U@@6@Dl(4<H(<(<((<((4(<<<((<(<(4(((H(( ,!,",$#,$$,%,&,',$(,),*,+,,,-,.,/,0,1,2,3,4,5,6,7,8,9,:,;,<,=, >,?,$ PJ@X@@5@$!L@M@~@4@"\@@_@"ffffff@~ "2@$#:@@V@@T@$@p@$ffffff@~ $A@$%dF@H@@>@$&A@@z@1@$'"@@z@8@(GzT4(y@D@~@C@$)E@E@`}@7@$*0A@S@`}@B@$+P@O@~@;@$,@Z@@z@1@$-z@@W@@z@0@$.@P@p@]@/<@X@/ffffff@~ /<@$00AB@T@@9@1= ףp11A@@1@~ 1H@$2@D@`}@1@3@O@3@~ 39@$4 @q@@S@$5A@x@@z@5@6Q36@p@@z@7@$7;@e@@2@$8@@@@P@939@Ps@@7@$:@R@@S@$;U@`h@@@U@<2<P@F@~@A@$=A@@z@@=@$>6@O@@<@?h@@?@~ ?:@D4l((<(<(((4((((((<(H(<((4((4((4((@,A,B,$C,$D,E,F,G,$H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,[,\,], ^,_,@= ףp}0@W@D@@2@A= ףp1A@@Affffff@~ AE@$BA@x@@8@C(\2C@Py@@@R@DP@Q@Dffffff@~ DK@$EؘS@D@~@E@$FA@@z@2@G&?@@`@Gffffff@~ GK@$HP@@`}@3@IRf@@Iffffff@~ I4@$J<@T@~@I@Kde@I@Kffffff@~ K7@L@~@L@~ L9@M^@x@Mffffff@~ M;@N6@@Nffffff@~ NH@$O^@@z@4@Pܠ@y@P@~ P3@$QHR@ j@`}@>@$R=@Q@~@G@S g@R@Sffffff@~ S.@T@`@Tffffff@~ T@@UI@b@U@~ UA@$VA@`y@@1@$W@`n@`}@@@$X@@V@`}@@@$Yܥ@J@@@@V@Zf@Q@Zffffff@~ Z2@[A@@[ffffff@~ [A@\@8@\@~ \7@$] @@Ё@X@$^@f@`}@:@_60g@J@_@~ _2@Dl4H(4<((<(<(<<<<(<((<<<((((<<<((`,a,b,$c,$d,e,f,g,$h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,{,|,}, ~,,`ڠ @P@`@~ `C@$a8@w@~@E@bΩ@@g@bffffff@~ b;@c@I@c@~ c2@$d6@P@~@A@e= ףp1e@@m@`}@<@f3f@@@z@2@gt0@P@gffffff@~ gK@$hțA@@~@L@i8@G@i@~ iG@j(\4jAy@H@jffffff@~ jH@$k<@@z@<@l-@R@l@~ l>@$m@N@`}@@@nq= ףPAn}@`q@`}@8@$o{@0@@U@p@0@pffffff@~ pQ@qzpe@]@q@~ qC@$r@0@@7@s(\Asf@R@`}@D@$t@9@~@@z@7@uޡA@L@uffffff@~ uI@$vA@w@~@L@$wĠ@@@@z@2@$xP@H@~@L@yP@J@y@~ y4@$z@H@@:@{Gz4{@`r@z@2@$|hA@z@@ `@}(\3}A@q@@0@$~ԒX@t@@B@ffffff17@@U@@z@<@Dl<(<<(44<(<H(<(4(<<(4(<(((<(4(4(,,,$,$,,,,$,,,,,,,,,,,,,,,,,,,,,, ,,@h@ffffff@~ ?@A@(@ffffff@~ 2@$\e@f@@<@$@L@@@@$BA@S@`}@E@0A@@ffffff@~ B@$2g@d@~@I@ 0@b@ffffff@~ F@0A<@T@@~ 1@$V@ c@@U@$@`@@z@*@$P@H@@V@Q+2@X@~@E@$Б7@@W@@W@ @@@~ ;@$P@@`}@=@ޡ@G@ffffff@~ ;@|@ @ffffff@~ S@@@c@ffffff@~ 6@q= ף1@@@=@$@p@@z@7@$r@q@~@E@q= ף03@`x@@~ H@$X@@@@Z@$T@؀@@D@q= ףp2@@@z@5@$t@@@@@Q@(\B2@@~@B@Ę @r@@~ >@$A@ @~@D@2@o@@~ ?@Л@؀@ffffff@~ (@Dl<<(((<(<<(((4(<(<<<4((H((4(4<(H,,,$,$,,,,$,,,,,,,,,,,,,,,,,,,,,, ,,ؐ8@`h@@~ F@P@@ffffff@~ 8@$8@@@@@$Q@`@@2@$A@ a@~@D@,@a@ffffff@~ D@$V@@~@B@$~@@`}@1@ @x@@~ I@Q2A@o@@N@@@j@@~ ;@@`x@ffffff@~ @@q= ף02@@@z@1@4@X@@~ 1@q= ף2@@k@@z@;@@x@ffffff@~ ,@$@@v@@z@.@$Z@@@P@1f@ @ffffff@~ $@$@x@z@4@$`A@x@@@P@$@0@@z@$@$4A@@@B@@}@@~ =@@@@~ 0@$<@؂@@@P@$@ o@@&@$XW@j@~@9@$0A@X@@I@$S@k@@z@5@$AI@@@@V@$@P@@@Q@Dl<<(((<((<4<<4<4<((H((((<<((((((,,,$,$,,,,$,,,,,,,,,,,,,,,,,,,,,, ,,$9f@~@@$@$d@n@z@.@$,O@N@@3@@`@ffffff@~ &@= ףp1=@Z@ffffff@~ Q@ؠ@p@@~ B@$b@p~@z@0@$$A<@T@`}@B@$e@f@@@[@Ơ&@K@@~ G@A@d@ffffff@~ 6@PA@P@ffffff@~ *@@P@@~ 2@$@`@~@H@$df@`@@z@1@Y2@ i@`}@L@@w@ffffff@~ &@$@U@`}@@@$@X@@1@i@@@~ E@$:Ai@@@I@(\O0j@i@@0@(\2@q@@~ 7@1@`x@@,@$ @u@@>@$7f@0@`}@7@A@p~@@~ 4@$@@`}@E@$T@v@`}@@@$@0q@@,@$r@ @@z@,@$ĖU@@d@@2@Dl(((<H<(((<<<<((4<((<(4H4((<((((,,,$,$,,,,$,,,,,,,,,,,,,,,,,,,,,, ,,$?@S@`}@F@$<@`@@1@l@P@ffffff@~ .@@@ffffff@~ *@$A@v@z@9@A@@ffffff@~ >@$>@F@@@@P@D@I@ffffff@~ 6@QKC(@@d@`}@B@$(f@r@@@P@$>@L@@@H@֧@`i@@~ 4@@P@ffffff@~ 2@$L@x@@2@$@{@@(@$0@@@z@4@$A$@L@@@Q@$xA@@p@]@ @@V@@~ E@$@@@@A@O@p@@~ ,@1'@_@@R@$ @@U@@U@HY@I@ffffff@~ G@A<@R@ffffff@~ 4@$,@f@z@1@$@X@@2@țA@k@ffffff@~ $@ڠ@c@ffffff@~ Q@$hd@G@@Q@$,AY@I@@=@3@l@ffffff@~ 0@Dl((<<(<(<4((<<(((((<(<4(<<((<<((,,,$,$,,,,$, , , , , ,,,,,,,,,,,,,,,,, ,,3@g@@~ :@$đC@g@`}@8@$,1@T@@$@= ףp=4@U@ffffff@~ N@ffffff0A@px@@0@3A@h@z@5@$A@@z@5@$f@@@6@f@P@ffffff@~ $@ @j@ @~ 1@$ r@@@z@$@$ 1@e@@z@(@ fffff1 f@h@@(@$ d@T@@9@$r@]@`}@@@$ȢA @Q@@H@ffffff4,@R@z@6@.@D@ffffff@~ K@$ƥ@U@`}@A@$F@O@@@Q@$r@Ȁ@@O@$ؠ0g@G@@=@$@~@@@S@<A@@ffffff@~ 0@:l@ @@~ ;@@@ffffff@~ 0@$<f@h@@0@4@h@@~ ;@$ب@@f@@3@@o@@~ @@$@@@@B@$@Q@z@3@DlH((H44((<<((4(((4<(((((<<<(<(<( ,!,",$#,$$,%,&,',$(,),*,+,,,-,.,/,0,1,2,3,4,5,6,7,8,9,:,;,<,=, >,?,$ L@@z@B@$! @E@@B@$"LA@@@B@$#  @@X@@*@$4@@$@~ $>@$%@@@A@&A@@j@&ffffff@~ &6@'x@h@'@~ 'S@$(\f@0@`}@;@$)T@ y@z@2@*@}@*ffffff@~ *@@+A@@+ffffff@~ +E@$,88@L@@@H@$-Q@E@@3@$.f@]@z@&@/2/@@/ffffff@~ /J@$0HA@@@,@$1 @m@@C@$2T7@[@~@>@35@@3ffffff@~ 3>@4D@؂@4ffffff@~ 4&@5@@5@~ 5I@$6@3@Y@`}@D@7L@X@7ffffff@~ 77@$8Ƞ@v@z@4@9A@Y@9@~ 91@$:@u@@(@$;L@l@~@.@</@@W@<@~ <9@=|@P@=@~ =A@>@ l@>ffffff@~ >5@$?@t@@z@<@Dl((((<(<<((<<(((H(((<<<(<(<((<<<@,A,B,$C,$D,E,F,G,$H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,[,\,], ^,_,@@Q@@ffffff@~ @.@$AA@k@@z@2@$BȞ@x@@(@Cffffff3CA@`t@Cffffff@~ C.@DĘ'@@^@Dffffff@~ D1@$E(w@ j@`}@=@$FA@@~@F@GR@K@Gffffff@~ GF@$H@@n@@D@I= ףp1I@@~@C@J(g@T@J@~ JC@$KܣA@Y@@B@$L@E@@@L@$M\A@{@@z@3@N(\1N@ @Nffffff@~ N0@$O@}@~@N@$P@}@@;@$Q^@(@@K@R֠@@Rffffff@~ R@T@SA(@@S@Sffffff@~ S0@$TD@Q@`}@D@$UT@Q@@@M@$VX<@Q@~@H@Wfffff1WA@P@@@@$X2@`n@@&@$Y(A@@`}@H@ZtA@s@Zffffff@~ Z.@$[r@@j@z@1@$\U@`q@z@1@$]n@@@,@$^@8@`}@I@_A@@_ffffff@~ _;@Dxl<((H<((<(4<(((H(((<<(((4((<((((`,a,b,$c,$d,e,f,g,$h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,{,|,}, ~,,$`N@@@z@*@$aĒF@X@~@B@b3b@p@~@?@$cڡA@x@@z@.@dGz1d)@f@@z@=@$eA@D@Ё@S@$fO@@n@@`@$gVA@@@z@4@$hȑAP@`@@@@i8AO@O@i@~ iB@jB@ @j@~ j6@$kЛ@@@.@lq= ף2l@@z@4@m2m@P@@z@7@$n@ @@>@$o6A@X@~@?@p2p@@p@~ p<@qffffff2q @k@@z@2@$r@@@z@(@$s(;@W@@?@$tH=@`a@@z@.@$uA@@d@@@P@$vz@@@>@w0e@i@wffffff@~ wA@$x@L@@6@$yԡ@H@@J@$zK@Y@@Q@${Q@l@~@<@$|`@Ȃ@@z@5@$}AC@E@@Q@$~v@f@z@9@= ףp1f@x@ffffff@~ 0@D8l((4(4((((<<(44((H4(((((<(((((((,,,$,$,,,,$,,,,,,,,,,,,,,,,,,,,,, ,,@`@@~ 6@%@@Q@@~ R@$X@@@F@З@`p@@~ L@$؛@Ѐ@@@@$f@t@@;@$(&@H@@D@Q@@G@@~ G@$@p@@?@$H@`@@z@0@q= ףp1A@@@z@B@$NA@}@@z@A@$Ҡ@ `@@@>@Q+3A@p@z@5@@@]@ffffff@~ E@FA@@ffffff@~ I@r@\@ffffff@~ ,@)@@d@@~ B@@@@~ @@ A5@S@@~ P@Р8e@N@ffffff@~ D@$@@i@@z@<@$A@V@`}@>@$@`@@,@1@h@@\@$f@g@@@T@$A@@a@@T@$A@@z@;@ffffff2A@@ffffff@~ &@@@d@ffffff@~ P@$f@@@B@8W@ a@@~ 6@Dl<<(<(((H((4((4<<<<<<<(((4(((H<(,,,$,$,,,,$,,,,,,,,,,,,,,,,,,,,,, ,,$@L@@N@$*@ i@`}@D@$A6@@Q@~@=@$A@`k@@<@$VA@H@@z@7@A@`@ffffff@~ I@P@I@ffffff@~ <@$@4g@Z@@@^@GzT3.@F@@[@$X@@@4@$@`@@@R@$:@@@z@(@$ A@8@`}@L@$FA@p@z@.@$@ h@~@;@q= ף3@@ffffff@~ >@$p@]@@V@$A@I@~@;@@O@ffffff@~ 6@$@{@@z@6@$ʥ@U@@P@$7@N@`}@0@$A@N@`}@A@$@@@@@$o@@a@@S@$0g@e@@A@V@@ffffff@~ 5@$Z@@@7@$@@z@@@$(@O@`}@;@P@T@@~ I@$b@@@?@Dl(((((<<(4((((((H((<(((((((<(((<,,,$,$,,,,$,,,,,,,,,,,,,,,,,,,,,, ,,$@@m@`}@K@$@D@@6@$Z@D@~@E@$H@ a@z@4@q= ף3@k@ffffff@~ 7@$8@@[@@N@= ףp1@@ffffff@~ :@$7A@@~@D@$@(@@z@4@$ȘN@N@~@9@$@E@@F@&@e@@~ ,@$7g@K@@@R@$Ԣg@Q@`}@7@(\2A@ k@@~ A@4 @Y@@~ ;@$#@@f@@z@@@:@`o@@~ G@f@E@@~ 1@Gz2@@z@&@7@E@@~ 4@$D@@@P@$@E@`}@5@ @R@@~ H@$ޥf@Q@z@6@$HF@N@@1@$TAM@0r@@z@0@$r@@_@@@I@$@@Q@~@;@$@0@@(@$0A@[@`}@@@$2@@z@2@Ddl((((H(H((((<((H<(<<4<((<(((((((,,,$,$,,,,$,$$@y@z@;@T@`n@@~ @P@$ A@@@1@$^@F@@z@$@B@`}@@~ 6@$0P@o@`}@A@$t@n@@A@ffffff1W@D@@,@$ޠ@d@@]@P(<((<((4>@@7   Oh+'0@HTl 'Hadley WickhamMicrosoft Macintosh Excel@x:@?|$^e ՜.+,0HP X`hp x ' irismtcars chickwtsquakes  WorksheetsCompObjT FMicrosoft Excel Sheet8FIBExcel.Sheet.8readxl/inst/extdata/deaths.xlsx0000644000176200001440000006012013172305601016325 0ustar liggesusersPK!Cy[Content_Types].xml (ĕN0M|f+paapz$ltm1f KYs֞Z%p^a6 hneNOI|`Z0e4dL'W΂O0ZT!{J=f>34,+e|Jr萆FLP ?I0$*'Z%9 JY@?/ #7;[(8ȺI-N Iɜjd[E?[-Yeݩy _Zeqj&?.4ÞAW奈2'a)9 X_=ÿmUxT{Gݮ̝mN- u_14wM]4PK!}T _rels/.rels (J0rߦl&R`66dFj=Nfv7ځa "m\+k,&pr(#UW K3>]JA: r`!2ƒE);~kjZ7g7G[XL!PpC& d/b\zk\(|$uҌgcBQ/#KDKMg;@/l.WN 3A}3.1PK!A xl/_rels/workbook.xml.rels (j0{-mC)sh)ڦ ebKFW$q ΢|w@w $qbJz $WWl5CdDtq2RiJ|.n*:q e+Pym l[{j >{ѡ #FCjd(fIynI⡍%y.~xo O)jI[duNuD$ė{|%&mFPK! dxl/workbook.xmlTn0?+dI^`9p"ipQI*;i.i{19{3]6ROXU ꐣM8FuDDhrtb]?yi9*[Z2I셮680Rؒ1' K#z甭4%S1Lm+ۣI8Ic]T v\pw(t=(mN@MȰ}-95꽻(ܑ|Wo4Qԕ<`oDbݺ9 GUXE[j@${Yj0 a?jn*3/SĕAmDw cp~#0Waָ8D% Y mP}ǰ|ֶ=gG*[W> x+AxrC`jF>ёMۈ9JBbd ~_'A-L9l̶?ծd,9>Kc zmv@%G1Ki,9zM6i2eaZaE*JFa\I:\ ?_=Lm0<碉iiۓZ$0e#_!}C5t5 t3 zF0d24~*1BR?W㞣l C*r$"⾊/PK!#g xl/styles.xmlUo0~{%kՒRWMj'Հ!V٦NwB:i!we#zdr"1b*9We' *B+Y|Z vw`!P6 !6;0I홮76:ؚ0[$Y\a#׀HjjiYQS.k;,d.64j,iv6/%όpgGtQrMYZ9 Ŀ+z, L0BH,E%=vTpo,]\G'9\{ąZcF%Axa:?xb5 ݁qjpN|Mq(X Q˃:]0Ԋ d\u2&ĝ׷vS UD< SOq =^S{5ň,:X&1Ѫm-SfKi!॒W)o㣃6 ᕞhS ٓ>X[!·M5Қ oj ysR/#졧:}Ld}EO/)IwzH/G\%#9+h-2§gZ!]Ӻ:X3Dq=_﯒b-?lgn'b9ow,7VT6eNO67~t@ %{PK!5X%#xl/worksheets/_rels/sheet2.xml.rels 0DnzЫ IFѿ7EA4fj$zrw Χj 'HÓz4aG<"SkS ;،4#KeqƔ8uQlTd@m!] 9?56K?"TDqA߲YPu/PK!%#xl/worksheets/_rels/sheet1.xml.rels 0DnzЫ IFѿ7EA4fj$zrw Χj 'HÓz4aG<"SkS ;،4#KeqƔ8uQlTd@m!] 9?56K?"TDqAR,R_PK!T@xl/worksheets/sheet2.xmlXߏ6~Jw!!JrZBЭV޵}v8?wlؓ݀gyx{(S~\dd;&| i=niƏla~/~*762/%[t[pȯ-sV߾t`Ogۏ D9bg < u!0}azVCGcHef˼zH u%` 静VmtLD+̀x'*v qB t} x]zz&P-3/olxr&ua '-x f%.Dd&tn[1,BDU*FEZx V;ZX!Sݖ4!J:(*Z|kkHt}ew (:>읝|ۚu]Ne)?sk'EZ!Qb!Db{n[rϙ8=`n^ Vį uT#f-mY1X=gtZbh6net q6Lﰞb5mܖ5]T9{b<t;xBWQt0aLs8FBIQZm~5;}\uXSu.28P]UAi?yծC^ܐeKR z'C5{y^qQ`qW$mn#+TGޟv*y=yPȁ?Uz .KR*#Q#;ԥi?mՓuVj˫r8IO#:y .-~|/x`pQKRʖﻝȻ`j+tz*= 6: #Q -++6^՟TU.ltU\ y}YWHY\EulG8fpOh|M[-';-42P{.K|IB*mxW_~ܔq^5/<| -XQۅY'5\9I1̈́Qn7p큁[Hqr&""9M \;KaF_v ͊}j!xp$r/ؖC]nv3I,$ڛB›H] EG߄jŭ+6*hr`sV Q>Cw]8] gݫj9M49P9kMj5Xҭ ҺF Q[L1d+RR5.4O{#xߙ]Z9Al֕*Յ~'O@+Dg=3to*)cЂ.feK]8'Ѕ+oz8ro8mNNeTSn3OlFlՖ9lݖm{|Ȓnc8s "QkU%k!lOH:B- C݆A\jBV,.6HSe˰z]EMԄʅ崓4c[VtEcY9i~ /ډe`\F‘Z Bbŋ#vJ[#Oak~=_@W-&DƮ<Zd%mܚ=䱰-wloQnD7AW Vlﰞ`%mܚa[>XH"Ԅ8ԓ{FAt0W"l!ԓPnjoM@)h-Vr *ԥ w2rP! 5v.uF$m)Qi7VaDk!T( WJy*R^QTX67evFJRcU ttTDkpOKQ"@yhVGMs FYO:4H;&Uq}פׁwU+L/۶r?wmВgwyg>hm*2Ku܍;TXqQSFĿ"VZow.OXzH*lTǧ+/\]q4ۇzt>qU Tۂęl/or#gq|-ߥ3㈸gP .1~>>Fv0t8e=] qn\518 P v LR;IW#۹=o4I}ͽPK!ߡWxl/sharedStrings.xmllUn@ ?Fi Aa;p8$E=FKzTwWQ9XQ%Cjr8xY4xxBJia$З4QNgoLbL>N:kǢ㡴$4o eROGGy3(i|Πl6<ٍRAK:i6 !(LÓT$T#qU MvPT PdUTF' łUI 9&KTz~3@M`44 5->>%ܡ{.}n$E .ɗj\}7dJ u#-5JO`ŝo}Rm[3"-. 8$y uqJn)nxv+c G;Xae,0 ø>Uq:wO(ID3 y_MR=yH&Fjsu^dڏ V]ӰAZq:c/ 3q?( wk6oǂɧ—@Dt 7SdZ&)na}9w[*UgÝtPn=*oivqyaMꋗmt_PKr9=p-)I\?PK !c,,docProps/thumbnail.jpegJFIFHHExifMM*>F(iNHHg8Photoshop 3.08BIM8BIM%ُ B~g }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzCC ?<-o \xc×g}Hy4fitwYd{Vy$ػ3bI&7 &Ȕ!?;M7(C+wo"PW 4D Яi@"_ÿ$D<'BI%xOMJ? &Ȕ!?;M7(C+wo"PW 4D Яi@"_ÿ$D<'BI%xOMJ? &Ȕ!?;M7(C+wo"P!"]?k@P@P@P@P@P!"]?k@[Bv-m{{yex&í,K2HTuϏ|AnNO? ։>>1u?:??n 7@'Z' fDh7_||c3tuϏ|AnNO? ։>>1u?:??n 7@'Z' fDh7_||c3t!"]?k@EH~ٞ(}> Ϳtߎψ?iG#V~{?x>v?h=o\i5K"oa/ڧ(K?j>>(Zj?pm់sxdS>&"Ӿ񗁴߄#][@|+j_ qWu}>>#>n~#Gߊ;Ꮜ!xEtSDey]cZA5޿G7G{nDsFc%#Wŏ<#M?Q;Ùn"eںOWSxZ审ᙵX?ɧj(|"gx'P+h,KZE~$Š~ mk[<[ZF|WZ/iigÉ񭆹ax~W h΁&ԼcyD?MmY|<>}K׿i~Cw[j67^9Oռ(O¿k'G_߳dž7xg7zE^z!u+ Foxg?X<x<=P@P@!"]?k@ T$:E;|Niw|Qs |wgxQԖ^]ZƝ͞ږ=-/UH$4{xP>#~ÈD]ZO?jm⾃7o->|L5+/|;x'-Go(;WNxWKž$;+ֶwU}^ZO<ʿfo htoDi Wú'2xH4^}iO2?~9_hY|廰?J?#᫋ ق?]ÞiX6YCx)#[? V| iiW?hsĝ?ZWi?? ?O 7> O^4sO$/'/|TyS+6_}/|oxן/<=xQ2/ ZÚ0|B45ݤfEx:&kk 2*Ph7_||c3tuϏ|AnNO? ։>>1u?:??n 7@'Z' fD!"]?k@|;_1Kh (>U /,5_xǾ7k⏃3gk8񮷤?k}WU<;𗆵oZG٭&xH>cxx>!e7~5&e-o½75__|5CK~,|:þ~"h$|]ό~֓omy|/iwQ@&|4uO[R<9\| wc׀O7wM?[83_Ş'4;Rӿώ|A j⇂?-ŏ|>ԴO8zƟ +k/<5?t-\5|_xXh~%th?é"Ҵ{@!-bմfKEգoئ_暷]^N!"]?k@~kKgⶒžFo-,vZ]BYIimM+uϏ|AnNO? ։>>1u?:??n 7@'Z' fDh7_)|8>kO~'+ǟ &|,]Fg^'o?u ,+> mՍ>\!,- f߳/.S:fOxOz-CKY;Үf/>;a÷/@<ğ_¯Zpj#?k. ~m<g|c߉3|ds ╇4^~'χ^6۟iw6F'? C!?>0gIׁm,xO٫߲_>Z_|'z{A7|&y;\߉|~O? x?/_:,[.<4Y_T [x_x>і[gƿ >~t;jxH Ҿ~ї^1uvKK9ZGk^ *_e{M sn>8hv]lj=tO~?fPs7?ffNO?V,ռU#L$m7SS |_~~~xx~#^]Ɓ7Dzή^x 钿7:[an8h"_ %ui]uywP֗\]zv:O/|w?$>5'6Z xl?ioٓ?|gՍ4߆FxE_[.w6W^|9z]жp >|&OŘύ^$h,-}_B 2~ީ{}ISck=sV%kP%};7@P@P!"]?k@CiK6Stohg%7ǎ)xW`Wö~MN/.|o7Uq!8~-k^~t-oxzg7_xzu~i ? +_[.kbͨ9=xgKz|3}㏄v_ (>5?x2tٓ[?&x3\ѵ)<-xCVtK4յK xWu~#_j\Kj.kJѭx5ψkO~mxs. w3ť>0|Mb_ͦuRc`_f_#6|/~5.xᗎ<{/5M_]ރiAih7sΗ~oiV kx>&aۀrV߱}+>O ~"naccx&oI|iGxDe}KN}So+l~o fVڣ|_*x]Ԭ[ⶴ!nm/w{-ևGƿ X./8ҴOz?5kg0ڒ˧]i5#ik9@?T:??n 7@'Z' fDh7_||c3tuϏ|AnNO? ։>>1u!"]?k@މX>?~?|.?,~/ORtƕ~2 h#M7^E{Kq]Cum$HgI@9G 9,^;W<[?V> n,ӵL'Kr% +K|@U_ ^ZYR^_]Yaɤ ;4xĞW4 / 7(4M~Ƒxx*:aޣx*H:\/? GVk>|; d:!ڔZuΖwu4VKs;J@P_)^i4KBѾ|[>;|6j:Fxz_ڳ⿄tOZFpu=g'5/3;G.x?Z׉u"Kp_(cuoxsZ>6Ƶh >3|Z}|N'oYS?xVy=zN hmsMm "k/4w>Ҽ1t\"x"SZ}}O |K{;get{OյmVx9ׇGh k}M'ŴO*[x6++׍> k; gƞׅ#K?i(ލ_9 x~|=H3xn>=}oah>3}jAo!xm^6ztifP J~ xu4O^* LԠUS_*ږ]7`I iofq!x{⧉k?^xGnLkw3i,|&?uE6Ν[ i M'b'/ĝ'_3ci xö~ |]1-tCVMh-g1V!"]?k@ߦT7w>/f|L!/ΞGƿ~~,Χq=_<c?]lu/ŨEǏ+ CǍ;OiS6|/{=2w? =+χz]_ ?ƴ.N>k{~2G|W}~=x-4GLӭ|e؆_#W4g{s4?+xJU:s\P_hO[5~1zx_-ޮogծ :qgXMg-춶6v\E!@lkٳ߆ޭ??f+~z+h?o>=iex_ě{_MGԮȵ OǞ Mԯ5Km [ү?ᯌ8V-g.] %)/ c/e?,?kok->kG|>1|j߳L>𗉼Sx:| jxg@5OY/^|A;~?΍k_> Oh?7s/'O l-+Ӧ|S_|9~0x℗ڞ-N lc/'/V~!LƟ6 ,L><|{sEI5wCӴ_|]O]nWzy}^AO GAF/_ ״G|,o?}K߀MV_3fZݿ<7 @t|Ɩ7uGᏎ-aAjſZ't#e~ $~;jrO~Zj>!Ѽs&5kP DmG>&JM|4_@;ŏ |8f'ž.7xJcmg@l<;i:FAwsXh6hZ%Z!"]?k@ĿZQxwjjŅWWvV^Y'n}OJ[6vj$ִHCimF]{K+5c@3};5W@ gu :+ ּMq=;Pl|7C~P-P=&[].RUiyoNI_kSx?Ķ[kZ%p][[{iumq5͵崘Fh'N^5;"{ OxBG%Ŭog,$ifxęM7Oe[t_Ck/|7OWϰx7Ui&LֶVv٢mp0oavStqM4x}^*ԭ4 :q9÷_M42\_}2@]앫k]%ỽ/_o.MۍVIúl=io#iZcωfT-g|Y^:xSSSOǰ BxVm_OBj08~~:.;x*/ jW{[ɤLt =j;5n,gdԴ?U֬ ?+NQV|TŨkZmVJ擦wæ%%T@ $ߊiNfoxSJd=Νnj0 kym8JP/ x׆m42lthwZ|ڤ_gGcV+CE񮕫YXu5i7iyYG$_Ե KL+O% PG W~ >\*E 7RկX|aT?ʀT^ʶ*?QC{*,W*x+Sš > KQҦJ+ح;-XUfH.hXgү|/l#cX.]5j^s&$]q[Choyv,rZ95σ|-7'k}xS~-k{,kgiwx[FIkqcWz^|ko#@!fuϋO KxK^e#ũMuĈ J[G^/fn$Hd-x"Ğ9/akxU }/Qӡ Wzp.05ÎFC?ʀ?PK!tFP{docProps/core.xml (_K0C{ft=9P| lD}{v)yIι{%r_W'+bd ЦX XG%X//R <86$i3sN'[;KejlnO (ꁈH0U C5Hg1:0SFZ3ٜ[1i'u܍ Sf:e`FYU,`cxhYQ~~{;u>jvR^w 哘\,'?Womm> #7|6"yϾKPK!I~xl/tables/table1.xmltaO@ O8ݧMb$M( V"*mӜv?Yk?/zzH6BZ~]߫7pc7H!gxp-s$T4!vuB}D0"rYfIkeC'WcQ@z~qY]hŁѯt߆'!Ou1ܤ`7tTυıbAиMHbhƭKiM 0W%\W׋e:;џyg; spi42N ;kcy?(uC X}8ږ"o\蕤,P , | g"CozYHz~4rߚ/m_HFWB1HJbؔB)NjII\aBb'?+PK-!Cy[Content_Types].xmlPK-!}T _rels/.relsPK-!A xl/_rels/workbook.xml.relsPK-! dJ xl/workbook.xmlPK-!#g  xl/styles.xmlPK-!5X%#xl/worksheets/_rels/sheet2.xml.relsPK-!%#xl/worksheets/_rels/sheet1.xml.relsPK-!T@xl/worksheets/sheet2.xmlPK-!P:;xl/theme/theme1.xmlPK-!ZK='<xl/worksheets/sheet1.xmlPK-!ߡWI"xl/sharedStrings.xmlPK- !c,,%docProps/thumbnail.jpegPK-!tFP{RdocProps/core.xmlPK-!I~Txl/tables/table1.xmlPK-!HVxl/tables/table2.xmlPK-!^3WdocProps/app.xmlPK-!äZxl/calcChain.xmlPKo[readxl/inst/extdata/datasets.xlsx0000644000176200001440000015226213007404623016677 0ustar liggesusersPK 4wF_rels/UT UUux PK4wF PK4wFzz[Content_Types].xmlUT UUux ͖n@_m#m4؋\&XQ6fgZ; hT,sfXByY4&wE6uY"G!)U,$b(F\k1 `yeB/Lz m Sg ,u+LwNےosL*ܤ8zϤSvw1Jc@E`1Pȃr<ʹ x8+Su<`4DCC.kG]46kϒ6Q8|ӣ\bfxѷaG{3CeZph…ĹyKą2x/*ڰ]w?[:E}Zwmqݕqϱ//PK 4wF docProps/UT UUux PK4wFedocProps/core.xmlUT UUux O ΅af'MLx#욕/ֺ=|yxrsT}wFWf%n+5J|Zh <ԥ0^B>ڇ`^AqX8C,]- YaK8.:{L'XHMR`Aӌz)87uÔ,'[a8$O>NB3IX8ٸ9y/9w))R#kx>ue\=WOտPK4wF=docProps/app.xmlUT UUux  0%nS=HZԛAdv7dWoDP<^!s$l"^}:& XBzCY"*F_EWWc!Ib뢇 (fVsqyG*]G|lgbDmG5К PK 4wFxl/UT UUux PK 4wF xl/_rels/UT UUux PK 4wFxl/printerSettings/UT UUux PK4wF]('xl/printerSettings/printerSettings1.binUT UUux WA0 +I ;Zm"V*ZEB13Ofsod}GˈWזFU}h;v釔ٹg+e2BVpk:[7ݘƓ" q:iQWPXҾ0֐/ƴ͒Ls R U%((.uq=,]yj`msOjٲOGH? *MKJIi'rQ 5\:}'.zi@YX!rw1P:TV5tK[6-qd^xXqN6'p>xCݏZI?$]k.SC_2Q_V*hZïe\6PK4wF]('xl/printerSettings/printerSettings3.binUT UUux WA0 +I ;Zm"V*ZEB13Ofsod}GˈWזFU}h;v釔ٹg+e2BVpk:[7ݘƓ" q:iQWPXҾ0֐/ƴ͒Ls R U%((.uq=,]yj`msOjٲOGH? *MKJIi'rQ 5\:}'.zi@YX!rw1P:TV5tK[6-qd^xXqN6'p>xCݏZI?$]k.SC_2Q_V*hZïe\6PK4wF&{1_xl/sharedStrings.xmlUT UUux uN1 _唝 !tw bv.R⤱ҷ' رg3H],Udu4 Au,@|$YǞYIy]@rn`tmҶye߱ peElEcuY PK 4wF xl/tables/UT UUux PK 4wFxl/tables/_rels/UT UUux PK 4wF xl/theme/UT UUux PK 4wFxl/worksheets/UT UUux PK4wF9cV#xl/worksheets/_rels/sheet3.xml.relsUT UUux Kj1 @b=I'RȶMښX'tBAOOh's!+ہA%e<oJa*NȰmp #ik4g~;u7~u/iZק9!M_w}m~z{yvS>toNzdm;ofݶw:7_V/]?$?L|xMۜ.w1/Fxz{Jgm|?zqYǦvLѯݬC3c~zm~C-an՛-vT?4?zډdLju~k$#ߜ?Ȑ$pfjj^j,[U5hNʭnR3VU3@.PU7 ֘U3k)RM͘RSuqEvXe?Bsh)^jƪj|r̖o|sj窦6bU5 >wd'ˉq++5#%*\Bj#oa3"DS^=Rh0 |Bl[ҭeU?fdWjFV'45㋨|Hh{2e$}+n̨J`8>hN+aLg5Hl ĺsYj)e%r:$=SX:rJBYZTc`ݗXk#%\$8K'N>*Aؕ_F'v& Z)%`9֕<-XĮ3PfY w_bI|FпHLOYܓX;'X%u[}QbW(9&Z'W% d$F>s<(iK0c*ÌIS hFe z5_;de4 ^ h)'Xt+**650R` NȺP 'M淀$,*nP݌Ix&髍HֆH2 0}ΓX_5 Į3D Hhi{6*' !|~MFQ`r}u ) d ++BN}%F!'aK 7al0ķ` ®PbWY]1p+83>QRSRh 4^eM0A ^ŁցK+vEՋ5EF^%K0Scq0 h@pbtnQbWY(&ĚRqḧ́X x9pG44W` SXK2j:+y,4 pL9_`.~eB;IQOamLKr[tzań<69IS߷U"Ɉ$G>; h@"n  v5zܜFc "E޿oI|0W4ѭn' zZ XpFSy0p#9څsl࿽Dg 6% sYT@$ASBK?9KYgm`s6#WCY iZ+寫謮خS /&QMC .\VaR(.Hvc9o<{kO$]M']Mw' ' )`; ZRp@\^pa4 `]E' ~bഄ$ oC)bo,1l =a9{O`0Ƭ*X[:EP`WЅ?6 J6=j8\xupO^_ =y5t 2/' tXCaf%]09>9-X+{m׺}N],w{Ɓ]ڷ9JAt]*ka-i/r!k}?c~;-4VnǦ^_]zeqm[ɞ|.PK4wF 0_xl/_rels/workbook.xml.relsUT UUux j0 _~qvu{Sݺ0C;XO~"J % 1 }cm_m>0P흁$A|^umC=wl,ꎔx82P1wOZSVak):>ERw6;uppP{3xCݏZI?$]k.SC_2Q_V*hZïe\6PK4wF]('xl/printerSettings/printerSettings4.binUT UUux WA0 +I ;Zm"V*ZEB13Ofsod}GˈWזFU}h;v釔ٹg+e2BVpk:[7ݘƓ" q:iQWPXҾ0֐/ƴ͒Ls R U%((.uq=,]yj`msOjٲOGH? *MKJIi'rQ 5\:}'.zi@YX!rw1P:TV5tK[6-qd^xXqN6'p>xCݏZI?$]k.SC_2Q_V*hZïe\6PK4wFi, xl/styles.xmlUT UUux n _`(ad)nJb T.0<eJ~8iwnw F ?j7ukQL܍x';ʈi5(eBpǔ!Qqg`E`yiHcN֐}˵Õp_ ߧNx;mtZ Yo+j|*x_z$ 8H1d{"RȦ1,z b¨}ߔ/ˎ[YFAgQqZ}Je}VCtY$2Dp|Q(*z~]gHAO+)r @FFCĨ*AAO<&?)A5Lr HGHc^M{S7EZ1"MHd3+N2VE*웠?Gk!p&iw ,s\.%hJ.OPK4wFKxl/theme/theme1.xmlUT UUux Y]s8}_n2%3@Ӧ;}F*DR+Y8Magytte&e#3 :Rc0Ȃ0*~dϓLtOO'yDrQy1# T]FRTHn% BQ; yզBz'B{*FX[ɇn""601N':|{B/p&LҙKq[te,+ӝYo溲ҭNɴSi4!pTSsov{ !P CgqXzZ!w ~:]u^[?X_M&`rٛJ`Vy6+ T"k)?RJ*ࡕ#07f +N ωlMc@fK)Xra1Y(&:V0JeԐZi=;ѼR,zϖ-RʃE4 LM~Q":fyTEvm}=O.|H@FJ1-%h3+@#?(F.n. Mk4+ZEJK]û\^B!lύrȫFY{Ky*>)>x~/ xB`XQERT)g Z,< [_{_ѤTp35wP|I^K<:k_u`V˫%vw7H{}M ЫnhV^koPkxF[-E3pFPK4wF6˒%)xl/workbook.xmlUT UUux Mo }%I?UTza[  ~$UUNů]oϦ#vA9+Nj{d $Dn%E ԃs-I60P1kJPhxmzi7h+ d0ZF3/%k QEX4\/Xn!rI _,5QpUFWPZCyo,2z1y=oPK 4wFxl/worksheets/_rels/UT UUux PK4wF?l#xl/worksheets/_rels/sheet1.xml.relsUT UUux N0 _%!l+FN=0Np-ƹv`bIF/Ǜ;0,R 2w'OQI;q%-I;CiKMjoaD[~3`4RxovIpOK(=V]Mm3.z"kIPK4wF:lXFhxl/worksheets/sheet1.xmlUT UUux _sĿ\\\^rUIU*NNK:ITQ>}FZa fh\?xf=ߌl|>??rtzX?߭wϛO>l63~=/..^o6On>؏o/=b2/Qç>vMy>t7냩}ؾ{{z^NGgO~ۯ>o{5]~Awùuw z|}-g{rx[v_nFힾܮߤUcao?{e=l, ~ݏo1J8*jׇǙ=߾5LW>__& -Mjf+d0]'qɻwqs'AZNbKyit|~UG~Id}Yh\,D*Eӓ)I\8Hk% -RѢIDΝH/%ʗBTEv(r~92kAV_`T6RѢI%o־ZHsW(-ұyѢ˓H3$v=jZ"L"z]u($ DL%"zDEњI75' k. ҄RjLY!!NXsJx'Uex*􇙯pɒp ;:}:͛7s}h@l RPmȚYK 3%DU"kP!` %FU#kf3}԰~K8x<ʦdMꜥ!3{ HRuv)k꺟nR@jYO.U V)ZUe٥jt)V~$HuROh%3o% uK΃pYj&8E* .K>U|`01V7Tuv*k<~j;*^Ugf<~ĺR1:Tjʚ(m~BPsJXspN٩ʟΩuHpiv*kT#uJ8)v]i}):TfTYbfNCX'*T5E+'ǏL?h]%\]jF )zDAѺ"˔RKMitGX)b:RRքL <~Apiv)kfz@A8Rdq uKͲKY3K!>u'R.V,5A Y a)@efOR ',ƖO͈Y}r)kfsbx\KRRKH!~²ll Rѥ>jv:. vƖ*rNKІH!5Gi%AYkO,>y]f&?a>%(W-a. 5'r_K~'(MMāzk ur:r>;ѝf~Gb4dM̪_ aـpyv'kfAVpB6J]é.?Ms&}up0b*E&kn'9%9M,5{ӂ(_. 7V foZ7ɴOX&P%\*P tLֵ)a?i*P r(Y?FbR"5qP!rS-.g5F7фէO3i 0٧YO.EX]*rNK-i~6ǏGHSSĜz',9Xo)R^Y%\ev)kL:%5JX=BG]G|UᒰnLIe`YhvKv(ºy&,-a5ӄRC]C@*FpKђ.,4;%z.뢏.P봟pYjvK? b|aM.KOu{(1Vw)V{ f*; -af"q >: >a efwB F=b5R^pOWٟ_@(O, E}bttɚYbn):E+U o@W,"י.Gnj>땹2ylWJ?9e.Ғ[[~wy:#dѻոr@ss)' xl] f!]}Zv1Z>3'wa~Uctb-&{򛭬Y5-dr _t,QMgU.ҹ6ȣrxOvUc496e|["-"s=o;ڪ1B^̣x0~>*#otk+AL<x9vSD*tB>^2]G\~acfnfVE< 9`O~k/:~QK-p[(sLiD8\=r }".g!L.R-w 'dt7`9I<]7;ovDЁE 6Q"M xOhv@EU/hx\7b!ǠqêKyI,8]C&7qyeD FQ ]r'[@Tϙ=b ɎW0܈dh(Cn#<Ј˂S<'mt5ETN)+p#.vh\6BV]r'?{\Qv.#1ȃQb|!J=*/hŪi!aTt1!fY@݁rcQbt$r;)Nr`CG#܍.ꗸ䗨,GM.~{=r螋ME`@<xX7"K\^j+2ptCF& F ;6> #:Pa` Lp3D=2dbsݙ<"#<T{ ģ w#<.Ljj=*Q|#.GnϏ?E1r E뤆T.9yߎ<<ǮFC)Qq86#U](e.8]쐉a!ptmn`]dF<0ct_zmzWxV[Xۇtuw8잎?=lXnw8`eӾ*Jb_e?ϝe{3^/:l;f?mdM޾@PK4wF]#xl/worksheets/_rels/sheet2.xml.relsUT UUux N0 _%!l+FNd=0Np-@\v`bIF/Ǜ;0R  w'r$&z T /A[ʣ!]u3`4ixm2 9C ^YvWCQ=X{9mSwݦOʙU.z"kIPK4wF"wxl/worksheets/sheet3.xmlUT UUux ]o8 ~ *hGVڕVݽIPF@ۙ{rsg6OkћFuۘݥq$ZuS6.n󮆗$qO>ɶT/;Hjh .c27焧iUŚp? CM-TnҐA OM?~gpm5jxn ratU̬d1ejf +N]:]fg,82YSNY,a04*˄C83Z_7h6F2jRu"ucϵ[21A7k*# enG[q:"Y&ܪT` #OF|U ,#2Ց̒fֲFu!gb\'+`hrwY8#+iNVpˊwpd7ފ1ZrƳqGVp 0 nZ!//8Vo8#+iϽggYqc*YC VpYCq0 aZ!'8²p8#+i+ vwM% +`HSrw58PY!L+'Y!L+2N}gmh5oۣ`ed ى\p/lYq GVdBq:"6pb"dpdEfZ!8#+2 ^qL+7 NǁȊ̴BpQ}YC;^ ƁȊ̲K˸!U';#Rfs -+,M+эqGVkkM+X.pdEnZ gYAžY"7kƁȊܲ"u(8"/ fai(0F= k* T(ݾ8ewxqGV(L+[,YQVo8#+ V`iMYQVpo2nEV{_pdʴ XYVw*0gj86;A,_Ǔ꯯Bo>iR ~!pށT 8pG}0CjhවO۸W4TG'x7X\wcszeo||xiw2PK4wF0zqxl/worksheets/sheet4.xmlUT UUux [\G$Wz'<'/R 6/.0wĪ"$ k33ݿ#Hq?>}~aOϿ翾;~/}˟/_폿}mO~?_|7׿_?}e\>|8ϿƗϟn_~_?{#_?7oگ?4ǯ￿˯hͯ??/_?ǟmH_o܏߉h3OmÏp?M_|0/??~1m?ۗ_?~6>|}oSuu/ZX OF>O_c?P?7~~/b<*Ƴol}P]ۗG{1\^ ~y1 lO\{Wٺ7dw/;#va@͕\wcCllW^^ne?~e(7t]_DW&=?{2`c 8,f5Cllg ËVʀ {6:Wolum1z|Q=2€l{<#;U:Um3E yl)Zپ9͟N9ꙩ.wva{Ug܍Ե[T ";Xi(IE\}\̢py؋P*^ռX*96żqĬyԼ$Y^^fx1ydY̛ Y.9SD<]>]m ,yx f 0|`骈5Dm}ϢpIz=ߧ`D;Wic&ջ]j\"y7HiE#,~}&朐żgqyΗj bLzM9!Y^^ޯ .b*uRse1á,{x$ʈe/jADKK#N1, -k`̲zAlOX p3󢐘yS)ϺN#tDd vobfãE'W1ooH=Yv\-{ONADYǺ "OŜgzbnYқ"Ӌ!XT̅AfqQE "jgܫ V$71ٍᑽ A~z~{s?sxVVSeAD\PBM̹ꉹ]ϪGrE#Je ĜK7$g#QF qEHpiSA_9G7Ts,z{)z lxvD8OWAi^E\0 %#<^E"p>{/=B"ge}ְ{{<1ŋ Ѿ2& oohW^)ڷڇ)M.dpf yw]}ߛou݂ٓx@dv19=1ohuoU]? ʕ!AlҒ :)![E1)Y >njۉ: 2pRDi)"W(w1oh<&‡G|E*$d(vع‡Gg"WA,!ob}c<κG",ﳏ=|*MlRBsNbސ4*f[&vJ\}/m b}"=yYV.:\5Di!Yd5.vwU8d"A2UlsNƏZV櫘{Zw1uV=<|~ycgM|wSwYa<<؉T6İN|/X|s1ìxx$(Ҿ-X4sNbn c*A}*,<s{\0rf"EUw{Ŝ;yw8Ӹ G,{[_q>#ob XĜGbnGoYHaۦ9.X b-`zqV=<XAsDt>3\`71'>]̪wg}c"8zrlrs.A;s:ͺGr2XD\|?U;.6.N)cyjEAWA|&fliiyCYHwn]σ*NR눘1'1o(,}'.<}*qDPNYY;_9Dzi><0pEcB*=?O&YNZ\.MJ71,w>|*}:Uf}.6%fãD: 1Kئ'i0{xֽ=d ۏ HE.okYH>FEcg V9E`speD9N/ u\ssLU"`㮂͸s =wUFٲEXqW@ebGG[,/!|YyHH),Az6GA!BLl/~b6Rzc%Vn) QCer3z C\8CtiWEy-Y&qvߖ0@!1>gHS{qygyǢ)͈oa#P؞Wn+mI0&gƐ/ƃ7Cb E ~)vt nv^^="2*ey8[YڋߞSBern#5N8!GYB[(j.jn!2ys22MfHdB `D8ۋ6`!\"R2oFW!k\ʄ~?Ht8ΐ( "jT{W+i偒ˋ@(]|WE_ؐܧ).&XXDIcB>AVE{/ QpU1V4`bsr+[ "_$,#J0)V k:^g-^&q.w*4${ C| g& O,Ʃh8j1jeKfJ:AxJ~ Ep.NAAȀ7C^ul&L\b6*D1{aqIU3Ib@q+b/7t#"DBİ0M{pU(.0WF6Z<{WPyL9]>'q.A!K(b/Rۛ[hL\s^H 1?V.h"~4 iI\fA<ΐ(6\޾)B2R`,&V˒n^k~4@ f+ջSz NR q$D1W{+$Υ*Q2#}Lh$nn^JscL\*ՁhD6mnulhB3f:Y(Fg͐/i7ӿ~]ɛT | 0 ~jʎ? vLǼLTyO˗ba@~oM>8K(͵0JꗂX0hs =j'*&9G6ՙ薙57%Bk,vx͜MRe*|ɛ aVZGp77pcj)3,/ Hs[ ɓ8ۋO!-3#KYbD(B4C6뗿^oyC7KњbݒL\ tI4M~77תy0(4O4M kC|n8'|E%Dja&{QO/A3ys)0ɕG$k-p έA4 VPĹڍ:ogHXYoFԩ8(+(T2E&»p3\bqVڋ{y@f:I^dl έ,Ha{)l#RdRͻ)"+^DDfD&OBk&$jùo? ص7#x^O\ƛJhęSs&hs9 yD YnD~VlH XS]#+Y }_3X;O5ƚ既|$\W,~(iboEaq l_ل$ΥRNDPg7P,}C4Sɛ8FyYvΐ5WkB"fѦ)8]iqn$[m䏀~ W6 Ô+NMJopy_$n࢒)7A[)b-fBfjާY8C~RL" $.͈qJh3?(b/Jڍ/x3$V[~5bGF7p&oVQh3Mf{<> !3Is Ҥ|Hߢ36ς5^~_$$y.G<3$g)7ۋ6}4WR(.g4 Ynn! !)}WH(J6Q p͉,K@bo]SŗS(L\`櫁"3(L έ,4{D+~I98)3$03d9Eb7t@&s&q.vQ Ĵ{8?ѡb=BﯿBCgj6y 3=b_=߯GL\g`X3$zf*=83?b/J$ٝ1USg6׳D C>كC7$Kԙb6(i@(s+ZS}&y?eIإ0z? Y|pSL\)NA|M57Q:Ƅ~O!'|UHS{Ą8bH(\*A!M@62Do>8Ck9N2 % C:Hbo/-$39gHm:gJ6|vA$XI1g"PE >ӓ67QE8#@Ε*꼳qD͐v #n(: E\+^>#)UZ d(kEiF%v&qUq@"I."Wj)833$";3d{P{Q~we!͟xq ΐQ|,@\ 4zg{):;3Tq- ,.|Jo)z; b3xsAķ1uS{٨~C?ļ!($* Vq.)oЦUB j6̟7Cڋ%yH$)T1,l/Ҹۻ xù$bo-gHxn؎=g{E♪}<;A!1CJg.}PUR=vǹd~2fifD-*tSź&4Ez'Ƴy)YSb/p8Mމ\B:Έ-'W.wzH3PD|'r׼Kg'!%]S { iV' ߌ'\o36XFvȋWb/f>b=w^]Sw"wA;q#Zqx΁^L\b8iE''Ow}_ EykXDTs j/ ' E{"PiH4Uo3Dpz;O|4<έ IqP9|ZD'xJ \;HVnscZD'(@b7aU*g6* Ew"{7\ƲUv7CVϤbEBi0gAFDeD #m2,hlPTs۬2@|5^c Ø,뢐TBV/7RX{k2O- +jK47CѠڵVXq+Ev'Kͥnam 9vՠVxYDt'Έhs;.fDS{qEߧR)т~| 1M8۫g{#ٟxH(x3"G!cv 8o%Qv;(d bO;jo%v$L~l3dL  Ԟ/~}C'oN{T+Wm$o߿ޑO<ñ?Fa>Fv颴ڋ)WMىθaߋBw86-ޫ(~{kW.ȅ@\&rKg45-Ԟu,_.GAkbY k^K{1{(q.hqSx3b!.tEx}*4fk2$MT}<"H\ sIWO2F{ncD'zG/xsŋiI.wG g{߽#͟xiJ t/ έd5H36}t4♈c;0TX % hzħ}} dlQ@69T^RLى8"@8!|pW*3.|> jNjjoOmH'91!6X3$쭧^$B}MٙZGt̛͐ԿM[|Wk?dͅ*b$KJl}( iNv-_-<*PH"_?2„"@ oWOHX'x37Cx$bG~(yEDN AWo S{q~?Tv"3"\yZ;\ |p[bo?BΕj8{ ΐ 3/}ih )\삸3$i`%>%t8PL}:\gNsLQi"]8j?o}S{~ϛ*(oߴּo[ ijPr|3"hLiȄbxO4ŝt c jOCB̎*۸ 1xkD|3 ڴ);A'\@aH(l:&'|oD`mvQHL1jRd[>{yh{tBxH(D(b"Hg';!Wu@*<"~JO?;܉9Y\Ɣƍ $bMߧ᝖LىNî -J}^H26Qtvfs9y[8C"T@DR+Cd;]8M4EugtLKH* )Fb/baIg'>*yA MpQ+9ۼk);; 8peYD@S{q@7M wۦhsAf͐}o~?f@?΢j=B AHGǻj+tJE*;";,.;DϣB$ m~RtvAKZtLZZzz!Y@(82;\i"3mHF~SuZþؙFOn> ўh=!7߬DH?;n~a,xf>}k~7› *rp\ (a{.~ي$ TI:i&ΐk@!|1B{}iBSv qIF!qn(bge#N%Sz"R҆ 9p)-Li;"b;q7.;E |EO;8O"ǞWgHSWxauIKYxܿ; 3$rgȚC(bT2E'yV A<%BAon5HbcR]փ@õ\V? l&L LQ+@J q\`-TfaBsLމ0q5j8 ModK**8o_`X9tJz cl%4$k+3'xrUB6*bM;Tfwoin-y4yEʼk Ns/;qÊ hK5<L9G4c7ͥn7A!woMy-BeO@Lf')AyJyϞh/pf88C'cA1eX4X ȃ\Eg10Vof'oFl߶ )\fDWova﷗$ĻZ"TH? Ĺ^~&BW5=vx&Y* c vmIݻ]oFDd֒՞jo{L\c&y?IL1-U ht[Pho.uq*ϗ%oDΐS N؞gjowӛc0epq\_>b<3RXRrZ EϴdHadv{NboVI''aZ]A0"~b T1Ev'fxs= V"g&򚬾WtB?{ B\^qWg{?&$1E7^f;$]wt墈O-#+y^DwƹQЖj Xb/Ä{g&𶭢7C" mB&s~fɞPE?2xsTo?^zwPyQ܉J.;)(ؤoοjAw|$ϳqm 7#bo 1[[9=3ěccJ=%ۋyOj\ J ͅ.)@Zf{x"~\b,!} 9Wyż=Wc,M p#Z 78\>}=I37BƋWCmj/GyED,kU򸴒?K{1{_Ig/j=%3g M~{tO?LeQ2!5_)zD_v3+YE Oj.6u_g` ^g{{i`O? .%}q/b `Lè7#!Kr7/Cag&Ab1;"E" ,ť7b!3ysAl"OTK߁qn_֌f{#~ qn d {wS{qyߡ"џ!|muQHd_yq bE=.4}|,o, ΐ`}g{E^;8â^O%A͡;X˲ߙX !3=nJc~)b#v&q.VﶨGq ,@\ ;#iֹ^g;8׫Ȇts c,B!AE:{ I V ܝ ΐP ΐb#x麐C*"iv,p Жkq7ۋ)7"ʦHD2sQ+˦ X 3*M+\'9lwQH)>[S7瞩g$D:WBɃ8J[| 3㙉<ΐ)} x=SԾ!H\I'7y,[6#bB \ycLB_PH[.7(E,]Y3Wډqa*$VeӬ i#S9Z,=(%{!R|IgȚ^ n\!3su[!Έ/{ R^Bd"EdȐ8I4}M}{-g\E' 6[08CW!.r'џUv͝q]RdC"bF|N6W>R蛩K+XM(~f%ٟx/˦B"ɦB ڋ}'ݟUya )R75<W<)s ̑E f{1P{mynk*"3fȖ.1yk ΐի}CE׈Sh.?$U o8s8MolzgIRD)~{h%՟xLz˿ ΐ(AHQ|@oauiFh*DL ,\g}m^ :;͝q;z aL\&4QD[͋y**O:-XJI : !W{(@DGB$" Rpq .?@)*T'څ啴BI[ ΐq:@Yy;]I'xlcgo= ۋᕾO[wfV5牁x81+J@LPɐ?ڋ)￑i);⃈q ; ΐ7qjέB@a1gĮ Dڋ)?ѯ@q㢾 Y2b\y7N>؋l(Vu-!U!#E  sERiBSwƥi8ǒE<ΐb=EE{{Ry%xei .ŕmn2]} .v1?Y#:OJ1{ky6-Hh)>1E.sMž߮Np(Na 'oWل~xfp}gxOP2?~ oWފuۙXtKDAd8\ yf/b9\VmwQZJ*$S{>^&E|'"?\ #TtBi"u߯qBp*"3 )֮^L i)<<=HLXq.z,ګG9 W:) Y@]ϮMT9|6B .%9$*8 dlx!TS) W¿^u\!3# V8ܿ  p@<(b`(7 M ⇜T 4@!G{E\' T6E'+{MǹR,=,F;sJDV ➃/ 5NB*d7^X􋳐yŸrxl $;8G7vg{1{;͝IKV̒]gȘ%ۚ 3$B&y:*4t1蜙pJE{U3=%-ζ2<ΐ#IJ+/)4Ӧ42#=9-Ph)"'sT\}sW{{y%1x-ʝ 3dj87QDUqZE'nkJ%sM qVb/fb﷑3C+VM? &i(DloVL\b@!qR͏3ݦ)py(-P)Ot512fȡ)l/IxWgy ㈧Q,H U:s86Eg4H)SsU,>>/q"3<$"U73^yI"!q@]oW$. yG Q-"z ^;f64X3L"()=b#<\"+]3ȡbuYĹ\Ə@3$%fA3R*RؾфE M {iqiq_A3Y?uM{y=H@85"3$MEMPX a %gdH(6QuNy MQ bYgHqtL}0T7E'η9;xژX 8C?b\^~)W,Oxg.lR7 b{q;ĹŚ@!%y\ XJĹ"b'x&q6gHxܗί47H x&qih-qqf>O"ԞC\}%+s61TIIE KA?~O@]jy9G8C؋4.v>J<\"RHI!_#8E%gHhɞIKZ_f1 >JlϣBgUĉ8C"Nh}qb/!ޯAgzVOL~s+{OHb@92P<ӪJO*$hw+dke7焢*Y'>+\ώ", >k&.ıi<cĹg{ݫ $ qi7#"R B!hsJQ{;^=3wV=3d\Pΐ܅^^1<.P<ӢEcޯ)dրԞjo5h1Q"*PiUx!l/O)=cYR0sIv5k}OD*l8x^Q6D@׃@AZ'L\ƒDꜢ2t:^kn٭ާ )lPdq}nXكhWꢐ[@p[|7H(8# !O 8CpYʓv.gH }MD\qo2E M,rD Eq{DNQ^-GHbo/)H(9RpHF͐\}R9H8̞tqW&ΌB"ax[r!۫v>jaBeS{ⴵ/M\*+3_PB'O8{.Ay"}zQHH}Bx+E;oC!J*">mA2V8ߝoQ^ 0qZIXvKgh`9 GU--i)=2AgcC}P\tFrjm㙁kH 8o#gJ&@3K,`/.G rUHVNQ{D?$m˃i#H(>q#bVyʼn򌭪L1q^o 3sED'֕}@J;( 4SD{b?֗Iq.jcE"@/y\w YSQ: b^o檹CBWf{+uy axϏѕ@/j#XwwK A}CqBɛ+^+ &l//.AyX- . 5qqY՛ڋ#"<\bgk2V՟͈]T{S%ҮKR:`Ϩ9 [8CC08t][jĩf"O<H' E2׉ l3ㄋY;D'V~l:&[U3g{}f4lG(l/cdB%S|~ =]ϣYTĹ*ٓ*A|b7@+Zar6 C??W OtM_0#Wc*Dq Dz&qg*Vp7Cu>zM~u<7׻QY͈1Cb )R-6}Cs]7MyŢAKbL,e ؋)vPyioxp:2b8+4xfpQ@!1JGM& 6&KUĹ`E.,3d܋U^p 7۳:^ϸkoc'8K^8< @8۫T7R!UM f%sIuNWbq{bBX虑l  ΐIJ+iR!UE KuSpU=^,~e"N^^zi)R<ݹ[ dY$&n)7*HqmCsnSID8C 4xTS Dg$0V I }>׮v"(iD'&b b9Q\^Tzy? 3E-y!#P,@!PHmnzuL+݂68{B͐%uk7!ϳƖyꢈq Y|S{;P<3oDy2ħ< _h1],1`(2=}Rcc[!<[nϑݍ`v7CX:ǩP&rTg<;'\ GA!P=MĹ8YɈzyIJy'پ~Z>Dp-Ggs.Bb' έ, lO NPyxfTRql|\lcGg" ΐQ Y} l'jjyi4ql6z lϷ@>P<1 dpQȸIe5ŷnj*#w^1.:q.ec~i)E:Ԟ NqbVPZ= /=R؋UdbyGgq̍4<ΐhg!wMW׎PٙUȝ}W剹qA[Yb'ĹŚ_87߂6f{VS;[SE蚮 \Ђ%yfDiU{RپݢqQ '~b.M RFJ(Nqx_R^LW9N´&+8Jj!Қw/QwF)@"-S =|G!7PVsEH(@3q,g N3&x^YJ 3}8J5I벢GssA>NiI=MPߧƛjHD.ʁH7r'8C\*އ9BgF ׳)fD$xe)D1Tv&oW/8CqI9 Eo:p΋(_|#}}5H>.M?boeQϓUY|E3BAl|MwD}։fcp6#?bOOkO3hh6#&}6Cvy5BN ɚ+Ut91df-ťM"u&o.TQ. <77Qgĩ\ „k]NRrG(oLos Jx!Xz$ۋb/ $T(E'X1 bDe\!B^coR9Otp61NfD{wQ$vB,[IC\ ?b}P~_؄+E`g1\hW?QlORo>"kI(q,~hr6 /!x Kc)} 3ss3~8Cx~ݢno>Qub4eA\bR 6~ a-D}^6(lWv*\{Pߧl*b~Ĺ Fűx3?%*/CJgzX"(Pwb έl|<0a{1{{$qx /ΐ(>q>qk(S'y[DwB(X>.pU>DZ(hL\Ƃg^fȨ d gպqJGm~b+39jZ)q&A`|JkhboŽҙQ5nLSݝp- 77f{mmRLavP{k~ T$EKg,XEńkFCWi2)b:q'kXжЇWُHtf\s43p7Cb[>C6QoEЙĹB1eUgH,MYQjr8^ACgB7^->c)xrp9#g{qoE,'}.xYD3$"=NOؙR52sBaHxi͈7p9|˓DL} ޾T \V.8S&E.d{;:O< 6("꼟*dvW{{hWNMkk!MiOTf!%4}y?x!Q||uҔQ|ĞNi3Ƕ_:XLE J>e4}♉c 2<ΐ8 aOs EiDs tfsAjND 7#Ol/F~qzd*g)::c j6E@\ >iٞEޏ I$::_2"ҜGZDĩbplķ"j/F }>+EhlI Qie$:z7CByiC\gJcpVp8CQ*_2HbH(?[ZFf3sSH&Phe8NЙj];gH f T=+ ۋ) :88CB ."T^L :8既8CSRansڂ]I)3ӆ*H3".ٌX|Q򈽽"Mxfi> -T1¿8O<+mQHWˢj/ vWpΨi-B C確^y3y׊} gH\-cUjPC>'ۉ @[ f1D>--eGߧS$F(DZ\b͇,KJbK($sAͥ&DJb7tf*Qx:)d`MTQ>{Iv"@" Nɥr>?RO>'ۉ ›!KIT{1ۓ''@Rtl03Q0R򈽨bhS IDN'd}Q0AZMDzWĩ`NE cۺ$ŷ@ jkIq͐Xq.h3dKb/Ed(41Rth ^/} =+k?sX?2s9W$o:H9NnNr7n $x2؋oE LR+m.g1g>/l݇@H'~("<\_n3$e8dMѴd!Tt&q.vCa ΐAq:<=O'܉$>Ep=;^IT!S4Pՙ3Eg\4͍,>py?Qɛ]De96#YP($s4W4fl(6FȦ%Y׉oG2ς |S^y}!F/7Wml .<4{. m(<3̍( :- M[#wSy?wT R6.j5_t8H%tiɛ!1t? G{6}b[:/"3+.'DꦻMU!-M$boNIyKGtml:EbO;w%;[n*sb9\c dubd":3NJE$ۓhT&nb/2$sX$s{:$H)T0Eh'I-8 N2ώ%X&َPי.~. gȘ5XN@0d]gX}zL\k;\O8-=>=έKnD1gs91M^ iɲvOX>on!N%SxFN:@Vd#YCwy0`E!cfrW,ilpP$^!k@y @gjmOI';>Y7CRgRT{[jgRgbUf蔶~ 3${-ܭg~"nK N-njb{߈zy)XOĹ^V lL?q/Y P2!߂8CrQ{YgX/r\~b~/~xRk&93$R T|힭qn]V>OyΦEpاvlHS~bΖӸ@2_oCsadi^qyK_.0T8EgU (^UaEMESx⦺G/źx3?l ;3N^Ef4ޕ(Dq"32J $窘?J|NOE'"<ADۿm(BQzoCt("3:f*=녙8U{zg{E93Dw&q.g T8CV_QknEK˖0. y^Z)Vh^D !3=1r#8C"TႠHa{z%3ys9ϓ{[8&Y4Qъ?tѝI ngHL'gB$ 3is ~f2$l@a޷k3@oL*"'o dl@\8۫\~8KB@gQS2Op-6q_+TD'rH$quU#oj/RBVt΢@"R!s[̹ڋH7ߧYLs2hD)}pWft"۱~q³;!A f??3T3EsH,"͓8bG(fbW3]̐9R4΢䳸](CJ@ge7\P6)*$b{1E;-TlHfsM\a wR{q~CFʦDN1o\Ң繽@|POUmi)=ĭ7WU!w!^LwM:DO$ÓB"b&R8\퍰3w^9EDxFI"Q}\5#b/@xg., 3d*xiHy?I+Zxw@!q`q^lAԅkBwgmQfDmѕB_{3is9r>|%"=qǫ7Sb/bSH,*<'i-Ecgnlx@xg:U$kyE| CK_)r&y&q.W(ne *}C"3hO\=+ޘ5h3"ߢV{E[ާI ,<3}_4yz.i8\Ax("ƒkq6V(ꥴPtK#:XsJzL!;ڄUZ%|R:BOLD/hsתl3nuGB!yfpN雿 ΐ蕙7#6EpJ" n~D rwRO 7C'wX"PRŞepyOT/E'#)sS9 ΐ^KTߙJ]3^ ~ έlɊ7-ĩ^PO4s5͈$PL H*1 ~YvjAgb{{!1iȜo3ۋ-^;5׹14V}/bl"MiPj;8WH~S g>/Iq~z)2qS|I\<~|ݝ&\ǢQgHlc,IUR!DI+]tL_PqDΈŷl/Ubol? q7ĐWP «cEBfACO· S|CE绿O7?gۧOn}~Oǯ˷~ۗE/߾}_O_P:˷O_~̗?_~߿|o?l_`? I|Ͽe??|OPK 4wFA_rels/UTUux PK4wF L--eOk%`Qd֫*k*EL*WNrwgMӡ`ʥFC6Q^Trm姏aJ? WAiEZF>Qa|ID?q;y~)̑#m,=\"w~j;> wrӫo6;, |7kץv)pv١3tLsmPK!U0#L _rels/.rels (MO0 HݐBKwAH!T~I$ݿ'TG~KAsc+EY5iQw~ om4]~ ɉ -i^Yy\YD>qW$KS3b2k T>:3[/%s* }+4?rV PK!Ѽ$Xxl/workbook.xmlU]o8}_i;5+h#ͮx9 fmP)?w˕+9 ;&+ ϐ *ȎkGnvRx9ƚռLT-50T{ikM0RRѡ !W`lhyg&jEgf}& v΁"eIEw I ~)IM8S/jSR˽9h<~'!_uH1VVXVFF#`-F-D{/u=fA^CU0GTD$Hዓ pQײ3`{k+%wB Zrޠyaȧ`ih*j(~dD`El$0N*vmmB@u1g$׷٤U2 u* f*xaZI*͙3l(Pd/:3$Q=VƷg<ʶG;Ư麛q *n⫨L]0˂ӳ?8,܋> UľC VMh) r˷WWN{jZ3P܄K> mEǟ<5G_A;}:{+2ڰkٛmpqwpe&'*d%~.eܞ$HU`S9{) HV|Ol[zep.`*ԃ0D̫'ii xqgO[KVݩ1_)VoKo).xVq?PK!J xl/styles.xmlUmo0>iwj%P-M*uդvҾ:`~AȦN[}sϽ\RgfU # ]rMܛcXJ*b)>_e%=c"PMwKBb$m.t|lISF9IABߟI=Rq5IfT:)1Fq{}^t,F\5%u=cdor^F.>y&>hhK)Bct5neJML͖HwS:#5W B iezwߖGZ-n<ڑu {"m ~bS.ГcnEZ .\d{~,e7aؔWO,p`O+aD;/t.V0]锎t;:oĹ]!#%NYM0I.?ߕ<س1r|EVR8 5F>Dh hLd]?VtC宄*}ևRmK3Շ%ʟ3izOb.ږׇE>4ӭ]F;㬄龍,Zgx"'PK!P:xl/theme/theme1.xmlYn6wtZ%l[hnebCH'5{a7v؞=)"cO tb 9wӔ:8e=qslFE}8:f 5?DS@'5\9I1̈́Qn7p큁[Hqr&""9M \;KaF_v ͊}j!xp$r/ؖC]nv3I,$ڛB›H] EG߄jŭ+6*hr`sV Q>Cw]8] gݫj9M49P9kMj5Xҭ ҺF Q[L1d+RR5.4O{#xߙ]Z9Al֕*Յ~'O@AV֋I,Ev$f;LUŞc>Pre+s{)B<ܖv-s{B<6-5zRw8ù |ov!ӚH뵬 ) kl4D>=[U;sMQjUew4k)e@t'PK!PY'xl/sharedStrings.xmllQJ@ CYE,x9i;Йt ^^{{Jb(jmBҼ<^f"1Q Uyc=yUd icyLND{^Y.4f1v qUz*V9T;9F\._ЌLРB;D="v1傉mj tbZ»K/cA'Ǿ.?GW_PK!T]tdocProps/core.xml (|QK0C{7J=C ŷn6)I7mڡyIι=ty ZeFR3ۮ cJR+P -뫔 8 6$e^g\`l*f#P^,W5l8&W`#Ӕ=@p %T4Tς^8+t;e >hhl&jf} K?j(U+(OO7muႧ≣fɬĪ@)Y Ve*ſE?D3&Dguvw]<&t8-% ! %].PbO\dR%&gB<>?ɿPK! CCdocProps/app.xml (_k0Fldnaeݳ&_Ǣdtod~1uapӑnzHb(բ+x}Ͽ Ʉ'@q?~P;H3X[Iׁ7uL!n^ƺvn=H.Z‘ TPd(FUOkZE;1V_;kOMcMٽ.P&vsn.jk5B#(:Pw`6%ԪUb"mR&9؜k!%+'ld8 21 )\pJennifer Bryan Ba==p4D8@"1Calibri1Calibri1Calibri1Calibri1Calibri1*h6 Calibri Light1,6Calibri16Calibri16Calibri1Calibri1Calibri1<Calibri1>Calibri1?Calibri14Calibri14Calibri1 Calibri1 Calibri1Calibri1Calibri1 Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)                                                                       ff + ) , *     P  P        `            a    ||?i }-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-} 00\);_(*}-} 00\);_(*}-}> 00\);_(*}-}+ 00\);_(*}-}, 00\);_(*}-}- 00\);_(*}-}. 00\);_(*}-}: 00\);_(*}-}; 00\);_(*}A}1 00\);_(*;_(@_) }A}2 00\);_(*?;_(@_) }A}3 00\);_(*23;_(@_) }-}4 00\);_(*}A}0 a00\);_(*;_(@_) }A}( 00\);_(*;_(@_) }A}7 W00\);_(*;_(@_) }}5 ??v00\);_(*̙;_(@_)    }}9 ???00\);_(*;_(@_) ??? ??? ??? ???}}) }00\);_(*;_(@_)    }A}6 }00\);_(*;_(@_) }}* 00\);_(*;_(@_) ??? ??? ??? ???}-}= 00\);_(*}}8 00\);_(*;_(@_)    }-}/ 00\);_(*}U}< 00\);_(*;_(@_)  }A}" 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}# 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}$ 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}% 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}& 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A}  00\);_(*23;_(@_) }A}' 00\);_(* ;_(@_) }A} 00\);_(*ef ;_(@_) }A} 00\);_(*L ;_(@_) }A}! 00\);_(*23 ;_(@_)  20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L˭ % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  L % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23 % 60% - Accent3M( 60% - Accent3 23 % 60% - Accent4M, 60% - Accent4 23f % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23Ў % "Accent1AAccent1 [ % #Accent2A!Accent2 }1 % $Accent3A%Accent3  % %Accent4A)Accent4  % &Accent5A-Accent5 Dr % 'Accent6A1Accent6  pG %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 DTj%[2 Heading 2G Heading 2 DTj%?3 Heading 3G Heading 3 DTj%234 Heading 49 Heading 4 DTj% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  W%3Normal % 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title DTj% <TotalMTotal %[[= Warning Text? Warning Text %XTableStyleMedium9PivotStyleMedium7`; list-column>two-row-headerINameClippySpeciesWeight in grams paperclipApprox date of deathnamevaluespeciesdeathweight (in grams)(office supply type) (at birth)(date is approximate)3. .jcc0 PK![Content_Types].xmlN0EH-J@%ǎǢ|ș$زULTB l,3;rØJB+$G]7O٭V;#=\;S8MklX(*|C:]g.Gp m2:ȍc _nLkjt>.&< :bo~PS4J3.OC^Wx}sǗ?@o?E@{^z^2|oT:=a($9AWW[@f[-4j .9Ō%b_K@IZ@qJS2(a+ʠR#tf-y3$8|h_WW<_:GLDdϪ(qo&skM݄o7uĘ;Ű8 8(Bİ@Ct6\㞥06uKA,3Df،Wb1Dg½b;Wk&$Lu zPI=C,$E¢)ݯSYM[{`F((APb~*8%^ThN ,lS[)]ElE򎢋yWR^QgE |P-$y#eՃjtӢkdvݫd4LCUd״1ú lvM^c1h3ޖZ Etk4f2d+RQwx4 Mۭ=: ުvlTV`@ ~ V@P>@ggD ) '?@  dMbP?_*+%@&ffffff?'ffffff?(?)?"@333333?333333?&<3U @@@          >`@V@ (88>@ ggD Oh+'0@Hh 'Microsoft Office UserJennifer BryanMicrosoft Macintosh Excel@@  ՜.+,0 PXd lt| '  list-columntwo-row-header  Worksheets  "#$%&'(*+,-./0Root Entry FWorkbook@SummaryInformation(!DocumentSummaryInformation8)readxl/inst/extdata/geometry.xlsx0000644000176200001440000004606013172305601016717 0ustar liggesusersPK!;H@i[Content_Types].xml (N0EHC-Jܲ@5*Q>ē/y=VTĊsǓl %#T))eFaBɶl6,0l%kcwcՂX8" FD Zht+g#ؘNM'Pㆶw$βݹΪd{* wQޛ@@_t7YAI[o/eR^AI"gao4taܲ.յ@jekBb .Zy?FAHwxdbjs=snEM~jqн瑦..;$!*8 He;8Ȟv Ǜ7hPK!}T _rels/.rels (J0rߦl&R`66dFj=Nfv7ځa "m\+k,&pr(#UW K3>]JA: r`!2ƒE);~kjZ7g7G[XL!PpC& d/b\zk\(|$uҌgcBQ/#KDKMg;@/l.WN 3A}3.1PK!nxl/_rels/workbook.xml.rels (j0 }qҍ1F^Ơ-{c+qhbKɠMt\ 'g&WP%&w >׻'[= &$շ774OH"xR㳔dNҨ9ɨAw(7e(3O ރhm| sD"$4DSOUNh9.)k0՚0!!iɹS]٬ `2K9Gyvq/PK!f܆.xl/workbook.xmlT]o0}N H@!U-4U>; ^lMm/6{ε痭wf,ת@E<.:֟!:J"b:3.O<~@U9ƖVL{k`砍$BsĶ6bI H$\!7oЇli#ra8o+^MҷIbڧZ炻s(0N!:{tܑ$>0~,ao^, =w>GOnCWw`*Mabve#Q"?рT+6`@}Zu9`/ЏiMlzq0jd~>[o8 ]iIrd(Mi:+/&d'~l'2~N"?Q(NG}SI(4e396_ZV#tsD^D'5\9I1̈́Qn7p큁[Hqr&""9M \;KaF_v ͊}j!xp$r/ؖC]nv3I,$ڛB›H] EG߄jŭ+6*hr`sV Q>Cw]8] gݫj9M49P9kMj5Xҭ ҺF Q[L1d+RR5.4O{#xߙ]Z9Al֕*Յ~'O@=Yh/XQcx=ۇ],"}b`9_olnw0 7cke R_t ޙzP+ 0ō5Td4y`j -7/e@NIJz+![I p4gJRjգm4\ ?:յpsKdi.qT\Xy5dQ 4fz8?>C5}ޖXc[{)_)d|_x 2/,ΩQzڀY]96$x($b8` 0*^u_mڸ"01ho1`pØ0b׮Ǡ^A{;em[F(iNHHܠ8Photoshop 3.08BIM8BIM%ُ B~ }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzCC ?<-o \xc×g}Hy4fitwYd{Vy$ػ3bI&7 &Ȕ!?;M7(C+wo"PW 4D Яi@"_ÿ$D<'BI%xOMJ? &Ȕ!?;M7(C+wo"PW 4D Яi@"_ÿ$D<'BI%xOMJ? &Ȕ!?;M7(C+wo"PW 4D Яi@"_ÿ$D<'BI%xOMJ? &Ȕ!?;M7(C+wo"P!"]?k@P@P@P@P@P@P@P!"]?k@[Bv-m{{yex&í,K2HTuϏ|AnNO? ։>>1u?:??n 7@'Z' fDh7_`ˤim]k5ͻI̋qgq- uMku1eUIct :??n 7@'Z' fDh7_||c3tuϏ|AnNO?1|Bs0i,[{X.Q<: kumrJͽ1Mh7_||c3tuϏ|AnNO? ։>>1u?:??n 7@'Z' fTCKMoWԴ{![O xOHtDVXURG!"]?k@|;_1Kh (8>1u?:??n 7@'Z' fDh7_S2-[3xǓst.q+ȷ6e':NO? ։>>1u?:??n 7@'Z' fDh7_||c3txwZD:${?]Q|b1C$o#-pm.fDh7_||c3tuϏ|AnNO? ։>>1u?:??n 7@*-J–02.\]_]Zkv6rBVU s-n$ei!!"]?k@|;_1Kh (8>1u?:??n 7@'Z' fDh7_S2-[3xǓst.q+ȷ6e':NO? ։>>1u?:??n 7@'Z' fDh7_||c3txwZD:${?]Q|b1C$o#-pm.fDh7_||c3tuϏ|AnNO? ։>>1u?:??n 7@*-J–02.\]_]Zkv6rBVU s-n$ei!!"]?k@|;_1Kh (?4l/Ŀg<7|.^O-xs?ǿtOzGuMKXվi^ Ղ[&5po)sWi֛kW!gQ/uxX |gqv>޽;~&i]O( (/?;^&4|F[w¿ Z[%uxMob]vL5Me7j}XZg{V_/xF:]|oH-+]7? Qy}>4wo]~𵎗ϣQx\_ͪFsgqivP ז\Kg'#CI$[D@P@~ԟP4=?!"]?k@~kKgⶒžFo-,vZ]BYIimM+uϏ|AnNO? ։>>1u?:??n 7@'Z' fDh7_~-!nj~?~8|7χxZ?P,~.| =OG>w񵖡^xKcLNKtC U|,F^ER>:EMs㯉h/fy$hzĿ~+uOZ| -4_x60:NE ։>>1u?:??n 7@'Z' fDh7_||c3tG/ ?h|KgCExWnj=Ko^5y j fCw|oM'U:f v u kWZn~1G:~_vaohI>[~;9 _x6&4Jo~g&-w[n4`<q?^ ~1'_ hƘ|&;ҭ4Mww_clmu<3y~d+;O ։>>1u?:??n 7@'Z' fDh7_i ZXƕsi iKuMXЮ Y-5 !+*wDʈ!"]?k@|;_1Kh (?4l/Ŀg<7|.^O-xs?ǿtOzGuMKXվi^ Ղ[&5p]'|Awzh~}-ĺ/uΙjo@-=:YO/b?⇍Wρ_?i/ů~ ߏ;V-=+O_~#|Dӵ5.–vw-+(503#]h (> ?h'i{ !"]?k@~kKgⶒžFo-,vZ]BYIimM+uϏ|AnNO? ։>>1u?:??n 7@'Z' fDh7_~-!nj~?~8|7χxZ?P,~.| =OG>w񵖡^xKcLNKtXX>$uo|I< S]<ק>Z;] D[RB-.¾?wkH4`Q @ït){~Th7_||c3tuϏ|AnNO? ։>>1uo>%3K<+cZO~᥷/<Wo7 *^3R;Oh:57R9 1Co<;᭟+74_ %O–߅_ ?g?<1&e/[ۨox;ú|/𾍦x{51i:&eiq 66[@D#4 ։>>1u?:??n 7@'Z' fDh7_i ZXƕsi iKuMXЮ Y-5 !+*wDʈ!"]?k@|;_1Kh (?4l/Ŀg<7|.^O-xs?ǿtOzGuMKXվi^ Ղ[&5p 6 ej /?|B>.xǍ>#RwWែ~0a)Zx{OTZ喷e i@P@|eG}g㏈= |W]k[^Ծ#k5{Z K\F RCӯ Y>g?jj᎙Va𭏊&ì# OhmCV_\_5oC߇jAꞍFYj:nei:O֑ZsoW1Osƛ{sc>1u?:??n 7@'Z' fDh7_~-!nj~?~8|7χxZ?P,~.| =OG>w񵖡^xKcLNKtIa|0^P5π.*?>%Oٕ(i~$X_G~Nm~uϏ|AnNO? ։>>1u?:??n 7@'Z' fD|O7Pl~%Ǟw1-'ǿ|}ᗍ~xZCY]SIohCk4sš֛yg_xÏ~߷~gQ;x~϶>!2|K^޳ uWMC]\MxZn`4P@P__w/M? i8 ~ֵ5K?ƷKW,i>ĺ/uΙjo@-=:Y߶ٛUCs9/CM_k_~aWuRsvƟh z_s➳9i|O>1u?:??n 7@'Z' fDh7_~-!nj~?~8|7χxZ?P,~.| =OG>w񵖡^xKcLNKt 7xCIXx>>1u?:??n 7@4|boGĿ~9?4[;߉~|]? xI|4e_?m?x7|A[>jPi \u@)OŲx7yq]fMŏi_sM~l~>;~6,|jHYL-5<^iԬ>|57^I ?w].72q?#uϏ|AnNO? ։>>1u?:??n 7@'Z' fCV>1u?:??n 7@'Z' fDh7_S2-[3xǓst.q+ȷ6e':NO? ։>>1u?:??n 7@'Z' fDh7_||c3txwZD:${?]Q|b1C$o#-pm.fDh7_||c3tuϏ|AnNO? ։>>1u?:??n 7@*-J–02.\]_]Zkv6rBVU s-n$ei!!"]?k@|;_1Kh (8 U iz{7Z{+K]v0xvHd̅'ۺ7d*uϏ|AnNO? ։>>1u?:??n 7@'Z' fDh7_kž*t{30M'|g"¾䛭5ok6|:>aym?H/3ʝdt@||c3tuϏ|AnNO? ։>>1u?:??n 7@'Z' fDsZ,O\1[Ķxhmu,_鷰yshC th7_||c3tuϏ|AnNO? ։>>1u?:??n 7@'Z' fzV_i|-NVz|-qjĐZm3mC6WZPK!* M{docProps/core.xml (QK0C{v=9P| lD{v)ssI*cV9JBmsY/kXGVX(./2V <]qlIVh\M0l;Km$uhnOx%8ʩ@DG$g0U C8u`uSFN)ܡqlzqpMDMzxBb3 PMhK<`l, 6+j/o K]9Jb'%_/Q1yO8]'s2d1F/1?7*%lD< } PK!}VFdocProps/app.xml (Mo0  9: bH7bvgNc$Wvڍ/^>+zLdrQ J<~\|1\X#?M ["[xDWRiZϝ&8i/CX7]JA: r`!2ƒE);~kjZ7g7G[XL!PpC& d/b\zk\(|$uҌgcBQ/#KDKMg;@/l.WN 3A}3.1PK!8xl/_rels/workbook.xml.rels (j0 }qv]uzu`l%M`{3KS(%b?>{nF3Ȓjad+Ǘ-繖1`_^>\r *1Pw:.1P)mhʼnWH4P;ՀB${+ Ǿ 6eY |6E_ƞBA =1PY%u00>l SB:Ya3'}57囷Si:^|NO<1vh0dTPK!?/qxl/workbook.xmlTn0?+ǎQEYMTI*Q(W\"hfp3/>rY&0~du{A}a|[ZJCKַ.9J7Z:GqGP. Bm9%;ULS7̡t>AsxЫiМ~Ty:EiGEcQGB>*%^"HTwsRB&G9(pE195-d4p1K$ U dNFi<_rs\:+EAmdܟun؆4®*e( t +i_؏e8d<4:RV¸P֝ÞcՎgd s5$7*PK!? xl/worksheets/sheet4.xmlU[o0~`q̵E@UZUڦjqNU;le~ "s3WE,N"0,WuDeƕ)aE[c_\ "nWJ(@s JjqkWUxV_ҊdD5e L%&ϥ#J߀XPܣ~WʵhZ\}YWW !Rՠb*¸_ـ޼RXLcз1Hi&1vb!EwlGt>S3(2,SDx5$\>|;yo %Ly G*WU\x{Pd ~BeNռdIKf@Zl rV~*<1!lN`aQL̆GK wģ_vp\/㷽fKiU< H0{(a7s6LǶQgHq!\ tna/׎Dϓ CHMTck;υ_]y=x6ӛTadakw!1݄'PK! Z3dxl/worksheets/sheet2.xmlU[o0~`="TZmv}v V1f4;Ɓ4 `}IhǵZ(1S6+#ciRU|d)8*… . T+JKja7ԚӬ$KH**zsb[+A4/i$'~L ֢Ѐb$~S)M%)k+x)VF68ⅾyA$K;<_hy=$M|oN7Fh 5_\AmC:Z]J=_ 3Qx%Mط4jIԵ|@ ALhdקig#ӑ`kp Ń3୽voo+qyr9:hsў/ 3} !8;@2OqƓ)NH޴EI8G-܈3u ppܿ]里?m5ToDePfDRgH8ժvcβ0U ЦR]A\_PK!ㄳxl/worksheets/sheet3.xmlU]o0}`|TMjcLjcf;I_k!F0rι^h˴pW ~qʉP|xnSɔYpim=}CK&T*JKba׾5#y~/ p0c0TQpHVD3A,7%M&8IӦJ}u4Y 9 +xɩVF8O}@Zs8ۑfEo yOv(%Q⤄Ig>}$k:CԵlԓ{g8 Fyenams ?:47m~hE Um 0N9+Fدjui%;f(4xP%n"乹Z($hъ{$Ftc p=VJSd1j`J|8@ .A([`rs$dKH>]׉`2r{f\@QX¦o!z=V3KU50*ᨡLj2nDye`Es@Zݞ 甫S߭J0{Y(e;Ǝ߭PK!IOJCxl/worksheets/sheet1.xmlUn@}@._Dq*y,f`ڎa1؄a9g CxZΖ+-dK&Q#Ռ82,yD\p'Ջ87 :"14xA++^B$jJq*ro7^AEI,B!T0 ٦ॱ Ԁ~J v\A˦bb%ra5(q xZRUu |!Z8 }[ܛ{ vG4"wbċڠ_ѽW;%;Eg^n "5QJ|D眡{˖?0Q^rVT{ɀ))}bx:EAA\#9¯SH}s#< $h#seQF \=.JR ř9\ w 48ۂ .O6Q g-!e׺lj''L==hjW>ğ!;0% lhkz $\٘s PCrkTS=9:!_BhؘĨ 'b&hZ춠 | i#K0;"XyiUUm7V/TEaPv.pNqJ+pca.hI4~PK !KZ4@@docProps/thumbnail.jpegJFIFHHExifMM*>F(iNHH8Photoshop 3.08BIM8BIM%ُ B~ }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzCC ?<-o \xc×g}Hy4fitwYd{Vy$ػ3bI&7 &Ȕ!?;M7(C+wo"PW 4D Яi@"_ÿ$D<'BI%xOMJ? &Ȕ!?;M7(C+wo"PW 4D Яi@"_ÿ$D<'BI%xOMJ? &Ȕ!?;M7(C+wo"PW 4D Яi@"_ÿ$?!"]?k@P@P@P@P@P@!"]?k@[Bv-m{{yex&í,K2HTuϏ|AnNO? ։>>1u?:??n 7@'Z' fDh7_b(a\Y̶qDz=[v\xub#{& b7` :??n 7@'Z' fDh7_||c3tuϏ|AnNO? ։>>1u?:??n 7@'Z' fD!"]?k@5g:`'=i>\+/|I.dھcV/4S>o<+/ ɩ5_ xHOy7oG߳h_gO:O7_|[ĚO "ũf' m@k@|s]᥷ڎ|Uy?eWঁSQ? |=_zf6Gt!S?xż ĺgn<X0 (>38<37>( >S_ѡT>Ko/_Wtdf ^7x_/_>!\W@=+F.hx&Ӽ+;ym3o~34|O|v]i(, Zk?-!լ%ƃv( ?O{= {?^McQj%ix??l7l<]Wߴ߆^m<+!٣VA<ƾDhÒD۪ω_n,w~"׾xP~~"/מ^ҵ&/ >"p~o~|15߇"x# g$ /Կ:?#<%VhO3>!j_Oڐz~>i?Zag{Wƥ◀f_g^[/ C5 wz|F_‰uH<hоhKl5?~* Z#Ƕ_쮬?f|wо%8>$a0F?|n(|+~P@!"]?k@%.[3 tᆱ_x?54,MwRgt-w˳ƅ=V- |^%)x3X'|cwWeLJB=j/ K/v_xcڷ/VmūZ]o٣~ ֓4V/HQ/$kRx!{Þ#%xZQFMR@=??gw Š??gw Š??gw?fo |Ik#f; c¾ 5=KZt J +XOQe )WoWǭ ?u?_ioA?׿tHxW[R.?f K|57] W_^i+.MLJ݊3Q{I|7TȀ}<7S"֥P/iwz$>u / ťO,cěkkn4[q+]JhcuിؗYh?d]+׋txO|)iux4Xi6V]ngbӭ[mD/e0/x|q5|'ƞ0 Š_Y_Gk_ko?i_{Y~ϰyoݞR!"]?k@|;_1Kh (?=n?>>|wΣ/ixP|EOڋºfcXgŚhg&o~ do"<90w㮡0h>*KN|E 'o|95GŞ4cDk.xMO?iSHfߵq?Ri|}mO;ž6<'%M}|Eo ,+wzwO'_Wg|y1l+7iW]kڧѾ~=y?g[5]gR𦥦Y [|uxx7mhO|ZiGixc[iW@P@|R@N!"]?k@>26GoighO_~?%|$G ӼaŚ|2=s4N5U)Q?_,?m_!xw?fOg6?gox_<Ŧi#<#j:ߊhᯂ1uX=·D6~ ~:&|'烿bV?k ;?/~W,?hO_H vA/~ahGmzO>֟h2g|n[E{O{m٘|XO_|e=OVƧv?o~)~ϟ'Gkif<=hɮ\x 7:>'xF[ hq_ Ii z+"; hw_3 |S^5׌ ?{i4oKBgj ydھjzÍW)СS+?lu&qP~xI.xG -j_|"GoOw)cVԴN<߉_<9j>-E|J ú+8iPuC (>'x¿_IxK??h_tx/e㟊n6/tNWPo3Wx_//?m?|dW//?sǟ'ƿ |[i}O6mV9ޫ'ſMKSQK}dugIuφ~m|?s3/Ƨ5/Z#iߴwi7{xQ i_Hi 7%־"xsh8~:?ǟ>%DŽx_kc|SI|IW<g^Uĺ^Z_Ǐ~Ӳx#??w>zG$ÿX|o5-k6>72~ǟ?hV|G$V?WEw:/  gE?]?L@+"; hw_3 !"]?k@~o]F σ_ ${x᧋7 (mme ~#𞿧kþ4井zi:潡߀|soX|KWy{C=$iO/ >)>3t[x^4>Ӧ🉾0xl}mI滻o`u=N/|]~?|k>7ҿb9Լ!G/Z•O> V |C}_2Lvye_(!m.j.'j$ۣ>&|/e-|>־/>8|K_t?h\š$(?T-]6Z+CC🆼9|A,/-m#־x_៊'|r|k/xþ{ׇ!|~xA_ Yoi_O|A'/w¿ 'F'g㯃7=x*mW:uמaikv V:m@>|E'/<7ƛ mcB KÞ+׾Ὲ>|(%O"o#?i6z>?O_MƩ[7?!"]?k@|;_1K GU ,x^վ$jx`⎐)cSfr{Kx? Rx_`$3U -_x).7:灼Ok:u>L'oxv _W)'Vď&׊>/sx|/g5ˮ~~'kWŅS|~u[__|W(-bm ַx?X?go |?\/x~hoՏu_?x+M+II}{gO>+k{q$6🎴X| ԼxcP}un'Q?~;>K?t/s ŭxc( o~7<֑j9K~:l|';~_|:G<}i^"񵗍?DP 3~Ж>5]AkZ&"K,x38W!x _9uυIQOOA S#N_.:Ŧ=oĺ ?,e}>?g?~^>ύiC[_K]}Z?l4{_-/xbWދ) uzޛqFVp?_>)|WҾ/?hU?|[/>+xDxzxgT|}#ScxK㟋-*}cU/kO.*$M ~&ˆ5;[hn%7~4|g:|c>-xRRSSMiZBpz7V6pRg?ƿBUh 6'u=CS&/隗]SdžW־L޿^:n4[i{\݀}KƷE?Z]g\k^/?aXk/¾[gӴ}oѬCT :ӭ!SK <O z^6nj<1?xZgAO| '|U=GDcڶi#4yj:֏aY6QJksEnO/4[GO⇅Y~j"'^ywmhVe?lk]aKBzF]?28E3@YhªE𮮬\+OzF ,P,B*(<)G F =P9, ˻%I94F5(1ƷE?Z7_Qah5Ԯn ]VI5M-hi";(Ug+)D@!"]?k@~߁KRžŽESA<2^ #`Bu>)_N'6C׃:8_,- E[7>)Go _^^(e|Wg.[Em4 qc~Yf+ckNv(~GُH!-SN}o ϊC]]|.W?ƽF' D-CW4o@9?"3Di4|!!]|Zƭ|S?/#oź'% S]Szh?Bb|?Sh@Ҟ 'Md?VI^ w;+DY]GSt/zyJ8]SGȚk|Ak/e~xv:/^>&wo<=Eό|)kΫAu;wKW_{ S)ŭ' 1⻝AVڕp.Ey,? ~![SalWs=uo</]Kƶo+~>?|?#|/SH{!Yo|s\_jOw~:UoڧAӼ[:i~5g<5o$ku.xOw':/)hO"s o|5x^)Ҿ6Y.Li} ^›E?b|?Sh@,O=x; mMu>)_Ni gG7IgFMOCӼCkÝgx/ I8-7Bs{5>1m ?P|2~]oOA>t! x]xĞǍyoA^<Y7:ֱDeCw&O;X<ρ5o~hzOE{^&{&߁!6og@OhF_OIgQiN~4Oχ~j?//ʹjCķ?~Rx:'/Mľ/ VZG ){&Tx\&|sԵ#Ҟ {_Xu;ozt,yx爼?Ꮘ^ '<]he `Oş|j]E|g/>K~(CᾫK[wk:֋_i~0]#&ӧRçXa5+KJ>BP<#o;4/D^O?߆^~$&o|Ew}I_ [m7C?2*O//ci⇏||w'k>6wٻimkMex⮁h|Iբ oSë xC{(G_> -i⯆ j߅߳%x|qmw?G>|o}s׮4o ]_o^?wŀ>~?ox> 3m;G=Ǿ:/ ;_ bvOc|@'ug\?,4 x&/(xW,oxs=A|@6qGWG7÷o X[=_T/x/N|Ϛ 8xƿ ?1ON}Rg ]Ğ?x2.?  @^7'4xӵ"(R4J( +؝4!"]?k@'g?]_WV;9ߊ-l=UoEq|N_~.yLj.cZi:ox7㏁tᏅ){ץӵO]~( g_Zxx_I=?|]7sum.)cwx᭝uWo?E>xU~ƏYO]E.`-]W@,|J~+=UiֵVg|9{JuN>Ə~ 7:qxWZӡ`}7u4#߈_  |/S?:k^(dž)./km<7=+8_f! ѓU^$Ɵ}hxD狾/om57/= _׾ ךރM*-(4?븯5aֻ%V 8eDد4 Fi-$xn+[ ]hK?P./\"unBǃֿPxT37_ڿ5OxC]?ſ_ [x7>O ^*sI@Rn>q<)?5> .Z<]>m~O$huXu>/V6^Z4>!%d61:k_j5G)/śj9Wփ|0#Э_%kᥞoīKOxv?,:z+r/ K ï|u/ۛg_>Qמ(յW~~]i'Ë4,-?c?^t?𭎗0hW.ߋw>V?fo^h wtmq}dzxp ~(⹵5(1w3xP|u B6wmTt}[큗zF:Nͺy/>%x];E&o kR97<%9,E [{>~gw~('Gk`ɡ|~)xf~xᏆ/>%< OǾ3wi:Ω.g#s_|>Xk~x;gռ5$)|DwǞ,şh2/|!x_|gO𝧍Eex5 O_/O&_ҷڌwįXv׬$hISKVľ3-߅[R>w|(UcFռ=7œj~!h__|w6> x籱+n|OxY×8.-UzcO{>/?xOZo"8[[kx[[/%'"Ӿs⦝Xm?h|Ii^Ӽ4ˋfU"_lfa~|A?_KnO J񎵧kv SZ߈'g?#C!iP|Q|_saW7q[L#ex߅u owt:-KgY/7 ⿃=,5+t/=8x i[=f  {D|1ηbZٵk !c_ObfNO/7kXW~0P?f_ |9 mV|_{~˚#hIcu?3ľ e -!?ῄ[?M xGLo|$_Ѩ|6Կg;MsTP?P2?g}*ooTkj |Gso~P!"]?k@~nuyⵒžEl,uZMCF A撀AtO_?P.?1ËJ???q~ I@ 'x/i(D%8Sþ &yx-\G%KnnkX-Qikk @_ 'x/i(D%8]c4 A撀AtO_?P.?1ËJ???q~ I@ 'x/i(D%|U׼ 7Kϊ|cX\xjPLQ{]SYo7Pf]ۧ"^@@!"]?k@~kKgⶒžFo-,vZ]BYIimM+uϏ|AnNO? ։>>1u?:??n 7@'Z' fDh7_Sþ2!y#׊E?[%Kymh.#iuk4_'Z' fDh7_||c3tuϏ|AnNO? ։>>1u?:??n 7@'Z' fD|SHjֺǎ4H(cO X˪hƅp]u}vBi] YT-p%T@!"]?k@P@P@P@P@P@PK!`ݮhxl/sharedStrings.xmltSn0W?HBr``,A _S]̬Z'9/)pI4\{YV(k<{k|s$H =ӂѝ;XdD i;.0#/eesiMN6yeL 3]y* t; #u-\/kZSrG!=Daty\)<,65RLb1"ZRGB\C-PEp,GZ5ZwKq/q15NpgχT`|X' 5jF'>Qmw# *$[N7*PK!{֩xl/theme/theme1.xmlYKo7 X%6",%mİ9R.crARu+cEӢP m6:$WE}E{ k)CDHʳVP\ B,nwK+ gf<#`Ldpm5 nR‚ 1yN2x7" nE ||SX-/fp l 4$Y]AĮfM !DzǬ:?C f~V15B3 ͚"{+%`jv;zpV*Foޞ,NYk Wvs25 {٘Ԗހ,9o7:eo@<]Y]nxJfڡ^ 9ᅯ|V(2Cy\ +!5zFp}ʙGz-$CAs >1dĔ߫߿zz᳣?=ztG!Jco^>U?|ϟAS^|gO^|=7T}nSƕ ( NuW%3M\P<|)Yf:-Y n*ؿUq;qmwC՜cNB1IF!SuK>T>EmL&ӁHS4}:lCm|Zo} G>a©ej[X%>!w"Rc8FDJV~C}S)9"7^'ifI܃h+|8{8>ܥ#4@(SSTjOv ؚ|)qX M<ʶ Vi&y.9$)cj-id Eԃ7S\94 \$d79u3Ų`Ks ylOr')f2llX1blBKY[zխTsV7RV >U ք.AV^] f$vs-zBkH#b]kVt!LXLF y`jdvDzeb:hfB!Lp46b8 Q{j.hjꏪ:4D*'s!&yUef6/6:ތ6P/ &u-Iή<1G PTB>RD&~'LB8 6ZԵ .>Id|+e0wVZ#(w~Utƿ)Ua?SEo0/E! t.T¡ {ΨLhTx Ƈ`_}a6Cc$(l'*lCY2w zX`d""̭OX_e]@jR;}AX(&ywwҟhT~e+X3'7Sβrbh؜Vpf7>߁ڊSAT_U "HH{5>Y-vA庐iTi첉rsr|.,غGSgn&sq(UnћpB?bKA-Lt x4..:=&e 'DZA0S666#ZI\B-KӉK 2Bd=ڙu3gWKuLvY3w:x.`2ux KfF é-*&dPK!nٔa xl/styles.xml[O0'?X/N( Z)!]M‡vXi}Z/1i-z`rb<= 0b*9WK''YGUNV, 4!vϘCP6{ʐ홤HLNfGliͭ$1+B"IeIr]Ӳ0YxSЭtNGv;y<3{rIHI*JgQ+[v.rX<^`}s!4۠>2v\+L$*Q+:WJVJ*/@d39Uw'I:b>~!㻦 asLgҾ0`cuKI$X@ỽ:]V;HӝVTx=62&ĭOv]C0vncZaǢOnOoQ5\G,Es]-3i[M>@;$J;vcXZ4^ gO2`%ek4V\8^>0Omm9NLV 1>X+NZDgJVK U OTy:[Lzt̂?`H<:M=x4U&"PCF÷! PK!{i.ddocProps/app.xml (Mo0  ]6 bH7bvǁX,k$cqz!uo]cL6B\.r7~Wg%_  q$wjC,KT[IL-=g[ vNoyjѓOꢛ ⪧-Z31Ve pmQJ5@ܽ&jXO!5׽A\)Z: pu .EƺV=z4b~C=D |v]DJJ` ͹vnۥ^l #'KKӏz^!^Ή #Ž~xCּ-m8kE;vd}1we'7xT"ViS@;5&{?|JPK!]/s_tdocProps/core.xml (|QK0C{vm*Br5II[i KQV+Ph-QDiL\[Ke΄8޴mc-*8v>/~oPK-![2І[Content_Types].xmlPK-!}T _rels/.relsPK-!8xl/_rels/workbook.xml.relsPK-!?/qS xl/workbook.xmlPK-!? M xl/worksheets/sheet4.xmlPK-! Z3dxl/worksheets/sheet2.xmlPK-!ㄳxl/worksheets/sheet3.xmlPK-!IOJCxl/worksheets/sheet1.xmlPK- !KZ4@@docProps/thumbnail.jpegPK-!`ݮhXxl/sharedStrings.xmlPK-!{֩^Zxl/theme/theme1.xmlPK-!nٔa oaxl/styles.xmlPK-!{i.d.ddocProps/app.xmlPK-!]/s_tgdocProps/core.xmlPK-!oJixl/calcChain.xmlPKxjreadxl/inst/extdata/geometry.xls0000644000176200001440000017700013172305601016526 0ustar liggesusersࡱ> !}  $%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|Root Entry F`X"Workbook~=SummaryInformation(#XDocumentSummaryInformation8 #i\pMicrosoft Office User Ba==4&:p+8@"1Calibri1Calibri1Calibri1Calibri1Calibri1*h6 Calibri Light1,6Calibri16Calibri16Calibri1Calibri1Calibri1<Calibri1>Calibri1?Calibri14Calibri14Calibri1 Calibri1 Calibri1Calibri1Calibri1 Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)                                                                       ff + ) , *     P  P       `            a  ||>]}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-} 00\);_(*}-} 00\);_(*}-}+ 00\);_(*}-}, 00\);_(*}-}- 00\);_(*}-}. 00\);_(*}-}: 00\);_(*}-}; 00\);_(*}A}1 00\);_(*;_(@_) }A}2 00\);_(*?;_(@_) }A}3 00\);_(*23;_(@_) }-}4 00\);_(*}A}0 a00\);_(*;_(@_) }A}( 00\);_(*;_(@_) }A}7 e00\);_(*;_(@_) }}5 ??v00\);_(*̙;_(@_)   \{P| |c}}9 ???00\);_(*;_(@_) ??? ??? ???\{P| ???|c}}) }00\);_(*;_(@_)   \{P| |c}A}6 }00\);_(*;_(@_) }}* 00\);_(*;_(@_) ??? ??? ???\{P| ???|c}-}= 00\);_(*}}8 00\);_(*;_(@_)   \{P| |c}-}/ 00\);_(*}U}< 00\);_(*;_(@_)  }A}" 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}# 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}$ 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}% 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}& 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A}  00\);_(*23;_(@_) }A}' 00\);_(* ;_(@_) }A} 00\);_(*ef ;_(@_) }A} 00\);_(*L ;_(@_) }A}! 00\);_(*23 ;_(@_)  20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L˭ % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  L % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23 % 60% - Accent3M( 60% - Accent3 23 % 60% - Accent4M, 60% - Accent4 23f % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23Ў % "Accent1AAccent1 [ % #Accent2A!Accent2 }1 % $Accent3A%Accent3  % %Accent4A)Accent4  % &Accent5A-Accent5 Dr % 'Accent6A1Accent6  pG %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 DTj%[2 Heading 2G Heading 2 DTj%?3 Heading 3G Heading 3 DTj%234 Heading 49 Heading 4 DTj% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  e%3Normal % 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title DTj% <TotalMTotal %[[= Warning Text? Warning Text %XTableStyleMedium9PivotStyleMedium78dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\`>;Sheet1ID B3C3D3B4C4D4B5C5D5B6C6D6. .4- PK!pO[Content_Types].xmlj0Eжr(΢]yl#!MB;.n̨̽\A1&ҫ QWKvUbOX#&1`RT9<l#$>r `С-;c=1g;#=\;S8MklX(*|C:]g.Gp m2:ȍc _nLkjt>.&< :bo~PS4J3.OC^Wx}sǗ?@o?E@{^z^2|oT:=a($9AWW[@f[-4j .9Ō%b_K@IZ@qJS2(a+ʠR#tf-y3$8|h_WW<_:GLDdϪ(qo&skM݄o7uĘ;Ű8 8(Bİ@Ct6\㞥06uKA,3Df،Wb1Dg½b;Wk&$Lu zPI=C,$E¢)ݯSYM[{`F((APb~*8%^ThN ,lS[)]ElE򎢋yWR^QgE |P-$y#eՃjtӢkdvݫd4LCUd״1ú lvM^c1h3ޖZ Etk4f2d+RQwx4 Mۭ=: ުvlTV@G2ggD  ՜.+,0 PXd lt| ' Sheet1  Worksheets9XX F$Microsoft Excel 97 - 2004 WorksheetBiff8Excel.Sheet.89q Oh+'0(HPp 'Microsoft Office UserMicrosoft Office UserMicrosoft Macintosh Excel@`@9XXGLlW  EMFD@   X  XQxWXP(x X(X yͫpppppױpfp׷ȉpAy‚ܥp‰O\fpfAfOp‰OOp.\pȑOȂOOOf͑yȉfȘfןff\\Oyffpȟfyypfܱf\f\pffpyyO\p\f\\.fyp\p\pp‚f‚Oy\ffןfyOA¥fȂypҷp\ȉ\˜fAO׽½ȽyO\p\yAy\.fypOp\pAOO.fҫf‚\OOA\ffןffȂ¥͘p\ȉ\AyAO.ȉ.½yͫppyypppбyppȥȉpAy\y‰OOyfAfOp‰O\pOȂ.pȉA͑yȉfpyןffO\Oyffpȟffpf\f\f\py\\f׫CompObjpreadxl/inst/doc/0000755000176200001440000000000013442224515013255 5ustar liggesusersreadxl/inst/doc/sheet-geometry.Rmd0000644000176200001440000002064613406366260016676 0ustar liggesusers--- title: "Sheet Geometry" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Sheet Geometry} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) options(tibble.print_min = 4, tibble.print_max = 4) ``` ```{r setup} library(readxl) ``` `readxl::read_excel()` brings data from a rectangle of cells into R as a data frame or, more specifically, a [tibble](http://tibble.tidyverse.org/reference/tibble.html). The extent of the data rectangle can be determined in various ways: * **Discovered**: By default, `read_excel()` uses the smallest rectangle that contains the non-empty cells. It "shrink wraps" the data. * **Bounded**: The `skip` and `n_max` arguments constrain `read_excel()`'s discovery process with respect to rows. At least `skip` spreadsheet rows will be skipped or ignored and at most `n_max` spreadsheet rows will be considered as data. Compared to the default of **discovery**, these arguments can only lead to making the output tibble smaller. * **Set**: The `range` argument is taken literally, even if that means you will have leading or trailing rows or columns filled with `NA`. If you ask for `range = "A1:D4"`, you are guaranteed to get a tibble with 4 columns (A through D) and either 3 rows (`col_names = TRUE`, default) or 4 rows (`col_names = FALSE`). * **Mixed**: In typical use, `read_excel()`'s geometry arguments often imply that certain limits are **discovered** while others are **bounded** or **set**. This will be more clear in the concrete examples below. For now, here are a few ways `read_excel()` can look when you take control of the geometry: ```{r eval = FALSE} read_excel("yo.xlsx", skip = 5) read_excel("yo.xlsx", n_max = 100) read_excel("yo.xlsx", skip = 5, n_max = 100) read_excel("yo.xlsx", range = "C1:E7") read_excel("yo.xlsx", range = cell_rows(6:23)) read_excel("yo.xlsx", range = cell_cols("B:D")) read_excel("yo.xlsx", range = anchored("C4", dim = c(3, 2))) ``` ## Little known Excel facts readxl's behavior and interface may be easier to understand if you understand this about Excel: > Cells you can see don't necessarily exist. Cells that look blank aren't necessarily so. Among lots of other information, Excel files obviously must contain information on each cell. Let's use the word "item" to denote one cell's-worth of info. Just because you see a cell on the screen in Excel, that doesn't mean there's a corresponding item on file. Why? Because Excel presents a huge gridded canvas for you to write on. Until you actually populate a cell, though, it doesn't really exist. The stream of cell items describes the existing cells, going from upper left to lower right, travelling by row. Blank cells simply do not exist in it. Ah, but what is a blank cell? Some cells appear blank to the naked eye but are not considered so by Excel and, indeed, are represented by a cell item. This happens when a cell has no content but does have an associated format. This format could have been applied directly to a single cell or, more often, indirectly via formatting applied to an entire row or column. Once a human has spent some quality time with a spreadsheet, many seemingly empty cells will bear a format and will thus have an associated cell item. ### Implications for readxl readxl only reads cell items that have content. It ignores cell items that exist strictly to convey formatting. The tibble returned by readxl will often cover cells that are empty in the spreadsheet, filled with `NA`. But only because there was some other reason for the associated row or column to exist: actual data or user-specified geometry. ## `skip` and `n_max` `skip` and `n_max` are the "entry-level" solution for controlling the data rectangle. They work only in the row direction. Column-wise, you're letting readxl discover which columns are populated. If you specify `range` (covered below), `skip` and `n_max` are ignored. ### `skip` The `skip` argument tells `read_excel()` to start looking for populated cells after skipping at least `skip` rows. If the new start point begins with 1 or more empty rows, `read_excel()` will skip even more before it starts reading from the sheet. Here's a screen shot of the `geometry.xlsx` example sheet that ships with readxl, accessible via `readxl_example("geometry.xlsx")`. ```{r out.width = '70%', echo = FALSE} knitr::include_graphics("img/geometry.png") ``` By default, `read_excel()` just discovers the data rectangle: ```{r} read_excel(readxl_example("geometry.xlsx")) ``` If you explicitly skip one row, note that `read_excel()` still skips row 2, which is also empty, leading to the same result as before: ```{r} read_excel(readxl_example("geometry.xlsx"), skip = 1) ``` You can also use `skip` to skip over populated cells. In real life, this is a mighty weapon against the explanatory text that people like to include at the top of spreadsheets. ```{r} read_excel(readxl_example("geometry.xlsx"), skip = 3) ``` Summary: `skip` tells `read_excel()` to skip *at least this many* spreadsheet rows before reading anything. ### `n_max` The `n_max` argument tells `read_excel()` to read at most `n_max` rows, once it has found the data rectangle. Note that `n_max` is specifically about *the data*. You still use `col_names` to express whether the first spreadsheet row should be used to create column names (default is `TRUE`). `n_max = 2` causes us to ignore the last data row -- the 3rd one -- in `geometry.xlsx`. ```{r} read_excel(readxl_example("geometry.xlsx"), n_max = 2) ``` `n_max` is an upper bound. It will never cause empty rows to be included in the tibble. Note how we get 3 data rows here, even though `n_max` is much greater. ```{r} read_excel(readxl_example("geometry.xlsx"), n_max = 1000) ``` ## `range` The `range` argument is the most flexible way to control geometry and is powered by the [cellranger](https://github.com/rsheets/cellranger#readme) package. One huge difference from `skip` and `n_max` is that `range` is taken literally! Even if it means the returned tibble will have entire rows or columns consisting of `NA`. You can describe cell limits in a variety of ways: **Excel-style range**: Specify a fixed rectangle with `range = "A1:D4"` or `range = "R1C1:R4C4"`. You can even prepend the worksheet name like so: `range = "foofy!A1:D4"` and it will be passed along to the `sheet` argument. The `deaths.xlsx` example sheet features junk rows both before and after the data rectangle. The payoff for specifying the data rectangle precisely is that we get the data frame we want, with correct guesses for the column types. ```{r} read_excel(readxl_example("deaths.xlsx"), range = "arts!A5:F15") ``` We repeat the screenshot of `geometry.xlsx` as a visual reference. ```{r out.width = '70%', echo = FALSE} knitr::include_graphics("img/geometry.png") ``` Going back to `geometry.xlsx`, here we specify a rectangle that only partially overlaps the data. Note the use of default column names, because the first row of cells is empty, and the leading column of `NA`s. ```{r} read_excel(readxl_example("geometry.xlsx"), range = "A2:C4") ``` **Specific range of rows or columns**: Set exact limits on just the rows or just the columns and allow the limits in the other direction to be discovered. Example calls: ```{r eval = FALSE} ## rows only read_excel(..., range = cell_rows(1:10)) ## is equivalent to read_excel(..., range = cell_rows(c(1, 10))) ## columns only read_excel(..., range = cell_cols(1:26)) ## is equivalent to all of these read_excel(..., range = cell_cols(c(1, 26))) read_excel(..., range = cell_cols("A:Z")) read_excel(..., range = cell_cols(LETTERS)) read_excel(..., range = cell_cols(c("A", "Z")) ``` We use `geometry.xlsx` to demonstrate setting hard limits on the rows, running past the data, while allowing column limits to discovered. Note the trailing rows of `NA`. ```{r} read_excel(readxl_example("geometry.xlsx"), range = cell_rows(4:8)) ``` **Anchored rectangle**: Helper functions `anchored()` and `cell_limits()` let you specify limits via the corner(s) of the rectangle. Here we get a 3 by 4 rectangle with cell C5 as the upper left corner: ```{r} read_excel( readxl_example("geometry.xlsx"), col_names = paste("var", 1:4, sep = "_"), range = anchored("C5", c(3, 4)) ) ``` Here we set C5 as the upper left corner and allow the other limits to be discovered: ```{r} read_excel( readxl_example("geometry.xlsx"), col_names = FALSE, range = cell_limits(c(5, 3), c(NA, NA)) ) ``` readxl/inst/doc/cell-and-column-types.html0000644000176200001440000170345713442224514020277 0ustar liggesusers Cell and Column Types

Cell and Column Types

readxl::read_excel() will guess column types, by default, or you can provide them explicitly via the col_types argument. The col_types argument is more flexible than you might think; you can mix actual types in with "skip" and "guess" and a single type will be recycled to the necessary length.

Here are different ways this might look:

Type guessing

If you use other packages in the tidyverse, you are probably familiar with readr, which reads data from flat files. Like readxl, readr also provides column type guessing, but readr and readxl are very different under the hood.

  • readr guesses column type based on the data.
  • readxl guesses column type based on Excel cell types.

Each cell in an Excel spreadsheet has its own type. For all intents and purposes, they are:

       empty < boolean < numeric < text

with the wrinkle that datetimes are a very special flavor of numeric. A cell of any particular type can always be represented as one of any higher type and, possibly, as one of lower type. When guessing, read_excel() keeps a running “maximum” on the cell types it has seen in any given column. Once it has visited guess_max rows or run out of data, this is the guessed type for that column. There is a strong current towards “text”, the column type of last resort.

Here’s an example of column guessing with deaths.xlsx which ships with readxl.

Excel types, R types, col_types

Here’s how the Excel cell/column types are translated into R types and how to force the type explicitly in col_types:

How it is in Excel How it will be in R How to request in col_types
anything non-existent "skip"
empty logical, but all NA you cannot request this
boolean logical "logical"
numeric numeric "numeric"
datetime POSIXct "date"
text character "text"
anything list "list"

Some explanation about the weird cases in the first two rows:

  • If a column falls in your data rectangle, but you do not want an associated variable in the output, specify the column type "skip". Internally, these cells may be visited in order to learn their location, but they are not loaded and their data is never read.
  • You cannot request that a column be included but filled with NAs. Such a column can arise naturally, if all the cells are empty, or you can skip a column (see previous point).

Example of skipping and guessing:

More about the "list" column type in the last row:

  • This will create a list-column in the output, each component of which is a length one atomic vector. The type of these vectors is determined using the logic described above. This can be useful if data of truly disparate type is arranged in a column.

We demonstrate the "list" column type using the clippy.xlsx sheet that ship with Excel. Its second column holds information about Clippy that would be really hard to store with just one type.

Final note: all datetimes are imported as having the UTC timezone, because, mercifully, Excel has no notion of timezones.

When column guessing goes wrong

It’s pretty common to expect a column to import as, say, numeric or datetime. And to then be sad when it imports as character instead. Two main causes:

Contamination by embedded missing or bad data of incompatible type. Example: missing data entered as ?? in a numeric column.

  • Fix: use the na argument of read_excel() to describe all possible forms for missing data. This should prevent such cells from influencing type guessing and cause them to import as NA of the appropriate type.

Contamination of the data rectangle by leading or trailing non-data rows. Example: the sheet contains a few lines of explanatory prose before the data table begins.

  • Fix: specify the target rectangle. Use skip and n_max to provide a minimum number of rows to skip and a maximum number of data rows to read, respectively. Or use the more powerful range argument to describe the cell rectangle in various ways. See the examples for read_excel() help or vignette("sheet-geometry") for more detail.

The deaths.xlsx sheet demonstrates this perfectly. Here’s how it imports if we don’t specify range as we did above:

Non-data rows above and below the main data rectangle are causing all the columns to import as character.

If your column typing problem can’t be solved by specifying na or the data rectangle, request the "list" column type and handle missing data and coercion after import.

Peek at column names

Sometimes you aren’t completely sure of column count or order, and yet you need to provide some information via col_types. For example, you might know that the column named “foofy” should be text, but you’re not sure where it appears. Or maybe you want to ensure that lots of empty cells at the top of “foofy” don’t cause it to be guessed as logical.

Here’s an efficient trick to get the column names, so you can programmatically build the col_types vector you need for your main reading of the Excel file. Let’s imagine I want to force the columns whose names include “Petal” to be text, but leave everything else to be guessed.

Square pegs in round holes

You can force a column to have a specific type via col_types. So what happens to cells of another type? They will either be coerced to the requested type or to an NA of appropriate type.

For each column type, below we present a screen shot of a sheet from the built-in example type-me.xlsx. We force the first column to have a specific type and the second column explains what is in the first. You’ll see how mismatches between cell type and column type are resolved.

Text or character column

A boolean cell becomes either "TRUE" or "FALSE". A numeric cell is converted to character, much like as.character() in R. A date cell is handled like numeric, using the underlying serial value.

readxl/inst/doc/sheet-geometry.R0000644000176200001440000000552313442224514016345 0ustar liggesusers## ----include = FALSE----------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) options(tibble.print_min = 4, tibble.print_max = 4) ## ----setup--------------------------------------------------------------- library(readxl) ## ----eval = FALSE-------------------------------------------------------- # read_excel("yo.xlsx", skip = 5) # read_excel("yo.xlsx", n_max = 100) # read_excel("yo.xlsx", skip = 5, n_max = 100) # read_excel("yo.xlsx", range = "C1:E7") # read_excel("yo.xlsx", range = cell_rows(6:23)) # read_excel("yo.xlsx", range = cell_cols("B:D")) # read_excel("yo.xlsx", range = anchored("C4", dim = c(3, 2))) ## ----out.width = '70%', echo = FALSE------------------------------------- knitr::include_graphics("img/geometry.png") ## ------------------------------------------------------------------------ read_excel(readxl_example("geometry.xlsx")) ## ------------------------------------------------------------------------ read_excel(readxl_example("geometry.xlsx"), skip = 1) ## ------------------------------------------------------------------------ read_excel(readxl_example("geometry.xlsx"), skip = 3) ## ------------------------------------------------------------------------ read_excel(readxl_example("geometry.xlsx"), n_max = 2) ## ------------------------------------------------------------------------ read_excel(readxl_example("geometry.xlsx"), n_max = 1000) ## ------------------------------------------------------------------------ read_excel(readxl_example("deaths.xlsx"), range = "arts!A5:F15") ## ----out.width = '70%', echo = FALSE------------------------------------- knitr::include_graphics("img/geometry.png") ## ------------------------------------------------------------------------ read_excel(readxl_example("geometry.xlsx"), range = "A2:C4") ## ----eval = FALSE-------------------------------------------------------- # ## rows only # read_excel(..., range = cell_rows(1:10)) # ## is equivalent to # read_excel(..., range = cell_rows(c(1, 10))) # # ## columns only # read_excel(..., range = cell_cols(1:26)) # ## is equivalent to all of these # read_excel(..., range = cell_cols(c(1, 26))) # read_excel(..., range = cell_cols("A:Z")) # read_excel(..., range = cell_cols(LETTERS)) # read_excel(..., range = cell_cols(c("A", "Z")) ## ------------------------------------------------------------------------ read_excel(readxl_example("geometry.xlsx"), range = cell_rows(4:8)) ## ------------------------------------------------------------------------ read_excel( readxl_example("geometry.xlsx"), col_names = paste("var", 1:4, sep = "_"), range = anchored("C5", c(3, 4)) ) ## ------------------------------------------------------------------------ read_excel( readxl_example("geometry.xlsx"), col_names = FALSE, range = cell_limits(c(5, 3), c(NA, NA)) ) readxl/inst/doc/sheet-geometry.html0000644000176200001440000060200213442224515017104 0ustar liggesusers Sheet Geometry

Sheet Geometry

readxl::read_excel() brings data from a rectangle of cells into R as a data frame or, more specifically, a tibble.

The extent of the data rectangle can be determined in various ways:

  • Discovered: By default, read_excel() uses the smallest rectangle that contains the non-empty cells. It “shrink wraps” the data.
  • Bounded: The skip and n_max arguments constrain read_excel()’s discovery process with respect to rows. At least skip spreadsheet rows will be skipped or ignored and at most n_max spreadsheet rows will be considered as data. Compared to the default of discovery, these arguments can only lead to making the output tibble smaller.
  • Set: The range argument is taken literally, even if that means you will have leading or trailing rows or columns filled with NA. If you ask for range = "A1:D4", you are guaranteed to get a tibble with 4 columns (A through D) and either 3 rows (col_names = TRUE, default) or 4 rows (col_names = FALSE).
  • Mixed: In typical use, read_excel()’s geometry arguments often imply that certain limits are discovered while others are bounded or set. This will be more clear in the concrete examples below.

For now, here are a few ways read_excel() can look when you take control of the geometry:

Little known Excel facts

readxl’s behavior and interface may be easier to understand if you understand this about Excel:

Cells you can see don’t necessarily exist. Cells that look blank aren’t necessarily so.

Among lots of other information, Excel files obviously must contain information on each cell. Let’s use the word “item” to denote one cell’s-worth of info.

Just because you see a cell on the screen in Excel, that doesn’t mean there’s a corresponding item on file. Why? Because Excel presents a huge gridded canvas for you to write on. Until you actually populate a cell, though, it doesn’t really exist.

The stream of cell items describes the existing cells, going from upper left to lower right, travelling by row. Blank cells simply do not exist in it.

Ah, but what is a blank cell? Some cells appear blank to the naked eye but are not considered so by Excel and, indeed, are represented by a cell item. This happens when a cell has no content but does have an associated format. This format could have been applied directly to a single cell or, more often, indirectly via formatting applied to an entire row or column. Once a human has spent some quality time with a spreadsheet, many seemingly empty cells will bear a format and will thus have an associated cell item.

Implications for readxl

readxl only reads cell items that have content. It ignores cell items that exist strictly to convey formatting.

The tibble returned by readxl will often cover cells that are empty in the spreadsheet, filled with NA. But only because there was some other reason for the associated row or column to exist: actual data or user-specified geometry.

skip and n_max

skip and n_max are the “entry-level” solution for controlling the data rectangle. They work only in the row direction. Column-wise, you’re letting readxl discover which columns are populated.

If you specify range (covered below), skip and n_max are ignored.

n_max

The n_max argument tells read_excel() to read at most n_max rows, once it has found the data rectangle. Note that n_max is specifically about the data. You still use col_names to express whether the first spreadsheet row should be used to create column names (default is TRUE).

n_max = 2 causes us to ignore the last data row – the 3rd one – in geometry.xlsx.

n_max is an upper bound. It will never cause empty rows to be included in the tibble. Note how we get 3 data rows here, even though n_max is much greater.

range

The range argument is the most flexible way to control geometry and is powered by the cellranger package.

One huge difference from skip and n_max is that range is taken literally! Even if it means the returned tibble will have entire rows or columns consisting of NA.

You can describe cell limits in a variety of ways:

Excel-style range: Specify a fixed rectangle with range = "A1:D4" or range = "R1C1:R4C4". You can even prepend the worksheet name like so: range = "foofy!A1:D4" and it will be passed along to the sheet argument.

The deaths.xlsx example sheet features junk rows both before and after the data rectangle. The payoff for specifying the data rectangle precisely is that we get the data frame we want, with correct guesses for the column types.

We repeat the screenshot of geometry.xlsx as a visual reference.

Going back to geometry.xlsx, here we specify a rectangle that only partially overlaps the data. Note the use of default column names, because the first row of cells is empty, and the leading column of NAs.

Specific range of rows or columns: Set exact limits on just the rows or just the columns and allow the limits in the other direction to be discovered. Example calls:

We use geometry.xlsx to demonstrate setting hard limits on the rows, running past the data, while allowing column limits to discovered. Note the trailing rows of NA.

Anchored rectangle: Helper functions anchored() and cell_limits() let you specify limits via the corner(s) of the rectangle.

Here we get a 3 by 4 rectangle with cell C5 as the upper left corner:

Here we set C5 as the upper left corner and allow the other limits to be discovered:

readxl/inst/doc/cell-and-column-types.R0000644000176200001440000000551413442224513017517 0ustar liggesusers## ----include = FALSE----------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) options(tibble.print_min = 4, tibble.print_max = 4) ## ----setup--------------------------------------------------------------- library(readxl) ## ----eval = FALSE-------------------------------------------------------- # read_excel("yo.xlsx") # read_excel("yo.xlsx", col_types = "numeric") # read_excel("yo.xlsx", col_types = c("date", "skip", "guess", "numeric")) ## ------------------------------------------------------------------------ read_excel(readxl_example("deaths.xlsx"), range = cell_rows(5:15)) ## ------------------------------------------------------------------------ read_excel( readxl_example("deaths.xlsx"), range = cell_rows(5:15), col_types = c("guess", "skip", "guess", "skip", "skip", "skip") ) ## ------------------------------------------------------------------------ (clippy <- read_excel(readxl_example("clippy.xlsx"), col_types = c("text", "list"))) tibble::deframe(clippy) sapply(clippy$value, class) ## ------------------------------------------------------------------------ deaths <- read_excel(readxl_example("deaths.xlsx")) print(deaths, n = Inf) ## ------------------------------------------------------------------------ (nms <- names(read_excel(readxl_example("datasets.xlsx"), n_max = 0))) (ct <- ifelse(grepl("^Petal", nms), "text", "guess")) read_excel(readxl_example("datasets.xlsx"), col_types = ct) ## ------------------------------------------------------------------------ df <- read_excel(readxl_example("type-me.xlsx"), sheet = "logical_coercion", col_types = c("logical", "text")) print(df, n = Inf) ## ----out.width = '70%', echo = FALSE------------------------------------- knitr::include_graphics("img/type-me-logical.png") ## ------------------------------------------------------------------------ df <- read_excel(readxl_example("type-me.xlsx"), sheet = "numeric_coercion", col_types = c("numeric", "text")) print(df, n = Inf) ## ----out.width = '70%', echo = FALSE------------------------------------- knitr::include_graphics("img/type-me-numeric.png") ## ------------------------------------------------------------------------ df <- read_excel(readxl_example("type-me.xlsx"), sheet = "date_coercion", col_types = c("date", "text")) print(df, n = Inf) ## ----out.width = '70%', echo = FALSE------------------------------------- knitr::include_graphics("img/type-me-date.png") ## ------------------------------------------------------------------------ df <- read_excel(readxl_example("type-me.xlsx"), sheet = "text_coercion", col_types = c("text", "text")) print(df, n = Inf) ## ----out.width = '70%', echo = FALSE------------------------------------- knitr::include_graphics("img/type-me-text.png") readxl/inst/doc/cell-and-column-types.Rmd0000644000176200001440000002250613406366260020046 0ustar liggesusers--- title: "Cell and Column Types" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Cell and Column Types} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) options(tibble.print_min = 4, tibble.print_max = 4) ``` ```{r setup} library(readxl) ``` `readxl::read_excel()` will guess column types, by default, or you can provide them explicitly via the `col_types` argument. The `col_types` argument is more flexible than you might think; you can mix actual types in with `"skip"` and `"guess"` and a single type will be recycled to the necessary length. Here are different ways this might look: ```{r eval = FALSE} read_excel("yo.xlsx") read_excel("yo.xlsx", col_types = "numeric") read_excel("yo.xlsx", col_types = c("date", "skip", "guess", "numeric")) ``` ## Type guessing If you use other packages in the [tidyverse](http://tidyverse.org), you are probably familiar with [readr](http://readr.tidyverse.org), which reads data from flat files. Like readxl, readr also provides column type guessing, but readr and readxl are very different under the hood. * readr guesses column type *based on the data*. * readxl guesses column type *based on Excel cell types*. Each cell in an Excel spreadsheet has its own type. For all intents and purposes, they are:        empty < boolean < numeric < text with the wrinkle that datetimes are a very special flavor of numeric. A cell of any particular type can always be represented as one of any higher type and, possibly, as one of lower type. When guessing, `read_excel()` keeps a running "maximum" on the cell types it has seen in any given column. Once it has visited `guess_max` rows or run out of data, this is the guessed type for that column. There is a strong current towards "text", the column type of last resort. Here's an example of column guessing with `deaths.xlsx` which ships with readxl. ```{r} read_excel(readxl_example("deaths.xlsx"), range = cell_rows(5:15)) ``` ## Excel types, R types, `col_types` Here's how the Excel cell/column types are translated into R types and how to force the type explicitly in `col_types`: | How it is in Excel | How it will be in R | How to request in `col_types` | |--------------------|-------------------------|-------------------------------| | *anything* | *non-existent* | `"skip"` | | empty | `logical`, but all `NA` | *you cannot request this* | | boolean | `logical` | `"logical"` | | numeric | `numeric` | `"numeric"` | | datetime | `POSIXct` | `"date"` | | text | `character` | `"text"` | | *anything* | `list` | `"list"` | Some explanation about the weird cases in the first two rows: * If a column falls in your data rectangle, but you do not want an associated variable in the output, specify the column type `"skip"`. Internally, these cells may be visited in order to learn their location, but they are not loaded and their data is never read. * You cannot request that a column be included but filled with `NA`s. Such a column can arise naturally, if all the cells are empty, or you can skip a column (see previous point). Example of skipping and guessing: ```{r} read_excel( readxl_example("deaths.xlsx"), range = cell_rows(5:15), col_types = c("guess", "skip", "guess", "skip", "skip", "skip") ) ``` More about the `"list"` column type in the last row: * This will create a list-column in the output, each component of which is a length one atomic vector. The type of these vectors is determined using the logic described above. This can be useful if data of truly disparate type is arranged in a column. We demonstrate the `"list"` column type using the `clippy.xlsx` sheet that ship with Excel. Its second column holds information about Clippy that would be really hard to store with just one type. ```{r} (clippy <- read_excel(readxl_example("clippy.xlsx"), col_types = c("text", "list"))) tibble::deframe(clippy) sapply(clippy$value, class) ``` Final note: all datetimes are imported as having the UTC timezone, because, mercifully, Excel has no notion of timezones. ## When column guessing goes wrong It's pretty common to expect a column to import as, say, numeric or datetime. And to then be sad when it imports as character instead. Two main causes: **Contamination by embedded missing or bad data of incompatible type.** Example: missing data entered as `??` in a numeric column. * Fix: use the `na` argument of `read_excel()` to describe all possible forms for missing data. This should prevent such cells from influencing type guessing and cause them to import as `NA` of the appropriate type. **Contamination of the data rectangle by leading or trailing non-data rows.** Example: the sheet contains a few lines of explanatory prose before the data table begins. * Fix: specify the target rectangle. Use `skip` and `n_max` to provide a minimum number of rows to skip and a maximum number of data rows to read, respectively. Or use the more powerful `range` argument to describe the cell rectangle in various ways. See the examples for `read_excel()` help or `vignette("sheet-geometry")` for more detail. The `deaths.xlsx` sheet demonstrates this perfectly. Here's how it imports if we don't specify `range` as we did above: ```{r} deaths <- read_excel(readxl_example("deaths.xlsx")) print(deaths, n = Inf) ``` Non-data rows above and below the main data rectangle are causing all the columns to import as character. If your column typing problem can't be solved by specifying `na` or the data rectangle, request the `"list"` column type and handle missing data and coercion after import. ### Peek at column names Sometimes you aren't completely sure of column count or order, and yet you need to provide *some* information via `col_types`. For example, you might know that the column named "foofy" should be text, but you're not sure where it appears. Or maybe you want to ensure that lots of empty cells at the top of "foofy" don't cause it to be guessed as logical. Here's an efficient trick to get the column names, so you can programmatically build the `col_types` vector you need for your main reading of the Excel file. Let's imagine I want to force the columns whose names include "Petal" to be text, but leave everything else to be guessed. ```{r} (nms <- names(read_excel(readxl_example("datasets.xlsx"), n_max = 0))) (ct <- ifelse(grepl("^Petal", nms), "text", "guess")) read_excel(readxl_example("datasets.xlsx"), col_types = ct) ``` ## Square pegs in round holes You can force a column to have a specific type via `col_types`. So what happens to cells of another type? They will either be coerced to the requested type or to an `NA` of appropriate type. For each column type, below we present a screen shot of a sheet from the built-in example `type-me.xlsx`. We force the first column to have a specific type and the second column explains what is in the first. You'll see how mismatches between cell type and column type are resolved. ### Logical column A numeric cell is coerced to `FALSE` if it is zero and `TRUE` otherwise. A date cell becomes `NA`. Just like in R, the strings "T", "TRUE", "True", and "true" are regarded as `TRUE` and "F", "FALSE", "False", "false" as `FALSE`. Other strings import as `NA`. ```{r} df <- read_excel(readxl_example("type-me.xlsx"), sheet = "logical_coercion", col_types = c("logical", "text")) print(df, n = Inf) ``` ```{r out.width = '70%', echo = FALSE} knitr::include_graphics("img/type-me-logical.png") ``` ### Numeric column A boolean cell is coerced to zero if `FALSE` and one if `TRUE`. A datetime comes in as the underlying serial date, which is the number of days, possibly fractional, since the [date origin](https://support.microsoft.com/en-us/help/214330/differences-between-the-1900-and-the-1904-date-system-in-excel). For text, numeric conversion is attempted, to handle the "number as text" phenomenon. If unsuccessful, text cells import as `NA`. ```{r} df <- read_excel(readxl_example("type-me.xlsx"), sheet = "numeric_coercion", col_types = c("numeric", "text")) print(df, n = Inf) ``` ```{r out.width = '70%', echo = FALSE} knitr::include_graphics("img/type-me-numeric.png") ``` ### Date column A numeric cell is interpreted as a serial date (*I'm questioning whether this is wise, but *). Boolean or text cells become `NA`. ```{r} df <- read_excel(readxl_example("type-me.xlsx"), sheet = "date_coercion", col_types = c("date", "text")) print(df, n = Inf) ``` ```{r out.width = '70%', echo = FALSE} knitr::include_graphics("img/type-me-date.png") ``` ### Text or character column A boolean cell becomes either `"TRUE"` or `"FALSE"`. A numeric cell is converted to character, much like `as.character()` in R. A date cell is handled like numeric, using the underlying serial value. ```{r} df <- read_excel(readxl_example("type-me.xlsx"), sheet = "text_coercion", col_types = c("text", "text")) print(df, n = Inf) ``` ```{r out.width = '70%', echo = FALSE} knitr::include_graphics("img/type-me-text.png") ``` readxl/tests/0000755000176200001440000000000013442224523012674 5ustar liggesusersreadxl/tests/testthat.R0000644000176200001440000000007013042464213014652 0ustar liggesuserslibrary(testthat) library(readxl) test_check("readxl") readxl/tests/testthat/0000755000176200001440000000000013442230012014522 5ustar liggesusersreadxl/tests/testthat/test-coercion.R0000644000176200001440000001057413336631200017440 0ustar liggesuserscontext("coercion") test_that("contaminated, explicit logical is read as logical", { ## xls expect_warning( df <- read_excel( test_sheet("types.xls"), sheet = "logical_coercion", col_types = c("logical", "text") ), "Expecting logical", all = TRUE ) expect_is(df$logical, "logical") should_be_NA <- df$explanation %in% c("string not logical", "blank", "date") expect_false(anyNA(df$logical[!should_be_NA])) ## xlsx expect_warning( df <- read_excel( test_sheet("types.xlsx"), sheet = "logical_coercion", col_types = c("logical", "text") ), "Expecting logical", all = TRUE ) expect_is(df$logical, "logical") should_be_NA <- df$explanation %in% c("string not logical", "blank", "date") expect_false(anyNA(df$logical[!should_be_NA])) }) test_that("contaminated, explicit date is read as date", { ## xls expect_warning( df <- read_excel( test_sheet("types.xls"), sheet = "date_coercion", col_types = "date" ), "Expecting date|Coercing numeric", all = TRUE ) expect_is(df$date, "POSIXct") expect_false(anyNA(df$date[c(1, 5, 6, 7)])) expect_true(all(is.na(df$date[c(2, 3, 4)]))) expect_identical(df$date[6], as.POSIXct("2012-01-02 UTC", tz = "UTC")) ## xlsx expect_warning( df <- read_excel( test_sheet("types.xlsx"), sheet = "date_coercion", col_types = "date" ), "Expecting date|Coercing numeric", all = TRUE ) expect_is(df$date, "POSIXct") expect_false(anyNA(df$date[c(1, 5, 6, 7)])) expect_true(all(is.na(df$date[c(2, 3, 4)]))) expect_identical(df$date[6], as.POSIXct("2012-01-02 UTC", tz = "UTC")) }) test_that("contaminated, explicit numeric is read as numeric", { ## xls expect_warning( df <- read_excel( test_sheet("types.xls"), sheet = "numeric_coercion", col_types = "numeric" ), "Expecting numeric|Coercing boolean|Coercing text", all = TRUE ) expect_is(df$numeric, "numeric") expect_false(anyNA(df$numeric[c(1, 2, 4, 7)])) expect_equal(df$numeric[2], 72) # "Number stored as text" ## xlsx expect_warning( df <- read_excel( test_sheet("types.xlsx"), sheet = "numeric_coercion", col_types = "numeric" ), "Expecting numeric|Coercing boolean|Coercing text", all = TRUE ) expect_is(df$numeric, "numeric") expect_false(anyNA(df$numeric[c(1, 2, 4, 7)])) expect_equal(df$numeric[2], 72) # "Number stored as text" }) ## #75, #110: don't convert numbers to string a la "printf %lf" ## i.e. don't right pad to get 6 decimal places test_that("contaminated, explicit text is read as text", { ## xls df <- read_excel( test_sheet("types.xls"), sheet = "text_coercion", col_types = c("text", "text") ) expect_is(df$text, "character") expect_false(anyNA(df$explanation != "blank")) expect_identical(df$text[df$explanation == "floating point"], "1.3") expect_identical(df$text[df$explanation == "student number"], "36436153") ## xlsx df <- read_excel( test_sheet("types.xlsx"), sheet = "text_coercion", col_types = c("text", "text") ) expect_is(df$text, "character") expect_false(anyNA(df$explanation != "blank")) expect_identical(df$text[df$explanation == "floating point"], "1.3") expect_identical(df$text[df$explanation == "student number"], "36436153") }) test_that("integery-y numbers > 2^31 can be coerced to string", { xlsx <- read_excel(test_sheet("big-texty-numbers-xlsx.xlsx")) xls <- read_excel(test_sheet("big-texty-numbers-xls.xls")) expect_identical(xlsx, xls) expect_identical( xls[["number"]][-1], as.character( c(2 ^ 31 - 1, 2 ^ 31, 2 ^ 31 + 1, -1 * (2 ^ 31), -1 * (2 ^ 31 + 1)) ) ) }) ## https://github.com/tidyverse/readxl/issues/430 ## re: precision of datetimes converted to text test_that("datetimes agree up to certain precision when coerced to text", { xlsx <- read_excel(test_sheet("texty-dates-xlsx.xlsx"), col_types = "text") xls <- read_excel(test_sheet("texty-dates-xls.xls"), col_types = "text") xlsx <- sub("^.*\\.(.*)$", "\\1", xlsx$a) xls <- sub("^.*\\.(.*)$", "\\1", xls$a) ## it's hard to say how many digits of agreement we expect after the decimal ## we coerce to string for xls, whereas its out of our hands for xlsx, ## where the double comes to us as a string in the XML ## therefore, my choice is somewhat arbitrary xlsx <- substr(xlsx, 1, 8) xls <- substr(xls, 1, 8) expect_identical(xlsx, xls) }) readxl/tests/testthat/test-encoding.R0000644000176200001440000000247613172305601017430 0ustar liggesuserscontext("Encoding") test_that("excel_sheets returns utf-8 encoded text", { ## xlsx sheets <- excel_sheets(test_sheet("utf8-sheet-names.xlsx")) expect_identical(Encoding(sheets), rep("UTF-8", 2)) expect_identical(sheets, c("\u00b5", "\u2202")) ## xls sheets <- excel_sheets(test_sheet("utf8-sheet-names.xls")) expect_identical(Encoding(sheets), rep("UTF-8", 2)) expect_identical(sheets, c("\u00b5", "\u2202")) }) test_that("read_excel returns utf-8 encoded text", { ## xlsx viet <- read_excel(test_sheet("vietnamese-utf8.xlsx")) nms <- names(viet) expect_identical(Encoding(nms), "UTF-8") expect_identical( charToRaw(nms), as.raw(c(0x4d, 0xc3, 0xb4, 0x20, 0x74, 0xe1, 0xba, 0xa3)) ) expect_identical(Encoding(viet[[1]]), rep_len("UTF-8", nrow(viet))) expect_identical( charToRaw(viet[[1]][1]), as.raw(c(0x42, 0xc3, 0x99, 0x4e, 0x20, 0x53, 0xc3, 0x89, 0x54)) ) ## xls viet <- read_excel(test_sheet("vietnamese-utf8.xls")) nms <- names(viet) expect_identical(Encoding(nms), "UTF-8") expect_identical( charToRaw(nms), as.raw(c(0x4d, 0xc3, 0xb4, 0x20, 0x74, 0xe1, 0xba, 0xa3)) ) expect_identical(Encoding(viet[[1]]), rep_len("UTF-8", nrow(viet))) expect_identical( charToRaw(viet[[1]][1]), as.raw(c(0x42, 0xc3, 0x99, 0x4e, 0x20, 0x53, 0xc3, 0x89, 0x54)) ) }) readxl/tests/testthat/test-formats.R0000644000176200001440000000306213336631200017304 0ustar liggesuserscontext("test-formats.R") test_that("excel_format() recognizes extensions (or lack thereof)", { files <- c("a.xlsx", "b.xls", "c.png", "d") expect_identical( format_from_ext(files), c("xlsx", "xls", NA, NA) ) }) test_that("format_from_signature() works for xls and xlsx and not jpg", { orig_files <- c( test_sheet("iris-excel-xlsx.xlsx"), test_sheet("iris-excel-xls.xls"), file.path(R.home("doc"), "html", "logo.jpg") ) no_ext_copies <- paste0( basename(tools::file_path_sans_ext(orig_files)), "-no-ending" ) no_ext_copies <- file.path(tempdir(), no_ext_copies) file.copy(orig_files, no_ext_copies) on.exit(file.remove(no_ext_copies)) expect_identical( format_from_signature(no_ext_copies), c("xlsx", "xls", NA) ) }) test_that("excel_format(guess = FALSE) == format_from_ext()", { files <- c("a.xlsx", "b.xls", "c.png", "d") expect_identical(format_from_ext(files), excel_format(files)) }) test_that("excel_format(guess = TRUE) == format_from_signature()", { orig_files <- c( test_sheet("iris-excel-xlsx.xlsx"), test_sheet("iris-excel-xls.xls"), file.path(R.home("doc"), "html", "logo.jpg") ) no_ext_copies <- paste0( basename(tools::file_path_sans_ext(orig_files)), "-no-ending" ) no_ext_copies <- file.path(tempdir(), no_ext_copies) file.copy(orig_files, no_ext_copies) on.exit(file.remove(no_ext_copies)) expect_identical( ## include one non-existent file, but do not try to remove it excel_format(c(no_ext_copies, "i_do_not_exist")), c("xlsx", "xls", NA, NA) ) }) readxl/tests/testthat/test-shared-string-table.R0000644000176200001440000000040113172305601021463 0ustar liggesuserscontext("Shared string table") ## #293, #333 ## affects xls only test_that("shared strings are retrieved when there's >256 unique strings", { df <- read_excel(test_sheet("more-than-256-unique-strings-xls.xls")) expect_identical(df$var[257], "x257") }) readxl/tests/testthat/test-read-excel.R0000644000176200001440000001012013406366260017644 0ustar liggesuserscontext("read_excel") test_that("can read sheets with inlineStr", { # Original source: http://our.componentone.com/wp-content/uploads/2011/12/TestExcel.xlsx # These appear to come from LibreOffice 4.2.7.2. x <- read_excel(test_sheet("inlineStr.xlsx")) expect_equal(x$ID, "RQ11610") }) test_that("can read files with and without extension [xls]", { file.copy(test_sheet("iris-excel-xls.xls"), "iris-xls-no-ending") on.exit(file.remove("iris-xls-no-ending")) iris_xls <- read_excel(test_sheet("iris-excel-xls.xls")) iris_guess <- read_excel("iris-xls-no-ending") iris_explicit <- read_xls("iris-xls-no-ending") expect_equal(iris_xls, iris_guess) expect_equal(iris_xls, iris_explicit) }) test_that("xlsx is not read as xls and vice versa", { expect_error( read_xls(test_sheet("iris-excel-xlsx.xlsx")), "libxls error: Unable to open file" ) expect_error(read_xlsx(test_sheet("iris-excel-xls.xls")), "cannot be opened") }) test_that("non-existent file throws error", { expect_error(read_excel("foo"), "`path` does not exist") }) test_that("read_excel catches invalid guess_max", { expect_error( read_excel(test_sheet("iris-excel-xlsx.xlsx"), guess_max = NA), "`guess_max` must be a positive integer" ) expect_error( read_excel(test_sheet("iris-excel-xlsx.xlsx"), guess_max = -1), "`guess_max` must be a positive integer" ) expect_warning( read_excel(test_sheet("iris-excel-xlsx.xlsx"), guess_max = Inf), "`guess_max` is a very large value" ) expect_error( read_excel(test_sheet("iris-excel-xlsx.xlsx"), guess_max = NULL), "`guess_max` must be a positive integer" ) expect_error( read_excel(test_sheet("iris-excel-xlsx.xlsx"), guess_max = 1:2), "`guess_max` must be a positive integer" ) }) test_that("read_excel catches invalid n_max", { expect_error( read_excel(test_sheet("iris-excel-xlsx.xlsx"), n_max = NA), "`n_max` must be a positive integer" ) expect_error( read_excel(test_sheet("iris-excel-xlsx.xlsx"), n_max = -1), "`n_max` must be a positive integer" ) expect_error( read_excel(test_sheet("iris-excel-xlsx.xlsx"), n_max = NULL), "`n_max` must be a positive integer" ) expect_error( read_excel(test_sheet("iris-excel-xlsx.xlsx"), n_max = 1:2), "`n_max` must be a positive integer" ) }) ## https://github.com/tidyverse/readxl/issues/373 test_that("xls with exactly 65536 rows does not enter infinite loop", { out <- read_excel(test_sheet("65536-rows-xls.xls")) expect_identical(out, tibble::tibble(HELLO = "WORLD")) }) test_that("sheet must be integer or string", { expect_error( read_excel(test_sheet("mtcars.xls"), sheet = TRUE), "`sheet` must be either an integer or a string." ) }) test_that("trim_ws must be a logical", { expect_error( read_excel(test_sheet("mtcars.xls"), trim_ws = "yes"), "`trim_ws` must be either TRUE or FALSE" ) }) ## xlsx: https://github.com/tidyverse/readxl/issues/370 ## xls: https://github.com/tidyverse/readxl/issues/476 test_that("non-ASCII filenames can be read", { skip_on_cran() ## chosen to be non-ASCII but ## [1] representable in Windows-1252 and ## [2] not any of the few differences between Windows-1252 and ISO-8859-1 ## a-grave + e-diaeresis + Eth + '.xls[x]' xls_filename <- "\u00C0\u00CB\u00D0\u002E\u0078\u006C\u0073" xlsx_filename <- "\u00C0\u00CB\u00D0\u002E\u0078\u006C\u0073\u0078" tricky_xls_file <- file.path(tempdir(), xls_filename) tricky_xlsx_file <- file.path(tempdir(), xlsx_filename) file.copy(test_sheet("list_type.xls"), tricky_xls_file) file.copy(test_sheet("list_type.xlsx"), tricky_xlsx_file) expect_true(file.exists(tricky_xls_file)) expect_true(file.exists(tricky_xlsx_file)) on.exit(file.remove(tricky_xls_file)) on.exit(file.remove(tricky_xlsx_file)) expect_error_free(read_xls(tricky_xls_file)) expect_error_free(read_xlsx(tricky_xlsx_file)) }) test_that("styles and sharedStrings parts can be absent", { expect_error_free( df <- read_xlsx(test_sheet("no-styles-or-sharedStrings-parts.xlsx")) ) expect_identical(df$Language[1], "german") expect_true(all(df$Age > 0)) }) readxl/tests/testthat/test-dates.R0000644000176200001440000000337513336631200016740 0ustar liggesuserscontext("Dates") test_that("dates respect worksheet date setting", { nms <- paste0("X", 1:5) d1900 <- read_xls(test_sheet("dates-1900.xls"), col_names = nms) d1904 <- read_xls(test_sheet("dates-1904.xls"), col_names = nms) d1900loo <- read_xlsx(test_sheet("dates-1900-LibreOffice.xlsx"), col_names = nms) expect_equal(d1900, d1904) expect_equal(d1900, d1900loo) expect_equal(d1900$X1, ISOdate(2000, 01, 01, 0, tz = "UTC")) }) ## #187 Date/times missing a second test_that("date subsecond rounding works", { ## xlsx df <- read_excel(test_sheet("datetime-rounding.xlsx")) expect_identical(as.character(df$dttm), df$dttm_string) ## xls df <- read_excel(test_sheet("datetime-rounding.xls")) expect_identical(as.character(df$dttm), df$dttm_string) }) ## Lotus 1-2-3 leap year bug ## #264, #148 test_that("we get correct dates prior to March 1, 1900, in 1900 date system", { ## xlsx expect_warning( df <- read_excel( test_sheet("dates-leap-year-1900-xlsx.xlsx"), col_types = c("date", "text", "logical") ), "NA inserted for impossible 1900-02-29 datetime" ) dttms <- as.POSIXct(df$dttm_string, format = "%Y-%m-%d %H:%M:%S", tz = "UTC") leap_day <- df$dttm_string == "1900-02-29 08:00:00" expect_identical(df$dttm[!leap_day], dttms[!leap_day]) expect_true(is.na(df$dttm[leap_day])) ## xls expect_warning( df <- read_excel( test_sheet("dates-leap-year-1900-xls.xls"), col_types = c("date", "text", "logical") ), "NA inserted for impossible 1900-02-29 datetime" ) dttms <- as.POSIXct(df$dttm_string, format = "%Y-%m-%d %H:%M:%S", tz = "UTC") leap_day <- df$dttm_string == "1900-02-29 08:00:00" expect_identical(df$dttm[!leap_day], dttms[!leap_day]) expect_true(is.na(df$dttm[leap_day])) }) readxl/tests/testthat/test-empty.R0000644000176200001440000000324413067126266017005 0ustar liggesuserscontext("Empty sheets") test_that("completely empty sheets are handled [xlsx]", { out <- read_excel(test_sheet("empty-sheets.xlsx"), "empty") expect_identical(out, tibble::tibble()) out <- read_excel(test_sheet("empty-sheets.xlsx"), "empty", skip = 3) expect_identical(out, tibble::tibble()) out <- read_excel(test_sheet("empty-sheets.xlsx"), "empty", col_names = "a") expect_identical(out, tibble::tibble()) out <- read_excel(test_sheet("empty-sheets.xlsx"), "empty", col_names = FALSE) expect_identical(out, tibble::tibble()) }) test_that("completely empty sheets are handled [xls]", { out <- read_excel(test_sheet("empty-sheets.xls"), "empty") expect_identical(out, tibble::tibble()) out <- read_excel(test_sheet("empty-sheets.xls"), "empty", skip = 3) expect_identical(out, tibble::tibble()) out <- read_excel(test_sheet("empty-sheets.xls"), "empty", col_names = "a") expect_identical(out, tibble::tibble()) out <- read_excel(test_sheet("empty-sheets.xls"), "empty", col_names = FALSE) expect_identical(out, tibble::tibble()) }) test_that("sheets with column names only are handled", { out <- read_excel(test_sheet("empty-sheets.xlsx"), "header_only") expect_identical(out, tibble::tibble(var1 = logical(), var2 = logical())) out <- read_excel(test_sheet("empty-sheets.xls"), "header_only") expect_identical(out, tibble::tibble(var1 = logical(), var2 = logical())) }) test_that("non-empty sheets act that way if we skip past everything", { out <- read_excel(test_sheet("skipping.xlsx"), skip = 10) expect_identical(out, tibble::tibble()) out <- read_excel(test_sheet("skipping.xls"), skip = 10) expect_identical(out, tibble::tibble()) }) readxl/tests/testthat/test-missing-values.R0000644000176200001440000001127513406366260020615 0ustar liggesuserscontext("Missing values") test_that("blanks in different rows read as missing [xlsx]", { blanks <- read_excel(test_sheet("blanks.xlsx"), sheet = "different_rows") expect_equal(blanks$x, c(NA, 1)) expect_equal(blanks$y, c("a", NA)) }) test_that("blanks read as missing [xls]", { blanks <- read_excel(test_sheet("blanks.xls"), sheet = "different_rows") expect_equal(blanks$x, c(NA, 1)) expect_equal(blanks$y, c("a", NA)) }) test_that("blanks in same middle row are read as missing [xlsx]", { blanks <- read_excel(test_sheet("blanks.xlsx"), sheet = "same_row_middle") expect_equal(blanks$x, c(1, NA, 2)) expect_equal(blanks$y, c("a", NA, "b")) }) test_that("blanks in same middle row are read as missing [xls]", { blanks <- read_excel(test_sheet("blanks.xls"), sheet = "same_row_middle") expect_equal(blanks$x, c(1, NA, 2)) expect_equal(blanks$y, c("a", NA, "b")) }) test_that("blanks in same, first row are read as missing [xlsx]", { blanks <- read_excel(test_sheet("blanks.xlsx"), sheet = "same_row_first") expect_equal(blanks$x, c(NA, 1)) expect_equal(blanks$y, c(NA, "a")) }) test_that("blanks in same, first row are read as missing [xls]", { blanks <- read_excel(test_sheet("blanks.xls"), sheet = "same_row_first") expect_equal(blanks$x, c(NA, 1)) expect_equal(blanks$y, c(NA, "a")) }) test_that("By default, NA read as text", { df <- read_xls(test_sheet("missing-values-xls.xls")) expect_equal(df$x, c("NA", "1", "2")) }) test_that("na arg can be used to map 'NA' to NA [xls]", { df <- read_excel(test_sheet("missing-values-xls.xls"), na = "NA") expect_equal(df$x, c(NA, 1, 2)) expect_equal(df$y, c(NA, 1, 2)) # formula column }) test_that("na arg can be used to map 'NA' to NA [xlsx]", { df <- read_excel(test_sheet("missing-values-xlsx.xlsx"), na = "NA") expect_equal(df$x, c(NA, 1, 2)) expect_equal(df$y, c(NA, 1, 2)) # formula column }) ## #401 make sure check against NA strings is done after shared string table ## lookup for affected cells vs. on the index into the shared string table test_that("na arg works with multiple strings and for shared strings [xlsx]", { df <- read_excel( test_sheet("numbers-as-na-and-shared-strings-xlsx.xlsx"), na = c("1", "d") ) ## shared string table is: ## sst[0] = "a" ## sst[1] = "b" <-- make sure this does not become NA! ## sst[2] = "c" ## sst[3] = "d" expect_identical(df, tibble::tribble( ~ a, ~ c, "b", NA )) }) test_that("na arg works with multiple strings and for shared strings [xls]", { df <- read_excel( test_sheet("numbers-as-na-and-shared-strings-xls.xls"), na = c("1", "d") ) expect_identical(df, tibble::tribble( ~ a, ~ c, "b", NA )) }) test_that("empty first column gives valid data.frame [xls]", { df <- read_excel(test_sheet("missing-first-column.xls"), col_names = FALSE) expect_s3_class(df, "tbl_df") expect_identical(dim(df), c(3L, 1L)) }) test_that("empty first column gives valid data.frame [xlsx]", { df <- read_excel(test_sheet("missing-first-column.xlsx"), col_names = FALSE) expect_s3_class(df, "tbl_df") expect_identical(dim(df), c(3L, 1L)) }) test_that("empty named column gives NA column", { df1 <- read_excel(test_sheet("empty-named-column.xlsx"), col_names = TRUE) df2 <- read_excel(test_sheet("empty-named-column.xls"), col_names = TRUE) expect_equal(ncol(df1), 4) expect_equal(names(df1)[2], "y") expect_true(all(is.na(df1$y))) expect_true(all(is.logical(df1$y))) expect_equal(ncol(df2), 4) expect_equal(names(df2)[2], "y") expect_true(all(is.na(df2$y))) expect_true(all(is.logical(df2$y))) }) test_that("empty (styled) cells are not loaded, but can survive as NA [xlsx]", { ## what's important about this sheet? ## contains empty cells with a custom format ## therefore they appear in the xml and have a style attribute ## where are they? ## in the embedded empty columns, w/ and w/o a name ## in a trailing empty column WHICH SHOULD BE DROPPED ## in some trailing rows WHICH SHOULD BE DROPPED out <- read_excel(test_sheet("style-only-cells.xlsx")) df <- tibble::tibble( var1 = c("val1,1", "val2,1", "val3,1"), var2 = NA, var3 = c("aa", "bb", "cc"), var4 = NA, var5 = c(1, 2, 3) ) ## this is not a test re: column names; be robust to tibble version names(out)[4] <- "var4" expect_equal(out, df) }) test_that("empty (styled) cells are not loaded, but can survive as NA [xls]", { out <- read_excel(test_sheet("style-only-cells.xls")) df <- tibble::tibble( var1 = c("val1,1", "val2,1", "val3,1"), var2 = NA, var3 = c("aa", "bb", "cc"), var4 = NA, var5 = c(1, 2, 3) ) ## this is not a test re: column names; be robust to tibble version names(out)[4] <- "var4" expect_equal(out, df) }) readxl/tests/testthat/test-sheets.R0000644000176200001440000000530213336631200017123 0ustar liggesuserscontext("Sheets") test_that("informative error when requesting non-existent sheet by name", { expect_error( read_excel(test_sheet("iris-excel-xlsx.xlsx"), sheet = "tulip"), "Sheet 'tulip' not found" ) expect_error( read_excel(test_sheet("iris-excel-xlsx.xlsx"), range = "tulip!A1:A1"), "Sheet 'tulip' not found" ) }) test_that("informative error when requesting non-existent sheet by position", { expect_error( read_excel(test_sheet("iris-excel-xlsx.xlsx"), sheet = 2), "Can't retrieve sheet in position 2, only 1 sheet(s) found.", fixed = TRUE ) expect_error( read_excel(test_sheet("iris-excel-xls.xls"), sheet = 2), "Can't retrieve sheet in position 2, only 1 sheet(s) found.", fixed = TRUE ) }) test_that("invalid sheet values caught", { expect_error( read_excel(test_sheet("iris-excel-xlsx.xlsx"), sheet = 0), "`sheet` must be positive" ) expect_error( read_excel(test_sheet("iris-excel-xlsx.xlsx"), sheet = rep(1L, 2)), "`sheet` must have length 1" ) }) test_that("sheet can be parsed out of range", { direct <- read_excel(test_sheet("iris-excel-xlsx.xlsx"), sheet = "iris", range = "A1:A1") indirect <- read_excel(test_sheet("iris-excel-xlsx.xlsx"), range = "iris!A1:A1") expect_identical(direct, indirect) }) test_that("double specification of sheet generates message and range wins", { expect_message( double <- read_excel( test_sheet("sheet-xml-lookup.xlsx"), sheet = "Asia", range = "Oceania!A1:A1" ), "Two values given for `sheet`. Using the `sheet` found in `range`" ) ref <- read_excel(test_sheet("sheet-xml-lookup.xlsx"), range = "Oceania!A1:A1") expect_identical(double, ref) }) test_that("sheet data xml target is explicitly looked up (#104, #80)", { xlsx <- test_sheet("sheet-xml-lookup.xlsx") countries <- excel_sheets(xlsx) ## what's important about this workbook? ## xml target for worksheet i is NOT sheeti.xml ## name Id Target ## ## 1 Africa rId3 xl/worksheets/sheet4.xml ## 2 Americas rId4 xl/worksheets/sheet3.xml ## 3 Asia rId5 xl/worksheets/sheet5.xml ## 4 Europe rId6 xl/worksheets/sheet1.xml ## 5 Oceania rId7 xl/worksheets/sheet2.xml ## tests that we find xml target like so: (name ->) i -> Id -> Target ## embedded-chartsheet.xlsx has an embedded chartsheet but I see no ## current reason to explicitly test (#116, #200) for (cty in countries) { df <- read_excel(xlsx, sheet = cty) expect_identical(df$continent[1], cty) } for (i in seq_along(countries)) { df <- read_excel(xlsx, sheet = i) expect_identical(df$continent[1], countries[i]) } }) readxl/tests/testthat/test-xml-namespaces.R0000644000176200001440000000142013067126266020556 0ustar liggesuserscontext("XML namespaces") ## #268, #202, #80 ## what is special about nonstandard-xml-ns-prefix.xlsx? ## note `ns:id="rId3"` vs `r:id="rId3"` ## `ns:id` has been seen in xlsx written by 3rd party tools ## `r:id` is typical of files written by Excel # # # # # # # # # test_that("XML namespace prefixes are stripped", { df <- read_excel(test_sheet("nonstandard-xml-ns-prefix.xlsx")) exp <- tibble::tibble( a = c(1, 2), b = c(3, 4) ) expect_identical(df, exp) }) readxl/tests/testthat/test-skipping.R0000644000176200001440000000622013265235112017457 0ustar liggesuserscontext("Skipping") skipping_xlsx <- test_sheet("skipping.xlsx") skipping_xls <- test_sheet("skipping.xls") ref <- tibble::tribble( ~ var1, ~ var2, NA, NA, "v2,1", "v2,2", NA, NA, "v4,1", "v4,2" ) test_that("leading blank rows are implicitly skipped", { xlsx <- read_excel(skipping_xlsx, sheet = "two_blank_rows") xls <- read_excel(skipping_xls, sheet = "two_blank_rows") expect_identical(xlsx, ref) expect_identical(xls, ref) }) test_that("leading blank rows can be explicitly skipped", { xlsx <- read_excel(skipping_xlsx, sheet = "two_blank_rows", skip = 2) xls <- read_excel(skipping_xls, sheet = "two_blank_rows", skip = 2) expect_identical(xlsx, ref) expect_identical(xls, ref) }) test_that("leading blank rows can be implicitly AND explicitly skipped", { xlsx <- read_excel(skipping_xlsx, sheet = "two_blank_rows", skip = 1) xls <- read_excel(skipping_xls, sheet = "two_blank_rows", skip = 1) expect_identical(xlsx, ref) expect_identical(xls, ref) }) test_that("failure to skip junk leads to garbage df but no error", { out <- read_excel(skipping_xlsx, sheet = "occupied_row_and_blank_row") expect_identical(out$`blah blah`, c(NA, "var1", NA, "v2,1", NA, "v4,1")) expect_identical(out[[2]], c(NA, "var2", NA, "v2,2", NA, "v4,2")) out <- read_excel(skipping_xls, sheet = "occupied_row_and_blank_row") expect_identical(out$`blah blah`, c(NA, "var1", NA, "v2,1", NA, "v4,1")) expect_identical(out[[2]], c(NA, "var2", NA, "v2,2", NA, "v4,2")) out <- read_excel(skipping_xlsx, sheet = "two_occupied_rows") expect_identical(out$`blah blah`, c(NA, "var1", NA, "v2,1", NA, "v4,1")) expect_identical(out[[2]], c("yada yada", "var2", NA, "v2,2", NA, "v4,2")) out <- read_excel(skipping_xls, sheet = "two_occupied_rows") expect_identical(out$`blah blah`, c(NA, "var1", NA, "v2,1", NA, "v4,1")) expect_identical(out[[2]], c("yada yada", "var2", NA, "v2,2", NA, "v4,2")) out <- read_excel(skipping_xlsx, sheet = "two_occupied_rows", skip = 1) expect_identical(out[[1]], c("var1", NA, "v2,1", NA, "v4,1")) expect_identical(out$`yada yada`, c("var2", NA, "v2,2", NA, "v4,2")) out <- read_excel(skipping_xls, sheet = "two_occupied_rows", skip = 1) expect_identical(out[[1]], c("var1", NA, "v2,1", NA, "v4,1")) expect_identical(out$`yada yada`, c("var2", NA, "v2,2", NA, "v4,2")) }) test_that("explicit skip of leading junk, implicit skip of blank rows", { xlsx <- read_excel(skipping_xlsx, sheet = "occupied_row_and_blank_row", skip = 1) xls <- read_excel(skipping_xls, sheet = "occupied_row_and_blank_row", skip = 1) expect_identical(xlsx, ref) expect_identical(xls, ref) }) test_that("explicit skip of leading junk and blank rows", { xlsx <- read_excel(skipping_xlsx, sheet = "occupied_row_and_blank_row", skip = 2) xls <- read_excel(skipping_xls, sheet = "occupied_row_and_blank_row", skip = 2) expect_identical(xlsx, ref) expect_identical(xls, ref) }) test_that("explicit skip of leading junk", { xlsx <- read_excel(skipping_xlsx, sheet = "two_occupied_rows", skip = 2) xls <- read_excel(skipping_xls, sheet = "two_occupied_rows", skip = 2) expect_identical(ref, xlsx) expect_identical(ref, xls) }) readxl/tests/testthat/test-col-types.R0000644000176200001440000001277413336631200017562 0ustar liggesuserscontext("Column types") test_that("illegal col_types are rejected", { expect_error( read_excel( test_sheet("types.xlsx"), col_types = c("foo", "numeric", "text", "bar") ), "Illegal column type" ) }) test_that("request for 'blank' col type gets deprecation message and fix", { expect_message( read_excel( test_sheet("types.xlsx"), col_types = rep_len(c("blank", "text"), length.out = 5) ), "`col_type = \"blank\"` deprecated. Use \"skip\" instead.", fixed = TRUE ) }) test_that("invalid col_types are rejected", { expect_error( read_excel(test_sheet("types.xlsx"), col_types = character()), "length(col_types) > 0 is not TRUE", fixed = TRUE ) expect_error( read_excel(test_sheet("types.xlsx"), col_types = 1:3), "is.character(col_types) is not TRUE", fixed = TRUE ) expect_error( read_excel(test_sheet("types.xlsx"), col_types = c(NA, "text", "numeric")), "!anyNA(col_types) is not TRUE", fixed = TRUE ) }) test_that("col_types can be specified", { df <- read_excel( test_sheet("iris-excel-xlsx.xlsx"), col_types = c("numeric", "text", "numeric", "numeric", "text") ) expect_is(df[[2]], "character") df <- read_excel( test_sheet("iris-excel-xls.xls"), col_types = c("numeric", "text", "numeric", "numeric", "text") ) expect_is(df[[2]], "character") }) test_that("col_types are recycled", { df <- read_excel(test_sheet("iris-excel-xlsx.xlsx"), col_types = "text") expect_match(vapply(df, class, character(1)), "character") df <- read_excel(test_sheet("iris-excel-xls.xls"), col_types = "text") expect_match(vapply(df, class, character(1)), "character") }) test_that("types guessed correctly [xlsx]", { types <- read_excel(test_sheet("types.xlsx"), sheet = "guess_me") expect_is(types$blank, "logical") expect_is(types$boolean, "logical") expect_is(types$date, "POSIXct") expect_is(types$numeric, "numeric") expect_is(types$text, "character") expect_true(all(vapply(types, function(x) is.na(x[3]), logical(1)))) }) test_that("types guessed correctly [xls]", { types <- read_excel(test_sheet("types.xls"), sheet = "guess_me") expect_is(types$blank, "logical") expect_is(types$boolean, "logical") expect_is(types$date, "POSIXct") expect_is(types$numeric, "numeric") expect_is(types$text, "character") expect_true(all(vapply(types, function(x) is.na(x[3]), logical(1)))) }) test_that("we can specify some col_types and guess others", { ctypes <- c("text", "guess", "guess", "text", "guess") exp_cls <- c("character", "logical", "POSIXct", "character", "character") df <- read_excel(test_sheet("types.xlsx"), col_types = ctypes) cls <- vapply(df, function(x) class(x)[1], character(1)) expect_equivalent(cls, exp_cls) df <- read_excel(test_sheet("types.xls"), col_types = ctypes) cls <- vapply(df, function(x) class(x)[1], character(1)) expect_equivalent(cls, exp_cls) }) test_that("guess_max is honored for col_types", { expect_warning( types <- read_excel( test_sheet("types.xlsx"), sheet = "guess_max", guess_max = 2 ), "Expecting numeric", all = TRUE ) expect_identical(types$string_in_row_3, c(1, 2, NA)) expect_warning( types <- read_excel( test_sheet("types.xls"), sheet = "guess_max", guess_max = 2 ), "Expecting numeric", all = TRUE ) expect_identical(types$string_in_row_3, c(1, 2, NA)) }) test_that("wrong length col types generates error", { err_msg <- "Sheet 1 has 5 columns, but `col_types` has length 2." expect_error( read_excel(test_sheet("iris-excel-xlsx.xlsx"), col_types = c("numeric", "text")), err_msg ) expect_error( read_excel(test_sheet("iris-excel-xls.xls"), col_types = c("numeric", "text")), err_msg ) }) test_that("list column reads data correctly [xlsx]", { types <- read_excel(test_sheet("list_type.xlsx"), col_types = "list") expect_equal(types$var1[[1]], 1) expect_equal(types$var1[[2]], NA) expect_equal(types$var1[[3]], "a") expect_equal(types$var1[[4]], as.POSIXct("2017-01-01", tz = "UTC")) expect_equal(types$var1[[5]], "abc") expect_equal(types$var1[[6]], FALSE) }) test_that("setting `na` works in list columns [xlsx]", { na_defined <- read_excel(test_sheet("list_type.xlsx"), col_types = "list", na = "a") expect_equal(na_defined$var1[[3]], NA) }) test_that("list column reads data correctly [xls]", { types <- read_excel(test_sheet("list_type.xls"), col_types = "list") expect_equal(types$var1[[1]], 1) expect_equal(types$var1[[2]], NA) expect_equal(types$var1[[3]], "a") expect_equal(types$var1[[4]], as.POSIXct("2017-01-01", tz = "UTC")) expect_equal(types$var1[[5]], "abc") expect_equal(types$var1[[6]], FALSE) }) test_that("setting `na` works in list columns [xls]", { na_defined <- read_excel(test_sheet("list_type.xls"), col_types = "list", na = "a") expect_equal(na_defined$var1[[3]], NA) }) ## #385: logical-guessed column could end up with multiple pathological `TRUE` ## values for subsequent cells holding numeric data ## refines fix initiated in #398 test_that("numeric is correctly coerced to logical [xlsx]", { expect_warning( df <- read_xlsx(test_sheet("missing-values-xlsx.xlsx"), guess_max = 0) ) expect_identical(df$z, c(NA, TRUE, TRUE)) expect_equal(sum(df$z, na.rm = TRUE), 2) }) test_that("numeric is correctly coerced to logical [xls]", { expect_warning( df <- read_xls(test_sheet("missing-values-xls.xls"), guess_max = 0) ) expect_identical(df$z, c(NA, TRUE, TRUE)) expect_equal(sum(df$z, na.rm = TRUE), 2) }) readxl/tests/testthat/test-example.R0000644000176200001440000000060213336631200017261 0ustar liggesuserscontext("readxl_example") test_that("NULL path returns names of example files", { example_files <- readxl_example() expect_true("datasets.xls" %in% example_files) expect_true("datasets.xlsx" %in% example_files) expect_is(example_files, "character") }) test_that("providing example file name returns full path", { expect_true(file.exists(readxl_example("datasets.xlsx"))) }) readxl/tests/testthat/sheets/0000755000176200001440000000000013442224523016027 5ustar liggesusersreadxl/tests/testthat/sheets/no-styles-or-sharedStrings-parts.xlsx0000644000176200001440000000366313406366260025304 0ustar liggesusersPK[Content_Types].xmlRJ0 Cui "{Pi?2}{Ӯ,"x43|4YD&oEz}˧U7Q-? EzH=|9JIj@$BD_.$=ʫ*>Wyō;lfsmZH^Z1Z \T}\94HBlʂ}.ϔF)?+L9[(~7m:P5"1;+)[U@r.s?uiwCPK _rels/.relsϽ0whn1bLX >@-4@i[71b@5YC֦pΛ=0@8W,* Bνp>!&Nr t-REMwDZ+ X5[ǧ O#Fk1$߈$)"f-Q"1PKxl/_rels/workbook.xml.rels 0 ;]6"bE]e>@{{qS? n乳FB h[up)O-Tj$LĐcuK:2qR[?[ߠSW :M7 3W_Trrot: ?[Q >dIT_oϘ<J2PKxl/workbook.xmln@ +aT8S`uȊۿsO3'O ESsLtz%P v Sr`8v027k?b6KŬ΂!X7U9$< W?3RY S(_4+X6s8tmn38i 9r45s /PKxl/worksheets/sheet1.xmln0I}PCݶpVFo?(MFW! $ޑk#P;! { x^FoAPfpxupǡ P!5Qd 0՜`"*42|Mp- d;a25utۍċF^N^G&&]S8pgQPK>wC[Content_Types].xmlPK>-Q"1 ?_rels/.relsPK>J2*xl/_rels/workbook.xml.relsPK> /(xl/workbook.xmlPK>Q&xl/worksheets/sheet1.xmlPKEXreadxl/tests/testthat/sheets/dates-1900.xls0000644000176200001440000004300013067126266020253 0ustar liggesusersࡱ> !  R FH`Workbook'SummaryInformation(DocumentSummaryInformation8 F\pHadley Wickham Ba==`@8@"1Verdana1Verdana1Verdana1Verdana1Verdana1Verdana1 Verdana1=Verdana"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_) m/d/yy mm/dd/yymmmm\ d\,\ yyyy                + ) , *               8dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\` Sheet1fN+dl&w `l& j0DsĄs)|cs%+""dr|w+ss_ycsN+"hxT"ycax;~9\Xx?L\>-x^e/Txx?LTq9x;Tx{|rx?L|r{ܣe |rx|r{xaB{|rhy{(y]{8y;8y%x{u{p%;y:;)P com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 300 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 300 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket PMPPDPaperCodeName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMPPDPaperCodeName Letter com.apple.print.ticket.stateFlag 0 PMPPDTranslationStringPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMPPDTranslationStringPaperName US Letter com.apple.print.ticket.stateFlag 0 PMTiogaPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMTiogaPaperName na-letter com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0 0 3058.3333333333335 2400 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -75 -75 3225.0000000000005 2475 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName na-letter com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0 0 734 576 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 774 594 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName Letter com.apple.print.ticket.stateFlag 0 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PageFormatTicket Mz,, ` g(HH(dh "d??U }  $@@@@@<>@@7  ՜.+,0 PXd lt| ' Sheet1  Worksheets FMicrosoft Excel Sheet8FIBExcel.Sheet.8 Oh+'0HPh 'Hadley WickhamHadley WickhamMicrosoft Macintosh Excel@ '`@? `GPICTM HHM MHHXMMIo{sgZwc9wgZwkZ^swok{wcZswg:w^_swgZ[swgZJsVswwgZ{{B2cg[VJtgZwo|g:VgZ{FSo|Ng[] swwFS>s^1k{wgZ{^NB2g[V_Vwo|c9ZgZ{FSsNg[_ swwkZ9V>RwwgZ{g:Zg[c9Jtk{wo|NN{gZ{FSNwg[7swsRkZwg:{{g[{wo|gZ{g[&k{c:k{gZwswswo{woswFSs JR{wcJR{w^JRNsVNswwkZRV^g9ZNsNs{JRZ^VZNsR{F1wNskZckZZw{JRkZckZZwso{g9g9kZcwo{{JR sRg9JRRNsJR^Z^wsJts Z{ZZ{ZsZRRg9kZwZwRo{g9csRRRZR9kZR{RNswRZ=VkZkZwRZ=VwVZVVBRJRVRJRo{^RNsRwss>ss F1cZF1g9ZBRVB{wsF1ZZRZJRJRw=co{cF1g9BV{,=o{cVJRBZo{kZwg9RJRBZ{^=NsF1F1ZBww=wZZF1o{BVNsF1kZF1g9wIs{skZkZwkZkZ{wZwo{w/k{o|cVk{o|k[{s{ws{s{s+sZk{sw{ww+so{^sw{ww-sZJtosw{ww#k{o|kZ{s{w{s{s/o|wk[Vowo{w{wsw-s{Jtssw{ww+sg:_sw{ww-sk[V{sw{ww%g:c:c9wo{wsswo{wo{-s{Zwsw{ww-s^FSo{sw{ww-ssZosw{ww%k[k{kZ{s{ws{s{s-s{k[Jto{{sw{ww+s_osw{ww-s{Nk[sw{ww-ssZssw{ww%k[k{kZ{s{ws{s{s-sgZNo{sw{ww-sFSZ{sw{ww-sFSsVsw{ww-so|_ssw{ww%k[k{kZ{s{ws{s{s-sgZFSRsw{ww+sZ{sw{ww+s{Rsw{ww+swssw{ww+k[k{Zk{kZ{s{ws{s{s-sZZc9sw{ww-sg:1ssw{ww-sNoVsw{ww/sw{{scw{o{wwww-o{sk[Vo|sk{{s{w{s{s-sNtg:Rsw{ww-ssRcsw{ww+swssw{ww%g:c:g:wo{wsswo{wo{1 s{Vg:sJtkZsw{ww1 sk[_RsFSsw{ww1 sZRgZVZsw{ww#s{sw{ww%gZg[gZwo{wsswo{wo{/sR_w>sw{ww/sk[_Jtsw{ww1 s^V{Jtssw{ww#k{o|kZ{s{w{s{s-o{ok{oc9ok{{s{w{s{s1 sN^sZZsw{ww1 sk[_Zssw{ww1 scZkZVo|sw{ww%g:c:c9wo{wsswo{wo{1 s{{o{osZw{{sw{ww1 sZ_{k[Zsw{ww1 sk[_Z_sw{ww1 sc9_s_ssw{ww1k[k{k[k{k{k[k{k{kZ{s{ws{s{s1 sV^Ntcsw{ww1 sk[_VFSRsw{ww1 sRFSk{_sw{ww#s{sw{ww3 k[o|o|c:g:k[Zc:o|o|k[{s{ws{s{s1 s__oJtwsw{ww1 sk[_o|Rsw{ww1 sVNwNkZsw{ww%o{so{w{www{CompObjTreadxl/tests/testthat/sheets/utf8-sheet-names.xls0000644000176200001440000002600013172305601021647 0ustar liggesusersࡱ>  R FIX]~e@Workbook SummaryInformation( DocumentSummaryInformation87  !"#$%&'()*+,-./012345689:< F\pHadley Wickham Ba==`@8@"1Verdana1Verdana1Verdana1Verdana1Verdana1Verdana"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)                + ) , *  8dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\`  K "f8x 7x 7 T$v$P$\!ݴ[|%˛$t$ t$d|v⛛ߋwNț t$XwT t$wca6w&U/\XHw?L\X>-w^eH#TXhw?LTXH#*TXwzXːw?LXːzeH#XːwXːzwaBzXːXxzx]z(x%(x@'hzuzx@'X=x:>XXX)xOXxX(y*'yz4`-x?L`-xpVz%yF̐zF̐8y$8yq%hy%l#y|ۛy=^Xy~zy?Lz XbTy9˅z̐y(zz z(zy(zz:>K'z~6O 6hzC~6zHz]z(zX F   dMbP?_*+%"%??U  ~ ?D>@@ F  c  dMbP?_*+%"??U  ~ ?D>@@  ՜.+,0 PXd lt| '   Worksheets FMicrosoft Excel Sheet8FIBExcel.Sheet.8 Oh+'0HPh 'Hadley WickhamHadley WickhamMicrosoft Macintosh Excel@]e@P]~eGPICT Q HHQ QHHQQ)o{sgZso{gZso{k[skZo{sg:Qswg[{JtgZ{g[w>Jtso|^JtVk{wB2NRgZWswgZ9>k{wg[RJt{g[w>Nwo|B2o|wB2B2gZc swwZ1kZgZ1_wwg[__B2{{g[wB2:wo|Jtg:k[o|w>g:FSgZ[swk{JtNo{wg[{{{{{g[w{wo|s{k{wwwgZ#gZc:k[sk{so{so{sk[/swJtw{ww{{w1sNwwg9o{o{w{{w/sJtwww1w{{w3s{wg:o{{wsww{{w'gZg[o{wo{wsswsswo{5sk{NZ{wVw{{w1so|VwJR{w{{w3sk[B2owJRsw{{w5o{sso{osss{sw{s{w{w{s+o{oo|c9os{s{w{w{s-ss_Rww{{w+sFSc9ww{{w)sFSww{{w-ssVsww{{w'g:c:o{wo{wsswsswo{/s{g:gZ{ww{{w-sgZRRww{{w-ss_Rww{{w+sw{ww{{w'g:c:o{wo{wsswsswo{/ssRk[{ww{{w-swZ_ww{{w-swVVww{{w)s{w{ww{{w$gZo{wo{wsswsswo{/sgZVo{{ww{{w-sNZNtww{{w-soN^ww{{w)o{sssw{ww{w#k[k{o|wswswsws/soJtB2{ww{{w+so|g:ww{{w)sFSww{{w/s{{kZ{ww{{w/k[k{_gZk{o|{s{ws{sw{s-skZVNww{{w-ss1Vww{{w-sVk[Jtww{{w5ow{{wco{wsw{ww{w/o{so|VgZsos{s{w{w{s-sVoJtww{{w-sk{N>ww{{w-sscRww{{w-k{so|gZsos{s{w{w{s7 sw{c9c9{Z_{{wsw{ww{w1ssRo{ZFSww{{w3 ssRk[ZFS{ww{{w1s_B2wJtNww{{w#s{ww{{w'gZg[o{wo{wsswsswo{3 s^VNc9{ww{{w1ssRc9c9ww{{w1sgZNZZww{{w#k{o|s{s{w{w{s/o{ok{oc:o|os{s{w{w{s1s^R{cB2ww{{w1ssRg:_ww{{w1sk[VsNcww{{w'g:c:o{wo{wsswsswo{1s{{ok{{Zk[{ww{{w1sg:RwB2ww{{w1ssRgZJtww{{w1sk[Z{cc9ww{{w'g:c:o{wo{wsswsswo{1s{{c9c{wZ{ww{{w1ssRVJtww{{w1ssRo{B29ww{{w1s^>{{Jtww{{w#s{ww{{w5k[o|o|gZc:o|Z_o|o{s{ws{sw{s1sk[RFSk[ww{{w1ssR{>ww{{w1scJs{VRww{{w)o{sssw{ww{wCompObj;Treadxl/tests/testthat/sheets/inlineStr.xlsx0000644000176200001440000001302613067126266020730 0ustar liggesusersPKEz? _rels/.relsN0 )"WwCB5!Py?jGI شÎv/-Wy؋Ӱ)JP޵^=Yű#GV rOzUK? FD.4&J9 -z2۲͂VC8[P%ti]9l><)4X19/2rĉ,%B#}WW\sMˊ_yO ÛcSv_PKRPKEz?docProps/app.xml?o J1v0Q *EJ᳃d8v.{zv,WEx]j7O|!bH?|(HN">+-F)?c'm74Ob[F@ 7 _+ڠ/OSȼxt}н(%hUhVt7ْˋR9zw@Ҡ Bnct -DnzodLG߂McW`0FF af#=*5+wQ19| g4:~8R8d{AqTpEY[j T8NW~OO=?y'~(/3_=*?~߾*Ĩ(7O|_|(O="r퐻-]Lc`(Un sgYE'qO@.?u[rZ\YV(L cT(G!NTw@,҂.D!= gOiv-B)jaZd>l'bݽZl!Gq2f;xWXt+@c)؈0C"eT!u.xqPtsua^P(#yqWERxg8jg(Qo>#7IXD3\3a&-uMMG]1ZdJEH܆HAvH cX(1tQBz7%1Qό^aPԄ2QK%i؃t"\4ǁ _j "էT.@e$-Q%4Fbnh7mXteli|%-rUjZSrTkӧb&}CIK]bRΌ'mP{p*FtB+MLc.gv' +d]WXeUMg"c0U di8W/Ma+ :g8MC9{SXV5C@HҝҶf~٪ٴnJZr޵>f?qb%NeV >VDc4`cR4fT:PY8+ӒyxPv[&M"G7PKyve PKEz?xl/worksheets/sheet1.xmlr0;h1`gڸ&Z) * _1Y5xc]_08B+d-/XL]|2 ҂DpT:$D!Td*(fn0m*we03x!dGoWzֻTnZfq{W_۩Wuw+[-ڸ#^q&Tч̂ Q˔0 22pהBgYxqL+ntCzpV4ڀ6Y)i?!xʀS`Ojas`;#P /Ag3M4d]5r-_KݖO*dkfӯGr\hsֺp FZǒ?o.m~ڲ?/X4ࢶ.q]{:Fj.zY7?럚`׃C}{`ͪc,˱fTKxa3& լnj)| *|#Ӗ d35*#.;KHA 1>FiҜ+]!=B yQ;1,E)MA\{A9PKJɥePKEz?xl/workbook.xmlN0EHHͫ/An*dҚ:=Rر^;j{ԆI$ (d&'[2]^dWA5X ޙ([KXښGa ס@{3}h8AKSItRR&'[kUEbMM( שuRo"4lmͣaO2AzBÐU |ES=D#%2[ qq\Ri99pX2898)[<Q N܍!uIW [+wE6 /lotՑEd~p^60]@CwGs)s(Gg/NVP^h?1OhϾPKg]aKPKEz?xl/_rels/workbook.xml.relsˊ1Ev@D:[v'!UR(pnP)绡WLorP]:Xs3\boYz")deSɵ8XBD/7uHeѺmP|-W-*iQᇺg4GM s΄J?w}ҁe x./E~?) iE-"_e.%Y1*ݯPK"-PKEz?[Content_Types].xmlN0H+Jr@%B7UǶnIߞ E +ڝ&iYƻgkLMqϧm5;yRxU pTi|d8A.KE<81V=A#6Jx=n^e(.VN!_[8;1rHl?-o@{HRb 5e>WC4L";2 ܟ0?ꇏwgⲓ A ❝jE K@';)X>鱻*_8'L% 3PK JCPK-Ez?R _rels/.relsPK-Ez?%docProps/app.xmlPK-Ez? KdocProps/core.xmlPK-Ez?4<-KJ)xl/theme/theme1.xmlPK-Ez?yve  xl/styles.xmlPK-Ez?Jɥek xl/worksheets/sheet1.xmlPK-Ez?g]aKxl/workbook.xmlPK-Ez?"-'xl/_rels/workbook.xml.relsPK-Ez? JC>[Content_Types].xmlPK >readxl/tests/testthat/sheets/whitespace-xlsx.xlsx0000644000176200001440000005561313172305601022106 0ustar liggesusersPK!܆~|[Content_Types].xml (ĔN0M|f+paapz$l_ڂ!a7k|tU5%VHSmߑ,DfS@Itr}5^l M(I44 u`p^%[ʭ`b[ 2?@V*f#pvZ0,"(mw8*tEC#]AA6T/XN/ds3N7~Z|vYtvV ,_iZ&B*Zh&͞?4-ÞAxWH2'q )ycWSg=3>؏6:w(>J8 cMwpuqF7MxPK!}T _rels/.rels (J0rߦl&R`66dFj=Nfv7ځa "m\+k,&pr(#UW K3>]JA: r`!2ƒE);~kjZ7g7G[XL!PpC& d/b\zk\(|$uҌgcBQ/#KDKMg;@/l.WN 3A}3.1PK!A xl/_rels/workbook.xml.rels (j0{-mC)sh)ڦ ebKFW$q ΢|w@w $qbJz $WWl5CdDtq2RiJ|.n*:q e+Pym l[{j >{ѡ #FCjd(fIynI⡍%y.~xo O)jI[duNuD$ė{|%&mFPK![|xl/workbook.xmlTn0?+dI^`9p5PAmᢒT,wDU\Br737RXU ju8FuDDhrtd?yj9*[Z2I왮6800Rؒ1' K#z㔭4%S1Lm+ۣI8IS]T \pw(t+mV@MȰ|-95;(ܑ|o4Qԅ<`+"W 9fEXK* {!38ʁL_I<Ԑ}aV FBdk+ڈ; oL#66~t%q׃' } m% CG[)|=g_kW>:د ?x+Ax}}FёM[9J[Bfd ]PBmE(keɎP`fSxB9%jqr+>^<<0mRhm NZ@LָRsc4YdjIË(ru\Lb8f0_(_.؎m$ٳU(i=Yh/XQcx=ۇ],"}b`9_olnw0 7cke R_t \|,Dji!~:Ȉ†w1Au`eHG' z+# 5bJD{4ZăL=8+_(=!*mt'5\9I1̈́Qn7p큁[Hqr&""9M \;KaF_v ͊}j!xp$r/ؖC]nv3I,$ڛB›H] EG߄jŭ+6*hr`sV Q>Cw]8] gݫj9M49P9kMj5Xҭ ҺF Q[L1d+RR5.4O{#xߙ]Z9Al֕*Յ~'O@_g|f[rSz) Q 0|aa3Vיvǝ›&,DJ( g+DQ:\Ev8^F2_3 PH|}E1LMg(^0 (ヤ7>=.ڏxm{x?z3nog.'Bje1ƒc a#Z0k W5htcM+Z}Z&h?!TRvG =:@݁Qi۵m/DB4~״]<,.sZuk GX֮+HPK!ίxl/sharedStrings.xmlJ@ rXN;3{|}@'S'oXz B#p"1û}@!9 œ~__Yeq8.1OB\'oUR( 2i}>"#yeur|_G{+ BLa7ڷf7Qoͷ2E·x^"MPK !MQ66docProps/thumbnail.jpegJFIFHHExifMM*>F(iNHH8Photoshop 3.08BIM8BIM%ُ B~ }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzCC ?|3 O?9Dҥit %Y,-I$,;K3I$@xWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@|)"ڀ7 ( ( ( ( ( ( (?|)"ڀ7m~ ɥ|bٯx7> Ciz얞 BI`kd2ڎހp3~?NOh)ԼQh?u)C;u ?oKuχZ~kx;?IEJ3k\-Aw\Ȗ Sif/x~>a{ #Y.~$|IotiZ+!g>n@S-EU$r隥a8)a@ x 7%rGt.d:4xIYNy%G/$;wbY1$7' ^oGJ?' ^oGJ?' ^oGJ?' ^oGJoc|Q^7 Zu~]K-iB6]s^>_#xzX|Kejwφ~ZDx\|Mk~#MS{i|9Xޭ|S_oXC _'ιEo|Fvoqw]5|]M#LӴH<'-ci[KxZ-vɨZƯ|ĭwj׺pdY3}< xE!*춾 h'q},i>3Q`[=m#UIY@:3gx:+h>&ϧc3gx:+h>&ϧc3gx:+h~tZ93yF[K _ybçc Sal1*3}< y?1[@3}< y?1[@3}< x%!xDY14-miOxs*ɸ#2h>&ϧc3gx:+h>&ϧc3gx:+h/[غi]b5 1ӂ۝R&*Y"1ϲ(`g39>3,zsF%1l!IP oy?1[@3}< y?1[@3}< !^Z1lφuﵵ+mwtOHqI;*h|)"ڀ7! m]K:t,Zhj0:e_4jV7Q7WV6x~xfG־П OVGXEPUOg+?x+L׼a]/])ſ?OiqMi6,3DJ$V(7_ '7_ '7_ '7_ '+]񧃤5gdM+PDD״wvUV31UA$IU🌼!5+3ChM KlG$ot$F]V0b78_ ƒI?8_ ƒI?8_ ƒI?8_ ƒIq/)DžAAi<7q 1GtI,ʑƊT P|)"ڀ7|cep,y?;J)hXdg__-|+}]xz3⏄k|?e<3kM>j+$j>ĩxO𽧊- ִ$n/ +KmAa鯣옏xAkXI :"Pei H?Z_l?7@V@6 tei H?p :O%N{XY5{2Jp';/ +KmAa?$n/ OZn[d;,ٖͣfbbI$rs@gV@6 tei H?Z_l?7@:.2*ˤ%XZ@"b"< Of𻾟bY`,m,ǒI<ei H?Z_l?7@V@6 txMS3tž"duYt¬@ FF0(|)"ڀ7%mͥk>a<5W7uo&6R0E*A%j?/0h1?u=¾&l|;JGЬ|QwOٖKZ+H=C~;_EP?/"ocz7}1KciFn;x!o곹|k:x,S\e=%^c ~/X82o ixf ru.+ jS.5[ƶ}̻mڌw.wC?~;_EP?/"ocz7}1Kc iFW_6oxq%^c ~/X9x|/5__7AVy`Uٚ8n$pJX{kveS|)"ڀ7|-? hU,,n>(Rk+%XO?hҿ?d+7O?hҿ?d+7O?hҿ!vUW#"Q{W0^x_|xfC$S(Q '4i_| CF '4i_| CF '4i_q}i6~"m":uߪ_HGWa4' Wo7@,ѥt' Wo7@,ѥt' Wo7@> x.~ ͯ {^fiVK 'u=hO4nY>JO4nY>J/[]^Mzq۝UE@W¿m[OM2) i4rŧۤpTw Y>JO4nY>JO4n9@]|[ik=6{ +yFTQK|)"ڀ7-Z( (On( (:/SwtP@??(oLTP@Կj|-bZ }"'Rh|)"ڀ7-k}?=ϊYCh/g^M9-6*`@_#-=VjOxc9(mx&?[@#-=V1Wm5T'm^4_ഺ{k[/9HQ@:G<[ES{D+hsſQ5?'1?oMO G<[ES{7i#oB:h?N/U,{4{6GʪsſQ5?'1?oMO G<[ES{D+hsſQ5?'1<xoxFkj6KH-Bk VK6J,CHtx&?[@#-=VjOxc9(me~ZhRK:Ji)h&Ce!roO xrH|}&VrE7!Y%ӚY%!sĚsſQ5?'1?oMO G<[ES{D+h|٧w^פ/ė1&t[4k2Itl|)"ڀ7%m;LZ[xIW^(bU[ᯆkFn9E0]|[]|[]|[]|[]|[[/`n;nMto>;nMto>;nMto>;nMto>;n9oxIWCI?  i6_mse&9 C#kϗ3tkϗ3tkϗ3tkϗ3txHE#[?KLQ{IT_Q'GH|ʠO0x_pY4x7"-lbIђ IH\x|9̽ 2xG—Wn5_x.@[_o7ÒtFnf0:C|sz?e>O?^C|sz>xZ:L?+C+oR'ģyS#m]!>x|9̽ 2C'ß}7/@!>x|9̽sǂ#p5e˥Z8MɥidWlt 2C'ß}7/@!>x|9̽eE>94AR\xx [II@G(mm_ L7ˠ }xjIQ1$8E, 2C'ß}7/@!>x|9̽s>5|[p5zf ť]9C&0L˔E<2لr:|)"ڀ7/i4|]jN|PjҬ-.-lKn01 N~PyH l?m@&БڀM#_)BGSaj?7xGWqxwm?oY<]4fLo!d`Jq@BGSaj?7o7 :M-o:M֋u -' xƊ*nO',´?!GiCZ'P Nj?@+O :9=u<#ysE-߆4 M2O>k,B@Pj?@+O :V?u<@+Qx*W= $-/P7ZUVV#!<=A@|->ROq!OG!oUAgbUQ €o´?!GiCZ'P Nj?@ύ~:-":ͼJ){BREV 0|)"ڀ7.-_O+ƞ$۟aߺ?.8v6` D˟?D˟?D˟?D˟?D˟пi?)? GS?#vmS|Rgo7yWſP j?zj?zj?zj?zj?z0+w6o$C$^f߳~v1g*LehNWyy^wb|<3}ln /j?zj?zj?zj?z29%l6'+,Q(r]r^:*9mYu~V0M2d%Lh&[;keZѬ읮q|[pSGq HD$g#Rfp8u`ZLp;;Nٜѽb4v]uOy  3@2B0]XׂA` ɄG@q߾Q[H35Qm wCU,D@ q⪣ZF2Vm5įwΦX(b}>XJe9`Εjk5BW#(y*[0}jѪK1e~K4=X!: ĀlLطHI kB%Y0p^΅;G{1E<0#ί`k,pb" zv3 :6 GnLWCyQmkEM[ OMCya%E.jJ_PK!h%lˡxl/calcChain.xml\A 0нmhiZDz&LJ&ZH U M|Z@p4h <?ӮPK-!܆~|[Content_Types].xmlPK-!}T _rels/.relsPK-!A xl/_rels/workbook.xml.relsPK-![|6 xl/workbook.xmlPK-!̳MF xl/styles.xmlPK-!(H}xl/worksheets/sheet2.xmlPK-!P:xl/theme/theme1.xmlPK-!fsuaF9xl/worksheets/sheet1.xmlPK-!ίxl/sharedStrings.xmlPK- !MQ66docProps/thumbnail.jpegPK-!.N{RdocProps/core.xmlPK-!!CBTdocProps/app.xmlPK-!h%lˡ]Wxl/calcChain.xmlPK I,Xreadxl/tests/testthat/sheets/missing-values-xls.xls0000644000176200001440000015700013336631200022330 0ustar liggesusersࡱ> m "#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklRoot Entry FK Workbook9SummaryInformation(!PDocumentSummaryInformation8 o\pMicrosoft Office User Ba==Pa@8@"1aVerdana1aVerdana1aVerdana1aVerdana1aVerdana1aVerdana1*h6 Calibri Light1,6Calibri16Calibri16Calibri1Calibri1Calibri1<Calibri1>Calibri1?Calibri14Calibri14Calibri1 Calibri1 Calibri1Calibri1Calibri1 Calibri1Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)                                                                      ff + ) , *     P  P        `            a>  ||>9u}A} 00\);_(*ef;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*ef ;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L ;_(@_) }A} 00\);_(*23;_(@_) }A} 00\);_(*23;_(@_) }A} 00\);_(*23;_(@_) }A} 00\);_(*23;_(@_) }A}  00\);_(*23;_(@_) }A}! 00\);_(*23 ;_(@_) }A}" 00\);_(*;_(@_) }A}# 00\);_(*;_(@_) }A}$ 00\);_(*;_(@_) }A}% 00\);_(*;_(@_) }A}& 00\);_(*;_(@_) }A}' 00\);_(* ;_(@_) }A}( 00\);_(*;_(@_) }}) }00\);_(*;_(@_)   'S P}}* 00\);_(*;_(@_) ??? ??? ???'S ???P}-}/ 00\);_(*}A}0 a00\);_(*;_(@_) }A}1 00\);_(*;_(@_) }A}2 00\);_(*?;_(@_) }A}3 00\);_(*23;_(@_) }-}4 00\);_(*}}5 ??v00\);_(*̙;_(@_)   'S P}A}6 }00\);_(*;_(@_) }A}7 W00\);_(*;_(@_) }x}800\);_(*;_(  }}9 ???00\);_(*;_(??? ???  ???'S ???P}-}; 00\);_(*}U}< 00\);_(*;_( }-}= 00\);_(* 20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L˭ % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  L % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23 % 60% - Accent3M( 60% - Accent3 23 % 60% - Accent4M, 60% - Accent4 23f % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23Ў % "Accent1AAccent1 Dr % #Accent2A!Accent2 }1 % $Accent3A%Accent3  % %Accent4A)Accent4  % &Accent5A-Accent5 [ % 'Accent6A1Accent6  pG %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 DTj%Dr2 Heading 2G Heading 2 DTj%?3 Heading 3G Heading 3 DTj%234 Heading 49 Heading 4 DTj% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  W%"Normal 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title DTj% <TotalMTotal %DrDr= Warning Text? Warning Text %XTableStyleMedium9PivotStyleMedium78dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\`Z7Sheet1IUx 7NA 7y 7z * + PK!pO[Content_Types].xmlj0Eжr(΢]yl#!MB;.n̨̽\A1&ҫ QWKvUbOX#&1`RT9<l#$>r `С-;c=1g;#=\;S8MklX(*|C:]g.Gp m2:ȍc _nLkjt>.&< :bo~PS4J3.F-r-{^j5_ e`B exw[ݞ_2|oT:=aW|]z^m1zl|oШ7(3},@)$qjghU"J)qN<[q*J˟TFFLΐIJ~ ^] |1I>rbXd[廿뷟߿>tu|' J>4vw?~_XwR4#c<ė,+fEӁWp]{؀Ga.|1e5'r.-£e2O.u.ls(1R_.@Zeac8‘9Ɩ='Ĉp5$#26 ictLbFRmeԶ0pc j!?Z \PL"HWDL1eN9@7ggD  ՜.+,0 PXd lt| ' Sheet1  WorksheetsG F$Microsoft Excel 97 - 2004 WorksheetBiff8Excel.Sheet.89q Oh+'0 HPh 'Hadley WickhamMicrosoft Office UserMicrosoft Macintosh Excel@c`@wKGLlI W EMFD@   J  JQxIJP(x J(J y±¥ͱ·ұŸ׫ҽȥȷͽOfȟ\yfpͱy͟˜ŸOpCompObjpreadxl/tests/testthat/sheets/missing-values-xlsx.xlsx0000644000176200001440000005746713336631200022730 0ustar liggesusersPK!&vD[Content_Types].xml (MN0H!%nY vQ` (0$1lg U%j6b{f4lU5%#VHS}ߓ,DfS@Ivlz}5Y M(I{44 u`^ގFw[<d:yU̞'pZ0,"(mO8*tn8 L⡑.>qM- +Kق4ӭ_֯>]ݩ!U%9V灉DIs`OMx`6$GI0ĝ0tٓhsg $@ ~PK!}T _rels/.rels (J0rߦl&R`66dFj=Nfv7ځa "m\+k,&pr(#UW K3>]JA: r`!2ƒE);~kjZ7g7G[XL!PpC& d/b\zk\(|$uҌgcBQ/#KDKMg;@/l.WN 3A}3.1PK!s?xl/_rels/workbook.xml.rels (j0 }05{R>@D2߾og0O׊/ x KR/W+(^oAkW;T0 !ڿa9~"$#NS{tSi2Բk4}a8 ±Q }LWUcś_C5?DF6:`!nwI,o ctknܼm É,"S`v[pZAF)wbggPK!S,& yxl/workbook.xmlT]o0}N ȇ)M-4U>; ^lMh%^>>kgZ)XU«yLQ]ru׍?CuDDhrtf}(޿NwZ=P6GscK+&5S0F9`[FJ[1QXЀ0`SִL0Aз&%pcST v\pwA'b{Pڐ0!|-95꽻(<|So0J.=a#uϬf_3UF-c[ϬCKi82]`5ߞUt6}PK!{֩xl/theme/theme1.xmlYKo7 X%6",%mİ9R.crARu+cEӢP m6:$WE}E{ k)CDHʳVP\ B,nwK+ gf<#`Ldpm5 nR‚ 1yN2x7" nE ||SX-/fp l 4$Y]AĮfM !DzǬ:?C f~V15B3 ͚"{+%`jv;zpV*Foޞ,NYk Wvs25 {٘Ԗހ,9o7:eo@<]Y]nxJfڡ^ 9ᅯ|V(2Cy\ +!5zFp}ʙGz-$CAs >1dĔ߫߿zz᳣?=ztG!Jco^>U?|ϟAS^|gO^|=7T}nSƕ ( NuW%3M\P<|)Yf:-Y n*ؿUq;qmwC՜cNB1IF!SuK>T>EmL&ӁHS4}:lCm|Zo} G>a©ej[X%>!w"Rc8FDJV~C}S)9"7^'ifI܃h+|8{8>ܥ#4@(SSTjOv ؚ|)qX M<ʶ Vi&y.9$)cj-id Eԃ7S\94 \$d79u3Ų`Ks ylOr')f2llX1blBKY[zխTsV7RV >U ք.AV^] f$vs-zBkH#b]kVt!LXLF y`jdvDzeb:hfB!Lp46b8 Q{j.hjꏪ:4D*'s!&yUef6/6:ތ6P/ &u-Iή<1G PTB>RD&~'LB8 6ZԵ .>Id|+e0wVZ#(w~Utƿ)Ua?SEo0/E! t.T¡ {ΨLhTx Ƈ`_}a6Cc$(l'*lCY2w zX`d""̭OX_e]@jR;}AX(&ywwҟhT~e+X3'7Sβrbh؜Vpf7>߁ڊSAT_U "HH{5>Y-vA庐iTi첉rsr|.,غGSgn&sq(UnћpB?bKA-Lt x4..:=&e 'DZA0S666#ZI\B-KӉK 2Bd=ڙu3gWKuLvY3w:x.`2ux KfF é-*&dPK!#m xl/styles.xmlVߏ6~@BpIתnOZgmlrY{ҽy؟I>ZЮgR\JLSϧrN _^9}|T9@!}Vz- @ٵD{R˽k ȰjBҒ0d{ gȎ'N 0yC߲lyiXEz=S4RީQ Z[X}/Qj8ʒopXzY"HKDžϴ êGޫdG ^ƅ,(ډPgH3 `q &d' %6JGб (yTJZKA$@TQח;Ƕl:u!:y™đoht#;@ywnwtFp ȸb2֧kZR 9r U]ԽpޕLD|v : !LcиaX h*K+A-hi Y=|'@1f-!#T2/C4^7 Pכh 'fq#Cl>/~h5ZGL#3u,ZQ^[VQE~rFh*kEK߷v pl Kzq!j(7Nc-c!s0,Zaðzh} aƎ-QБYB!7Bw!ah=mmp޻y=O=b;l7K\l`M[(Qk&;MtN=MI揔5w "21=vK^-2sLhz/Y')͞™xPG2sX6Œ4σqEB-7P?y-%rF `wdD3Xu:}9²O o Dwr'PK !H3|;|;docProps/thumbnail.jpegJFIFHHExifMM*>F(iNHH8Photoshop 3.08BIM8BIM%ُ B~ }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzCC ?;O}>Yaffh#, ,I$Nrhf@> tfiH?ٚo7@f@> tfiH?ٚo7@f@> tfiH?ٚo7@f@> tfiH?ٚo7@f@> tfiH?ٚo7@f@> tfiH?ٚo7@f@> tfiH?ٚo7@f@> tfiH?iLQ_Q_Q_Q_Q_Q_Q_Q_Q_Q_Q_Q_Q_Q_QiKm;XO/cI:Ι]gtkox;R?"}q>տfctO%ޏȔO%ޏȔO%ޏȔO%ޏȔO%ޏȔ>+s?~|2o?o=|@τ>pEaki 7>+D/ֲxORIWT=ӡ1xw{]'PCU3Е/&DЕ/&DЕ/&DЕ/&DЕ/&Dg|-~?M]ė^'x[G'j>+oKs{WNjOiw<+ZDuobKBe;Е/&DЕ/&DЕ/&DЕ/&DЕ/&D[]ׂuu [\O*im&IfY-ZIeFgGfwv,ı&:@< BW@< BW@< BW@< BW2x"-X/V9# #?ZJj]XVS (< nyi@i?,ɧ[<#ڗI,Řs@x 7%x 7%x 7%x 7%s7G<_bŽžC=WrC43GjE4R*:) iKhǎ<9xþ57CljM 4~7xfMOBMN_>5xvZAIE.w#>|Z4SZw!|R6}Xu߆>@;muy4>B~Kt76l4Kz 0 -{e],K[?|otS~Ҟ5~8yx|C Ƒ ]ii/19o㮹3^2[7^?Yk@ 0 -{e],Kc _n[]MqvŚսF]*CWB(!Bb0$  gC׿.AlaZ%- >7^?Yk@z߂,uyG1z䑱KI[lWFe EU𷂭'LJ'm{QS-3&n!;Q)mĀ$h AlaZ%- >7^?Yk@ 0 -{--|ە|a+[g^b^sm+C]H#颞+XdVX#Ei[V#ᯋAշM_|7 O<^<#kG-'-ɐþP{O //u ڞor6K۟]T^m6v1zg?ow??]5fxs}yό> x />5 ~VEះ/X$5xL k1Oiۗ:tv5 w?@>փ]+IG.u[mO^3/c?-k߄ a'Ln43|H_|N;ƞ 7m/|3.2x_Nɴ_G_ixWⶹalnΫ-xBƫ݋ xzhϊ4p\C6kcᡶiM@G?T<514hO kM><S_Z@/MH?h7^ |QL~1ּJ+~%Mz+?|JlMb.Eflo..egx=Bxo>\WΫ|_t MYWPimhO kM><S_Z@?T<514`5Oo+w<O9<|^g'k^׼QKCë|ƝxW:&evPM=5OA-|5[y}@MYm+Gn'X҅G?T<514hO kM><S_Z@zモkO q#:^$tm%dbFUT2F%olcò/oXn#HWӬ.!<6%c{ohO kM><S_Z@?T<514xƯ-׆|?xc_[}t4[yc \۬3_/ڎhw_chxˌ|=_sȔykB׎?O-Z"P ^9CXJG>(W'/^?s xǞG|E^¸sE?bV uO x:t{xo xJR?o]Vxr3 <"a '緹X$p?'-x c(!%Zе$5D_sȔ#Ou{[?>k:gu jV<ߌ&闚Kxzo?o~WlW>;0}gV{ZxGIm3Ρm*Om|f6 3ZWUåZFe;SHW|S!)$e]IR tZе$5D_sȔykB׎?O-Z"P^it]^!!K< JB.rPI _ x xrJatxxSV z}d),NWtr)*C) 7<k?Hk@'-x c(!%Zе$5Dgƾ5om2xg^MsmV#6uy-Dp@K3؅Rhi? xšKU7˵׊u gNTkQJV)8;@:OC:OC:OC:OC:OC:9oVMw07|q: Ңvƾ +ީ1\M h%X;xG M;xG M;xG M;xG M;xG MyoY?Hw-.#:νA4{[|R^F7W\܌2??“G??“G??“G??“G??“GZ+^0ͷ?ż ҡxtHhY")7Utu*O'?Rh@'?Rh@'?Rh@'?Rh@z< .E),izqIUDD[*XIT𧎼o q/ < &9a=:$X^9#udteVVR OC:OC:OC:OC:9W~ uxKV;( | k yJ (g"N@P@r?CO>5uP@dx@:5/#);E عր::(9/ȉ_G{i /Z...>'Ⱥl %<[&Ny/5N/5N/5N/5N/5Nc?|#u]>+F&!glcU&;x"+HZFv`/5N/5N/5N/5N/5N7<%&L[N85yzkEz"(@7v_<@qu<@qu<@qu<@qu<@qus {xFKK h35]b0OZ+Xs6Qs@´W%ƹ´W%ƹ´W%ƹ´W%ƹ8l:64zL$Ze]-%e;Za8a9 w xr}*WB'ƭyf䑂%nv'j* P+O"_k@+O"_k@+O"_k@+O"_k@ύ~F-:ͼU$ 4UԱ9[։Ȫ$VFJi? h{oxI ,o Il_ mW: QNw#Zg _ֳE/bhkY145Awx Z]&ϊmxK#<>52\q<۩#kº*ml5Awx ?Mk?P|]^&F(>./@#Z/恪"Xo{(;m<ǷUS<#upwdo2L;0MkY145Awx ?Mk?P|]^&F(>./@?M|SikZ d}&і}E fy(3M,:F(>./@#Zg _ֳE/bh/\氚.ʩ Iga c9?#a<= Ȟ;UIh l Fcfi2K#vkY145Awx ?Mk?P|]^&9V~.O81%ŧV M*f}2pki .ēc ϊ6VYϷ|6óvwg$:緁?_6Mm7{xKoO. 緁?_<"?/_-'3Tt<ڂ<ŶR҇fMm7{xKoO. 緁?_6Mm~~/Eu(]mq!K30ܬgmQm-@߉ ]~&o6tm= %o'k@߉ ]s _xGR,Y1}][r-|p],Fq8ƫq@@>߉ ]~&o6tm= %o'k@Hf_U%/喺*$ٝFh7#, 7>]3Oc|f~vq@~&o6tm= %o'k@߉ ]s>5_x,3}Ze]yt ["bMPEi? kZ oVx /4 Gl ]We-S]w$o]g7_P .D/mY} 6K>w j Z-&c7nT!J5[q yw j?%x|͵?O]ڀIu'.m@$o/濪"({;nmɻUco<]kp6co2w j?%x|͵?O]ڀIu'.m@ACSw^iu߂V M&V2$b 0C@:Iu'.m@$o]g7_P .D/m/\./į ycJ֒#g$#I"3aXw j?%x|͵?O]ڀ9V~.Ox9|1%߂Z d}*ZeE $r%j0i x@ѥu=w 9X4Mv=}"{6ISw 4jLjLjLjLjLxGҮR' L<kp g,.Z&GDcxO~O&|Sj?cxO~O&|Sj?cxO~O&|Sj?cxO~O&|Sj?cxO~O&|Sj>x6^mn.u#oSߪ_HJ]sӕmT??O)??O)??O)??O)??O)G1gOs,-T&A,Ur "HePB R7d*jLjLjLjLB.wZytB4 "{IUAwdX {o xrkHK(_xUEۣ-!C)w̌A XS XS XS XS 9 m:Ouz2ϥ]Gy#%.4:Eu@@i q^hm?0i?r8_4Ri^ ߜuo(Mc}~`>m?0i?r9/\[<< xpd@A= b:ߴ?9@m6Po(#_:#R S9T}͸e@AeA>ߕt_i?r?9@m6P'ۋs_q '~# PNyrI'i_WxT惨x ^\[쪙-BZ:@Bo?@Bo?@Bo?@Bo?@Bo?9o+Mܗ/|s+5!ՈqF@:@Bo?@Bo?@Bo?@Bo?@Bo?8 }߃􋋯 xjChZ\>V4,QwTpv ;% ;% ;% ;% ;%rW f}JyIYKVYeٝ݋1,I?ЛO'tD?ЛO'tD?ЛO'tD?ЛO'tD s D%HBHOi3#eu`YNTF O'𷆧>y Y@dYdӭI%K$ŝؖf%s@ ;% ;% ;% ;%r7W|o fh:T3<:UܑM ڬKH` i ZTsj^%s'^-@[Z_۫g`@@:At x ڀAt x ڀAt x ڀAt x ڀAt x ڀ9x3Onm[ѕG |Mnmi#ph4r 7 -JG oiNJm@ oiNJm@ oiNJm@ oiNJm@ oiNJm@gX^xCIUdO!3Ii/c-(!>]ZF˳5v*****rfs\|MmoKZHCo +E5TU kƟ\x kƟ\x kƟ\x kƟ\xx'OE]c,c '|Q,lRVH9GVG\_i_siVH|gx!FOrACDqDh" {]7^4_]7^4_]7^4_]7^4_c gSWto~u>%vJR{i7+X>-Pi i+i>%ӴCj!PvPWt#?$#ǿ:FI@Gu%=G3J<#vc7FGZxiu0H"ڗ7+5p?gIV̗e<{Cgdx] (?Pt#?$#ǿ:FI@o/ƒxGI{?v\SN/C~ I0On쿲<{Cgdx] (?Pt#?$#ǿ:FI@ǂ4Ik*1=CiV^|2yQyKiet=G3J?<{Cgdx] (?P^t]]$cK tE&Yrs WW{i0@B[O1Cѡqعڠ=G3J?<{Cgdx] (?P3]/7Ų]xJO so$.tf;H&X"3ni; @WS'_wy|싼m9ݍnXoj?zj?zj?zj?zj?z1/O"{OB>"H~ #g/wyqocOOOOO  V:G!k!?h>yqum</cnۻݶ7D˟?D˟?D˟?D˟?D˟' F/_>}?'`'<|....NO#eͯ ./w߻n݌nʀCZ>f6$W;X+O/{fKOOOO ~ۚ_}#R  9<' ;+͋۳L٣PK!}VFdocProps/app.xml (Mo0  9: bH7bvgNc$Wvڍ/^>+zLdrQ J<~\|1\X#?M ["[xDWRiZϝ&8i/CX7qM- +Kق4ӭ_֯>]ݩ!U%9V灉DIs`OMx`6$GI0ĝ0tٓhsg $@ ~PK!}T _rels/.rels (J0rߦl&R`66dFj=Nfv7ځa "m\+k,&pr(#UW K3>]JA: r`!2ƒE);~kjZ7g7G[XL!PpC& d/b\zk\(|$uҌgcBQ/#KDKMg;@/l.WN 3A}3.1PK!s?xl/_rels/workbook.xml.rels (j0 }05{R>@D2߾og0O׊/ x KR/W+(^oAkW;T0 !ڿa9~"$#NS{tSi2Բk4}a8 ±Q }LWUcś_C5?DF6:`!nwI,o ctknܼm É,"S`v[pZAF)wbggPK!.YՅ4xl/workbook.xmlT]o0}N HU-4U>; ^lMm/^{εwf,*GE<.:֟!:J"b9:3.'mZ?xl* cK+&5SrF9b[FJ[1QXЀ`ÁSִL0Aз&[$1MS-ksݹE!{ea2"C ZrjwPx 0a8\,\Av'"SnSr{1aVtphŵx/cFVZ9+I4ݰo 7 |)%4#{{M\5FZeJ1w;_W~u/$dw8;'k*)Gpc{^ ğ͂ǹ+gotdudӱyvPoGODw`-&]ozmn7 mWґcY>Z׏` я|iei8xǫ&'dɊ=mgSKv p;Il]I4M}$lď_&I6JUIHUoc* Ŭ~f#GfKC rAD<Ӿ^9$jPH] nSDh n %0'1zҌT#`4}#I7u}եBj\gg88#F3vgɥqU/PK!P:xl/theme/theme1.xmlYn6wtZ%l[hnebCH'5{a7v؞=)"cO tb 9wӔ:8e=qslFE}8:f 5?DS@'5\9I1̈́Qn7p큁[Hqr&""9M \;KaF_v ͊}j!xp$r/ؖC]nv3I,$ڛB›H] EG߄jŭ+6*hr`sV Q>Cw]8] gݫj9M49P9kMj5Xҭ ҺF Q[L1d+RR5.4O{#xߙ]Z9Al֕*Յ~'O@wA ̌Z%xr2ƈ\\q3: *b nŗOu`{ewIjOtHjvVz#)t<>#r[H"yQeEϸ X<)mh& dFpy/ynե;8˒m ƪ,uՋPr]lQJ[R[oH-rKo1Icq'j]z4?3 z\ mKXQ3ýPNOr.z !0B9O!g/Hc`16pAFia;;Ct>0 agИC[Q V:H?AӸt`*&ăoo+C9"!?Dk@âC㿲Z뽰z{DJ4w̘ل1z130~EoO;EYͅfq8k{e@ VZ1-+x-=.@$xnνvp7F 6[-b<~ VNX>Yd%%ۥp%xp#A_ DžPK!qTxl/worksheets/sheet1.xmlUn0?<@%Q i m\iJq])=yf8pmj8 Fej\]DmI9rOo6J_s5s\[IbX%5x o*%իtI6IF(T80*bk[H4oٱIևNR}"dKIV\Z鲁oӜzw}[")Du]HYϒqf$E$ Jb@ rHh[o{$z93 'zG L%|5ռan #u_Mi4"+up}aSzytJ! [s* 竣+h jx\amU/pH Q)ew7T_PK !%IIdocProps/thumbnail.jpegJFIFHHExifMM*>F(iNHH8Photoshop 3.08BIM8BIM%ُ B~ }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzCC ?|7iYet%M.I$`gGh ;w3NI4]пQa(_?._(/t/X?  ,?g bE3B1@"wBE лP]пQa(_?._(/t/X?  ,?g bE3B1@"wBE лP]пQa(_?._(/t/X?  ,?g bE3B1@"wBE лP]пQa(_?._(/t/X?  ,?g bE3B1@"wBE/"χހ/jZؔvȅ<ɍ3%CchYw>Fs@&cO.L 4]:|#c:uxS|hW.վ~:Nϊ Դ +7C|ҮEtk %|zi|;55#O |~7Þ$n4O$W~=|oa񶨶l ?gWARS⇋lG ?w7~Ə ;_K4:@O ׼cU~+'|^|9Έi[:v|k0&ß ^wzF~/zooM:sójc'oS^#g|G"@~9m~)/dG 9$sk%uַn(?֓hΚgxvPUſ?u|[@&MuK k~#B|I?Ƒkeϊ➥BYWX_¡ǫxc]x.xW>M]Kz_?l-x2_<| |;?t?eOJwB=I|{/|<{OxgZwĺo i[]y~_h{||Ei?sh]'r5ͥx/=sC|#j^6m?V~442^|/;/ Y]:취|HsQY(&o`š4_P֯5w俹4=/ײjeo|z^ z`%Z|x;l5S|}ek_d:e돉@/ے o"ҭ*x[ -C;^"_lj^^=*4wOMi2ӼCׂ}*m>Igs~ ~tzsI@#A>|:%]|a> GռR,}o<~0_|u-/:wY|K|G?-Qk7TC/<P𧅾6> EVvh٧xAּMo~<}'<9N5z>"@x\Ҽ=FƷZm@Zw8|4<1Mk뚗u:|Q׆n>SGmGz]oIK1s⿌~>*m⯊K Fִ|OеSN|=q66K?ºŏgMKnjToD <>x?M־G7!x'o5߈Kau=kᖕx{WGOoG? 4K&⦛}c°x/> =3sx^#xۯ*xzjZAOڏt˻?j#Ӵ}#NoaazB,n55|IK|.7a?|Ԯt}OԇIu?J&3oH b?g_Zϊ,/mO5S]g} Hֵ ,W>o\-'!.)K𗇼Q߅>ҼCsIeΉqO +MRĺao|o߄+0k?^*?#]|Ax-O֭hm,6gAծY|3U|ܞ$#j-s[uMWC_ -5_u/[cox7X4yk{ Xm#}@R,|kx.jc/t]7KRx? #l'_vnnx |g#^,_15-'[/k i |WmJOPum3Lcamqd Eo@G|24Ѽu|H_Uue-u]k֡QX߉t}[ALԵ=*K:y4OQ{{;BC7KžYPűy-Ԡ:䱙vZi͈O;npYUnX-i3? _|i bBC7ƟP(-i3? _|i bBC7ƟP(V*y&n5e.ʞ#C&ݒHT/"χހ(?n3ȼq3>gǃ(OggÍW@֙/t֏]_x.T<Ѯ,|c~k zZ74VwOm'4:c7׆Iu?h j_> ~zT׎~k g7oϯxC?<?Aפ:KTuQީbV ~~~k/5=s2?7 +ǚHwĻOxÞ7ŏJsn_$ljZVt{ }<S icKE<57ڮ/ju /Я(^ _cج5OXx7wĘ<1߇|9&/?a? x EѼU&m^Ҽ>?"x_|O+վMx~?񿋭>!x9WLjfӼ5Ccsh@.xSY|E|Cqk"jŗ4?2x|E, |ak$|^> |P74uLJ#6cOVdx[_oO:c+o#_|Ay5]&:3[xE|]#/uOz>-+x#㿄_~xS?i/c m JVԴ߉t6>M$dM+ps[_ ,<h~t {-/eûCmKLKMoM^MgwZmψ/oU:KBZ5=B{@;?緂\(;|Ui|$%|}`sM;0ńT(['_k@߈ ]~"o6tm=%'_k@߈ ]~"o6tm=%7%"*\6i6ٗ^ptщ{"pT@/"χހ(28'iI@??e|Owō~^ZfSj*xw\$:g.4|(:eܞ.v.9jKGMFD78o|W'-u_ZĻk~=|x#l_?Z_6_jb[y|3k6ͼmq  |=/x|a{U߳ܚr|F^O|-is>C_MSčow:>Kx`nok\.0.th~m?g_~"uשE:jV.uxPcpƟO|N/Koh#>eG_:=S-;KStϑ7 5H-,<{nQK\IN-mSA|=eh^ /|oS!~Wď|Ao>1])[_);~𯄼9|\V/|AҾ<%4{ ^ZˤyΙkgǺ_|J񷈯Ϗ.,>i׈?|1bNOh|sb{n<;/neo麨|L kÿΙῇg?  xw7"|?U% ExGSu++Þ+ij3ĿKټ/Qߏ )~?<=OziO|A{=vm~4_Ǻ|־;i;3Mо{~~ԚO|E޻mRÚۼh?'l=Ŧ ?ƻ5$h>/ᆑ/F1]xKGO4|B~w/Ţx48 5o)WF_|%v[|v֯*yڅu $u{zѵ!k P-~1ό:s|_u/MMv~ixýfI_ i2߆|;ÚƁ-kJ-[Ƿ?c?E%pS-t |=/f{_ ƳB[5?q|$֣j5{co:׋?6t Rɤ\ᴏ i&3 Ѵ|)Nw"/}[-7>%|-rěODoB@u/km#?~1g8_cm|6UmEZu/SᏌὖګğ>xPi>2kv__I.|A_Boğu~~~VZgkѰxEҿmxG>7||snQ~Cl5mݧÈ4=is柯 JeßX5᷈Q_|m?j{þxf?߀=6C֐2y~!>?Ju4h_~_χ6iZ_.~>ⶅgc_A$eoj~|"vRԼE?^q{ Aү;㎷↗ k^m/_ |;🂵ύo@?Ὲ)x7ž#Լi!xWTgo|G|McK#P-o^mGѾ2PқPx |y{l5@h]|1w-;^~$i]sė3 o/x^xGh+ hbռDomo@MhfEli{w^'K+?5m.=GUxkNCN2^3K ^ڟ/sпe#LӴ]JY֬Sq^ |O0|dlW&i|G&q7hߏޕ)M~ͯ~24O |O^xSDV-:o~>"}x#X#SڔƟ5CO_%%l~3EBV/|]n<=ſ~ \n=k:{gckxƺQ~ok м]kwZ'|?|;6M?T׻K|)C?s]r?Ŧ_hq a VK Y骲Ǻw̌ VV @%9.K|)C?s]SM?- Λt[O=7Ÿ3{:o% o?gtKgƾ( lxBy3E 1j|,UGQ8#:E }<{PBm`z%M 3¯X? U@!60x c&W]?*K_/~撀J/I4QBO߇?|_~9%_Гi(߿I@%$sJ?('ßP5^ ľU5&`ma|A T̆'(tjە@:_J/I4QBO߇?|_~9%_Гi(߿I@%$sJ?('ßP E >/~撀J/I4SwKⲾLo)XC4`r W]o QBO߇?|_~9%_Гi(߿I@%$sJ?('ßP E >/~撀J/I4xėx?pUnk]'MAɥ)c&E;MvF턠/"χހ(@ž"$H'$7xc_% ?nKo@& ?.MCw?]x3 K?6g tm1/7xc_% ?nKg~0)))[b)c-RH$n 0 `tx3 K?6g tm1/7xc_% ?nKo@& ?.MCw?]x3 K<' A/ ("Szl~tgM"rD܌Uc:MCw?]x3 K?6g tm1/7xc_% ?nKo@& ?.9xW>e|;qqqv [ei(.G`ƊT@/"χހ)xDث4^PC+Oxh<4}}m>i> b[oZϭ@ح?Vm+Oxh<4xѼ6䷆4I"I:]$I9$@Oح?Vm+Oxh<4}}m>i> b[oZϭ@ح?3/3mnvTQ"8Qep3zn}m>i> b[oZϭ@ح?Vm+Oxh<4x|[kuea@4#A@/"χހ(g2O " r;b^AOo[P^AOo[P^AOo[P^AOo[P^AOo[P^AOo[P^AOo[P^AOo[P^AOo[P^AOo[P5i?³y9J|Oo m M!%,DqDh"S[S[S[S[S[S[S[S[S[SZ|6|]@OMuK=4ébX]8 U S[S[S[S[S[S[S[S[x:}Wp]ֻ20=iwN5mVy閦4hanHyRq @P9?9?9?9?9?9?9?9?9?G–22ּ3.Ԗ;Kio/ɅX8eTO cj>O cj>O cj>O cj>O cj>O cj>O cj>O cjgk5[ĶZ鸊 jO$K2 x8ex,r /"χހ(x~<'78 x-GUZO.hGUZO.hGUZO.hGUZO.hGUZO.hGUZO.hGUZO.hGUZO.hGUZO.hGUZO.h|xkeƛgӴM*wK0֖0A#DϬ+e% 1R "U@7?|@˚?|@˚?|@˚?|@˚?|@˚?|@˚?|@˚?|@˚?|@˚<=l!i8ԼG}Ziŵhޘ*CH7 Wi?7 Wi?7 Wi?7 Wi?7 Wi?7 Wi?7 Wi?7 Wi? O||viVoRS5]>&V%U22G#Tbـ?PK!}VFdocProps/app.xml (Mo0  9: bH7bvgNc$Wvڍ/^>+zLdrQ J<~\|1\X#?M ["[xDWRiZϝ&8i/CX7OṯJ*2)76Jr.]XC`2*z$&Wa< Y+$4yr1:NiJh:O"gߥPK-!&vD[Content_Types].xmlPK-!}T _rels/.relsPK-!s?xl/_rels/workbook.xml.relsPK-!.YՅ4) xl/workbook.xmlPK-!d xl/sharedStrings.xmlPK-!P: xl/theme/theme1.xmlPK-!o ݛ bxl/styles.xmlPK-!qT(xl/worksheets/sheet1.xmlPK- !%II@docProps/thumbnail.jpegPK-!}VFecdocProps/app.xmlPK-!K:2+fxl/calcChain.xmlPK-!NO{fdocProps/core.xmlPK ireadxl/tests/testthat/sheets/no-yes-col-names.xlsx0000644000176200001440000005442013067126266022052 0ustar liggesusersPK! [ u[Content_Types].xml (̔N0M|f+`bapK%g[k!LDol_Oo8^6:YGeMY%` +r6}JoYA)5 ./ӕL`X̬C3+D1Aw kVP>I%uU΄sZ"(ogyg{ FХdUFqë>T;i'镄d"|x ޭeAhR m1ok:Bb 1k2=q18 / 1'ӏ$8 + x0r<~j{4!㻰:u$>(F:Rvh3R1G_PK!}T _rels/.rels (J0rߦl&R`66dFj=Nfv7ځa "m\+k,&pr(#UW K3>]JA: r`!2ƒE);~kjZ7g7G[XL!PpC& d/b\zk\(|$uҌgcBQ/#KDKMg;@/l.WN 3A}3.1PK!;xl/_rels/workbook.xml.rels (j0 }qne:A[&V'o?.]B/I~Hvյ5)Ȓқ w 3 H+no/jMdDTq2)iJ|.V*:1 uy5VxTk nj"-r oW4 a0{l _B'dkw_R'lmcUaK^/% n$iۻ~4\X SOsKW'loڎ,P֞!l!s;~6k|( )րv ;BpؘM810ogA &kwz3,9 K<(%^]<)Ȱ͑jE@-ӊY>[Wh ^:K<,Lh^E0LUz5Βy2 `5Q:*]9dϖ5PJa>T8Ye$uγ $tg",~*1bP柿QQ6fLum NDg1PK!P:xl/theme/theme1.xmlYn6wtZ%l[hnebCH'5{a7v؞=)"cO tb 9wӔ:8e=qslFE}8:f 5?DS@'5\9I1̈́Qn7p큁[Hqr&""9M \;KaF_v ͊}j!xp$r/ؖC]nv3I,$ڛB›H] EG߄jŭ+6*hr`sV Q>Cw]8] gݫj9M49P9kMj5Xҭ ҺF Q[L1d+RR5.4O{#xߙ]Z9Al֕*Յ~'O@[vFWEsNa]_o_.>pt4/mMG @dBŇB2d8JHE=vdXR;>3:`jkřăÁͪsxЎDhDʙUcϋKSj1`3sg74Ay*~(\w p(/`@EhiM%M>QNa$F A! i|P{ٳFX8$=:5 AC+$9S/kVBdX(vS#LoeQ,q.U%tͶ/Ko$u,a_ű6K͞ӎOfϖ{!͟g8!I{;~PK!**g0xl/worksheets/sheet1.xmln0H{dFIUEHr:Zln'$TzL3S<[ÎFW"9ծ9 QVtP3~ӼW\X V GpT[)N<VjgB \!? z ͪxЎiyrfU;rgsQ=%V+NB_{ׂHMjrw/PK!B,[: xl/styles.xmlTk0~zOdɚۅ$5QH{m9O;{cNctXwӧ>9@XUg#2suc2YadU9Z7кFÙ1B+7$S]2;6:p͉0[H 2DRpٿHjriYRS.kZ,d?)mh*j=[:%όpS#(x^\58,reRhI*[>eš8̴9P|DQɺ<5 *hp{ϓJY '8u3*)zy>˫0SmrhQK(+5t%|S9't dLo @tyM s<5Z}XTNovѰ}Olߕ/$A{"ϖ> q3GAI+p 蚳V'JG] nvVTwۛ.OVv5Y|`zOvO<7 ms'-6Vhؾ۶R.EPK !G44docProps/thumbnail.jpegJFIFHHExifMM*>F(iNHH8Photoshop 3.08BIM8BIM%ُ B~ }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzCC ?|3 O?9Dҥit %Y,-I$,;K3I$@xWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@|)"ڀ7 ( ( ( ( ( ( (?|)"ڀ7%? jW^^(F4m:ނgI $m +_M@ +_M@ +_M@ +_M@ +_M@ໝ&Kx^y>9^oRk_[ZX GaQT%xK (%xK (%xK (%xK (%xK (yx?Hn$:=΃45[|ڳQwTp;O@< BW@< BW@< BW@< BW@< BW9ox#w^ }ׄ<ω_><ω_><"ƕw[_4_qO(Ou0-ߞHO*?3}< y?1[@3}< y?1[@3}< ?:O-|֙<ω_><ω_><ǃ<",|փZ\Kʴ EK9icwd@4?1[@3}< y?1[@3}< ]_δ@.1jGIwiK)ld@|,m|mtŜo=96d7ω_><ω_>|jσ|Z/-|g:\{ʻͺKO8qdtI4|)"ڀ7-xޓ;:4+jh<_'O,<k൧t/[֗B^A|f44X/4lGx?D?8_ ƒI?8_ ƒI?8_ ƒI?8_ ƒI?8_ ƒIm~:OO?Y֡hχ]:[x:?>/hHeWyW}>DZk hw֣7(4K(4K(4K(4K(4K+ߋ'i"3[!7Λ]w#+TnF 2 vx/ A]x/ A]x/ A]x/ A]x/ A]rmkrx'4hD{xՒHUԫAq/tq/tq/tq/thq2I&""kS;ZLtYN$*O^on4h]wKXNI#7#+1@x/ A]x/ A]x/ A]x/ A]r8n|kor  4fiti$GeHEgw` (|)"ڀ7|cep,y?;J)hXdg$n/ +KmAa?$n9?k&#Ş=PZBF'j"(誡FuZ_l?7@V@6 tei H?Z_l?7@7m7Nz3ae#ec^ 8+KmAa?$n/ +KmA|;8k 3he%I'$Y6 tei H?Z_l?7@V@NikLu:V #S.س7tVfkX 36jK11y$O't_Z_l?7@V@6 tei H?ra<5W7uo&6R0E*A%1Kc>%^c ~/X? }@wC?[4m&?J|rf;ƾ [5ȖX!1@=3u?c ~/X? }@wC?~;_EP?/"oyk&~֚`'Qu2Uxkh˶=ʇyR}1Kc>%^c ~/X? }@wC?[֞4ox=u lm QqcTj2[[ cz7}1Kc>%^c ~/X2?X2¯"G^91i.IRnːH7kT𥧍6`99M,q:ƒ̞8IdT¼ #`P ? }@wC?~;_EP?/"o񽧍~/k[/qm]O]GgHh&U1|)"ڀ7|-? hU,,n>(Rk+%XO?hҿ?d+7O?hҿ?d+7O?hҿ!vUW#"Q{W0^x_|xfC$S(Q '4i_| CF '4i_| CF '4i_q}i6~"m":uߪ_HGWa4' Wo7@,ѥt' Wo7@,ѥt' Wo7@> x.~ ͯ {^fiVK 'u=hO4nY>JO4nY>J/[]^Mzq۝UE@W¿m[OM2) i4rŧۤpTw Y>JO4nY>JO4n9@]|[ik=6{ +yFTQK|)"ڀ7-Z( (On( (:/SwtP@??(oLTP@Կj|-bZ }"'Rh|)"ڀ7-k}?=ϊYCh/g^M9-6*`@_#-=VjOxc9(mx&?[@#-=V1Wm5T'm^4_ഺ{k[/9HQ@:G<[ES{D+hsſQ5?'1?oMO G<[ES{7i#oB:h?N/U,{4{6GʪsſQ5?'1?oMO G<[ES{D+hsſQ5?'1<xoxFkj6KH-Bk VK6J,CHtx&?[@#-=VjOxc9(me~ZhRK:Ji)h&Ce!roO xrH|}&VrE7!Y%ӚY%!sĚsſQ5?'1?oMO G<[ES{D+h|٧w^פ/ė1&t[4k2Itl|)"ڀ7%m;LZ[xIW^(bU[ᯆkFn9E0]|[]|[]|[]|[]|[[/`n;nMto>;nMto>;nMto>;nMto>;n9oxIWCI?  i6_mse&9 C#kϗ3tkϗ3tkϗ3tkϗ3txHE#[?KLQ{IT_Q'GH|ʠO0x_pY4x7"-lbIђ IH\x|9̽ 2xG—Wn5_x.@[_o7ÒtFnf0:C|sz?e>O?^C|sz>xZ:L?+C+oR'ģyS#m]!>x|9̽ 2C'ß}7/@!>x|9̽sǂ#p5e˥Z8MɥidWlt 2C'ß}7/@!>x|9̽eE>94AR\xx [II@G(mm_ L7ˠ }xjIQ1$8E, 2C'ß}7/@!>x|9̽s>5|[p5zf ť]9C&0L˔E<2لr:|)"ڀ7/i4|]jN|PjҬ-.-lKn01 N~PyH l?m@&БڀM#_)BGSaj?7xGWqxwm?oY<]4fLo!d`Jq@BGSaj?7o7 :M-o:M֋u -' xƊ*nO',´?!GiCZ'P Nj?@+O :9=u<#ysE-߆4 M2O>k,B@Pj?@+O :V?u<@+Qx*W= $-/P7ZUVV#!<=A@|->ROq!OG!oUAgbUQ €o´?!GiCZ'P Nj?@ύ~:-":ͼJ){BREV 0|)"ڀ7.-_O+ƞ$۟aߺ?.8v6` D˟?D˟?D˟?D˟?D˟пi?)? GS?#vmS|Rgo7yWſP j?zj?zj?zj?zj?z0+w6o$C$^f߳~v1g*LehNWyy^wb|<3}ln /j?zj?zj?zj?z27 k3<0nF": ͇{jPioܯrT- mۤ1B.ݮ82r [.%ƙGU%9Dk6'n5s~_I΍᥾(DC2_-Pt,&7+2WMgo]]B82gߥPK!wjgdocProps/app.xml (Mk0l["+MK ]MrVZDfbı@xyH3f-D4l q/~ IRY` _m",Y8,XM֜QLm:Ue4\yԀ#~?8 \ "lp\= (R=#u >Ĺ u2|V6Y) [A\oLD)ZZ szs=(`F9JlHN HQ5I0OT;7: R0Hj,j"}BvT3ʑ7m?>̨qn|uqxJf^ZE(4эqmo;@Wn72_iG&5~|PK-! [ u[Content_Types].xmlPK-!}T _rels/.relsPK-!;xl/_rels/workbook.xml.relsPK-!".<) xl/workbook.xmlPK-!P: xl/theme/theme1.xmlPK-!Z[xl/worksheets/sheet2.xmlPK-!'xl/worksheets/sheet3.xmlPK-!**g0xl/worksheets/sheet1.xmlPK-!ڼxl/sharedStrings.xmlPK-!B,[: xl/styles.xmlPK- !G44docProps/thumbnail.jpegPK-!v6J{SPdocProps/core.xmlPK-!wjgRdocProps/app.xmlPK QUreadxl/tests/testthat/sheets/whitespace-xls.xls0000644000176200001440000016600013172305601021517 0ustar liggesusersࡱ> "t  !%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrsRoot Entry FI#Workbook?SummaryInformation($XDocumentSummaryInformation8  #i\pMicrosoft Office User Ba==p4D8@"1Calibri1Calibri1Calibri1Calibri1Calibri1*h6 Calibri Light1,6Calibri16Calibri16Calibri1Calibri1Calibri1<Calibri1>Calibri1?Calibri14Calibri14Calibri1 Calibri1 Calibri1Calibri1Calibri1 Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)                                                                       ff + ) , *     P  P       `            a  ||>]}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-} 00\);_(*}-} 00\);_(*}-}+ 00\);_(*}-}, 00\);_(*}-}- 00\);_(*}-}. 00\);_(*}-}: 00\);_(*}-}; 00\);_(*}A}1 00\);_(*;_(@_) }A}2 00\);_(*?;_(@_) }A}3 00\);_(*23;_(@_) }-}4 00\);_(*}A}0 a00\);_(*;_(@_) }A}( 00\);_(*;_(@_) }A}7 e00\);_(*;_(@_) }}5 ??v00\);_(*̙;_(@_)   \{ c}}9 ???00\);_(*;_(@_) ??? ??? ???\{ ???c}}) }00\);_(*;_(@_)   \{ c}A}6 }00\);_(*;_(@_) }}* 00\);_(*;_(@_) ??? ??? ???\{ ???c}-}= 00\);_(*}}8 00\);_(*;_(@_)   \{ c}-}/ 00\);_(*}U}< 00\);_(*;_(@_)  }A}" 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}# 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}$ 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}% 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}& 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A}  00\);_(*23;_(@_) }A}' 00\);_(* ;_(@_) }A} 00\);_(*ef ;_(@_) }A} 00\);_(*L ;_(@_) }A}! 00\);_(*23 ;_(@_)  20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L˭ % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  L % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23 % 60% - Accent3M( 60% - Accent3 23 % 60% - Accent4M, 60% - Accent4 23f % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23Ў % "Accent1AAccent1 [ % #Accent2A!Accent2 }1 % $Accent3A%Accent3  % %Accent4A)Accent4  % &Accent5A-Accent5 Dr % 'Accent6A1Accent6  pG %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 DTj%[2 Heading 2G Heading 2 DTj%?3 Heading 3G Heading 3 DTj%234 Heading 49 Heading 4 DTj% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  e%3Normal % 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title DTj% <TotalMTotal %[[= Warning Text? Warning Text %XTableStyleMedium9PivotStyleMedium78dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\`Y; whitespaceO>logical_and_NAIG <-space, space->  <-spacespace->  :-) numeric . - PK!pO[Content_Types].xmlj0Eжr(΢]yl#!MB;.n̨̽\A1&ҫ QWKvUbOX#&1`RT9<l#$>r `С-;c=1g;#=\;S8MklX(*|C:]g.Gp m2:ȍc _nLkjt>.&< :bo~PS4J3.OC^Wx}sǗ?@o?E@{^z^2|oT:=a($9AWW[@f[-4j .9Ō%b_K@IZ@qJS2(a+ʠR#tf-y3$8|h_WW<_:GLDdϪ(qo&skM݄o7uĘ;Ű8 8(Bİ@Ct6\㞥06uKA,3Df،Wb1Dg½b;Wk&$Lu zPI=C,$E¢)ݯSYM[{`F((APb~*8%^ThN ,lS[)]ElE򎢋yWR^QgE |P-$y#eՃjtӢkdvݫd4LCUd״1ú lvM^c1h3ޖZ Etk4f2d+RQwx4 Mۭ=: ުvlTV Ao <-tab, tab-> %a Ao<-tab  <-tab%atab-> Ao tab-> x:L6>@ ggD #i  ??  dMbP?_*+%@"@333333?333333?->U @@@ ~ @`@  f(>@ggD  ՜.+,0 PXd lt| '  whitespacelogical_and_NA  Worksheets F$Microsoft Excel 97 - 2004 WorksheetBiff8Excel.Sheet.89q Oh+'0(HPp 'Microsoft Office UserMicrosoft Office UserMicrosoft Macintosh Excel@ `@꽳GLlM  EMFD@   N  NQxMNP(x N(N ͽȥȥ±ͱͷܽ͟±׽ͽ«ҽȷͱͽCompObjpreadxl/tests/testthat/sheets/dates-leap-year-1900-xlsx.xlsx0000644000176200001440000012026113067126266023321 0ustar liggesusersPK!܆~|[Content_Types].xml (ĔN0M|f+paapz$l_ڂ!a7k|tU5%VHSmߑ,DfS@Itr}5^l M(I44 u`p^%[ʭ`b[ 2?@V*f#pvZ0,"(mw8*tEC#]AA6T/XN/ds3N7~Z|vYtvV ,_iZ&B*Zh&͞?4-ÞAxWH2'q )ycWSg=3>؏6:w(>J8 cMwpuqF7MxPK!}T _rels/.rels (J0rߦl&R`66dFj=Nfv7ځa "m\+k,&pr(#UW K3>]JA: r`!2ƒE);~kjZ7g7G[XL!PpC& d/b\zk\(|$uҌgcBQ/#KDKMg;@/l.WN 3A}3.1PK!A xl/_rels/workbook.xml.rels (j0{-mC)sh)ڦ ebKFW$q ΢|w@w $qbJz $WWl5CdDtq2RiJ|.n*:q e+Pym l[{j >{ѡ #FCjd(fIynI⡍%y.~xo O)jI[duNuD$ė{|%&mFPK!y Ѡqxl/workbook.xmlTn0?+dI^`)p5PA$ǀh jERp<f,*GLQ]ruM8EuDDhrtb?,<~@Us-$LL^Imm)mŘǣQ% s s֚6)׃&$}$桩Ce ;.;u(t=(mN@m0|-95;(ܓ|o4Qԧ\,\^"-XwYre#{1aVlpX+^ nj"r W{Ui(@p;70WX@KqU#|c!?)u ۵"wg꒷ } `ڏ_KR,۽haqUcf1x4DIѱ[㥫+I2zr0StdwdR<ϸXt}ʃO0`;Wfa`ea^I=|:=;w7R" |# SZx)+XQǘuz'l&IFe&Y4 /d&er1KSshgI( .ٞ4m%9u $tTx|an2Q6,i$}L%ut(j6!ދ,PK! % xl/styles.xmlTk0bsIۅ$52hu-'0w]ǥݨw_GTd''FTdrϷYX"K• n7-7{J-i^)Tsj*RZ W M))Si>e=Dt'ulЃ``r}^f`΃| z͖4mW}&ᰙtl͑ Bp1PK!ktӗ xl/worksheets/sheet2.xmlMo8 ?: ƴ JHuJ VQ5 a$Ud43/Uxҭ(U 3+4Uň S)837ӤMu*H`%MG\PLJ ^*\O[-G'~k77TJQ֪~xs&Y,[j,1|lrsܛΠq09srTKp5_U'9gVU,s"X)a_FfAxGaE=3 Xh{N( --dq4sB.琋$XrA?MmUFݾxhna# "ϛy>|%xΟ#frtmK sd5O'(sSm[O$ "*XmK^!gU̓ hDp$Sor#ŲGѯb`="R1| 3Nk DZ,{)ݧ8ܳԆ[QЇ S^6 ݱZ9%M'%m1DG8BC> 3h9 _ }ɡ2mB!\ (oS<ힱZPK!P:xl/theme/theme1.xmlYn6wtZ%l[hnebCH'5{a7v؞=)"cO tb 9wӔ:8e=qslFE}8:f 5?DS@'5\9I1̈́Qn7p큁[Hqr&""9M \;KaF_v ͊}j!xp$r/ؖC]nv3I,$ڛB›H] EG߄jŭ+6*hr`sV Q>Cw]8] gݫj9M49P9kMj5Xҭ ҺF Q[L1d+RR5.4O{#xߙ]Z9Al֕*Յ~'O@LrDFY 8U{V .5 ZPA 8 .ޡ7W0<8Oii\E=(wM=n{`5m{ھׯiU(:A{Yx5hG j\S'w4 F(iNHH8Photoshop 3.08BIM8BIM%ُ B~ }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzCC ?|1 O?ICeit %Y,-I$.H䳻Ė$"k@>(S-h'ӿx[wO еN)obE<-Bց};PZ?O? Z 1@"k@>(S-h'ӿx[wO еN)obE<-Bց};PZ?O? Z 1@"k@>(S-h'ӿx[wO еN)obE<-Bց};PZ?O? Z 1@"k@>(S-h'ӿx[wO еN)obE<-Bց};PZ?O<'"_ѿm@`K A,O] YӣvheJ#`€#?4soi~L|#CO?y?1 >?4soi~L|#CO?y?1 >?4soi~L|#CO?y?1 >?4so WA n `2@,qgGMc|97 i4?@&>ß<GMc|97 i4?@&>ß<GM^<xl釕8aAv#_L|#CO?y?1 >?4soi~ 76u0$nI'<'"_ѿm@~y|il>j?|k|_SiV /:I xZNo[xCH|:~[Exjhn<'L<#=s8E/-Mu%Gg|P|<^|I𶞫oxNSt ]j/~#ҴxُkRhZx uaK[ׁ>.xXx.ǀk6;[ӣ-M5-/mwY[K]jO`h_[iп ImB.O7@@]'n O m?t?4/?-t`h_[iп Im5?&_ m_i:zQҴ5V-+J}[TҴn=[K@i_Q/ՆQ߈gɤx^wS>^RirMӬ %Oh?#:=^>{+ G=q _ԵM~旦Z|7uy}<}Ϳro~77v|_j^F.YQ(>0^A O~?ˏBfЯB.O7@@]'n O m?tO'N"ƚ޹o-z_o|d?!xRt[;HCe6Yw4U' !#Ĕ/ y|u.|AX?USN'^/6>:՛Em [{.\KԴ7FP?٪><> V< |0%ޥfnK/Sۼ+ym/b!ӭ$HNwv6^6>w,~2[|7SOEm| g'|l=ZocGZޫվiz/!m{-_H<'"_ѿm@|u3?)O~9^x>y}o:>"дzGΞT؜^iH&0xB?xb8|/M"~L='_D<->)G4K)-`w:(tC[>"OEѴ;GUo i}M=ym,`Gh$i$QYC'ǟ9hE]W񕡷[xnٮ\xDnnI$I3\<C.ojZsW@"Wv0x^?2]Ihn5Ks2'V*j΋6KL:okZz.vڻx%t˙4N;{ ϧ_,rZ\5JKѦŏ>t`MͯOO%|J-G<4ߺ]ggsI -r 0^?㟇^:`^:σu+Pӧ&xD׬ i<ٻsǃ-|'Ok> om|6V_EP}{ũxviڗŇ5Sh/>edx1/Ú։ޥ}'fMGò\k:]e?e.l~%A{;Wob?][_o|Ta];7mږarjg.\^m ?w?f%YZ|&:A]sy /@=, 8I?~2j>?9?|s~cy?_}fF:7|# ߎ/Q ? DENJ7> z~:L+mdKO\5ͺNce7M7!/'R?TV{m/m "qMghwus=zUT6ijQjŎkwXˣI,Zw䴵Jx$Uk .M[Ԯ4k=;߀/G?+"v7.3z\V6-o5牮<߱eOw4{^ǟmkO+'~> x|9g!KFֳy? (#:gu_ZxcO=^xg@U6Ewh{x/}xoWZn_Rw:ι?MnYKm[GgOa>־"v䚇> |>&hlx~|~m㏊#L:gWOe4y)N6t}u5E_e}x\fXXmcųi?<;m K[ kY-zGJ>(x{<[Y7>!-|3kOğ]K.GX;:ƛeǚo h5|K)>x?ih!a~Bo{_|F5⿁N}G֓ⴗ_]E4=z"iN__ølxWm;S~!G_l[~?O] Lҿfw^ {HԧC}/Go-^@?F_8mqƖ_> |OQoxFw$q[xB#EeY_<c u˟ xOOϨu›f־~"~wgy|)z$Qިm|>"koQ_|DO|9߃~ Gm>>_뺼Z}H'{m>Wÿk#K m1?u/~+?>;m?;F5 xa-?IO5tR inog㏁|1~,aOGM4>"Ľ37|'~oF+wmGZ֑EሬC@'7:xx^/VWß&oĆ?lj j~%\ΟAx|=W6vzoo~)|l޻i%֯s~96~ ~|yoUA}qYCĞ߃t/|!weY>OLKO?SwV_ h e xGžOC|I|uӾ1^WwCItB_%|J{<8O_^+5g73Ě{Ž\wdx]7!8~xCLM=7|KsM~0d'IksW1M@G&?x7@?|_}—~T>/C@oRĚρ7h>"^<%|}jچ Ko|jYd <70k⹣6xYOin xO^!|o_5-SFavz ?5=C ):ŧk5XtMŞ(K5_}VR]^O>{E<G_/xd(#Ɩ+˥]? A'(!L4<'"_ѿm@r^ =?t@~f Ca7kkU> E]_-ŝZe}Z[RߊVqΉ  G[sƺWo࿅hhoitC宱>[%啷,ŀ?*/ Umx&ᎿҴ;H| kKѾEGDrI_Xu-6|Eb<'_4 lm߁ nMĺ_5?k_ ;/'H״-oSDN hHZχ|Mx_oN@O~8u}KZlf~.ޱ" _W֧|Qo|M|Ai-,#|1CK旮9>|u޻k\B6P?ů-S'xW+YGĚ oүKk>&Yu_Mεh^Q0 J~?gƿ ?Zi6OO@/xg4_>?-x .xo72n#6[ÿs|=d񾁦±[Š ?HO(s|5}O5]K)?ׇ>('㟇~|&<+m} ~,ŗ:/!:G,< i_Cޑ#ᮏkbZP-|y߆i0b~OvquSӼs7/|EѾ3%AK?5 |#/%Ň*ϋ_ /77b];ls⿆^#uK_B摮^0@)h?G|i k8nb_:_V~ѵS]u b:5 OJ5M*?|8ė7?|Czo 'b??OBo 0i_ۏ߉s?_M ,.%}GOk~"x [71;𦝨X?o?>"xOMft]͞oB+]|]T-5]V^ &?|AxAм KxĞ)`ܿ~!|o57,/2᎓}3pxm+[4oڳºf ^i>&27W_?_~x+@6S[@?k+෇"j>ݯĽOŸ u?x߃޾.DZ^CW/|u|=>m&]Kb|U=6¿Z_>"xW?Y>Sx.wz{ ǗzVy6eڶ^F-7utYտi? i?xU~=Zn'|I/Q 4}KJvJ??QEi/5?xvFۡ뺯<|5'~&XۼP_khn`B3vM..|Uc'9< "\|MxZ ,}?tvK=GPӴU+2:߇41n=׾?~eyhxgF׾.xh/|W~#|]?5E/x75?`˧Q@\=\_H(6W?QOۏZ /ZF8/&X3~"\4}$xs:cgyPj챢Z~' i~ rDZi 5x<9/uhiOӥ/l xG߈?ir<+x }qk],vt}qW l?l/VƻG >*м/ [ iڟ|(n. _ oyb]k'4lA_|(u$>8mc>: 6,/[_~.4DMrw%Xx__<7#ǏiiYpx}o'%'#}s\ Iu۟CMᐚӀyڿoxƩ߇>&x^k]>*}<Qjdִ>ZΣZ6:xZ}j?AuȀ<_6ACfS-[_i|T𡙡]>Z Jsx2';`V m=zddIX2{y G,iCֿ|[I'#w+|;% k~𧇴(u SY5i{io mψhK|/s>|E~83/>9go|[u{c_N}3+o\U~Lm8#޻WAvROt9a >(uusi֗Iu*V| 'MwkVk_ˆ<%_x oo_C^>)xN+[Gch>5OĚG ? -u^e ˿xGUo{w{_^-^񆓩^ìCԯ x]×k'o4G[|s:i~!<%sR/4۫9@>e b_k? χ05u=WĿ<1⟎^8ŧ x[_|aAxF M^𵞏8^_׾(^?o>*xU0?|Y{?4ZO7>  hXx%Zuh _>u'½g? ß>+xsO~xaqx+_D7?)o}>>t'^%ׅ$Դ/ڟjv߰f|Myo^SoxšW[g|oWeFBovo~ ! ,jZƟ}&\[pxo)>4|k⏂qxBW _"񷂼o|M,MCνj~"}oO}Y|v{÷x!<7 SK}?/- m+>0߆ W5Zxj+7ot߇0Z%~ h~!~if7[jր1&'ïn ڏNxGo>;>/h <3_ /7xč_Lվ5kUſ+P_>#ּt=+^w| w~K <-# wï:,м['%ѿcHt~#ַCj'>%h>;n߇O~E Xxs\gg:KQ4f⩣мxOi>6 |}%JX| \?2&/g1kY]1𴐳ѻtx ʀ>|/gYE>"|J\MKE7-džO>ş |Ge'mgmzCegaI){WnCA`<&O^< c'&kXӵjVouJR'ҮI8uEI$y.՜@<'"_ѿm@pZgK_ѵ5}w^|\\ZLw2=wk$7V2X!|I "'?RMZ&OPmcDo/~)t?Ɵ <]ofw{:ƋhU#QA3]x?/75?Lkᯃ}oZdxX?5*f/OkZ7¾լOSB̞񆏪Z@7K\,<39 u |&|W?Fğ^a]w5).uyqxO]~?[ MOxR:  jO5; <;}'+]h<_ ~u i|Qo)ޏom g>|5Lu? {nú/ ]|;ݽ毡 |UҬ |1}KKO?ڂZ<\W<_OV_9=O "~~"< Sskz'w}\Wm|Axh֕|kMѾi?_iís⏍.|1A5-- 6r:>6?TO |4\$|W?j'쿧xKg >+>j;izeߋ-a|( ZE#Ե+?2rH<?Z|ESxgJ5k >)ZIS-CᇓD>e0^~io{Iះ~:5|9ԥAxo_/t[|7ss?x>(CNikۀ}J"~#|KUyM>v? $z'|\@å#Z|8е[?V:Z?Sf4otώ^d O3}߃<=|Q<O>"]NT@~'?PdO x?"*Ӓ5O,r6,㦌6=D.ok;F7K^>ƿ)xL<'"_ѿm@y<-NRԼ/Bxy}iwSoq=!H#McEA' ^oGJ?' ^oGJ/?7_x/<5e<=[z_ɦ_jzlRpi:]XNm㿺]P ]=A㏊ 16~xo4 ^OOxj ~E?:/{ok㿇Y7^/OtT>y:/K/7ͣM;EoHүuo|3t&^.O|/-7Mo4Q|i{V5'boudߌ֕~V蚗4K?^}@|+ozf <#Aqqq z}$[ ~1~_{#IGQs;i~+_bF.\@.y^|GԾyMW>+MRҤS x>k=|P|E'<{i&VĞt+?xr-[L𖥨ϮdW@w$\/l|}qό.}࿊3|aOQǿx>K+Y\<|y"_R'mRkGO?lne-/7:?:햛mYj&PCIu>su$R9'@8ox&i~7PB>YxF |8cLZ\!~'ni9dKmR],~~5e׀ 7S|u~_ 5Z']6uM-}׆=ޛuE?MM=M| -R"kzw7V}j> -nkBoxHֆe -̺wYc>9AgY3j6>"~,|7#G4~"M?އWtgZ^C€\_o}|6_4/6rd-/^1K? ڎh1~&Ưy:{?xc|sxrE_>({+G<&//77IsD9xvy _ڿ~xsօZa_>YWzf?z> [[τlĶNO|?-^/ `_ 4~u}T:lj4j~ kXF5 űx+HЭ>/K7ឧgxO_~>Q^i:|9떺yg~-g]c5HҾK ks5>؏h#xC<_4gⷈ?gޓ_^~7>ҍ[ĞiBxᴧHS>Gt. C׿kXA2[+i⫟^*xVi9g6e6( /į[Upj9м ;ytiM<-fyg]_uk \x__PWrE42jE,R*r#+e!4<'"_ѿm@yWYmj>O>.4]Z& y7ɲ-F|C㋟o>&ƣ&-&{~ u[i,p$tﲭoi70;\мUZu{+mKI4+UԴSN.,BœZ^]VKK>?{Qx#/|IO^.?<+!ҿjvnO;ϲ)Y.3|G:t7`٫xršojKboxOXᏋ>!O{<j+x6泯޴nXՆxCÿk g(t \x_^/~*qez//=x65fsBko_h];eD&Gž 7ZD6Z=ͥZu=P/熼awᦕ{xP|bO=OĺkxzPxRI۩çx~WRx[}>5Ɨ6<+7eoUsKh>1{x7> /xSEObZUO:~v?~$ᯊ>O [k@$еkN|mJo~$lOźwD 1I麵~%|YO-:Ÿu /g?Zh k/[>}vr_~~Ohz΃=VZnh60?cٯ[>13<>3oXooƽ:Ğ-+TӨߴ_OxA~ xljnhӛk=o [J}?4]G>2 ZLjCt4_o9~/juG߄-M^ XiM͌^do |3-?+׆~|6wş_+u__𬗶 ?i>;OG_ /tj'-3E5{-#Mm04?#kS66[PZ"^/ԵK=DŽ?h1|md׋.9t/ ~ůh+M/xJ(,8~hSp~^k>466q1*^?|\oP|JU=wvvå fx~ t[xC\_~7:(k:S˨Gw:ick>=?^5WWķG(z嶯u[=53TBBh1|t}<&_ƺ~#I| `.}Wn8^f]B=@gv=# ~߇|;Ķ+;YφړDŽtKv3ཟ_xkÚ9(oG|/c-Q|eP'xJx!>"LjMcğsZyMCƾ4[.[7kc~C!/Ľ_/>O6ZB ?xE1V4?|mSHƟgǑͨwg!N z=4mG<\nOIj<15iW^rA,#(hQxAF<'"_ѿm@y? ;z'hoM:OU7[uO xCD񷋿g|?&v?5gM< [K ||SsK}WNY|C@%5ٴ >~\Y?ouo G! ?|Iσ~ĭ? ?~Xx+^ʼn2CxS/$IC׼e=[x^5G5k6>x~-F\ӥcß|1sS>&٧g?+㮁?_|=to^_-'Aeuim_3DV֯ckx&&~֚¯7? C·uX~B{<SOë.]=S7b PE>.o'&'|PƖ/x}3> WƯ~<[~ շ3e'FKL^4_<=x|?Ʒ? ?bOx/5wORKݪ-l~֮,/߈Nj/=i>5ӟa[h$&&|y O{?GH?xx;PGړobs?ýkKM_C0 x?RλMf&x3o4߁?|?YYѼItÞ,|/mG!`~^9mQzO_=~$|2 .>3\kzƯ|Vuht=c^?屵&1E97< =cU|/{_fg,?oDYymto| tx?[|Ft-JU|l<6 o5-_>/]χN_,mWt'gzmď?uGM|b<1|66_j_'CAƿY𯍼_/xSxz_|g,`'-|>xy5Ko/%2x>?Ǻ#{oL/1c M׵i:Zſ>.eOO~74Oi{9/i/ xAO7 ROk1|cqj\|-M:&]~6x]4,|`ǎ_|E㟃gǫowil$ x| /xl9 ^2>_ j~)E/R]@|죡ÉWB|I|uӾ1VWwCI4 Ŷ/O?3cǞ!~Ţ^+5g ~Mo>c|;_FѼSuxIHZ WM@?V%UWn'© 猵i8Ko{E<W~ 6-׭eνootYҮ0Z 8<'"_ѿm@r^ =?t@|ŏߴW|+m+_h;eςONOi!|;m=՜39NjCqt%O ak? |Ox-+k/ž$վX]|Q}xS&'|Qi>YFsJѼqš?=7:o_>Uď=_5\S/9gm,1< W?|x{]gػaxKLZv}>Ú̚֏E5^RxS5 ^,nW4{O ^6'xҵKoaxRռ+/ךMe1P/~x3:|=M.oO|k0RJa-* X x(uY9Yx{}^av;cS|=x|,叁K1s |!+/5CPqkڷ|9 ']Qx?h_7|rO> x;X<?x/I'ƟD>2⮃o2o2`ؼMs+IJZnuj@1|&|֯+x@׋4xg&S1_ڗw:o|u_+|Q7!z>K=_Ğt[^m,f'G_ 9[Y'k㿉|Oŏ~ÿ>Ş?k˝ WVcMG>|;ϋImZ;;o^0?z]5Oh~k>6`~3%AK?5 |#/%Ň*ϋ_ /77b];ls⿆^#uK_B摮^0@)h?G|i k8nb_:_V~ѵS]u b:5 OJ5M*kO῏>$gΝ-cS'º7ī;{k~ K'ºMe^E$zlj-b@ϯTO?¾>fƹgGxf~!}xৈ> Л:t /W\ëx~_+K_I_|@QSF/i_4xV|/)j:#m('o'Fsgмk_|UËMWU?f;|@9a?/xGR!'X//__ cƿ .c_L$[Jk{ kWwwɩgLwz崕 =?tǏ-|wk/S_ |xC>)x[|M}@x;[*~o=|q'oyw?CUK'ğ|_OIxgėR_kOcXLAA<@ߌ/ xosI]KƱ-XԾ~#uu&%i5Bg;WSK5Kg<'"_ѿm@y4MNRȤw6XxI`>mFW&"GaȶD#-O@#-O@#-O@#z-?@|5=a6~88IF}8sĿ ,|cmxĞ xw}5 &Ŋk^oJ{lm>Qx.h_gxsއiv4单O=ܱ[#Y.'ǝwwsssp<:Ǟ,pz<tgV+ŇcDY#sڏ=_>fox_T4[[Yksi|weiKolmB+ A}sW.e !u-igjqgH5-=yl/ [:O:jugVGek/=C)A9oW=f@ 88$g=(5QM4ȷ&bxR-[ $=mW-2I1Y-6K_vO pA@ COuSܯ͗΅JRUF0 /#Zd?pH#( =hOrNj/Xc"OVbKx{<3 cǞ,AUŗU8ʏxj(Kݲx4rn<q'u"5]`Ym9'147'1>@ ֯qK}y*f v,Hh?~oxoj/]G{_U45DS(1m # H<'"_ѿm@you;-JxS/x-xlZO!ra$l'm!̈=:JuOc}??)?BkT ?߃S/~澀JuOc}??)?BkT ?߃S/~澀JuOc}??)?BkT ?߃S/~澀JuOc}?.I^? x%f*ͪ!x⦃ɷ0$s.&)nSЅ NB_@%:^1}!x5SЅ NB_@%:^1}!x5SЅ1jPWh ]>'H›3w:kk!ϊ_"YT ?߃S/~澀JuOc}??)?Bk5)_>+I17 O"dҮէUL@$`]|}<'"_ѿm@r^ =?t@P@P@P%y#߇?R<@mP@P@r^ =?t@xDOإ?3<'"_ѿm@y7<}^Su 1/.|]4RoBƋF۸b@|@f*?Z+=cTµWz,k7 YP _o 3?e@+_gʀV 3X|@f*?Z+=cTµWz,k7 YP _ofZ ,-ϋneGU;|Eؗ ]Q̺$e:oV 3X|@f*?Z+=cTµWz,k7 YP _o 3?e@+_gʀV 3Xs>{ *Yw_xOZa5˷(]݀:oV 3X|@f*?Z+=cTµWz,Y7ŷvKGqkz ?uW4UԱ>5+)"?<'"_ѿm@y.|[n۫!yxRi(+)t@VBQ@;{_Ykн/,ahg^Z0}/xK -cZ>%-l Xx e @%-rw^4@fм..G^"xUh|n$sŒ9cmVVT%{v.:x e @%-l Xx e @.hMطм/$xܳMV5"x22E{9{h:x e @xOg}iP {ГƐD ܆9y{leXEVR ; rȲEJ0u3 f{P r%mxX9Qzw:{V0gSгUWcswz\5f Uk45X1?s QV֔k #^YD0׎N]ndm|Zֿ04Z8*cOUEYŮ(\IS=Lb˾EyB<_J½ ,şPK!@udocProps/app.xml (Kk@~{Նiɡ;1LW#k+vH" ͋I\yz <& <=#7) OyZ1+V-$%S*xAje}U; -anm[; ,]1P(9ـuUדZyct|6VsW,Ը'L 5V/}Џo .:bB p&ؗ`-q4?C| I+)9Yb\#$.k"x`yG##t_ p(Zd}w}M\,owXH?Kri]?`,:E.Ŵz/PK!lE:xl/calcChain.xmld݊0{a!̽Uw >>@HǶѷ%|!̤9ލf7atV@Um/r>-(m'(ǢQRAQ A hdX -\72{PK-!܆~|[Content_Types].xmlPK-!}T _rels/.relsPK-!A xl/_rels/workbook.xml.relsPK-!y Ѡq6 xl/workbook.xmlPK-! %  xl/styles.xmlPK-!ktӗ xl/worksheets/sheet2.xmlPK-!P:xl/theme/theme1.xmlPK-!ӛM Fxl/worksheets/sheet1.xmlPK-!}#Vxl/sharedStrings.xmlPK- !;xxdocProps/thumbnail.jpegPK-!qdocProps/core.xmlPK-!@umdocProps/app.xmlPK-!lE:Rxl/calcChain.xmlPK IRreadxl/tests/testthat/sheets/skipping.xls0000644000176200001440000016700013172305601020404 0ustar liggesusersࡱ> #u  !"&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstRoot Entry F#tH$WorkbookaASummaryInformation(%XDocumentSummaryInformation80 #i\pMicrosoft Office User Ba==p4D8@"1Calibri1Calibri1Calibri1Calibri1Calibri1*h6 Calibri Light1,6Calibri16Calibri16Calibri1Calibri1Calibri1<Calibri1>Calibri1?Calibri14Calibri14Calibri1 Calibri1 Calibri1Calibri1Calibri1 Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)                                                                       ff + ) , *     P  P       `            a  ||>]}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-} 00\);_(*}-} 00\);_(*}-}+ 00\);_(*}-}, 00\);_(*}-}- 00\);_(*}-}. 00\);_(*}-}: 00\);_(*}-}; 00\);_(*}A}1 00\);_(*;_(@_) }A}2 00\);_(*?;_(@_) }A}3 00\);_(*23;_(@_) }-}4 00\);_(*}A}0 a00\);_(*;_(@_) }A}( 00\);_(*;_(@_) }A}7 e00\);_(*;_(@_) }}5 ??v00\);_(*̙;_(@_)   \{s sc}}9 ???00\);_(*;_(@_) ??? ??? ???\{s ???sc}}) }00\);_(*;_(@_)   \{s sc}A}6 }00\);_(*;_(@_) }}* 00\);_(*;_(@_) ??? ??? ???\{s ???sc}-}= 00\);_(*}}8 00\);_(*;_(@_)   \{s sc}-}/ 00\);_(*}U}< 00\);_(*;_(@_)  }A}" 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}# 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}$ 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}% 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}& 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A}  00\);_(*23;_(@_) }A}' 00\);_(* ;_(@_) }A} 00\);_(*ef ;_(@_) }A} 00\);_(*L ;_(@_) }A}! 00\);_(*23 ;_(@_)  20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L˭ % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  L % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23 % 60% - Accent3M( 60% - Accent3 23 % 60% - Accent4M, 60% - Accent4 23f % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23Ў % "Accent1AAccent1 [ % #Accent2A!Accent2 }1 % $Accent3A%Accent3  % %Accent4A)Accent4  % &Accent5A-Accent5 Dr % 'Accent6A1Accent6  pG %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 DTj%[2 Heading 2G Heading 2 DTj%?3 Heading 3G Heading 3 DTj%234 Heading 49 Heading 4 DTj% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  e%3Normal % 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title DTj% <TotalMTotal %[[= Warning Text? Warning Text %XTableStyleMedium9PivotStyleMedium78dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\`;two_blank_rows"Y=occupied_row_and_blank_rowK?two_occupied_rowsIJ blah blah yada yadavar1var2v2,1v2,2v4,1v4,2 / - PK!pO[Content_Types].xmlj0Eжr(΢]yl#!MB;.n̨̽\A1&ҫ QWKvUbOX#&1`RT9<l#$>r `С-;c=1g;#=\;S8MklX(*|C:]g.Gp m2:ȍc _nLkjt>.&< :bo~PS4J3.OC^Wx}sǗ?@o?E@{^z^2|oT:=a($9AWW[@f[-4j .9Ō%b_K@IZ@qJS2(a+ʠR#tf-y3$8|h_WW<_:GLDdϪ(qo&skM݄o7uĘ;Ű8 8(Bİ@Ct6\㞥06uKA,3Df،Wb1Dg½b;Wk&$Lu zPI=C,$E¢)ݯSYM[{`F((APb~*8%^ThN ,lS[)]ElE򎢋yWR^QgE |P-$y#eՃjtӢkdvݫd4LCUd״1ú lvM^c1h3ޖZ Etk4f2d+RQwx4 Mۭ=: ުvlTV@ggD #i >>  dMbP?_*+%@"@333333?333333?U @@@@        <>@ggD #i @@  dMbP?_*+%@"@333333?333333?U @@@@@        P>@ggD  ՜.+,0 PXd lt| ' two_blank_rowsoccupied_row_and_blank_rowtwo_occupied_rows  Worksheets F$Microsoft Excel 97 - 2004 WorksheetBiff8Excel.Sheet.89q Oh+'0(HPp 'Microsoft Office UserMicrosoft Office UserMicrosoft Macintosh Excel@ kx@`GLlM  EMFD@   N  NQxMNP(x N(N ±ͷyffܷ.\y͑f±«±ͷy¥ཟ׷ܷyȘ\ypyȱ\yХyyͫpfyͥ·Ϸĥսȫץͽy׽yyy˜y׽׽׽Ҽ½ȥ«y«޿·yyypͱ׽«CompObjpreadxl/tests/testthat/sheets/numbers-as-na-and-shared-strings-xlsx.xlsx0000644000176200001440000005206313336631200026110 0ustar liggesusersPK!;H@i[Content_Types].xml (N0EHC-Jܲ@5*Q>ē/y=VTĊsǓl %#T))eFaBɶl6,0l%kcwcՂX8" FD Zht+g#ؘNM'Pㆶw$βݹΪd{* wQޛ@@_t7YAI[o/eR^AI"gao4taܲ.յ@jekBb .Zy?FAHwxdbjs=snEM~jqн瑦..;$!*8 He;8Ȟv Ǜ7hPK!}T _rels/.rels (J0rߦl&R`66dFj=Nfv7ځa "m\+k,&pr(#UW K3>]JA: r`!2ƒE);~kjZ7g7G[XL!PpC& d/b\zk\(|$uҌgcBQ/#KDKMg;@/l.WN 3A}3.1PK!nxl/_rels/workbook.xml.rels (j0 }qҍ1F^Ơ-{c+qhbKɠMt\ 'g&WP%&w >׻'[= &$շ774OH"xR㳔dNҨ9ɨAw(7e(3O ރhm| sD"$4DSOUNh9.)k0՚0!!iɹS]٬ `2K9Gyvq/PK!J?xl/workbook.xmlTn0}@ E@ًRUEi<{wq MUJ.Kھ gΜ3v~ }0% ?}J*&e|X,+̕ƿ,߿OJ?z@¯mRSͅj[HFS\R+80C3  u80B׊J;hʱfy mD{ƙ='bwJ=(!|-ʨ(4|o(Z.nM Wn*fiUD_ms2,sPŵv0_rKĖ oW{U+Z)8)sxb{sm>5!J<#5rwYO[c0虾y0&(tԤ1z2O  O8,f{VYe>Pv-lxR0=+84]hDpܺ! U;?9 5\$iWSCaُƖ9 +6M,4Hh\E4HVMr5O'#ɿM|8Gq(Yw>u&4=\xIד N`n &q%8MVq#Wѽю"$EXjRޖ#v|?Ȉ>_PK!>;xl/sharedStrings.xml\A 0m$Bz؎mTVD.ox0z^=0sHda]j-\Χ *\fQӖB'2HtL[CFp(כHba jpkg88#-O|:z{PK!xl/theme/theme1.xmlYn6wtZ%l[hnebCH'5{a7v؞=)"cO tb 9wӔ:8e=qslFE}8:f 5?DS@jaNPm&Ԏr[&Xn "G3io炗Y2}U6mkX'lVS '-ă#Q{@j5v Gu߅֘Ie!BDBZXt-,:&T(n]ԶQEKR♌Sq εFz3d@亷{wEE Z$4L ٩\gUH zPhw>F\JA3熭bscrb}es1D<)DP;=Wv 4S5 ,.ʧFn8zص WU&[AOم3 p(9#p*.ML*rD *g] -VBN<^=UKiY͙Y.oXUnmu7Zj%ubBШU$]]ԮqAy"aPr bT.<; 6}1\nr "OEF'g ~ F5{NoAj74"-c8E\s1KL]quhvqγ9m58ԺQ8 è=?wsGZ؈z~[kfo;#\@ (}UPK!KH xl/styles.xmlTۊ0}/%iҍ$XؖBRlˉX]$vK#ٹl>hth}+:1cV)1U蒫C#*Њcg%u펌9ʦ\$G&)8ԁiֆKRxHIsSG5u<炻.pa$AiCsRɌg`0ʍ{2&1,rQz>Yj돼#% ep\JǬ[QECP^#^L\W,9f 4}W9 & RfIM smٕ%UWjӵs휖c3]TU0!v~оU/RJXF |om?/!`yÅol]"'=4JVF0W% ?i(R|}]HZdaSauoh1^-6jgfa!K`ӖVvڡ՗O\ft۟ WPK!txl/worksheets/sheet1.xmlMo0 k9֮iP>ϲLB$ѓ0rDyɗR~b ;]WI8vmxYҠ ~:ȈBL:2$؃HH[ߊ{xNav|"d6VE`dCpYu JW mOJO#3֡_V:c&&So{wHe^k`yh 6kDp 5T(%dTQ)Fg f,4g 淮cG4jhox "ސ)7Y}BP4%YtQ#SᡗsYeߛe%Veժ6z RRWR+ȩ^EV 4 ɧ4u~0#gƈ_&41ΛaZW+PK !1 4 4docProps/thumbnail.jpegJFIFHHExifMM*>F(iNHH8Photoshop 3.08BIM8BIM%ُ B~ }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzCC ?;O}>Yaffh#, ,I$Nrhf@> tfiH?ٚo7@f@> tfiH?ٚo7@f@> tfiH?ٚo7@f@> tfiH?ٚo7@f@> tfiH?ٚo7@f@> tfiH?ٚo7@f@> tfiH?ٚo7@f@> tfiH?i( ( ( ( ( ( ( (i>|&4iegwS㔿 |%;ּQ\xŞ1<+k>"Ҽ;}s*-C;]ߣ +F(?@< BW@< BW@< BW@< BW@< BW<3 |-<3?u- I~k3|9_MWυ'5Dahzd$c3hhO%ޏȔO%ޏȔO%ޏȔO%ޏȔO%ޏȔ縸TƿqoqoiPo<:Uܐ ڬMG$lChi{ƿ/~:x@ύ<Y=3ĚJo_6}oz]cH 7i ƹo~>g/ uV|LO_mg/ uV|LO_mg/ uV ?`sZgP<ŇOx%kbU@;/3gx:+h>&ϧc3gx:+h>&ϧc3gx:+hKC cZ hekq.Z*7 ,-U5pFeO|LO_mg/ uV|LO_mg/ uV^u:4ŨkA%c /;MUEcßeQ>gs}fXJcِ>B>&ϧc3gx:+h>&ϧc3gx:+hC> hbٟ kk[qV*6.<-%6hvU$i4>x|CaO xS;j~?hZG"LA/ R]> 0|-ǎ~׿,4ܰ_ꖑ]~q/tq/tq/tq/tq/tk]sw? uf|;>2?g]Oxw]K[s|a,a''ǚ1(.Xes(W' Pi?@' Pi?@' Pi?@' Pi?@' Pi?@WÿNE׊<;m)ſ?OiqMi6,3DJ$V(7_ '7_ '7_ '7_ '+]񧃤5gdM+PDD״wvUV31UA$IU🌼!5+3ChM KlG$ot$F]V0b78_ ƒI?8_ ƒI?8_ ƒI?8_ ƒIq/)DžAAi<7q 1GtI,ʑƊT PiX\'$ONR淊G/FV88@;/ +KmAa?$n/ Ozn=}>ɈgT(% ڈ:*Q1@gV@6 tei H?Z_l?7@V@ MӤ^XYHYwW$'2x(a?$n/ +KmAa_N?3Z=ff(If$I''94ei H?Z_l?7@V@6 tbZ.bNU, # @!i? ,ͦڒLy$I<@V@6 tei H?Z_l?7@45< 7M><)&G[XUH* 9dc?i? [xGsiZχ?:@Xu j: [IJIsEuc ~/X? }@wC?~;_EP?/"o}I6Y#u@kpMr%Llm:@tCs\GkX#ڲL+*5~%^c ~/X? }@wC? rE !4@ȑ;WGZKRFԫ+R'q<)ic JO4nY>JO4n9|@]wLjȤoxU`L4!fIg ' Wo7@,ѥt' Wo7@,ѥt' Wo7@gx6M߈{E$w&F=uv| CF '4i_| CF '4i_| CF/ _-.|GCsk}<URaG"0OZ?d+7O?hҿ?d+7O?hҿ""mW/io$^h6wQGU/xcÖL{}Ghf i$l62:<{O?hҿ?d+7O?hҿ?d+7gƿ<yZM:1}*(bAe䑕gq@iş>xKV;( | k yJ (g"N@P@r?CO>5uP@dx@:5/#);E عր::(9/ȉ_G{i h.On|sP%+ ׶SNKd ʀ$WjOxc9(mx&?[@#-=VjOxcxG@DUAFmFe 4>3⸸-.tE bRDPD+hsſQ5?'1?oMO G<[ES{D+h}2P=Ӥ{uKlK> !ʹQoMO G<[ES{D+hsſQ5?'1?oMO 9(ǚc@ Dм;2ZUGnͧҬ(DK$P39c@?#-=VjOxc9(mx&?[@z߇V.|@ԥExJZ2ɧP*YHaf*[)j6I>`vHVItEH@3;&7oMO G<[ES{D+hsſQ5?'1|kxiyu&} ñ%I]4,:zM̀D*+4i? xNַ U׊?jk/4ћQg. (G/fG/fG/fG/fG/f4{O37|s00#Ɨ)ƾ -?,k**3 gZSES >^- >^- >^- >^- >^-źU%3xKV;( | k yJ (g"N@P@r?CO>5uP@dx@:5/#);E عր::(9/ȉ_G{i xvQ1xR>ɦMGjoGΫyM79 b_!>x|9̽ 2C'ß}7/@!>x|9̽sUۯ|cl7˷l4i4F0 %!@^C|sz?e>O?^8χ:xPŽ ǷTC;q(T|Wj(g}7/@!>x|9̽ 2C'ß}7/@ǂ<){q/|cjc@m4mnV xriD0%Y*.?!>x|9̽ 2C'ß}7/@zouy|i(M/Ps1Rc'Q8m'k)*WwxcÓ/en:<.<> >n(DA`I$Ff0!>x|9̽ 2C'ß}7/@ύ|+{o?|atxg^nn4mriWN`r O 6ai M._ZSFx%D)*@?&БڀM#_)BGSaj?7i4]^?Boߧ.bǾU# QD!XqoM<9og:DBx4o/OO6mMbYP&БڀM#_)BGSaj?77Ŷ3ס77Zev]* D̕9cV*Fiş>xKV;( | k yJ (g"N@P@r?CO>5uP@dx@:5/#);E عր::(9/ȉ_G{i? xgNW> V׊i6[,f[]` (+G}i(+G}i(+G}i(+G}i(+G}i(4{+/|sƖɲƾ Am+G2]\-̳K(SV?-PV?-PV?-PV?-PV?-PZU׃2Qܶ5#n|ey yq&-#vv`|[|[|[|[|[[n|.POoikM[D xpƑu?h/w%h/w%h/w%h/w%e "uEQ'o,eVOH7+)"*xSLyy WX|skxI[;1 `c( *U+G}i(+G}i(+G}i(+G}i(4o;4E4-*f1P$)`3Ѽl@i Z͜.Ư׊^Yr=KZp -R`O= %xoi(O|EI@$#{//J?$P/ki7k5>(HOx_kr'NdWU0,/%۴RI?'"O= %xoi(O|EI@$#{//J>bJu0~97jvֿ 뱉Ĺd%7!W`O= %xoi(O|EI@$#{//J?$P/k/Mz(/GZc4ҭ."$s("OS*Ǝ(O|EI@$#{//J?$P ' 撀2x]] K}[̑+ZJFXD@K0Uf P_ x_q=~8#UG:&l4i7cRUe9UX \2$#{//J?$P ' 撀IxKV;( | k yJ (g"N@P@r?CO>5uP@dx@:5/#);E عր::(9/ȉ_G{i /ܾ.4>'J%Uvuq<@:V?u<@+Q?ZxV´?!GiCZ'P1Ү"D?^3ިVC$n`;zZxV´?!GiCZ'P Nj?@ouu4C|KyzI^" ۓv_<@+Q?ZxV´?!GiCZ'P Nc?|{\KswSs~ ϥZ,%/#33PiCZ'P Nj?@+O :2 EB$K$֡to` PzP_ |;eφ<9s>h:"H~ #g/wyqocOOOOO  V:G!k!?h>yqum</cnۻݶ7D˟?D˟?D˟?D˟?D˟' F/_>}?'`'<|....NO#eͯ ./w߻n݌nʀCZ>f6$W;X+O/{fKOOOO ~ۚ_}#R  9<' ;+͋۳LPK!8M{docProps/core.xml (]K0C}~v+w!9݂Iߛ[LAM996VʒEBm*^-+9OVP84Jf6`r m7cǶ KCVRv eot8O)H&y C w8K2``PR 39d.!Fȟ0j,T+.9#KvCځ-fK_7Sc4 6d<w44΋UvM.f9~O?b EqD<| PK!}VFdocProps/app.xml (Mo0  9: bH7bvgNc$Wvڍ/^>+zLdrQ J<~\|1\X#?M ["[xDWRiZϝ&8i/CX7; xl/sharedStrings.xmlPK-! xl/theme/theme1.xmlPK-!KH Lxl/styles.xmlPK-!txl/worksheets/sheet1.xmlPK- !1 4 4docProps/thumbnail.jpegPK-!8M{LdocProps/core.xmlPK-!}VFNdocProps/app.xmlPK XQreadxl/tests/testthat/sheets/empty-named-column.xls0000644000176200001440000004600013067126266022302 0ustar liggesusersࡱ> !#  $Root Entry F="Workbook=SummaryInformation(DocumentSummaryInformation8 #i\pMicrosoft Office User Ba==XXj,8X@"1Calibri1Calibri1Calibri1Calibri1Calibri1h8Cambria1,8Calibri18Calibri18Calibri1Calibri1Calibri1<Calibri1>Calibri1?Calibri14Calibri14Calibri1 Calibri1 Calibri1Calibri1Calibri1 Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)                                                                       ff + ) , *     P  P        `            a>  ||>;c}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-} 00\);_(*}-} 00\);_(*}-}+ 00\);_(*}-}, 00\);_(*}-}- 00\);_(*}-}. 00\);_(*}-}: 00\);_(*}-}; 00\);_(*}A}1 00\);_(*;_(@_) }A}2 00\);_(*?;_(@_) }A}3 00\);_(*23;_(@_) }-}4 00\);_(*}A}0 a00\);_(*;_(@_) }A}( 00\);_(*;_(@_) }A}7 e00\);_(*;_(@_) }}5 ??v00\);_(*̙;_(@_)   \{`m~ m~c}}9 ???00\);_(*;_(@_) ??? ??? ???\{`m~ ???m~c}}) }00\);_(*;_(@_)   \{`m~ m~c}A}6 }00\);_(*;_(@_) }}* 00\);_(*;_(@_) ??? ??? ???\{`m~ ???m~c}-}= 00\);_(*}}8 00\);_(*;_(@_)   \{`m~ m~c}-}/ 00\);_(*}U}< 00\);_(*;_(@_)  }A}" 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}# 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}$ 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}% 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}& 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A}  00\);_(*23;_(@_) }A}' 00\);_(* ;_(@_) }A} 00\);_(*ef ;_(@_) }A} 00\);_(*L ;_(@_) }A}! 00\);_(*23 ;_(@_)  20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L渷 % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  Lմ % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23ږ % 60% - Accent3M( 60% - Accent3 23כ % 60% - Accent4M, 60% - Accent4 23 % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23 % "Accent1AAccent1 O % #Accent2A!Accent2 PM % $Accent3A%Accent3 Y % %Accent4A)Accent4 d % &Accent5A-Accent5 K % 'Accent6A1Accent6  F %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 I}%O2 Heading 2G Heading 2 I}%?3 Heading 3G Heading 3 I}%234 Heading 49 Heading 4 I}% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  e%3Normal % 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title I}% <TotalMTotal %OO= Warning Text? Warning Text %XTableStyleMedium2PivotStyleLight168dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\`:Sheet18xyzNAw . # PK!pO[Content_Types].xmlj0Eжr(΢]yl#!MB;.n̨̽\A1&ҫ QWKvUbOX#&1`RT9<l#$>r `С-;c=1gހbFӳ Z't4ʥ9g4r PVV1ZWk ~Ȱ)RˌqUTP \@c1jl_2ZZ=%ؙgBYҖ  np(VV7;_xztF_PK4*o}/|o?/ԅOhB$zL.)O92711fd׈B\%fu=-u q,h~'s6.'“E+ wy>N*l5xf0*(3Bj=ԋ1 |szֆdB^!&3RqVHh j/NDNp܀a9^ LGq4)<௓G6lHY#̹~;ib?gPpU?~gƺt?KD(5iU Bp~K6İ 0G M_b_5׋2rC&߇e/:ܿxh*s~$폤I{]/>U[Փ[9elI[&F0c*)nY u' l TgoZH$sёD7õ5N ʞObCbugvxKR*2Bіp]e[r(kjiL3i+]!6'yy ф-Dy. j8aFf:6GEZLn3E23H]Q$#[ yEm-]'IuE>$KE.#Kd)f;@!κ1 R/1*T–l|NM/q8@&`0`dlCXoˁ6[;P G?d>'rǜJB1ghCu?3*0~ =m'k4e1Vhn<9oni[r-+z=[@#)݀ s` nF6;ZR^CQ/ȹo{0moNiHł%S}WkkrAsef͞s&JݰINw缃1Yw>)͆ib=Xv^#j*9KA'o4KeǛ8bc,7D-D/~ ܊- x Mvp ';hIͷN:jb};R`kˮܜ^`bmֆ2{Eah^dLbwk_|=/LISL>Խ?PK! ѐ'theme/theme/_rels/themeManager.xml.relsM 0wooӺ&݈Э5 6?$Q ,.aic21h:qm@RN;d`o7gK(M&$R(.1r'JЊT8V"AȻHu}|$b{P8g/]QAsم(#L[PK-!pO[Content_Types].xmlPK-!֧6 -_rels/.relsPK-!kytheme/theme/themeManager.xmlPK-!theme/theme/theme1.xmlPK-! ѐ' theme/theme/_rels/themeManager.xml.relsPK] #i ;<  dMbP?_*+%,",D3333333?333333?U } D,,,,    ~ ?~ @~ @~ @  <8>@ggD   Oh+'0@Hd 'Marshall, JonathanMicrosoft Office UserMicrosoft Macintosh Excel@eTl@= ՜.+,0HP X`hp x ' Sheet1  WorksheetsCompObjp F$Microsoft Excel 97 - 2004 WorksheetBiff8Excel.Sheet.89qreadxl/tests/testthat/sheets/iris-excel-xlsx.xlsx0000644000176200001440000002735713336631200022021 0ustar liggesusersPK!'fd[Content_Types].xml (Tn0W?DVp"~o Ƕwc j Bp;3;|tʚKTV*c޳0Rhk`k@6)&m`msZfցN:;QEv45LHC j!y^ g]OU0V$HWUt4~i<Y4u*Zt/CAHlBgPfZ^=nT̃Ɓ'EƲbn-ƒ| rci:>aoq;vC:șSoy8=m`;F p?)PK!P|NL _rels/.rels (J1Ͷ4ۋ?n&$Ӻ}{|͏lw8Ա7.JP-7ϫPI;ؓ3%U7WPrSjTd Z'҈@>G|h{lHo^ fLwޭA!OuYzb{=d iw ]6׻IСibN)Jsql_u$tw|phe% H@ PK!nxl/_rels/workbook.xml.rels (j0 }qҍ1F^Ơ-{c+qhbKɠMt\ 'g&WP%&w >׻'[= &$շ774OH"xR㳔dNҨ9ɨAw(7e(3O ރhm| sD"$4DSOUNh9.)k0՚0!!iɹS]٬ `2K9Gyvq/PK!D$Вxl/workbook.xmlRn0?{)v`iPEmrfIUg%i\>f1Q zj]oA}m \Vg!LJ7IAs2NСLәa>>; 1ـl<c)Ý4B){HzH;x:`L<_J3xnB &vcRASڢ: %q R)oHųvk#UU0jC*'{%OF^5w#Dqώڇea{DowW j(X hR'WCU&V!O -(x6M@TSt= B<_jˬ.=}5䇔g3,NfFWٷÊK=-{^#)[u(Gq?8۠7RFs"R~V5udqØ(>#oa\7PaYvЖ%PK!{֩xl/theme/theme1.xmlYMoE#F{oc'NGuرhF[x=N3' G$$DA\q@@VR~MԿ;3x8!zgkf㘡C"$I#^$!d:W$N4 w߹7TDb>DJKK2e,$nE<@#Jem)4 Pc`{w8!A=2̙<&JꅐfM T5BNd tY#9~#*@ K/AKחFF]et`~!کկm Y\n?aZ]'2Gc"ry Ǹ8E/ԡnޙ`5xsѵɷrΚ\xpK*y7NF~b\c|‰8'VD5N(B<=. |z]ң}'D;4L|6CGM|VoC Gao±eǬXE>%qm #8j>-~ ..R(zys^FnVԇ$*cߓqrB3's}'g7{t4Mf,t,Q;7ɛ1Ѝmmƍ` F$vNyad@}m }w^-/m z<}%s7CXWM->Y°t`Qә")Mi?F$@3ɌHK8ۙe/o}'U}f@bvyE/G9#sh [1/"ZXZըfZ#0b8k,ބ] xy Z4M0#w;(5!ʬDx@l7&vy ;H)Okള0i1?tr`d]v%b :j8mC88IolW;6kϬESSEÜq8RmcWYX%YWk:.beRB톖 $T`Vc XэGbCڞp` Z?My֬Ӕ ήcF8&%8 7V`Jm^ݍq7EWeRN)zie#EHk#BEPѰ#`A,SphStq"A%}g0fDzd#Q%uejCzRt s \oN)F{b:P3,!gdbKU z=uAYk;֌˫rYaϤpg?0jCoEAV_] 2H7HhIv>kj!f.6Q8/ٙ_۵Ȟ.QXQ݈B~$“tO$ɤ6F#YOG [BkFE6hM \\ I,&.(dh&1oYYG;&kŕ{%e (w䳨A񍁺]y 7x5R`8tMc3ݤPK!@xxl/worksheets/sheet1.xml[? 1jDRT"gY&]:U[D!u갻t4_W_/o]_ew>oݯO%q>?ݜ^c[i|37k8nm5r>)IZo4_}{nsؿ&>wFK3___n9yد7_W?>$G~:nOqMgi/޵']kOkU-ϛNa.u.=vu>zXU*ݟwNWos*\O7nH]=?RۧY} G lNþ,6ûᷫ):aN&>mYj픎~0~w%ŻV%*,%&X%XbKJȘPhG{oQZj5׺t4GԴ]h6GFJU9AŔGElt?L$.lR3ASAhaF5 xrkM-5FFT[hv%9{;tȦ^^PłGEeu^HZjG>haз4|mt:Դh:-ag3g>*aG.<,5'_ӱ͊P=U ;b4Akꇹ~ nH}{Xžf0QL 'n Rp%{GX_pև~{\c-1·]Gh<麬4&kL:Bp|88_w8ԕ>Wv~m8lt$x56ƺ4$ 14гMtuKը‰8sXI&K8lu|ˆ-2`4w*8l ~ |еI2 ̸Ō +59W^)8Vy& vg6`EBpY0ݴqܦghӬOFmev>K(M"ZZkϴɡK#Ztm2Zk9Ґ )[г#zQl]_ n_k=Z`u]oPdԎC= 4ɐҘdXK6H27nti~јhjs o ;`|qܵӃmW.Mz^ 3vV_B1@7e- r 5cܚښY0I`]ϣP zx!e}4&k.Y68nv|:o vx6 &!Z3-0Hإ~!uIK8t sdY_׎ni5ИKei*Tr˽=,fj}Rp{-zl _^ 8zuUJZ5߂5;췡ݥpe8xnзڠ? 8tnзk0CvH>Hcn4I7hmwwIWgOp+Vu5`oӀg_"8xnӷ]n& % MJ{.8V=tXe܅o5&cHc2iLmVܱ ^A5{j"WqWnW6~& O:ǡsC.] ==tz _R4C)k|-_=LH]7H8tnw{9k_\8޶ {]Inh_o,8V NLk Ai2 C{uKB׵Yx,~د.N{®j-(_JG+lWRp=u9~ @r:7?6h~m8PPEnb]9 3^MUv׀In@iH:Ap:w{p\NWPQl:{U`{8ffԀ'dv|6Goy]veKBטqܭ1{BԠ6 ^&]puz |X8SI e};%>@j,?.$G7RHzy1%ڍ)u5ta&=1%|lLkIztq7,_P@%_E諱m%' ,eYY%"Ree^N8P =^^]oUݣ%Kv^ܝ1YQ c02W+Bqsqzz^G}A  !%K 1.1ܢ f2?)]&H4'mX8˿u-\J4CH3/ϿX F9w&%U2Eb݈2d"YkΒBJR$(qtx1Eє:uh[_U^rD_)K4Wx}QT֣jXwҥAE=/ s^NΧMj@}Kjz,o]'p7)>@Qח,"dm @h/-.tㇷ98ӣ X y7X7̼:D̹"fɟrDi47@QZ'NiR$+\Yd5V]9[М5$Hz^B6zIvk6)-48#<ӾAtIyX%nA t pr8IH1wxI K=Bzv{PɅ[`s>܍$As-|/o&$A;.Yw$A7Bqz<OYh1")>@Q܅%s٨yR9ٗg}1.͒Mb]uS4u' e½';'#ڥ8?ЇuO.Hf$e ބF.A'&^x,}P^BJ@]5=>boˍSN/|@=%#YWl6p)| /kLhPA$X8`&A/⹪ 0{'GnDsrC9* Pceݨs !p}$+z,/E]:'tŪ*|lli&}g~:ֵ+\.X榯>k?/ngH7%ztn'l_GgcG郱7kgo77ۯmܻo_};>W?4P)n˿7aSoʗ|?OPK!&5e07FdocProps/core.xml (AK0&]f2<8lx ɷ-ICͺN1Oߗr~u ΫT(JF*jP7׍ uќޔR8xq$Vh{} m4vrq;B%hPJ1*퇫{j`yo6 }rEj:g^8#}j۶ڢx|~GM9Jb܇e\V5tZÞ&J)T8d_玗d]<<MH>MINUSBt^ 5gP5mXϳ/PK!LdocProps/app.xml (Mo0  90 bh7bvgNcd׏YwNx%s{J-*0T'UC!:![afTEJZkr-ҎiR>K:5wx#UY~xd57C59{_:wNu;`}.'J |Dm0=ܢ{͞O4zw26° Lq_*~V8ȦdCG폔_Ed2ZSq y?(Z8L ҸFyHߛ drN<2L-xa7_ۥ{`fPK-!'fd[Content_Types].xmlPK-!P|NL r_rels/.relsPK-!n^xl/_rels/workbook.xml.relsPK-!D$Вxl/workbook.xmlPK-!wpP xl/sharedStrings.xmlPK-!Ÿ  U xl/styles.xmlPK-!{֩8 xl/theme/theme1.xmlPK-!@xexl/worksheets/sheet1.xmlPK-!&5e07F0'docProps/core.xmlPK-!L)docProps/app.xmlPK Y,readxl/tests/testthat/sheets/new_line_errors.xlsx0000644000176200001440000002045413067126266022160 0ustar liggesusersPK!q9+p[Content_Types].xml (̔MN0H!%nj?Kؓƪc[g PTDQ4f|[d9g#NiCz*a|v~6}y-欌pJ`t6i5lDV,D"5<qFz,m k "RrkBKPN+Zjqg[ 2Y+wBMLDq}̨iKǡ]?wVoέNMUB}%-iփ@\J=IB̺iޛ1"o^AAGc,ER'?_rM?;67PK!U0#L _rels/.rels (N0 HCnHLH!T$$@Jc?[iTb/Nú(A3b{jxVb"giaWl_xb#b4O r0Qahѓeܔ=P-<4Mox/}bN@;vCf ۨBI"c&\O8q"KH<ߊs@.h<⧄MdaT_PK! (xl/_rels/workbook.xml.rels (j0 }qne:A[&Q6'o?C@.$}?ЧjU%)Z(8>< ֶҝ`@CqNsD$%襤`)qm.cuy :itJIH )}=?,)qkѐ 8VcNKi}K4Vci-pJ_q 6<$ǘ񘴽9޵߻7UH">J%aUJiGdB}rI1+|&3q v)]J0"BkzNZzn3`եȳߨu2̻[mT.}IViR],S_Kj Kzgm:xլx Kh~?C&7QM dC]ZĄjUE>}h ÊH2>$qG#A7 .K\ZҲMT0P ~Sώt-/pA巟菧߼|E9^/?^ Zh'={Oq |[Q>9B<یc\HbbPxޚcVyw42}GA(fHFps78(.fEƇe8vBۛ%5t| >ñBRb=JQ_p' ݣiKt$҂hFyj7{wQ2wȡD!aQ!X7 ˔̅_Hq)hn Uiܡ"AбF߈׌nls]3n{۰5 l;x]}wﮪvEޫ;)9Z9$O(c5g4sb܇EMg·$?4%!|M 64HpU 5O3 d:(vfÜɰ H.h1[N`Οu֯LVJYZͨfZ#-7bl,ބ)^n ] fdn7,,& "1Ic^Q)sS#};ki- %HEqI ^DIrdq8Y^𐏓7c-|ԃf\ Jش?M/ s7K;} R`0`d_k[/鯡$ÿ -L.hǴ"bЈT{TҴ+9EW28Y*M:z`[ƸbJL)uXG\׶Dž 9t$~_`zd \kH*N69mYԧhH}hK&NaVK.˒LFԕU{D {BHuM6`p'}N+h!XoN^[crh2*쪖ސg{ob1fճakpέv%rea1AT4@oE[fiY}H7H8.dҬkI{-۬/xp,>E:;kٓ% K cc~*G!;p?cJds`J4[PK!JK-xl/worksheets/sheet2.xmlPJ0 CMWY",m'm$YW޴eyyo^jĘ E }K} o۫{%5|cusyQ)Ӏ";TVRv@RA}f4E8"nZrV^txV?iqC$UO 3Ȧ0xLf1G⩫v;xC_8W(N0F@d Zx^ӛ˺Aޜm2SE`zsԩ18Hw_PK!d>!B xl/styles.xmlSۊ0 }/߻ tٖ$˲0PhKaWOd [&Jq& K"KGұ\<ְ Q{WnǙrڵ%~<{,pRTGcMa40pgcwSOtC.(!#%Yw xU4Ad|?U0Wγc#U)Y} a'`h@`F%SMZG;%K@Z)haL9"kcngB*:;f8v8CSgS' b7 T*N>HЫ90D!o~eM(W]g;5HNS/Q283)Ϥ;izS]7[139_' O# }ݙմ=eI8u꫶<Ē>¬A b544W/h.]?c^b|~R60 #a=g>薔%[ɖK4sZ*Hmt/APK!lb@]docProps/core.xml (N0DHC{b$D%$ZY Ďe=N҆rٷ+g󽪢/uhBPZԲWEs-yUk0Llm\H1ar0؁. Mmip'̰% DtDJ1 ͧ:*P4*gCv:w`l&i.FO[5.u{+Ȥ`-SQ=_ŝ_KoJwuVBG?)/j Ә\zEnMY:7q2cS:"E>D PK!+^docProps/app.xml (n0E1e'( b8 ReNjdHVrr5{qq8$w92i_#g`ÜzN1R9K!cqd҇ (mN4~БXdGBW`qQ!q^w|y XɛFSF}IJ1e۠~ ZI1ʍJ85#B75lh٠&X4?@' Vg6}mHA}{h틅Bd}9Nks.{C*΍]sĭ!{@! sS7NYS0G꧔~Yת{Kh7>"J1z; )7{XSC>k Y= Kz/fYZ{R>PK-!q9+p[Content_Types].xmlPK-!U0#L |_rels/.relsPK-! (hxl/_rels/workbook.xml.relsPK-!]^\lxl/workbook.xmlPK-!8|R3 xl/theme/theme1.xmlPK-!JK-xl/worksheets/sheet2.xmlPK-!JK-.xl/worksheets/sheet3.xmlPK-!cӐ wxl/sharedStrings.xmlPK-!d>!B xl/styles.xmlPK-!6|zϨxl/worksheets/sheet1.xmlPK-!lb@]docProps/core.xmlPK-!+^,docProps/app.xmlPK  readxl/tests/testthat/sheets/Ekaterinburg_IP_9.xlsx0000644000176200001440000076412113067126266022234 0ustar liggesusersPK΄WE:xl/workbook.xml (1N1EbM؄%MC8kem<lP@ +pL6FOs_.۱ dj,k2n]6u9>l߰wT 1Դh%}.g+caͩ(v|"Č[i;\餘+Ho%=F,}zޥP[,&OR׸XLB.\6 fkyjMOx]3)?PPK ΄WEիB(( _rels/.rels (PK΄WEUdkxl/sharedStrings.xml (MnPyIHAml"Qä;HUըQ-<[& -{yr+.u^ Dyuim΃d7̫mL$-7_N㟩ǻij8 *+zPmҟ[TH.zc^eYS$"ˠ{plfدG^ww;s7պ.oEv3lz{ѫx=]wlgw;xzu;Pzv܊ݐq]{رg={6^ܽ|ރٽzlzgҨzd,G$S>zCZ1a΀%.Ct :Mh`{P?'@2tZq I7Z] S(ij vz2oko&$RK[ p=bZ:4݊Jk}M93W;XPK΄WEm`Wa xl/styles.xml (n0_ްKhBR/4^ dL yH}v)&^?Ѱ?}i9ZGD*3*5:snM;F>hFzFԺ~LVD\*54Uו"80`9\ ]{lP8df4qIi93(9u`(wBNS!L\ ;RE8^/ݛq3jJEyVXkD Mٷ]B 2*{ wqΰ$Td4yH)ZԲDj-yogR`榚$,!]oiIp5g٣ւf9h,9q[9;svxegCpy௦ h+%}Ҋ'sh5U`B^5ݤPUźO OW*ŅDh)ijܯ WC=_wSR*zl-%|dxbnޣ1L:P`ik]-p?&kO\PK΄WE_,Txl/worksheets/sheet.xml (ے$q%+!x)&.~gdBb% !Xth-@/X,_ɪ̬[BƗ/{p83"bn~BT.?~?PG7o?|?O?w~p?oﻟ{?~þEQ}{AGuҵ޷_og7܏9ݍQƘ ױa0 c UaL5aLԻ1ؘ&i&=mNE7JQݣ0,|s coOs=#?a?o?招n77 $M.ӻ]/ӛϥ xx}tsvsBm۷o67iyb4[h_||O1ј_*K0ӛF[߸_H ~w4C>wA /{G ͕[nkn~ɷG T1?/]+^,`trfNO YLpxkh朠ntzANfзܭp]lFZoncgNw'J/:bK_j~1k*5/z([5mӊTUeB׺-y)lUV٦p>'-BXHzȞ7^{ʟ`_sSn =34ڪ*S}FS o,n~ * 8`oxAqmڐpydJsM{fЊm?//9w"#ch۱/upBإ#ӽݻƝ']ʶ] cXS Z1L1w 7 ~"3N*zH# mؠͯʏx*<3*闐=e vn%-^zv߹f(t^ 0Р 0eݴ]ě/Ӷ60.ۊƹ6U\0d@@”Q!GowΝӀ섒B6}҇n]|L" xqΛin&?E(NCx!dG&nTZ<,SSi@<ΣPnV(+:5yh' A~ZHpBϚ{n~5OHg67*x1ymy={\9_?s 7|x*#wZc L ?Κ LG<U@c*7hr.`F+5Zs_n(sog<{l,| :J 2+[qʽWM] ae^t]h"`REwOQ3"OQ+ⶏ=t=${/MI$PMoF_\].aEQ,$:^iC@)A2z2e܀ۢK:U P*D9R]Ԅ-BfݧxhHYm?P} 'd~0.Y?{{JO]|# 

uׁ:U To|trLW2)\ac8WT2vŜ唹xЪdL* =   /dGq#?g{" y+g哏ˑ'˻+Ree7ĥ Z# E E1֑vq$&R/pu:e-3`t[W.d E!DQRy@#|H͠>DCNy3v IEpIύ xcJJLvlqK`>Eϻ#ejb|0WVWrkEʾ)q=y'|=: #cš`_uG :^`މ8'S TӵLWri&;MUں\.0nVkhyAj#D!2BٕY̔K! s^2BA~k΃65Xl1%ɐ*m!Ui x?ZL*CyzCyk$y(@h/y2N9\yBFH?;Wp'$~]208(U) @ n*g躱2?} F] r*JkJ=< 'G'GHAzį|`aJ"?RJd>$'<\H#tfՖօj9g;4\__" ;uoL$UFiK'ъhw*\ʵ84n#Db2KZOIe=hb ;_fdءjS`v] &5. f,O<9*wŏ`uO TAH м' ϠA> @kp> wW(pa>ygXuQXΡEOt'BLK:mxݽ3ZЎBH 3@o0_e 4J U$V`\,1f.ZHhir^r`@u 0t;7l|Suшby7|1IHC7n2u8xvq:hȀLΐ0}Zs2/#3YH=@OtUX\ }`(򡘁 W9~͡ӎ1|(QUD\@1C /G{V *vEB5ڢ$ iQe&D"ʾ{*<1Wgπ2HԠ47C)jH>PCTw\.1Ub Y%|yG7}9sRub,9,>f~,Ppj#q 80WS #5 Yq&TzsgX\9{R;+?OGί`*Od!+QG׬lGt:ys$c p4a@䕶T,*u`Gb4U*Q&W9@A^}*o ELl4x@x%k/1}lq{?pq9Rĺ*tҾoa1GU L5g`PXU`3i c@z<B.-]]3az4|U$],QI%,Tm u`L[#7_qQ p@' *yu8v82q.O:WOuw~i!Ƅ.hzX^$\mJȟN+2ژjÝb)4!" Պ("x+%o)kD'XH/)>Rq 錀&uwl;Ѷ =RPMWmUPQFaӌsUM-V[q8euL*3vu3Rg( ~́Qc0{1I%6`]2*mC( ѲyVSp^6 P&1h F[Nq5Zf]>ѥDA{yQ#q~dAQo%͂` ;ƳS34 MĂEA|VjB!0&hۙ qQs5Z,XI|.rpJHCǜr>}r-4idml8>s|>I,6ȡ,[!5_$c1 o|a>l}aKV{UUa'^a27[Dh#y QV`\LoX$>H}LxA|`}6N 8Cpx֘\A9.䦏!ԯsi5jwGx۝t[,%K*qALCeT80.] 3k(yA hkfJȚX~F}H8pL:8?"f\b02l,S2@]aV3χ!V"zR~b}}WowoT: %m꺑`NQE)V`\,K  Tݳml϶)!ۆcmwmMZ^ ْ[y ؔ+%r |j uج=*ȀATJHPi'=n3≯rJaxd@%@qS .ÿ}`m?]P7v\d)_!v[PXP\;=J7ʃ 2 J3*eRBJOhSH ԞrPwKJ-0n[in3MHA>V^kŃmp yO<=]A)t2A O#g/Ȱ?K?!1NAm[Ff[G!Q~;#ȣ?mVl,ePjkt3 d@#?Qe-ӕH4H#WQ*]l#t l+rRHK, )2J)4{&&XdpA9(-gV`\ &r5Z5[#t> hsA$#=k'HOHh@RDv\Pu)7_A^-jW]qq%;5z?Ԁ ADj(G'5T7>g8܄ \e1=cosv?E>*Y`Ӑ4du_M60 ȁ u@ bps6 + E K0JN&EC22 93 UPa2s۞5&ʡ ,d@2f >ˠ,)̵)(&2\S0iL8Ro;^yOKʏ:Iȕ+׆㢕+# IUi2*׵#79F4@,@<yĂ  Ot=HV.F>"o*9{qzɭrʭSbyNe؀f3\BN,ӊe26dɟ]F`P'j5㺊G$g[jk.kP5 kfK7>ko1mD|1lw[v[A6^ 'ɀAjں1e49 dOF d@`f>=􄫐s; 2Uf {~17,J{P5U8N?@Ja\ם=y.W"V!2}s|76ݬ.zW`\GnPV*OȀ<>T}Cثs,nI\@"#`XN3!b\ (zӱh:cqz^]fH+) ~wpg a&p=VG//oMiexV\SOu0'>T3UPACY"+W#4`ݰI 6)khAy|z9yV:CtkJeu(t&oa]tOW!]!Aº߀~OD4\mPt{0Τn;̍|8|9s ]e 攪?0.zl{0d@NOZ!i됃8ZHSjF!rDC^i4>4BWDp/rFJV\A $mFxвDub06y@z`pBݧԐ:ѵ^~v8?GȢZȀ| }@ -% KޤwsL8x75 ll|`C O@TCciS4mR?+08 (MHȀ4 }RA Iq/ץYF F!&J_d)y՝OGдī UۺSJt۟ t"5#JkE84i 4V]\ݝ;j[`jRwAAռjHvN`Eت`P(KCQJ*(BK d@~f}A WZQJTo,4o*BΝT/L wPv'B@KctM PcEtC5x:L&9pAGt:AG&HhӇ `+& m4ջj/Ut(cH6i[cs!P_(ۘ2+0.Y %SAh @ Y.i*Zj,(;{Nq=B+Tl/_+OLn m2EQ؆qvԽMjʣaٹ,mz@."p;I-=A. En/)Pe"bq0ٻ63 uP' `z) ?6}$Jv<7 ̽d&9 SޯhаvLH 5>D]mo[d/㢶?|AX&9`A|hć&A|>G_.H`= ,:"7I?.r<`jQ)06r \-BJ\D> "`R"Ȁ 438M`؞W1kȟى i,+H9 9}pPtOM6#UCPrCpRVIC(}da׾U9Kǃlac6NYT{A Mո |!qo k&p\fעs-̵k;?RrB%R/ bfCnkT`3#y`va/HʢA=d BhKkR9dQ4|y3JrϘ'2qMN)jZ=jT5܉^R~)jB펄"20/*U#R .W8hE~I :Y}0lx)ȀIvl}^Jy) ܔ_8#ObٷGGIj偬G^^Aӂo[A8[~vPUЃwf5eE{EP*]mqB!5n?-;sLPhh}&22tΠ4}jK-C~ǀyG"k&Q N(Nqm֭",`Pъm?A3[% 斸-@8z|C.}*f?X;IA.C,ʔu#+1sS9)zfE\xz T[Ooi1e{0O" Hn#g:do)~F4EefE=vYpTv1z1Y-Vő)Ġ#0KUT1,ZL0.#\ن( G`RGȀ 380m" }=_ck?3=N%} L_ܥ LH䃟qOѺr O|WT~ ΂;%:kt d@C>)-8{^y:ꞔr/kp"F^5P" q; 1 >^&$K7p$ $K5h(,ec,(<Y"I *2 {3 m "*Hcc7ư'_*RnBb+Hujs  T yp=n~UFɡ%ÂU]x$ D39Ӎnm&@9HAi$@<;ߟZh@ҜΤȮQʧ4.Ë>wtڗDySv^w9.u@˵pH-DptW]F||S܅8hEZS0+k3R+0.Ykn6ALp{bJ;)- Y 2?,7LM:wjohS#6:riP^^ eSp9| $/'B38מJleAk0j +wa][k2Z<N p r`8 -"pDzC}9OHp7FvSt 3SO챞cYo9)2)v&]_n_" ܡKF9ITUG]CpYr{ZӢ2-z STDatQ1>E،XB<vڽ)qj>%̙XAbTA!t^uB$5yOd@Γ?k-Z'?_q@1$_jJΈ&n WNE_*1=XXUQ &a[ 4$]h6 Iɍ4/Z<0M` r49-` $*Nԃ%eJ/:`E(hD>Y n_2({'<~mY} qcXM6*)J$ke?Ѐ ygTg4W~jhBӓ|*|<N+|2{sMy& Ivʙ%9$.sWh`ɡ6x?~4%9'>jc*ռnRD^MgM_{WRdI-=hmKU6bzs MvIn BԹsp22M N*/հ}o'idIMh&. bp(ï$(A]L?'_M|Ъ(hu..#k6XvL\L`@p1o 3f(xZRNҮP4?ZQ|9|6;۾%;*E3rv}͕ @A $M $42J2#{HYKD-\LL@3j x#]?8NJfqkkϞ$y]IRsw,t(zvkXTz8֜9'͍`mZX+ {n|2OOQ>\dk:._W(ì٠l&gY y: 7L&' YA)PE=8$\s>t0)kclplr.yPx7pm.IuvQs_jh_1.qd+!Tp,D<_KYzvtF`7Y眈fCHqx5Fq{~_y) G2l=%٩& {T(gDg9Mw0>fM'}Ɓ}S{qOw9Nn[n AQ"ANSN1O|N1)Pfq=F F9d_qöB'@"МCjG7_~܃UvP[[lBq+Wkx;3|0k!dafB x *PeXZ]pHMcFW$cu-iXE#=JVZAi v/ 4p6Ԁ@ j.R#nk>g&lS4 VFM*ei40vi)q%wZÛ) dB$'Ԁ>@"9@O%"JBG"M#Vmq3͑nx"ʝxQco|9q.wFibNhφu/ !\ Ucd!%DBQJ Zp3A9`L,t`AQ=eIpY$ u&\Ԋ& ϻ."׻*K/}v KoUooL?TNfmQmZ K4EB``d.k&) YpC:N)^3vh'_~p2.a?do ?]e[`>*gW)GƁN/YK8FVզBgA+Xt31ҀLBJPtb0y{HD7J(Is؀:\Be5E `MY_00k̙Ž@&ds;B:8Ţ:Ӓ#JȪ>7=o* EEdjC4VV([QA,蔋Flqix3! q=8t Kw_6~BItȎvFأև/__9ԋ2ϻTK,y7:fr~pwN֠(^IZ淃 EB@&doB:A {>IT .1}No{Գ SqI|mfF2!m(%,_PEς&cU4O[b<Ȉx.O?ŃU*VQ5d"kR@.p1LAW7nH @\b Ȳ+=~+D*W/J'D{_740B:Rʰ?AM`dU*m \)tnn+4B&ᓐ|0^dBzBJLPr_Qw'軃YڅH 4'iwz:۰q7pqLҳKh ݪi4)C e%׋,(g5m@,40Y\7K )dBÒb whػw.qES;"O<\v^nL\\ hH#w~H _RB-REYպ@( ̖!<%Ʉ2! Bs"f1 %IpЋFvH= 论mr녮Uɸ}<٩bޘ r(akw.S6B*oAZkYVwF5N/Ӑ)dBrK̀XbĒ,%`샩u.oAyq.a?kwL"n&dˁdG8rW1yX&'5n|"쭪הnj];y[zf/{TI_X8DZ)jD K $l 8,+(ƃ%ĆeDsq)SYusgj {&Rpj YHé1NIpjzHD=6RS2N]%rwLԝ5򃾄x7gZ5@ tCUF2!]v&MvUuٻ>䒇&p1Edٟt*J>ߝر15O RFcXB3=ٳ-aK-h&PQ Y CE*TP~Yy_rNPRFrȺ?MG']ɖ]Ruը`TUP t*5TRnJRA&dkKX*T虊OŒIf7+q*&#Mg=΂?鐦yC00Kȗ4- KZ5ۈ 5\LMa 'Lހfb1̈́ :xrp䋌0\ [Zl0c܎Ѻ0  )7Ta5@&dfP;,v8B54WԎdu,~kUT%_,flDO=5H Ns'נ);'0`ۈM" _`Z]JNJHj*8A&d}a bow]q nC(OL;D!nU<~ʂF B^6͈`,thXSTm+opGZ,[<jOi52! Ksx"v'i烙"AziGziם2(ՌuebWcTQ]MM )dBa,A1{ED(i+(FAz@`` RԬOi 9< ;iXӠg~nF4tszzTG5r[ۦ2 ``0ݑtS)dBpTGLpT~q/w+H9ehȶCO=KK {];#z?sn.dMF5,B5E`` |xƙȜaA&d!sRJ9 v¶_?l"~d^)#L2dam b/J_!Nuu&]h N`pKӉ48".Me絍Y]gq }py35BBN5T ɿE%}N!{PQ~?u^ <O"~<ٷV4iw K4XdR>tG*0MV7؎\iu]yt)%ohT QueJGod@ZLMa p6=R #U=FЄ7_бz#O;G|m^2g#$'A̬Z7(Fy|MV"E $MКebk )9j@ )46>^+E^:A,S6!n"M[miVh`$7  t j0@*Ơ]ݧ;}N "lb~8˞o2(;f!s4^@ kJ- ·Hh9뒉) dB0<ã 8]Rgs 9z8!7es7kc- UYO'QZ7rKO0K_H۽ԥƂ䡀$A }fmB$,W5F#C*FFu^D:2! sQC:nt^;M7($|LtH G/ix\2 }!II ? O6`+nP8o=y;F*X9F;Yeԫ6 0Nz3 9ȄF2! sQCFYн\ ԫ`r5%<wל0\30-|EBQGAfzhBuia9@l1Aw̩NiR{gvuࣘjD YU kUSJN- K0E B``jr#5|42IS6rg%rUyvo %{H@K )|dB=ߣN=.zA:V5cbtȮYq[MAsS ]yD]‹omQ(.1MsZLN  8/R"u/rqE|ۚi Ϝk/W^t揠?w9͡mj o/yy#R(`CTʱ`C&ۢ09YnTRFy\QBiH;TX0(t/<0+@=X99f@i = ݬw1%(rȲC;,~9Q٠ؤj$i6 ʺLi0BLQ.V&{ YCi&A-^D5Sλ]! AJYvpc/ %o@ ukVެ/45f` 9f@i뾏+^hFWe0MxO툞B.3eOc7/}X2I;0NQ`*XmuN^ЪRyU_'sRQAUګHM)sC2ZLN *Qk Ppk$dͨBf0lnC+ !@ Nc5 CFh[U.sKXtb ~&dX YCci4&Ic QZR0-Ւ(Ț%>=Ʈ L((&&2K`(eA򥢪*_ޭ$|[۞ )dBG *Ǘho}l 3%X0]d}͡4M\H'&$=o_\5|=9[T<0M z,(.{P\k00F`l*: eB'hBXIXB7Y y8* K)޲."PL‚HȼHՀ#l)Koӻ|Zl=(O //t_#9R5֝P64Uk Rx fm 9Ēf@,iR+|G`⻹~n(ҏ]hӌY">yz t5>R6-jK|W>5 %\[}sT4%K}je;-R[tr `+J;ழ);9z|~t' %yD@u/v4Ky(ӾO_D%#>Q,?5$=U XծP_F$0-Tk*K4kY F@h.t 2 9lUYMU< _mCTߌt(Tڭ"~EPSjSp6 )O@hnn5:ZXI[룡Xé ҧ¿P(޴h>VZf]/( YZtkxo&"[ Yni[ DIҦPc0n)[ULPU {R僑P%*+"?R{C]CNLTL P!]T9ߥ|ūl~A\L?V:$Gs]|F#}__KB7([B`MT*+0 UF/`W;3mQ8(Ɠe*p25Lv@Ni19eݿ 6Q>̴s`bDG[A[#܉.`bߌ(a@N1NIfF;x-mՙ? 1YoC`3sNÇDuk:xP` (y&Ѡ&Ee=S5[1Mt~%k os&@wME >{{آ s#oV& JA+x)m> Hu3Cu{sx-q)Zχ*N<']-b }uo$+4SQ=\,YEA2眈>5@&O i:<"ǁ}Eݷ)hюg%-^>d]q/s3|{C#^%[b|*iGO]#QsjS40 d@tH< AtЅ'Atgi~:VkxGDf,Oq}g< Q Ө.S1ɸO*fVK4Vjk ,W,a`;Xds.nA'H3!.r ;v$KkݑvġaPB> hBf#taĈXkc?o)"Ã6) GML ]|ûvOG˝3荜)FPLRH;)SJrL Mrgs ]pBl 4*F9KL |H/uQ,XtE;YfE1?gpBo0ڢMI) -j#]WЋmz0#{5 QN+?7QjاXwGXK1.(JiS6(xPb2.f&&F YAE;&*.^u* &\]oSC53$ 8\s{c +VKTyP¬vu%Nb"sPZ~MpKrX[]Y㜲8\LM&dlD ($ RH(6(sgY&Op*L(Cqvb$b`f׃Uxy y$_,b8=JH~NmXc)eeX4*V 3Zc9P*f5)lE [+b(E޷"Gxp]%.RVGoN6nj>|loT0G Deт=2JZzp2>BLȂ PhOsO1ZLȢPvp^D>āl@N} 1mJ UrE$ M*PYpĐ5U/_lpQhRz@r|&ΖjzfEw >9P Pc`0FI1#W$yEe|7(|12),nuR@](Sjk*%JWh`!&@gv 95`(Ⱦ.Dz5r"/LBvJ%r0ej,`'mZ>-Ѩ Dj>\LM! p4(D2' Ğ㴢;tnG*aE$KXA*#)U dѨPVXq{xb )J"y~9f̔(3KOb[[lH |(J[*O9[ɱ79Y|K؇_p9J= TUZwnt0*ZNj.C&fU9t5(HWaP3q^E\3Bi:Uaf s) cqNi|޿:[vdEtQ t 4;,kkF۵{aYeLԀe,s;5 *|ZtwtM[R70=Gby跄ffpdI%E.+NBߑȻ !zl:Y%Q.\gԫQܜk8\ %INU3ᶏ^o A8ۢVhT@U[^+|=!KQ*lt3Q5LȂ?4{4EZUڄ:-vA4O#襆7Cv0*zlѼ ,kF1]jV;EzvG"8`V8Ȅ9T =ZhL襋95JCyd #4pjjO#W#!u#݈ %բ*Ѩ"./dbz[Lt9T =bhL^2D>>S(b4菨llK]iE a D .K[OYd W!lSxȄ,e/Cc^GnIH<fP#Qd0= qC1Jv2Du K0=q1\D8ҧRh`, +Xp23LBr#4&GxDǢȦ?B'$dKRWi:6U!i# pw{>S:00w@G )dB$~^ّABcKq5 .0tu{rX({ E7{70ٞTq*,jso0}m(N疭{@" @4ZL\MO p%'1\ 'Q~Gѻ}I`lU~'9>Uo 4]VLWTMPSJT`p7$J :^ABG{!bYe"[էz~$h'?P- D{ډqX;)dBjǸvbR3W>$fȚ;S@zktF9z̙?'gzͩW,Fp(҈ARm*ʹ/L/ƿX^KnG*Dp/\]TJ["uhgj n@N\CP<SȄ,bDЗHIRFbO)ɈO:N}_5@ /%e2hVzL;)VUiuP`* k*}E4+ ]Nѣ ]yV{r9\3r`]ǪW`%`p{$pxO5R!9ܢY|@b* wǼ)>zC/PC9KyC^u})b*_Q5 ~kw9ePݯ2mZLNam *62B hA hu؈k*cTt`󻃮$;H/{̀FP! UC}h7([ dWh`$"kҤ*1 Y&Ħ3 YC0zA .~Gl|)QLF&EBVA hR>܈򨑏wS iDz)[͘"}ծ*ˠ4&rFɡ%E2mm+6\]lj:f"C"ED1oy )TYtr!w!nI7SζWA>*/8˒."<{IφNֆ2{"*j A.Nw.SeKB8PS.e~kڇ (ky((D&a3"fH@am:x9n\ L\$=)Q$/9c!}DC`KV&tXxABmȀQ)K RB&*de 9\;X})N)JUujUVh`f&z"`ֻA ;OXHxO=ŽsCCz ?;= |kO#21N0W8k|q4/_9؃px,C|1%D`T(^1L&Xnjo-V&*& YКÛބm/%Gv7Q62\GGS:9E4W oJ hJme׎$@`KP#e`K4ˍ B[BY/Cy W)USȄ,TaKD ^<,nr#"DOGmw&.D0dI*[[4O[2|Vh`DOm<Ye rPPa+B O9<'7TFB)F;\HjK/=ѣA[ cA>|K^/ FvY P|ha:d2CtmuK47k+408(y 7SȄ,0ΡB*D OCs@ދ2\"3=03Ĉ^'ګkῗ$ غk1t*ШDl_p76'I#[ Q ƒ(zcz_!

:2J.X?ikFљ͝US(bE֬g"u #9j0#L8{{p &%urP盡Np9Q)4?u`ت6P\w]zu) 1\ Htu ȇQ~jV``ܿZAKH0 HdB 9j@N09eu‘c m;}^zEȊDv5'cJ*աQ*SbIDQ79I|ș j;bh"$? |K@ 4Q-twnZ`z *P>;ݪFTӇVE%%M'S@kB%m XhDЍ#8|b 鯺 rjtjN(H*~qqߍ76P[6g e%&QTe&T)b6\b0qyi$ohնm=n䚢쩡?јx %>L1AMhYb܂j2j2G|j."\M#YJ:Z[v[/!R[CI!Q* T:ղFo"^*P2~=fޣ:q]t#Gm?mQ+WȮLlxO Bv+ũK|'2!dw +Dwt{%$Q0_>ź,~ WFPPr&u O>ъp c.V}/% @K)sʔJKDe&SKk5hYZi -BI 7xs-1Wؚ$j϶`)<L02tROd9b"8x'SLk8 Bp]QtQLbvr[$ )SG g?LųHEnKj[%R$W;kM< 0fB@<`/5!_Pi3K;l$)E3QQzqCK|YzK-G=jd;2体VXHç,\ ʨ?8ѱnzM;7 $G4w9 K>>,hm-$P:btM۔P3ZiИMЧȒ1fz}m]'K[>Kz83]~_t,9[Ix*挜]N}ZE"жXD>Ly8hYpY]^i;nv{%kB#K׷YZ};5?IFɳpy N]?v}N=f },}QzdVLAʢ-c1=5}< 2π[p>Az8ʴcc؉+DFv ^un[}R(iCi*:}ϧTC?CwT+<˿QPUO Τ;FU5T8c`g5 !Kw[>>z8:?]`+3toe ڕ{7m"O/.(M7z8/2-~Xai2B#eakAz˓#a 244ȱ<=(?ꌘgBz oKèЉu];jejSCoaHO!S9kBrbDHY.I'@BFBBL@D Q+k#LH'SCw3 !d)r 2TȐB;6^`)mngCT>gt.T8VBK.F~Ϛm"yf H>)̚6pz5-bب ݤW:t;?1 MHԔURC[VւTn[}DG -4,UoAZiH#UrKQHbLRPeIہ_hg忷OJGWU0!'.e_@H@4R"a#0y=56@O&SGkB)C v6uIhdMS O`VIW)8,Yo S d"Sà"nu+t؟.dU.p|+wԌSvy5_ibK^s6rT~VT}9:@5R R"]OP'!Uј'a#8K.0n!q8W$8,qnI3RW* `M^݉KP3'%Npd/=2B10Ym95E_56R#VںNU EBK|Z$6PZ|~;_S.P/WBkg%:KIWRT8JDl&(WhhY6`UTk!LՈ7R.8~G }_LEpYBTE=|3@I}_8K;/Dabmf7**e-?p6:$jFtu]Ə>m3ndžg視T#X%>LM`GpYTEh*"S5IrNq,&YWG3d[y s@\q=BOFT8\w`R 1֨M+kqwWj |jZAJ!VJNQG&GR pLK/5:A®JF]rC {Y:~nI ٕ o=Fפ d\ȕ]T 5\c %-L LuK=05it2] EWӳ'n\`>՚k2Si{k\ӊ-}psT]Qv37vOc{(Tm8OqxsO lgL&=TPU:.ZY[04p }Ty28O=Skh~2T1-c'꜅Nl멆t2]GvJ$'Ɉ'=<3z7I!@5Od9{^ұv6hdWU<{O ȉ,D;85 !KI[*kwZsa_3ѬKR7qJڛT=."q֣@b߸Q5W/%LDhY1Ƞl¾lN-nCXj`dOWpz5l?;@ԲUpygwF(7R#uh*^EcGlaĠ~7#'5 !KE["if?߷; m8St2M).fi{6=,E\! Dbd}Bʶ"0;jT>age BC(ADo]EŻPVF"BsV٥A#w o4k9~aO/3.f6qqzK8Vm[j(6A5g`Fep aL !$K~At5\ǓsK\w-BWRtX\ ԑ"ga/W 0{aB[yl|!1G.D˱gQuWo8LƵ,=.cSլ^Lu;&ww iWiu;N>sWJ2./ȎZiLoHiBAJ"G)5 !K[2 J 488.n>s <( F?M<YW7Xbb y-\IBwqҲ"ۨBGT,%Ǿ;$o} ֣8lL7 jJ֏נP/d zcjI^%ٹJx~O?Q"?qcn:ePãEs{$eocpFc;ʪte/-)aQ Z1^A g%,q=C@KHKX9jbF˿wGiԹ Ƅ fR̒%uz+_E/ hڌwH Ӭ`2zL)5L !K[2`2Jd2in$$:/OhLze*EJE mT~fwxJf’Tc жs/nn87Lt&|Ac&? ́{j%9T ؐr$א4,In!?ʀ(x$ɀ]E~ÊW*/AA y\eB +1aChݸ{phf|2U!dj Q(G(Ǎԣ3կ=Sꥬ./ٕa1zcTg`OAHTtةTQڗ)#H@uGT4Jo+B 򚺞HzN֐4,l!9ʀ(B^ZL~]:WDĒ$ku)rp˼!_FJ`#`+Sųų+h $G(DCʏo!Lx@Kk?aŻ0^AH-]hÒRUcRbUҴ)&8> uMS#$R4&$^Ag@r,* @*$@vuػH :_:ڦ1<'҂ HT>q ɒ~UL;;j5NFM!UVBWd¡zj QGL AR!>2."t-6Igf,?kZ@^*DkNxR8~}0;=|:rhE͸ #"u':f%v^djgV:YTR!S؄ȈYr .m9i,Cw1{7AZ7\Kv3aBpjѱ6k]3(,I'\*\dro؈& %sy3`*e+[xX7_;; V_/uRT5g cڢR;jfW gQMp#)5 !K[*V*V>K_L*64+%W-e'@lj$ޝ͎ /#A $Ca=5쪄o'/^gc ABC  Qf2-xTgĒ)Ѯq-CxX;#-e4}&FK¸QN? 'MẒ_PU}EFPdWtHj.gr BC b3*Ʀ5d c[ ٬Uƺ"Xٻ4}v.ƻx uV/\:79ڂLg'{$.jME$.*Zq)ҥ*eOG)Hc'gd-L@2B2RU. ݛU^|Ow:9vtOFI&@\7nxzumXC/4,l^xx|ٵ\2?r!00Y:~Aʪ\"Zj7W>wgn*W!RMS[[7޼ÞAj s!ZvlIYxg@'ga[WؖjI-5-7;r҂d5;@#ʞc"ʹ~_-vZPӕRb 9Ek}⺂n 3A8=<]Aq]rtUodꀒ<3} N@f_u F[+);I$ j Tt ڒEr&4,lM77T2Obaa$G"ewl GtGI#& R( ` &!b^A"g`2-LF0uɘ$=݋`K˂_} 29JSjoBҲ%8!T)*(4Q[@Cv1qOK|O2u!dzK:F02ZONΗʽӘYw6/+q+;/F%9i:]$4z3< JUiZYd9bO !cR@ 4,Mm@LSb|XW yZY R(d$a^.0ճ4<(K,&R7uQ;j%$G'|SCOC“nv@P 4,l@##?pJC|;|pTMZtUoF8;J[\Vhz^|נ47 jQE@-fo&ԫ;tnr ƴ)wOlOa͋l{NagT4~Ɓ|7: ^鿿q7{# r|q,Ъ&1Jj'h1LW@3@H :I|ԗҙ9ܬQUQ/e1+Ge}wg ZA6>q)NBb1EwF;lR2lO UB,Ԉ]'K}1""y ݏ{#In:†L`6#ԭO>֌Z>t\DUH;l$@}QSuу=5S@ 3 `& S|{/gE|_Զ J''4$4J*yYElصKHK+5a9sޟ~tRbF5k͸!&vHMXsNբEshY׸h9kMZ4I+U .Q,$h-F)=}\%E zx7C1=u9~˧[7tkvqq9П}Lܿ׬h%gyޒyu=Mǒ=z3*àD~/,w3J?63[W)VvI˄ JhhZU9bP$4? 1b-w!HHT#?z˷309ye (txƕ7BKB(- ZH)Az.R#Qxc3!dia .HøH(YY ."Lbjcワ*f1O.D<': I,y:Ws ;[]_ b*/ !8e5h !K[Ў&@;F;|t9Dž  aI^O2́kZ?xB{N?C;LUATv){0V.5FIRlGC%-lG **)ΰpFrf=%佋CGݞN^*'零Q:1);̕)LqG";weG;vuaأdI)/ I7Mk::dP*fq HBCR @AeV(t\Ҟ Fs!Gq*|<ϵ<2v%$Ch'y֠FTL[VFkGm^I8 Ƴ-S uti,a,Ɲ"8\Zzj% #Mƴ<G ?~aIV./>2a/,2r~ XjZ>&R}F$XiTU Ƿ 3!dn L^fLLoV0p%U)_%%π\福3x?CћSY;jIm6C|SC? 4[|?EiEq q4cX@㸵ʯ UU"( WoǦnrn۹H<7CWy(>^« A#[ڌ{{@CӲܸ; 4[6`XZfXB ڍմZ1Y+-|"Z}'6je70Li3oH/MᾸF),sdphz+SCN/N^,, !G '؃Xf5K=YC0( Tt(QElYX=fG֛úTX$B ؏6~3oa,HI%IG:eΝ)jpT0P^h~Ӿz/KT)5  !K[6`@Z,$5n |<^ .P,1q_kppY]9QnMeiF퇍S"H n0U찑FMӗ-D6]sTr-F-S#;y%Lb!N#:sCPr^{+u')q(F'*4$+ ZIEgSA .Qfn ACȒ ؎؎qW.kҹ-Xf! Y@Qx>pww*3O&AlAdn7u̅W9KH9VJGޘ_h8YJZǀ^AAg1- .GfŔf6Ee@PRՅ3Ww=B9] Z(F6L)0%c .)d'+ Dh % Bԣᤝl.FC}W&~-NSMSڌMt3f*- <0YTU՗Vm[6EioZ%LahYb.ԍ]Yw6!oZ HiD!v^hTUCq1Kųċ/\|0 4W BK̂ɬt*x4_$`GXg.s\,ߓ; ay:S˹ꎌmHMqbmO =S>02e3!df fAG._n̿=|/ r:m.Q,TI|ni` Ou`{wy~ھh(Jv_1:發joh@PᲒc}vGt~֚ MvqzP׸Pi9B]tP%u?YY;mXkzƃKeb*N#D \z{rbՎSSV2538PǺBa =8{]6u]5d\AmbFbt\bU/h, <msך&x=bһ?ُ :nA g'0St^,UÚlꏍ*|BW _z.eS 7]Y(;jdڢ8[[Bb1=LqBOXL k4rON*12,? 9C.yA#ρ+-C+;f\/cVY,8 opn 8Fܑ԰X>VA2eyѭ8PQ~ѿ^] J|6,q wa__}̀AKg(]8?ACg+]38-pFZu!K()y=?7r8 2,a)˷Dƞ_[_rgnaبxA }pZBi BC\"% m4,9#_O~vk0&?..o^~uEk`2[+p>>VZ{oP!SkBp+]tne)q )nY4) /# TwxV֪F @ƶN"ς@ 3`*L0{p$7]F*QgZ̄bB:6?nr2nK2H݇V:9t1` }aN<ݧSOȦA#բnj_+x'||ȖO: uqaqٗ.%볝;ίAS()tʘ_c Лxm5rĚ~{@~ cl+3WY)?w.…' #]o{dNuxg,pX0%Hr8;-Iݩ_MQˣMЖPVLmGckgra^k)PeY~h@ktKޫB|3"AcH2e> πz[<7Rd6`?mY!0 eh48}aMELJ}"GHje[ O'yryVyTE"$N؊= H<׵ PJqR%cJ-MyGE6EJtJʢ6%=LJhYbT'[A1n/8_irmiJ{ $0šΥzT>au2_15ݏ)r;jeMY6C{j ;__3T'Br`}m l!'Kڳ?Ym!uD$*dЃ5B( OnsunID}[Ƨq]: )^4 ei BC@>LzrG@2Tn`|)]ƴ:]ZO2Fb׶ `_WhqTqO Gh[ɰy2> HNOp"oV饶2.a윕{uzpahC]JT6$d i{>Sjk@B^x'8yS^qHYM`bFӕoV}PUA߆zй 0:s%!THl8U=oʫgրFeo  F1$2>UaVXCK~4'2сי@'b] f!<?Yϫ!:: f̢߂Y f1$0mJ\)'ȣ.ke nBe29ѭەYt8u=1/Zak t+(M:Zi"V2i tcD2=73'CyR&Kha!SFm+E]bP88 +~2RcHw>PN1oiou~9\`q'4Bt!7SoN_LFxΛ8Ry-(KcT n(2)a#Um{"v}])5&4,Ym!/䅕՝Zf+zq(,`i6͜;x,W(?7yr![KuƱ2w3L6DvyZg%OiƉB,]MM!=51J2G dj{ ACc@A?`^\HlXs Oʕ,:9݌Kˮ8;F1=5Eō7A!S,k ~2IJvc`v Y1w]?u% 6}xN(q;7__k&w0ρ4БCjK8 gLdtGtU&/{-EAp+h 0*$G%H>.p%))kox1w-d˥'\(|Bur Fox9 ,f: ei9b5h~-` 18oozFŠ :u1l.pшְ6F^ 7 ݻsJ/ j㑹Rop*$fe4ohۿ!d[!`(f(vX~f}X} ӱu(1.蜬\3==7ê='i&Gw/hqL.v o߶Q2qZݿG}įJqqL۽ga;1ZH7Gnꨓ*ھ$6=]10H^ ߅L4pY݀iEȗ1 !qF$yxw/]fU[JRaJt}3[p=}_FlzHr1ukW(8.n眼P1\4{AÔZdMh;je- ]{ 'K|2\ud먋*!bmۋ) К|/`:-bb=1KUTOVLIXj3}F2.視[eZ[*^ v>'ΔdIkUQu -*SOh]EZ]ld@!=Pĩ&\l㧺;;Nj䅫uQhwTz<=*\&Poq%T{$z0Bo!ZwGk~svū3c{'5JAL!ZBs[n5RXulRWѶQC8\I6XVP8,mpo 3.-^Yۋi"c_.,~dc)h|G:[HWXlͿ 0BYg['4ӎZ9Ls%>LAO*|zR] V$95:R:vQ0X[ 4Yi%5,~˖lq {R=RMOm#zPٝx +byi3MܤrhxZi2Rp7~NM Ei4U@ ['eֆg??9M?o *k.S0skP+7Лvmjowz== \!P 7J^}锇o'w=ӽ-,jAݯ٠N$Q c 2@JCNb@M(lAiP 4|d`J q^ I2>$yizCo}t:0$(3Woh5&u]6Lg5 !K[hi2g˧i$.{p~*Q4ZK2&H ~u'acJBQp9SзALSC=,%fx3e%q$@7 7eըt ?;& }2`L;%1t&76$kB|`&> bzxΡkZ3D,,hf+}'GyCFw_ʵOkqIvE{!B~Ў:oeR5fij{$~h[b{DOA ;MGvE[tMs)l!3u!dt 7bn 7"﬋Zs3eѥt'u>R8"d0z9&tvinmM?}yםɷ3pHkAͺMvʦB*Ӷ.HM $(+ L”)1ȔHTyܟlvq;NO!~;8iu"I*eAJ=]h=EJ,lj8 >JO!S3kBf"& D "5rbo5fn}Ѧd)[#o=aI-^_djQW7=4>>HЗe]^vJ~miLf~ķTRx_5r2 K@AhXݰF\R8SFSJ7߂\/uiIǎj{2uaGSF%gSЉٚR;jM;} 4x=S/)df BC" )%v#Q XpD'OJ`ԇywU:eFaw#7DQ+*ۮh  T!t*4,Ul1ʀ(ư8$2 M;^mM.#AmxyXbvvq?;a_/ɸںwʡ@r),6&˔%-evv侵#OFav1@RQ65$xAzN%d9WP| 򺦭!4t{tf'&WFr ?1ć)5 !K\[2>J>&qM lU.(HO(_(w]{w}k_%zӵњ ʦh8qvF04,la.ʀ(42?g؉\QRQmg-|lo\Bk 8.䠘FKoR tLȉч }Ȃe)>tb 8d z}j'NPe@MHM|0gXz$'(ōr=O}WIjFzvlNZy@$l;*_ѹNtfj >*45EHϩ(i@ 3@H !m}~6>"V$GFX'i2bҐ 'M>g[;QoY}eR\(NX69b&XC" M0@aQ<0'\Δ %-F`%c?Y%{$??r;)3g~U|*tZoyip=9{&L+=U@g)b\jIH痩5 !Ks[؋*`/*d/E==;+VL4דW]8ν]6g)-,;|ƻҘJv/Sq=5!u`IizkjK*6*6,= Ih۴nRX 1IƎ.{'#n-A~1yWxgiCh҂v;|H񖦏a#ٗU] 5,:9F'SLSG]:Y: GI{!,H,gݳi_U~|nu:%xK迬K1 x8(T|aoNߴ?V*'5, !KV[X*`I*dIdj{Dž95nlƤ/ &}ݪ~m+Cf @(jJA`07qɹPRTK"uIԊQtG_Ýдz:zN)U@THm}}tш6%L\;Ͻ6Ÿz~ ?ǻҿ*W0|-)6ZjZA0W}4VzFƗ>Y;P2.MI sej[쨕k&!hPh=NP-L22NSt~GOYo!őJӒCRvU+!AU۽=lSmtK7+!Ddd ("jB>N KsKV6Uċ쨑)ʺ\M9ۈ',\TԆ-M66ʎ"+RB7k% w$gNE>㽉  !ƽCh .AM͔AW0j RKLAotDhpAƝh^(INl#ZoZm?4o1I9;j%1IcYT&LLhY™TgR!grרT[y Y*DuF"#],MO"CjE->^}T)l,xrO J)VE!4, mBIkWf@l/3Ø}̎Vw@+=jâ1%.̜NYUwcHB~Z##Yv^$Sj3ĭ[W}* =L-EhYZ(R'@E=e{_1 6C&BF88&~F>@Ikp,SbklIhYbKR(J@Q>eO WG_+tE.S.DitT^j+$)&$ACG#%ǩFSBq8W /BCz"u)^dܘIGGPR6t_fi-ժBxtnϡ`b"aA96,ud&n>jy4@t˸ɪ͛I ܷV'ʪhf {jbhU ؓT$]'K[:B✁R0(޴*8 Y ؖ /lxqC~xூ42m)<|ALr}_BҍV_U~qK|ƙ^CrfcԏB kU'RzS8wei"Ob0r@arvߛĵsj d[r\-_А[]vHǻL sqK|Й\fDI~D9NLK+xK@%(,:泼pILoO8e=#],r:Kڴ= הu߷ُ!Fq4kO ']#˔%-hI%5%"qC! vfS!q׉ 0ɺ| áWH&L}]);5H !K[:@JjFJq\&P,~ BҐP _F ~}5~6pIkwڪk6U)CT$^A:g I-$I$5$t~wo_uΫ0y۩ݔs'f(=#& R0ʝfʞ˕۱53Vh ;$jLUt3;Ik~01R_"3C5Ο+M16&ϳ+Jπ[З&@_F_tP`#OosSף4D]}w noj郪p#*JQ6F#R#Ҡ/TeB Oik\.44[(&LL&bãC[ҳ+*;JS^|8G mLt}|נ4~ G臝7Fq)2] ڔш$D.t_M_=j2`^.HHt-yHmRҎZP8P4DIMbXİiaċ78*~|)tR%JnE lظazL.ww|6Ń=1;;ju*nǗq m(BoLi~a~!7v`qb'4_)VTM#aWQ+]UTJ 2ŏ.eS:Ybقt4Ѥ_CӤufKq@D&'”!Tg ;? 5]Coq!v!g{j8 ؂O1=L.hYڂ]4v$ ޥ8rWFK, Fva" ({*;0F+TqK=50+ ȏ) ɧ3p΢ 8&YB!OLt S$0ϓ%0U=9U,L 1"T*ilsUӰi˔N-Fp qOvՇK,-ѝԥzMaq\]ik2'3}Bh B+/뻪@aPۺ2zDZpdh!c.?q&R%iߧ qH'6HVmW]n눞*hDSIΫL 甩54,=mkh k%׏T62fx^htD;STv .y'_㚣(sXSZngkN36){]קޱurn*h -4TrJK-14BbEA?|yxf)C &&,d2UAg&ԓ>h  NһA_]ܝO @zh2!dl GKG\ej;(liB.c*}!y_߇[@xhOri6lXŢN 5av Y7.ph{H(SVkpB maZDL3g&1B(~.K`ה: ~"i}O/ ALr! D9YO>clRP}`Ŧ;7UzZZBUKVeϱSCݨc8, =pޣ%b|ds2 XhdyN{>K$(5doEl ҍO2< q[ 68Z8+ iu\f)yFvI r$BFtt7qGgPXntqu$!+qLܤ+";$4_/ib_ ]m!;ڀhYZs+e^{\G:NWX7;QTMyG\oD2}#qAY(cg8-GP-Qov! Q1p WNmnapJs|6T/2_ cj ]1g=5Ni+ݟ^Alg:-XG`mw[rrf Ts)+7śp\:'tdh 2eG^p-:C#uSwQOaj2e۠!d&m&6qmn<\HQQq0b-__ZhȀiioZP {j#h%L-hY2B[tm%h K,_`!mL W V}Qc4e+YJZcon&q>]xg'A㟂Sa<=I5khesS1C% G')5.)B-DD]$5K: t^,֣1=Q_5NO 黁$`Ji/uw1_'pG^PgS%ަ??I5QA& xb:.S_e3 oh3t~ oj9\nc替!!d[.@:F{"?]{Ka4*KIUu?:%|T&;\y:q;-ObQ(@F;>~t#?1_?՗LhY%t!4Gac=/ s,󀅟6VײWzx|ޚW-%[5.?i*t}!J A@ALmaS c(MU'ܝe m @C.:`ڍ.te}ۤ)0Z1^c ف4@jRyd 0L[F=˪;ᔪ^&f$y^!h߂?# !;5IzbLkhP'a;;V}1Lx\mZȵX)IK8NFWCz =ڊ]T-F}QQ| /O6nh@\?O%' k}'t4ii ZsQ:Sà Sǒ)54 !K>[h>1z1D>khWa Z"~J:M~hױٵ2MZ+ &>|?e$ԋSL@$L$QmLN$ظY*Ƶ.ďhvJ!tD;G5 !KE[h> m_]ϖv1XpĢAX Ȟ8!>+܇iyy?|AݛrɸZ0웞ґ5$)ej T@C`!De;W΄2KuhdO5SxPج#ď1 h%o1fi=5Jtw:OS'ur5l!D$+ngJ3:|܏'H4&ܻGVsg>|ǦTC?=_ wCi?@&)Uh娙8SSƣ 2A!df 0@&Y:s9,hT'8m%&iۇ?4~{  8ug3x0 r[Rh8o=LhYb, 0$QoV>=;IBZd0fPqu2 \M9覔M!Z3=5\'%>L! hYB Q0*5sN59 Hйk%u0T)Jl}IIT*/>N*\b-씐"0&yOy0 mhJCAxߎZ٬m<2~JShd q @CRaN2?#ы1fy4qb%jU `$#<pڪh>^b}kܷ=YEBCw+~y]|ۡ'v< 1aQ(0ٲw$)8hDz"՟$në <8L+YP>|7y9p \}o;r?Z3 @C[ ʤhVT9A)p)5H !KM[<HMhtѨR^ħgᛇEK_L~Dbrv լK@RsdԗB|hѠvfnGDJzn:[MthbvZGW:e$./# V?Tɗ~]H/<+SmW[;>wc+ONRhCdž(5Оx %>L+hYWޙN?qzu.V Qf?h/Y;gc/t͉=hoJAPYtuQ+!L!l|E =IQjzx<!J)@ pܬR ;:pŸ9up܄#Bi}Ԁ\̒\~:kLnV_5+ ?e,*R|A2^P[*8FP}YT`OdiveY8WUƇ;ZKe۽3[~JK} GO Gn | p-EϬB!Lkdr! GeP|z "_T!KDI6(?UD`$"Lԉ@7z@U}/G  ㄗx;3%!dI`5u &^;o&pS{n͹]\r݊u+EbG CvA2㇬JY"WPV#a8?v» 8,l@ µXcۂ6evƨm \Rr ǧ]ysI-('>u(ڢ!je';xSC-6Ax3J!demLqv11r>eiBTY%',0,u:L׺٩. +U@ݍKs19j2+7>I jePSC'%=2pЊ&SJ^AJO->WJ ؂|/ujnaqk&6_v2C+XJXۊg6+U_wP2-lZS B$cpqZo$^@k?')Җe'э%>L٭pY74EkDȶ_~tiw#3W7Oƽydqy )NOUU3] B=?Htj:=BB&.5p2e{DAsP +)AY1'[pZ>u^eqL,ÿKWV! .'HP;'8āWjղ-:I!2mdUV 8,emAL D]޹[{#ݔT)]|cN٨iS_aIh;?K4ߍ?K @܎ᩩ8h8x9%><@qrcP & R 5roYEE'SR)U -M*бUENa#oWoEVfbG!K[p* 3:bp΄q=?7$?{.?j>8p3q)OX9\D rawH+%m )T{j,\%ap|%2EK!dx `. EK{,uw\}iQATPB2b}eNqQRa6ɳ]]o/JZϹrɰ5>^s|]'K[p([+E@&$SfDnvL~aꞤh ) h='NIZY( v l0L@ai# +cp 6Vv6Y-:^:&O*qU͎/[btsK|7nZ1l#jO"K; X΀`-  @0fb ^cُJ%fFHk=&?P EFcYЉ2c%s!kn\Ay j8% g5 !K;[ 0&\|v ''-0f0sE.RZ؋P Iq+ j8KS%>LA-hYjۂZ0IhVq'%B e6q<q1>7Z;bpΗMLNJ^9,H̷cSY*|S)_˻Igqk`kj$p9@Iٷc-?y# PF. ? zyƒ^£!܂R&'\/&zJvO!=*RF^ႜ4Ƣyù%p7F;p 2AH3EӒt,=os)SpA źBt!qJyx|0n0nM[SK J*nO ZclD0)5h !߂֔ZS&К;=Syڟ,(C۠ ;g9(3LJy'۫. 4_|~$zT@W̔}7>oAT| #}MBN$SZȝx%b^Cļ)rL;GbM`2xprS<sD_kЙą#ϺD%( HJ'}cÎZi*nӽ>h|ܔFp24,mdʀ)GNJK ~1W/݁gK`{O|__"!O/:[E+9OsUu_P#ug 6s <[~[;j%^E1]@B4tgfE9$rhQf z}r SLL`bAh18AK|4k2ϲ" SɤV6DYVulJ}!.}*)l^S\Лz]|V1*prkѳSħ'GHɑcRbRfԭב'HK'4yy#)Jٚ3:~tUsJ.PwXE)Ja\v-ACXE֠#4,lAGyw} 7q .Knͩq=SÀ]:Mxךh@cP,0mG6-pi4q%>LmGhYT?R% Qm1$uY[E kEbHxTgJ! PKIVM/d7LmRui:sѮbxᄏ$>򀡕1LSkU\%-J*UHաtyn5۬P kO QI8G)5\ !Kj1.-;LLygB]'rPi,g!IMQ|*_` }Q͌8AIl2cG즩(\d<&%UΡG5P !KI[*B*B)te?n>(fhd^|yT1*tB an[}Z쨕e2a d5Fg*v /`b?v98ӽ5k2;mv rxFIFC7hoQ'25=2Gxe[['U?AW);{B oǧ7Jz{X$׎wX>`I%HDì[)3fqgpl4$0M3#ﯻ/M)*<\I(%0*`j /x!5B,9P(IS3lJ*rH- Kp#{Ngl@ܰWEPcK`}vzcQ'rctƱB.`BڨF+W z\,.Fabs\G g|2`ʠj7 C_=zw|.ȅ 5#t`0*33*7)JX̽KC`s3ROߔX`|MD !R,>@[M] w@Fhj.uAΥOWAzz2qA.d| 5?l|2'M7x[_⒡bIŋ<H!iwzu/{HM {@^HrSwd *CI1I0*`܋z 5r/=V@e.Q[:ޠ`GVm+ :U'|D@URHD /^D:-t:cHxMt`%/v.д{%*YVxK~ d)2 c풘"]L!^ Y0BEċLev˶(i y7߼:#|kJ@^-l##k.:-I4#Ix0* :ƫXDR@Vq$_R/ښ5u?$P\@+L,)Ua}->KAGHK&QW.Ku^٬:j1n x(ّmqj$z7Нfr I\ȂF4j$iT}qa 0|Z,IQn׏Z<埢=v",YrKXTJ! 倃93VUWؑ#lKJ U/el \jEP+jV<ٟ}q0RR]G+w-45epȅ^j@N|aDÊ$XL;)wd4M_ 2ڠt3)A.dAc S  2%.[8kapӧA>ea`τne_8״imiLNUJkڲ⇣)˨6ظ C2AitKy؁Q!rlaN4sA`㭍EG}Ѷ0Z %LO YhBhDZNGaEn-`(:]J4Z t;{v4woP # #`=C}SKQEƄ`d+,aXAN9㶗|db{ \G8$q(_9q 6B:%7aNC YC L4Xqk1"j$ hY P9Jnޥ]q]X\ ӔM6;q tH7+%eՔ3V}[T-ZPw0^݉.q&4֐4ȅ,hl!i4IAi_Z-IJ *Y$l.wQ`'=yQ&r0na%FBKBBfȠKH7L7.}, O$-^#H'MWmmGFn[M| 2 t2F\\BJPTZi>3;ꥫ] v܌(6ճYR aT|2γܑ|.{hTtAnD!u9k+B,Wڀ}>ixAO\p,$ȫ#9| ܕ,/_rRAF` ]ſwd;0.I }׽Fh%^L`a YiHKL}䕇k]GcE0 d\ B%8 v/o (w͟*GhBx_=Mw^5O;MCnjXr}Sq䎬FTVvq)_[V]D-6xpVl-C&(*ɯ,Kc'$W~&l5Ѻ"[\ iY ^;ڦ(xj }u)z5Ȅ 񤮖0OZb﬚O+@0 +_܂n$$X);;ωRV;-|QO~7L `Jd{ǻ_^L4! YhTf]P鈡Y>{e&GMMUɯ6ij 15bF`eKĴ&n >l0)\ pȯ9$paFN0ʺvdgV}k6t3᱆A.dc { 7^Yx;kFE~sSy ǂpyI>:&.O\>L=d5]p|rR{"Rd} '\NJpR:h}+=:-ҘaE'jx+ᙩ+'wY#"m3-$cnF& C0ʘ-ܪ^4OP`!<#{ߏy% L!Ƀʸ@]ЛV 2y0}yyĴe DƉQoϕ]Y UY8!@q'"f.`׿n2m1rPy_-ª{<$f$ VvSCC[`7u}Ew%GkBtv HݣCwZ?~z 0) _'`Jŕ2gj}^& W j|hgKbymGV,?[noAɡ,;a \NaKUUlqM*3O>uA3m 4!%`Co*oj_cy s0]Kx"FIq}jR BڜP&0]ȅ,DKX]@!E"(=$iқF|J>=S:eoq,VQ$m5 =*2~Ի˛5r! IPMzH |޻b 2XO'8zAY\RNoM#^b@uD QW70ܡn* j0GpӍxK|*21C.dax 0=d/ҹ܋H^]* zp_'fT´ FKz6yY)MFN* gh++74 '4@Wݹ {.s4O0pWC*w^G_Epa`&yO>e8;ٵ# }!4ˈƪh#tfM;Иb':ЭD%r! R[h(}@C;&w*,vB1YJw>| s'ThQ0+iAb(ʦˡ+qJQSb*K 5r! [)}@M!;] kbBʇO"J!-;GHkc CQRjtt: F~K> | 3>?9~.x"oP(]k*ܰ7\I`V(w7 [Kջ)4 ]+,^nj`Fi(Џjݵ}i\xR(ѵ+nJM uESP T+0c'i[h}@!}@ 2ͪ'Pk{ MM=~mS_? S FO'7M3o ȵyXUpc`rԚZn': GG4)_F0{a-Δ 5r! [8}qk[ [W f!^+lfw>DŚUW ^k*8 F`o!t c@Bǭ,>S&v/D3tBAcNm)p& ~'|D3EaœDג/h1ITXI-ľ˂R}q^sƟsr!9p51 W~\8oG;T;iO-@Q0컸E!іMޑ?UW6fH:gb \?#* (5X&L0SdqZqU`YjQÝr|I\+d9!`L+oE#+-jڮ1|KavNc0 Dji Lc"~~^x5T '8 sĪ>zJN!еo^ףx? U]+IviuwhLU0!2`t3A3i{P,RzJϪ5L 8?u2.0? emHIl Xt3QNA.dn b)>k%c%FWL@X:l3IVho"*'N-8s4J`l)j[b\JSvCOq[2ģ x3q-A.dn[bzN+;UXF9yw`C>D&+Cpy"ZdepdB/;_Rڗڽ>^I~չP}S7qESDƳ?!+}/d8lW(eF ]@s%L*fhtӾ UTh{gXl~Z颋>'K=2QNGSm]HBV3%'$p|"HdF}Γ (_HJ4`a/~͹LOVπIY}u+qb 7r35膗2E[Kc\ 4ݸYgJ!YUe<6w)?Γ @X+sHbd`ɰzûIFřS= *~ޭ_~8R<%E/h>m+oFTߨfܦqَ 2%0*][B6Eڢ EDG$Yڜ>7rr >ñʭT/F !d69StMʍTAZ񚺡%3L ƅ Ʉ r 䌶h9cv,3h" ^U;W PlzZtRl.>&C9ԙxi%ޅLԬ`s Yh6@ 95Tݖj.h[=Лsb$s~ %W943L\S4X5m6H18i)4*H ߒdQ7VJ—3 O"!Ա֧Mqg5x݅%EUSdeբb Z)$rw*[+B60>ڢE!֞aRI.)6^e,~`Bg 4n-Xl `ޯ=8(Gbu2JvǾ?Ps7*ut!18RcUU_A B㟂ZBZ\ !7QK<k"[+bFηS&jYޣM>տTa<;S/v$p]u}L==&9/h0x[JW6}\" X\} -tM MXú)9i i&|^ڤ{ =l᝘wbw2C_Z7,ӊw4lY1'yh ̯z?VtҗiJ%60m|7C#] 2^R'Gebi \ H(I(_;b$ U)3nR}~Hia Iڽк b2H+:P2X=x[KZH! bF?72diT(b(RC#VDrRx(Gx46[o\xкSM-`tjWܗѶ5 7+`0곇ZN@1[h3&`Q$>h2^ZH"U!;=Q;up|ݎ h‚W]6 הA)77u?^Qylp CU[v|N*"Oy\ -dm f|jj%8uKW [N ,7*:K/>E/2nSty#SG3 1u+5YRUI'ķdKUWۓ 5r! T[(.&GA5y;7@vY:O+6>'N 0b&Ÿݣr}[CO&2+2."6k%B Kʀ]RB^a0c\nJ.K0 txcT&0`UOiYLAv[/=a'iAn`;X鞫q"C_ bl]r ͤ h&%:59TXPGώWm}[9{TC1]]uxvd E /p|/g"fEt! 1[e@(!-Ky<ǫ # =0 OzCǃzeF6>~SE3zN86^' \z*ʀVQB,!=3?Ondna7v|_ lкq7`SCD*.Зoey70^9 -2'Wo{s˝Q_#>b ftUe5Sq`-K5`Gc\?2(c8]L YX)(NA yZȺ}l6?q)zC|pmǔq77[eA`Ni%Q'q$ 2nʁ [nυ>"k8BDpʀ3P"gjMپq.sH|29=ߥx_U!Ms#uڎV:a`|wAt 2x4O^ʀGP"Z/Lem4%-="<6?R-u@feaz:>%$6!O; ^1p!zkB~d _b_IAcvq i% o &̡tjkCg9rAd:י XLW5C\mGF6wZUjXt3 >xA}P샒G)1INeihFdQ?8˺T "v a1љY 2k$ָ[5<r! P[x UcGKB:Jz9ûpy$VulZ])ERƥӨϽ<9ЩP]a@HB) [ o=g=t_\MXwҢA~|R ,p*6>twU|0%/$(?㡘Yz#=i=Fvx#3@.dn ۡ Z$Dt=35 r!BbEEĊqϫ(” ydqX7 Q?|1ds1RoΝmаHWV(Z wQ_ߎ@o0Gp,211WHfJSV]?_TKQ&t731A.d!p c z'yfڊh{1 M7IFN 9:!(q//t;|+\j}cu9V4=JUXΠ4,1}54n;2;z\1dWAjx3q3 h,nATl?[ѱv+9 C˱,XGtd iI[|XPƃ2WVho/EI &nxeT))6x6$t3@.db  5d':üt*!<` ӥAK> JwNAYqzB.x31i~H=g(*Vewiq2)S^<.;gźѥ ;Ϧ~YIUە=u6 zҽ++z (5$G= )ZdL_Wǫ=C=ߟ=>m}/T`dHr)&D-GDz$AҨOOj}S˃An8͡3n VfrQ(|^ⓓ5 r! [uݨ!c~HOژxƄI%wI:!+!3X9M] '=-rU$sZGQ{!;5;2r@bA&e _UMz=}[Hi\~|j ֙J? ?y}g,Dlg@p^Ǧs;u8v?yGX&]1u4yAâ} _M6^wA>>h qz2 `&S@)mѵ%pGV7]ٛHJ:%E/6dm %\ȂJJPRgÏP݇A}|9n4˗~w,z])bY 1 5+t2l'oJl쨒[ IJ^}7H^ukO/⎬Y *Ӻx H=QBTiJD'1 PtN>ۨR+-EPF ;fijƴЛix'ٌsՍ60 InE&rPAȅ,l4a*H>b:B)u8e_f eGI((H @ LgWHRk 2ju~Ih4Nh0:0C/N"!OӇKR\_gGz/鱩 ԁ\( 'ШPI-T&4L%qL`>L3PbϐT%!q6|,w۽NE FHSy0>eWVmdQ'KQ5' 412I-&`4&my,dL2h js k4DFxqV?oJTWYEv4jQ7Nl^66@9{5r! D[('M@9irb(hxeR #1ʆ dw)L=J*Ӷ"^(Dz/MWWCMEƣTQu_/3MJN&Eȅ,k1ȅ -2)L $<ǹ?˥_O<с:6JI5p[ G!ueY7q~_2ۙ.s&,,Nohڀ"= [h60~t~Cr״߰VxFxh$)f[R \K@CFRi%ނLجQ `E- -`{y FPZKnxG엎bҥΊkNN IzS@mΝ:vBHk5XEhZLY)L5UL = 6M76k(B ciD7&FOzt#dkȷ'q'D7$?2"&50_kڲ/@F^u;xA5U.y&R֐ȅ,{ݧHCwnt7hxGK;׺nJ*O&P ĮE 3fMLW$lSE3 .hޓƟ|r!!1@h޸U0+Y0ƵF6 SȡUÄYH ӭalUy)YX H넪/J6BC6 I-fP 5i}r! []0~:=ՆY4)6#Nև9_HDWTrI`q7Wu|GVf2KΖ]ĈnH&Ʌ,mwA^ü D*xeXȮW>|$O^N;{LH.jP b9P '}ڌZOꅚZpF e#+qQ 2G^P$i禊:,%ȯcrOTGV lÄh%;>I? Su Dgi 9\r@:$؞wS٪%7PA}AŁ|Zh9UC6XMƣӞq4$/h`di4* VO.g"e \B&A0 :dWjVo^8 miϿ͋;敾 k`@/;4E/W:q)*F7-`k8 Bp!'A_jӮn$hSWPE=q;GIZۖoM( p+T'{C"(3Jmy;,ĊV R#d ě 5r! b[ ]_萿0h/WhZw0Ja:` H!~Qvh$S"K@\D-j ]4i5z6i[?ny??4vvR,ap*?xAjEϡtĤ+M׹P&}ޤms>j` =V'2u`S5I 0*`dnRCpz*fNީX*jen &3 uo'koq8رSNHt#xQwrϨ;][M}ҊUռ5vNr:Vwd䶎uSuCPH$. q70jB8-|>SȧGfA>w"ɂRy,b)^HnT2KlPN~iDo7ř\!9 2D>o 2y’J??i=/Zao-qޑQ:h+z?꿯F> XڨIek[o4t kiUW/ITz9LQ>Lu mfSxZC |\G{扄Wi?ƁWAb(ɼ.mΉT ^ :gf7`J n *$\`8%ϴ!$dBi \ȂjGP;zvLH %m!hQ?^^{Z6)w_>iR">~AG9t&ݡ>r<Re٢량5r! )[(}@ҡ+K83f!>e m$4Vll|\PN~y'MU4 @40]ߗD'#PNu tyxo2A.d!i ac6B$;!1 Kލ|z1+(<8vmX_NA}x" /h[TP0-[R7 uC_b5Ín``8ȅ [(C@aǞ2O Aa%~[=O ?㫧gڼFzڼIo{!<;q;4.qIpq4Je@ƪCI%-#+ir9@E0i՘d"|&-C@ 2GS#a)QNȯa܁jT+aSLNG9ɔz_F-!`t vhㄗj\O u7թ;]o>x4'c0;F Nvd,A D9j7C:kB091C%](†{6sTU\mF*CKL`YBzt* 88b"o1LrdRO_Q #`pL "u= RLr\[$&MZÄ  1L\fpJ/ |9FCj]w~9?NjJ|T7BWC/q-Aeݚ fЗ+\D7+RkBbdEH\##`%:y$$y-&Q6> Xk@T"gRW9ČߕKk7 UvSB\%v(Oz+WkB0#13j(Y3P2SIDBw/Oz%qW Ľ>P0m #8?]=BC,94 mMt JOBuY=qp"kXjd"h c\B0&fLOk)~lxHz]*d(z+2X3T5HcuS#A*ʶ#Y02xAOo`9i-?xFٷlOJ{䶗e&,_*G03wvdePVz0m(^,0ШQ0 `c >g\k4tOF*S4Hƻ '[px0!ޛ,(AQoTi g|['K+B6d j1Z4PYKy22 RBW6rGV!sUuZ 23x93){t!ߐ*x1eݸMDĽW N׿I,qSEǟ)k y NJA*5HbhA \6NۧQAϟcDP RdQ3Z?>dl/M/ѧ d1%leY mSȶ0~ ^Z~R-XU xG2x(2MȨ핣 3k=}iײch#\AF_XI$3r&>)LΛZ m@r?ڜW %/#+5h SCYyANAK@*oS&VpЅ,mtE ˓do_ 'j8SfM#l\$~׏hdIuĩgdxZ kd"h]B*@Wt  L;ӹ;XhV-fRxމ쥶>[`JSDNx6%rHhUtdlj<59̢7zّkU0htR, ,?JH @ʱ"t0FBrI<3^B>~ׯO⹶m4HNDi?Kۼ"a&cm=F_& -EH)}TlѠlYtԭx=N&<рF>?CR 䗀pP,6VJ3$ekap?+U꒺'@""nt{=U7t#{®`٠ U!6Wp򶫥ac 2]Q3t Lt! ~[&`:9OV&J ŷL5=I6} ~N79&z?%{aDFؔ=跒UVJ!z).(ȃ##a1vzt * x g}_đM  Uoӻ#+2C[WmwAH܊K/8ZÏ pa~ i8m# yuo9:֟5~rqM(ޫM׏;2ȁOqCd˿⡈K\D-$ , d#ߚcq>i"] A5.a|vDeqUƇQ6e3݂.+v$H>i$jӝ{^OBրQ' k-d 5 54Y!Q3~-g]4F{CA%>4L;>̲ Mi?E5Tm%L>d"g M\B hfsww Y0_uy@yhg_5yBG|Q275~$8;Uxk4gkqK\Ciӎ>e0I5ob&8ȅ,m!pa :5MxJQ8R̨?+x4eDչ $[g˩lPյ kB&]ȡRb൬CH{AN0 C_'9 Ӎ̈́">fB H$fD"wxxz ΍_h\^Whz]o$ 8QYQi4M{ RbgF@"v(뮩hU$I!ygZ#N+d.dBq \ $$ouSwt"5 Cz!Ԥ6|m2 # [%0&ZHF:aTs41&t-M\GVz3fC):QfL/kk BֶAL@1HyP%FxWīV/s1_9eVmIxɳ"?BE z.F.-yRǤ~pVEĹu]vȶvaC &mCqwd((aZSqm 2Bedx <ClaCD JM,c+<Ɗd^(~k˹zYpGM@Be9.i)K/m]ph*k]ctUa' VZj 2Ԫ[3%<¨q 9(,Lʀ`R"D3U;Q=(/ 1D|v~[έzߟ) qkLߕЫ,_NB-'6Hw>.!}SN;t2B.d!m  ((%RP2n_*PuSXYYr10:qX'p=?OprFw74OB~֝){!XY-[ ~Woyۘ54r! }[h,e@c)Q?~#L"ge&0 Z!v7T釻D:Љ}P٤#w"&Ҹ] WS(9o[E u"AEiktu DSʪ" 2j;xG31& h,nᾔDG͒P\%/xu̪COӊy $J3 ?s5ɈI^>gCӔeRp -ᚶ$wddyϊ}MJePeO/fw \BMphJh La!KV,|Wue|^_iom8I.rC4j d*`1EMHO{"CY0^)r ?jϼ֝2Sn̔eD|k2q9!Ptʂ<[n5DN" 4Nu17M¥yӛ3@k!2i*9tL0iƍl$Rt3z:LSt0Ң 1IڟA&5Yb`cIigE|C*!" ^$EK"3UC< 5w'N…QL'”1.LS-) ÔH7'?aKGMP\] DXRȍ?NL{mJ,kK &ɨLwV wp?iBŀ؎*]Ed/mqz 390{ȅo-̞2`@DF|"<hˊN4̸m9 9㶶iz"y0+qU%$.ei #\FN0r*d?~}'K]m,moɯ㒓ohWg ۽NқI $GpX2Xtd[R+]/]/Z%Eey Q #r@Vm!T"zO.zknt<+[\Rҥ& û4tA2l9v'ugJ֛7C!G[uPL2wk7Bo~S.R*b-4*K'f^c?⇉Vj<w(JC״`y0c>ʲ"=~B ui|QgNJZ(/|G7HoQbxDNQz` q{YV=[pi(g"k;BvwSA벎*G`X)HJ7q([`1+pEyü?﵅7ĮC<1xT-9$![' ^A% ȽhFEKFt?xt[6I 2JkF%>X]RC.da59-k@թG֞%{[Jѝ~_/\aiE ѐs0r{Rtf=+^$kXU1\s,$k EUWkPJ^$rNSX;zB:&)4ɷ0g=jhJ2rɬ6E~f*:vܑ>}Y?Ӭ|wU9@ 5"AVQ:Lt5^*<7}44CUʴU^g4!O7:kx@B)L8#(5Ь+MuMݙKbU&֐fȅ,Dm!i>tv#><-8, ,h 'Տs3]޹\͟H{fzR,5e4awÒf겖TJ~pW<ݸLḐ YPqK | y7]p,ImwB4WQ4H j(Vo-oc_ZْPeIV2TUR=/@qUK%PZCA!E,(5d-l)h h)H=! +>J'\X}ջvaIjYi_L {|ّT܄"0~AI'0* z '5#;I5fq< #l2юlg/LdxA>٤kXz>)JKȅ69CZ!SRk*[l$h90~73p%67 /hdeɍJr865C_J!x%>yQ%r(M߀1Bm-7.teZOXGa;yquI_O]~zR?މH~?DI ߮X&~e0*HdRV6\ ;0]##emb'z/sY{! /gt G\BFp4:h(HoF~)q?p4Z]Ƨ(2]EMs'7lDY3J٫4:RT3ޗx21A.dal ; 3|<{gp_ Bjҍ HgW Kō}2 oPg?׎C ykTW hU՟+=k)~־tm]$ sKxz:vd*mQV=nFS\hf=pQHd}lt cʣIBODdx >|$c)k;,݆. &vDjM]0+8m`i%NNta$3uu*O9 E/)뜇 n4O-}W|'=Ti(q4iԩz^A4^ RO+g*wGiLt^`8INg{F9+ TJ^qՂC{*JTk} 0'ILv38@x-M1AH[<<&{YըAHIJ7jN} Igz9Fv,ɾS^IjCV((H|񑭛/;éMe>Q?)BRF"eXgfmn=hl/ $ڤHZV)=L+?~;~e4.O6fm6<( 烕Ӈj$Ip;؁/݉LT?-ߢ;> Bkˇ>^׏_<)[f Rqez`;^ \۵۔aYn$+'L h;8rH}a0Õu`7{ 5r! Q[h}@SYl^6n XX~=P@"vl[9Kr1UMzƃ|Ғ@tʦhvX)E6M[\g_io}&LP4ȅ,nh EcHQ4L]זpJ!G^Q~7Vc9)G_ 6jDZ%]>>PߑdUG; p 5r!Z*Bs[2Wo5r1 /%rɫ#o. qJ8+1| \oor)<;L ,}9]~[_( EgNuQx1q=t/V˾\Y[zݘ꛴zs=ۜg}qGxw$V&a 2qIX4ot4>6xoǐȣY?[N@D 2"zM?ʻO~G| HY^MU [r@)wK-,0_y`XYyqu_/B(_C̈>z^@QCe9fL~mD91#' [SQ2%7Ս^I?&~7,wg`V,dɧ  ]@eykvUJE?ڥkpTz =MR:ԎɤƊ(ݩLH¨PY-T! *mKfl=Lat<;`2M|rlPENrI_lj WU\>L,I;4:D^QyASIeh+} <fB ͐jNϭ.E_/5x#Kk'@oq~o=}':|cM7B(A.{/h)Eh2n#+͜ =%޻L!͐ YHB̐ XO{?Zg!|=#ܙd\?4oO[+MM1dK[Hr )AƑMo3.Y=!$dt2ΰ3d!A|uIgq0YO^M@nFIM"nזZ6m :iAqwdlW$%VVCдCAp=]#B.da6iAxrڧn6^‚ly/$1Dwn MV=9x'2; *`d̸0t"KsL!}KHY!3! 6<8b /ɧ5Š檜K]?~ߎu B*ުgSp`8nݢ5r! k(67 k_IP~:~A-0ƅNj}zmx\ ^?yz\wgz{tqIZ~cК{M*[f9WZdžJk%ڲ:hEAE<=y79 4jB +i@&>i$.|z_(uE2G.i]q;wߧWV =HldL *e P)BYNMe {bY{)B 7b P X fuÃk_iqL'ä0WNoʰ" (䆍Os@Əwxl>X5Mp""˸3-ڪ5q 2v=O[ 'B6Q `J/>K_8x\d`=bvP^UY{*o{kZNW2a׏zV tƥq RmEd/h\T@CmHJQrv {~s%H=A3ozH(o]v$M!uOel;D-EI~VcY#4Sh+2n)J#E=4eϴ T+)!4* !~̕i ;V}ΟV2m4B-!)ٿ CRI& }Aƌeb PŲ.iO4}%RE@f ݸ쀟EA.DNQqdwdxp2i-YKP(d A0łM"UT1E:C#+%.B)b3^L` Y.2E}3u=4\ +W0kb'p 0>"|?Qd '+M`Kk'n黱T$ ܴǦh~JhDH> =؊DWKh\AиAɥ/HqW=h`S/,Is"QwZHc IiE+ 筍8m|pCE V/S*Sd&%52qY%EdSs.K|&2ѻ.dw//KQT>gch"MBoouc[$jT:JH>sw;PtM?a]YE4μkt! [#&䏨H^`hfNKzy|$w wV|FXf`tLs]/JɄ s ;'z /Ǯu.׽sN4zYZ?}LnT7 >6J)Da@usq?T)^ G9E^R:3rKYh}~фv6!L V(NTyhǶjLڶ7NPy+ P5j9AipEkl4UΓ+t1B|fkv]n!,[ i5\Q+=雺90]XzMkP``3sws{j4g5k- jCƠGX fvztBnCxE6}0j]a4UKs30WSdBkL@Xhi"L^S@;u.TBgZ- H{h6C;2*

zdBp䵇a3gSj2_vMfC4 GMxX PFO+JNOGu Zic@B ZBTDQa3Dŷr,Rw>D V$E6V@R,K.~'{ h 8VL$8[;BcZ&]>͈^$/zOP3[hEك&M&V4SZ(kّP= FB=Wx{m6`Tc}Ya(Z,0g(5rQN\355 Q8]@OPA[|hE ڃbP#b 9^?s/\Zw>}y~ց=L;3HC3mcUкVl*}WWxr8zY{a03)S|]D|wW9C,;dnDc*{mwjw>$ ͠k?)ޓNKiAC1}N@9zfX9 n @C(R#vRP ڿ.`iq὜#%1~=?|˫ݰmL%8V.]cF t -|L(P=A5^3_IBۓA.J`$9͞.\#p5\ҭ \xp8jED&iҠrm_TY b`AL0 4"aIIxkI] ]E}yku)HW' ϿP%8l]0Z.cVCc/2L;!sGhdVCM7>eoW,37 e^!rPGB,KrfPczI,\ߟbƒӂ^DA imR_0(.sqP/[B^ u/Ԉ/DzqLa 뉹{pkVZ`wՠw^xϡ\VP%vKSjW%5uӦaPKcp5B#@3hiw'd ){~)^% vє~c22.:xNʑЄ쩜oOy>']FV.a@tcmkںiiDэkI|J˫ >BmhEC=P# ֩73yoL$I4 8:=䌉}U`M<^F+;nvDE^akTW,} PgC#WU C|b:[[ζ4"!%ꈔruK.1_QT}1qMYyT3aB.6QWMH>yߍ53QRi 4AC(S ̊hpj:[Sʇ!/i<(aBQ!ph==ܯ&r1ˀAI)f. 7ࢊ\؞iiZ͢~B24 fFZ ʗC- DnI~? ޽q%^=ӂJ xNdro\ zNeNiyp;5f"L &\ tjcچ+@ D|oQf 6AC(lI4ĚOG#`R\ @ ȳu/ި g//b4i:PYkjlfɤOnYe 2AC(d ߆DzwNpr*Lc{ކE >@9\aiZ)nd2A@ZKϠP9[( BrPMDQ4HQ»it_>Ѩ>=~u$NB9<) t-TYh3=VDSl }!iiDCG M6%Edۓ:wnzq9?'SVz  E}kQ>_D': '24ig4ϧoH>9>$2E\d܍@d*gJ;{V.+#֣ȇ': *H_ Fcյi+l&fƁv ƨI,T9t"Bi?ۿt%ܽwy]Yј*(?j ɛ,2_Ӆwud=I^Wu}e m)dBFŐUQwhҽԿ,R- HD{h&==>juί>xL(2:<t^4^2$.Av̋bj 6z(ϕ8a h\<BUl6hEHbvEmmm[(r=|\G)p5#յMZЉ0tM sr~]g,YCù|Xng ״ h%*hSđoB="=T}= yW)a'){wM weI7o]ޗ:3~K(&Κ_]:_]"Ω/\ ?hlԸ'ʴގineWuxUeK1_&ku&ˆFk[;tC+S6P [Lh)(LP Li#jP3 ]/6֪и,O/W~\-L4^WS;r'KȕNq珵 /Be>|7wYЗ{eW{IY?1wFR[Q. c;YGwʴς;iS*aa?m? N;LYiDq$QR-GQ>Sx_h7iag%Z;rG2m{|p`BS< CEfHc0$Ghy >BnhEfD)R$cqna<6- PѦ5%?q"S28U])Z9ZCa䨤24w^}:wi3Ώ!z6#{X3ql,`ZF\Rri#ߚSTvuh ڪI70߫e'R(-(4" `i3̏jN;bkpWQ@Wrw/պzːpII6i+jЍ24K0R02قdsi#̥`.?)DrUrǸ.)\z>MsorܕŘ&J(..ٝLW;<#Ɉj1(^S$=3]Ğt䝎1'V& [)v3_er$Z$6/M_uOv5ĕ^j!#) b3-=%9^J&OlǾ"IGi2[h8p@zʅ¨tQ"F0*2}Уf#& +ht??_no D}@@sYWʑgm/FiLN >.e2;状fORLM+N_Z9դQC|/VQzY+;:SR7պ'OZjc= 1ʅ[z`4 պL#w߅zق"4ˠ1dm*"gcV iL}eMv7bCIYNKZ{tKl e`&5P]UTCzxM 3 ImIgarGx<]tn~{lߠ{vfŽnK۷Bp)AF4Q}NtLڞByS'{S]- H{ >d$3]ד0޸4"L€M?QHݟ iKy%rRL75rd ,i"@b״bM_1>Gh(S-wTp)%4¿suuE?vKI&pZ e/2ZQ!gL- 7jܴGۧW&h8#J$`t e=!fzGICOes~b/!9 N9/Q:wGe^밗SxETI^Q+W$y|\&eȔdW(- Hl{>Nt@lFIO]O7-aqZQOnU_IVk?ObACU@o:h(Qѽh.!:SianHm&YrAej%3zV*TX EK#Xbɖ ެTQgD?B *P=WOF诮c g*rtM wHgaDW@~GG=+$pXmG:%^T+R#pcSѠFrۡ7jc!ilдgKPc:EPgY2ԺбY)ByH3eur/௖MPShK>S N\SyNa:Ot4"M138F|d] ilBB`W=Nһ{ˤ7/޹S C sn` Z)ۏ5eB0y lm o930{5x~X~@u?[D@?6Pl5o88hŕ,ІdvH]a#nء+C[LU3fq g-:EC[mgh.o_9b0}kW06*yBdAЏkMoa nU݈EMM0eBBS{h!) M!GMip!soz)W4:\}됶?v>T9F/C"K.#u9WJ ӍCOյa@.Dn! zMˊP"ar1DŐA.FBNv:_Q1eJ''.JGV N0,Ҝ;{͐޴E#ԢnNW]S%^A.g@-=CWG˯6>ZFu[+](- H{P!B% *hˑ,phVRP%g]<4s8.2FO3.s|s[.!klq/5rfc3vJQ I, ;/1%2D$d?N_YY#֑S d\G;0Mt\tDk? /LNRo8m'^Q#4eУU-}g2W؊!V}%C|M4f塈`J|̓KV+(4ҿ=dR4I C=(q(@'KDe^F3ef$اkj8H=DMϲP[B 0c|9?9~v]u'yjqpq%.5'&媵颡0u:sP:[Bt!c0' O8Un FSl gk~ZH0pٲb(5yB+qH9*3^Ag;=|ca" }S"ӻ1f@խdKK0`]g;Pyzl4GwP/[ B^cf4Sŕ8&_(PjE10_>:#FMCmPFrt\iCkj!IPY ub]t12tާs{&$^MpS.G*_=˴i)Vy2og_ez~_VHk~cWJOz sD0- , 951&ƈBlG g+ Pfh Mo`P!˵+d Rk>Rӝ/P=@#ӠމmazIWus4?evAj}8ުLʸJ/iK ʭT`iݕ^Yo1a.6*DAZ[Q:-nq'.D-leZʛ3Eoj4"1A- y$pj Fvv4&R0\; ծ"H9O:.PҲ]cmh!HOPU[BN12U&aSY[EV#U0GFb2e?) d%(/j) _۞%mߤf蛊jC\=B)nA"hER܁DKC) %VΜpd`NWseu?뫯&B]JiH]Y3ZR X>E:^:!$Q'& t dRⓙ]'.>z琀ϨO:‡le[cN\jGt B}lpE+~Hj.XcnΤK ⚝OZP:5GȒtIV,֤Owa3vJaC(BO8 &PGZ`@k+Ͱ{8_Rm.0-3~@a/F\RpviY, j2n;  as%?1|ϦPNBv cDjb|mry PφpTL73I; *tMS8WJmKQR+ YjgC(N T5xZ\K!:+_zѨL>SDnҜ6ruߦ+?]PlSMǩy穪y7(o0V]$,Q>} KD|"M|ZqLW\V\f4`4VD =ꍋ(*qz=>(!Pdp2Cs6]U~-%6JPbsYhJ+G ?.q2yG۴UCF1]K54ǜK^A"%>7Jd$>ȞMF8bi|H7C.duy{4Rr>t)+jӛif0d @|/jwǀC(Dr qIghBFXa,±JQTF}\t Va\Dm]ΉD<ZT4x4,q#DQ٧!YT#Enmz5/=2AiJg&b#Lݝ=0y8"c/! QnOL<uJ~]p d^)}q5fF[hށZT-86S+gB$$RٱY , j9)aRQfB.*arCDbp^}xќA.Tۋ~| ;J8o>ÚËƗ+ ݤ^{_kkg+נ /O$%D ȴmZ9;55[ (;P[BwxT&B@L&,FœJfEC ԏ.B=`,kzs9Ic5@sUշЀ%&5 nI{Q.'jt"I8~USbr 4i G/'F0i/1aT9 7*٣3ѿ9!7h3usA 硉.UX+oI.Scl$#?45iUwz 0{A&u觼~櫊8-򾗏kVd%jpvx슍4+6.߹N2.%{%[v@+ۙp^/{zBڂvT0a2h{Wŏ9_hVtYh" BCtVrVn~!!QLI-V6x#)ăBڃx0y8NU?{v~t}[ kְc_㗀hG]%V90Itz=1{x &Ã]8 M/NP$=6DlY?u/;W:n W$> WJ"rn(&44z}mN"6ElqZtoܓ ӝ۵,wɟTsU~86*\gAoC&/ Db3沧iRܯ}c:yцE^nuڸ_l ~)M?auZA+f^CzQjz H{GlD qܽ'm бWDaMJ;P2\39)Y\%|1ttܶ? ?ǘ^NN:}{A"PW7T$pNOPg[B)6bSlMK%̲N[kl q .{t:Ӫh~oYQ@^!i~yi;&'jxj vxZ8Ea!e'@.+ r\8%.$X{xj%jcz$S~)taHsWJ }͒:ɧ9o- Ϳ>}b3!yw^ֶI0LcOrc\I"2Ԙ >s08] (,T&rx rW6.髎fIQ]Q#c; VpL >BmQhEۃGkq r Ǖ'yQ8JVrIB;LJnmiL[]Q+_Ͳ DZcewf(qzh{:Z R>5Qv|&\b jejajq&lt"(y5vX">»1Ij9^}ʸW,sdUC4rVbi+ssۚk[LkZ4{:[ ݇`2+Yq;l+]٩]X1˲8fFNOMMsPR \̇JTm=XJKQ؜nPP.4"\r3n|-5W*=]KmԕĿrQ7T1EkfLް+jO=Ph&4 5|P=t!]<64vCo3ăLdY4HrM ;Z-< H{x:AjA >8ge6pW+eiTX p2ZgA/ Oj~KE6,1]Q+ُ5'mLBð&N\MD{4D{8/;#MB]ǡ>&Y|<>p= 68?w_"Dqڲm%Yp.V.bz"Z|h"!#ǙTҡv7\̮ ,F9-&|(&gmfQ,tvM6E)7}UwIޮga/RP=H" "^χ/VI۵ 8;#h"._񙾳_;wެb(K`8U򃰀Aq v׵dr Je >Ba{a$i$M49[?DqcV6j06,T?oܒW iN|pZU0 q }QQRc[Qsn.;32{зTp9)ى_zg~Ql;S׭q_~9t9۟7UwمzSOOwbU9O {4k;PGv΀4{0&\ M_ W Yйg9X˖;QqS[/@ct[)Sx(=Ot+@ËpF&˹>bBQ^Đ3\֎m+D;(q^R %b` /hZ[2tBC>i`=mG?4//XOc+hTz){O={ -%ZCGvenV>Xv/9K4P=^"8) rmS#qByTz/zMkPvF|Pn[ŜVM;]fp5Bƕ[=ks vZ8\<=ߨ]|)%- ksN/|Jw~ZXߦGaPR"=BB=Gutj#T͠Bs].\.NnM_hNR =|_݉;>TE'Dmp-gDt%;mA+)momߣp%nj¥Z(->34"!ڈC.%3F¨6CZ>O E4&LIܴ y?~_]!wGr0p' CQe2?`Xr@Cph=0ƇpC*Fu5գ6/>>)C6cTvLjU]]}T+johJWwpG*Pyj#*PY~qoq~ tV?Q9sl+q" ;v<"L$vmKNuok8ҁVZW邞7xO 5>t}^{2{wnNWa2fioOZq-u-sr%bfn SۖSMa$Ar@x;. CGH ִ@BR' >B1Lt]H{6Z￝V~F-DQ=R<+쳒)CC,[Ew\ye5 0_T݆h:,3+MCh4i2E (]+ң(P$= T1P-3PfCzLǥ>jF&3j I$wA#[ZMW>1epMOҤnuwiRc&jsp}lad׌o>Imlz!yEt֍Cz OVig|ej^{MH)r"cgSݹ*~M MU0Bk&"4_Q=҃Nn*"q/BaێrUL4"=Bmqޡ!gNE8M84 g6 :7+4; $[݄yq?+om5 PT7C F0轞@ 32^xyUUsrLYyg>S㓊 6etx}ҪsL\Q#olp9uOF@ʬ~}#|2&hQn hzA+C3]ژi$Cnt8~&ZS=J**)Ϸ!3"[ .$K`|k>K"}p4%xx}lïJO5ƴi )Y8%Tޥs)P="6z$6%i ã]ݦ( \duvOwޓ ]/(W-*g9|:e/ԴX\ضLۦ_NA{Cgy}HRKK\&Sw^rF*ålߦN˕3Z"\a~ܯow ͅL/ 2ur@l9r•-T4DИO&j~ZTE⥕K? p@{>"^ r$\j&\Z֚TC1W|xj)pk[\NTW#JTy?ģ饋v>bKb#\:kLMys06SsR 24"aAd3̱\؉aZxƳoYP0n UNKR''ÃqҦOH:!t ܢ?L5C+ AMO=@3,FOPk[H#l`3־ ֢.ZT:BW0LIE]*ȞguC"0hW;}*iZo ^X}1x6-.K5Džgӱs hFe:[i "fTkj8Gsi %á!ItGNpHg~XchdyŸ]LCeڼ)]T>!ZO'S/H3L[@  >BinwhEg#i:r0;4sXɬX-pȿP-IKw+pu3 }R! L4Ufnh CC(R4М>D*-[k 4Ӧ6`C?'O='Hsfl(XjTGm29Qҧ?.fuoqoܡ+F γuie-ָ8ZoLxV3WCÙS XBApcGQW?z>$<6aQt+jlmj au9S|nrbBC(de4dEgSxz^kT+Zˠ*I uvaG>&/}Ȁd&~"yIfq&bv_Y^yW¢KK^Oqjbә}WJu?jS(T'80G](-` H{!S/]z0} g:ޫIAxǏastN} GoiQυKheaL{]Q+=m: 2guo j BC( e4 {wsMG}Vsjܭ0[@>' Y)U09j=Bm4hEi 1 X;s@EZlpsPշ!9څ|I_L:sIJ?HNۓKrRn_:g;X=P]QJj)^JC",$5E^ K6L|OΈzL>VubBZv00F\]74 >R hŰ"bȡ*2\fj)9ZVwjWliFv{ˉ9s5+ #v gi /-a8k.*\.>]Y4DG5ƻ-N_oD :8Q}Ma0L:]*Q9)*OoB)o٠!I9X%AcMQ2C7iV0|~9 X&*]|%wx~)'y1=N9̐|_or(9ݴ1a C*kCPocauB:|KR1t[ONyztl֖;9QW9{ XR~k.CSNb B7BVu_Q+g3:Mm55 Z:#N7PbK |Ƹ#>cfo})_ڈEX 79B)-73I#:~)'%\M72}m_$9tbt8bH;#1fI~b1VuUH3\b4Z;B$=Bmq!ihj1FŘA-E@?N߯,%5X1a%yq+%єOz3&6N:=UaczKKÌmʹf[ h8/ %oQ z}y ƸCNTw~~+o g̘az>5-3M/d& >[W=P*q'9*DWpXt+lhzc:-C6mH>Br;ݪG1ÃMxD!{ Yx 3qRٿ먾Ae5:z֨xhG~"Vzayp Bmm`zی1WJ3)+3JܑCAy%}=> 2wz Vfce1Oy ˣCJOݜMo>1?A'$/FZ㮠cvtc6ܴ#cK,~F[#s[:VX+=M{{rGVtj#{ߛjImQ-}rZ)X0RU@&||dhWĊ&>Gma0ud0WW2˭=ޅm_[oGKEz#KL&='-6=t-+9@^@%MSҁ+nN+t% 5=gC+dQԪ4p%YtI8h ڤnh[Em| 8 jmĜz@,/vLW̡țy<.5V;@4U@(/JF@RF'aT8q"vb۹`S$eХ?մ@׌As-7KUQ|$ ƪcDu!A:ҬU`dqak5ѿ]JoTwz?kyP$9Vڀ2uR*))8 ekZQFbpy|@et X̨߹jF#3/.T3:R+ U)/q~Z|I}4{`4Q-p$.* Q>c,ҎB^l 6@R7\.D3@^[+sGaaM&fW +ν-;֓ͼe6̠<"auH@ K$(|t;iVvv24n)aZ i[@d(PϊHa S`jl抒ٱXlp֭ E ݂HiE"5x,yS1*IY1ilYw'QU_l;ف֌u5 gLbo&7&47W&yqrёw¦jؿ&.$|aG]ϫH ZL3"1ӋڽC=njlca^ŃCsI惥S;h-醡NƖs*K CA)/ SO̡PTy"߇bib4ZۦѨ~a%I(hٴ6*:]M[ J'2(W;DB;|MV1wb;6m9o5.Iѿ[HIrM:ҴKy=, ,Dun6.H >)剐kt}rFA/b0{]}eut #K>ٴf28/؞})JsB(.&L0)C)e!x\Jؤ;#{M%}U3(9=1)xctu+lƴC&2|ScMd6!+n*.dȊ +ӥݶnQf|xNԽң8{J]KBm7\YO6DΆq,$\t[kByP6"42EL .U82K^bcF`pB#T\=h[O j֦kl )ս5W*ʄ/T]aMֱ-@PEZ 5]`dkkIs˰ޕ %\wx/4k !gcr(L]I]c@?-;C+ţЅʄQSJRR5Bi=}tE`"6x7{jɗ>25I=nZly.#]B92AL"!z8268b+U>ϥTDvؘ(0Á}kR1-wzVW=\C3=W X5 ) F+M2dx\ۡM#יg6 eLP[ HSvbc"NoսK$n? ֮$k^߇!LZ ?{~K|y"~{˷tV{߻oQK⚺5|oRD6b$IK@jiJU=jf$Sf}IjOqz8 5GC &+֊-4J< tK?bwܙZ̋(g?k'_cp ۮM%wnB&,7‹xYsL6>T)S郻+lDRl|U]`nєjB(S._,8*;EG֦P(Ԅ*ott~kw7w<,YÞ*~KnY-=&M_gӃ.,1nn6)42=SlLX8_4uetQ[8 ]$Kͩe]Iza)CROn"K746}WjZdעneBMn/M cLnlMŠ*_GGʗwsEn]68zm6(1јty!Ai֓$&\3dEtfԸnMێڒf+':n.>uO=@޺o4yno8*9z?RH-߻uRygWfm)so<1t=6Y:]F/]qbt eZB7u=TWB˰PH JgM L)*{{YZ@uVkW&MRMG(J`U稂laI,R6 UfJڌuYuӣkAH9VM]Q~b ĸ cFH y ϩͩXs脯K_9xM0~CU֦7WyW0ZF&/&BQ!ssI 5FdjDdI\u[6F3|OjIܓؽ :uD3FѺMsW+h-1w`GOTQ0Dva4uԈѼуw]e:*ƇR4H /!ʖ%s&u׌TMVj]7[Εd=NZMezhe1,R#,?\Sy5g߅ nXCƽM#-C Um ?R=mBhezUpaP=xBKﬠ異z c(pJ'lq|qst5T%|}oZ A[:AӔKUArČG.}1cp?fg:in{^kHpQM޹l[4WJi3mLs3m3v ZlIg~*nAR4"I5&??fOrj;Wʪy9N_{ς2TrleҬ{2B:3ZPlej3`9 [^Lҗ\M L(&PPPr0+{<1}Lhz"Y"(C\AOh.zEmT:O. EcvMz5y-C<rvtKe.Ad]tIKu`ΆNaވ߻+d4LJZt"/xs^`|ZN` H0O6FX yo R*M LR NhXk8MPrK wИ`9o-zYlPۚ\e4u='|;=Rn;he ܅w4101]7C.$WgvJ"ɆmI2j%xL`}m$y ѓBehĸFøƴyU픘?jFfX/PQ:|D vlBă઒z=4 ;cӎȐ}c$8H!9[9Hf$G$[> r||V[R9fGԇ|샃oy_xyL`?`pC @3WAtp=m6x%YhvM 4 kӰ̤( SW dOhVP6!6).0W^gT?/pk*IF]8 ևnZfA94`~DDBSmdVJ E642 ";ژh!E I;z/9A xRM&hPZk@%n1";BeEv1"ٱ^9vdZ2}u~9߱Y~^Hc>$ECH}=%ES(U&`Q&]F-2=h>B5\glhD+KI!E~i.4TN}[bӋBKsV6hFsI8v ~h۱i1*@ݘrTXWr*7A 42U@ig w2톌puu?!.!!} =s]xч7wp0֣%:Zi -=tq!-tHic:E:HoN_ i$,&D+0 daIL<:3b ];&CkЛ ZF\壟ل  bdCdDS>:\A:mzzj*}Gw~ +-vaw{̭:Y0 .!VئW>qIa2廬/=BA0Dº] I3$2$r'9[[ ~4S4-a?N?Ӧ_-)9V+F@g2#eT}zv\tkl9͢GUM Lc./:/>:AW{O7?TWsh\/W1$`.ںk+hTf'diofR5e^.&Q&]E32!L3|_27 M3q" Ӑ*ϧ_ഓ u]#qn^uhC9yugfgt٧|Ǧ9{$//ĕ5Sz<tK:/舿I/3y'ޡO:XB_ݽ:ӡB|N~vKZ I`' `xm )18!+(#n{B642+8(o}c~JPmxIdb99VmxYF$`uogSD~vQ]LItDIO.qB,t߲x}4Sba&zK//ݬRS}(]I*rO;*]6X򍷲d Dih6} m5ԫ m0 /U(!^a3 4Ӷp艩39-jlװkt4S巺}=Ϙ'@'Կ_ϋ wE9"HGJD7,Uo}e@aQ0-)'<1.0< ,=)ߢ6vȉ8>5V̍.z7`J(A)i I%=%r =Oo%^ *hꖒe8&] =Rl"JheE 1Q20Q2Im:}oWӭ4,vXG5[fU:/}p?On=(ٵRm|-9d#W ?ByA /D]S(R(R"|n(R2a{!.za;N>$n`-񝋸k a$J-z IB:IBːڴG͝YnIs`V]3+2+ͯN؋$h4hu0Ɩcx0mrb.ӳSƦC}RӔ6HSƃ,聕k L_ !LL"}-~M֯& K=ӢQGͅ h! c9Sӷ:3{sLf,!V~@KlXVF3+ Qt,ʹh3`> i6{,FϼThDPw*CL HFx"|ձٍ v%O9 I"as_4z?ɈdGP/RPK_4ղ4~<͛qDϧSz*SMf~]!,<W$9\1R.^0HUe إ5dYZ7= frfmEZS:w~"BĈ ʄbFd@FD;oo6[3r2EAa<s+J KA*9 I"+(a6zcuYC'JMvaL&lZM L!f>d>D.t9ݨ JNAkTq ؐPyW̹} -n`A(.`co}-wh2)0XŜ E׉?kߧQ+l52Ƞ#=-&Q&]C#Bn-tkqkpʶVd}K.1{Gr)ZBTxϕy$IG$-=0tQ!s݉ 詚d_CjO3>&q1MHSwfHƖj$,]znA-ccDc0 z~Q5)`@T]<-pcUOhBrU!~>ڄv ʄ ccD#ֿj}q<\IlGawq4f9 / RsĶ1]O[FI.dA(.Bc  og-yz6kX4D17'iX|hLeToW3 >5ʂp%ZZ;Jjy ubU1W19-,hrm5haU?*uG,8" "LZqeBwv ZJЉeo*f L1\5_TO.9=:,;fFw&n "bMsA`:hf'\vYs  w &Ǿӳ*&HQ&]C #I!; ?S u؉(ШWvNxJ }!ݖ#9tW=fհpX3y)x5&REQ-M;`H z&rHRV(TyBF˿7!W3<Gk/;ȸZ5)8պ2tߌ,ôԣ/꾬? ݇_?Rb(2nbƘqp6 ?,pET~2Wg+ *w:*°M:b4#͞Jz>'<4ɰQ}S5ƴ*BdViXVD6c Pp}֤g7e\z/.A\ %᳇=l[+|lvb %YKT&8w(s!nZ[<.{@kLzz0؍6}^p#CAJ"闊vAAv1Ƹ'ߪ7}y_y2F`T <6ZД$NĮ Zb/irvm c1Gi$;Mi\GKF[MTh L[hi?}B)*<( ;^B0&tz2_#7{C@w"mA -bfٚy|tzz ՘sú3c-$ghd~k^|e£˦A/\tL,<8W?Ɂ]gmTpmuI*G#Se>0=j;}3;G̮߯V.`I8rv@2/q7Z4u+1B,z(zda}̝O._IL:?sqa"<.p̒+,h8PK:aݾe[LJFΛuEE+9>$yӤ]/(Tu[  9J<2OnJ%y!Ɠz!gԧ+|ZB68Y>c)٦ӲIJrI$T \LTC:IQjpИ֌P@#5,>Rb02nbL:p1tW]C 1v`}y $s eEd{p&׭o|@xxY7< rЛ MiӤ1mđ^#-(Tm y4΄ eX1͂8FA~><2洪:I;k5vۇO v[tX&`83l5fnf0@*d.jGa1M3 9W;fS?gr$3p9ke2p9 %RS>+O`2@.ُU*޷!2̈́)%}I)')əaM'gd3lv/U \]Fe"ݘEn"eXW=m/UxGe Mrn'qNJ}njidXQWcD828V0s`.K<.VC, s NKay+"}2'6LwX'Gvo [h*Fd2;a,eii  f;#~09창c71LO[Z@𙗊u Au c1kԉ}ox>͈p[i/"/mWy;''غP@.QýBQSp.ƌNdzM@@ffO&>.z/IĴ>RsT|AƲKb#_MO^MpoǕ) /Ō=ɚ8 AzkQ ~$C]Џh A.  $h6a?&~L+av]}Ŀ\>Ll2b[ʇQj]+!s46y7ApA mFu-)Kl9pAܦ5Yt,KZQaTg-b"CY#螶qI(a|.nJW} .IZftrx7DWDD7D&FL%niw{-u?!NZWv"/ig`((T/"]A?EOtb#v+}s9rlr0n, su+HYH;,Wis+~ԥj]Qej 2H̭qUFP-Rd'f Ia(flͨktG$Ca]Ya#*,kSUcƘ TV?D6?&FL>w?E~瓡|vIe,N2'9[gXg cu>rAA%ig):{$tC_*4tYY:+WUpQMp{\Kmp'C I_QZB筮_͞?G\o7B.BhYY2F;mvHj#sV?J7B)3>Rz(2mzL Dq~n6e$LzcMIꩦuRW^#ZwV*P:x>ٞiUieP4a{$s:fcb@dw?JN 7KYp螔T<>OzT NXWR=Œ ;v."ӌФ-v8o֚(\![cq"=Re8nTM)xMʯY|\"閴9;^e:5RpI;fڲYࠗTd'QUd Q&YsTRP֘ Zν7bZaLY?tӘꃮe%}o }qk3Ks̽=dg΅Z9:uRʠ7`TIӍMGL9TUԚ < ]'s3fYgD_+VY(߀ =81@2%JNzh}EnJj|jb/3ۧO?9Vc۞BzyG:RrƏrZ&sbO,v6UgȻUm uǒC}}dq^kMgH&!ܧ­n%/!.wo3]7 /r0aZLT?tLw(g94NCF^oυUQ1'd3P'%OdEdR&ITopywb oTy Q tݍUGmUidk蚞cVa?D6a?6~lysq6>ʓ{ ߴ,Ef1δQ6Ɔza0iiJGG:J5 4 1cs^cGNҒ Ԓ '!q6g]T\Nɩy;W=P| Sn@"p:$JVmǧ]];Ƿc]rđQOt+~ϕ~Pb(tM}RİJG/g ob-)E0[ oU;R&|ɊԷ<_tjj6nn\ik7mjfcSWrǻӼ/)uJFLz^J[&QeJۄ&M94k4ٓtW,+0@aD?sJ e]sJv%6ݘ`7M4Ε.qd6VBeDAedc*樤i \ți_4 ]1\@0k $܌$CaTGޖMcg_*UBDp7H6lF:nW_,DQ-%Wg˹VE%xվk0=y>» Q;%iGeǴ?%SJk׈$s`Hv)$Q.t6 O{,֒Pl|qr_%cx~̀8oy4赾9>>$D6.j\$+#si3!M11]Gzɹ鹕J炐FejMAH\B3ub{7g:z7:Kvwdr\uDַ3PHN%|S}:rşsFfgw $}3 SjK0m3 L7D'\dLAɸ 1$Tg O?k%_Z_M? @^>ӌ] UX\ĵ\  L4]!}^@94-Yad?bG(Jճ Գ cΠ4{oŞ\މRb\07$ `i);?fR5-*ȝx3vcv8Lc' )#uůwJV1/DJ61/u̼@%6g?_ص,/)nN]k }l3 fh)/\rh=q_0rii^5p&.;-Q|6,u@>\]jdQ@KKYr~Xiyy~v^ z&@^ }6 t4SY=UlШN[kz􄃑bC.@YM;uLC?4w[֡DF,%c _V@+چfu 5>ƶotsÜ*+JrBMl<@Tp٧W9zRK^nqo{:BD9(lΛPE3:siS0;D(:C\һ˶C0UX[ \h9ҁ<=R"i(2 n"i꘤3$LڷAz:*S p/q:žٗ$Ld\iHp273M#ige:kumۙ%?-_'FσeIu`MLc0unZtO'kKJ_qyCŁ?"Qp$ॺ;\;IG\/_=uyY2t'Z*U Q&MMc4ukܛLNTq2?ʄ f1kT`S5Z1"!Rc9M:an؍"#E˒΁ԛyi2T̝kkp_b/]|<%½ňasMR>hKýsGon̵j, n׊һ~8gU"N:\W.;mَFrƆoGg% nfC ^uzU۶IO82؞,MoBeADMMs4MqR 2dֽs}k4pii\RdS ၙp0Npx<̚Jn+n! æVtxizUYEPeD41=d;]b~)oF[o.vˊd kEQvKN}og$cдjQ:06=~#n l1gUCAgUTMj19. <*=}#gЉ?y*8|/sE#{={0 @_ҷֲLGx=Gu0M5fhӊđ _U0Dn64M4Lq۝};Aبl%4hp}єG1R|u~iob:Wh:رFKa馅Wr޸đaxzxϢTrx/!bWHu-+bWp3g,eK&"o@:|wct.bmݡ3K;8St+~ҥ^eBAi4ūA)Jj}ҜpBtX*룸8 LH%c`, yaK~ R^i'+~KU ) T )ibaooɕNp.Mg߿/4nQ/5pЕf,y\AshŖo\eڢI/0o[-ohol l=BA ,E-S ^ilٱ9rncZZ%#76|SIi q*#X9vf|HZi_*U*X(S&Xaa}߹er )Y!jLGӚ1mWaio*GLf &^Rb:(2$N%12ԑUI0=TE=U~;N+~$ 󌓘R-+ FejA״PpYQvƬCˬ`sswKb8u8-ܗNnI$L{A\I#dg㛾zb`灪F \>&WRjd@AidlClä/6i~߰0].$(%k=L[Opq%p!noב9,?]38rh##H;p0L4-%#6ѦZUQMDS-SP7kXPD?CnMm_5分dg3mz9v#g:F/w>VD>6mLCxz{wGgKs,x)/ܡzƛgJ8R:|oo/$40E]x]2~NRʒX}a2vK *PJu QM~m ;1yw[^%?p4;uq :?柹=lz-?62p`L8N?B#9K?ί+V=z{ ?"v.8v~j;qB^R&m&w0,xt\#CRsLWD7Y}19f 6IOE'qKM>K a ~!vRbUctϴsSb86Qiǭy ,)D hcl`b'r0~~nPnPBXO4\LbSS]== Fd-t+~K ʔMq6Cʑn75@KfiFRVѧ/*i٨/cpUCG }Ѻ19}sB1*ZSۺ][^˒ρJP6F% *!i>εxLer ,fG \>q)tek"}n1ld۟;Ѽ^4i+16SG`XYq7Mg/q\}+F:/@n-UtIڲ(q&$]iy#޻}yjᲠZ H&ڣi.C{Mq {m=qENWH ^i!]ua vY6TN'達jiBAiiTHB y{Wpqɮ$)_ LU\>폶Kf^K0rnK1/*(&I.Cr8pШu{0҇mZ}Xg`wJΆw>?# 1UFΠm:!iq tSwHwƳnNӓI w8LW$"FZ2մ[U QM I3$]!y1El~v_ǎ=$ 6lA6Pnx}1=^$6BĒ)_v|ŧϏ8R BiK<^EۖNa4 F/S%$an < \dwĤۄt1beiwU;Y+YؚbJ$)ZL_۰B'34FvҝT=xôg%bYUQMG]ַm a[_/5^ /Q@J{$YE>=?t ЇxEֿ*?4_!hEY6^kJyU{oo嗱S`I`؄F)tCHad PJY_s/*(& .C|.vkrt#S'jؽ_޺WL9Ԧf_s{fmw%WAZTKw VbBժܾ _jU}1Otl7M0Mc#$c+5Kz\Tp'7}l"i2$V׸Y{==5rnBc}}z3\1fLw0Y6U_u%<`w .K :m`2̗aˆ&3Cy eP=~Z_LʾٟAy_+tJ|o)t(S6r2ߴDź/ |i IQ|ma maQLi+~JxCAIxNpuzubGS"|bXn|)`f|CU=8` >}q#g\6q?R1Bn(21mBnEQ97pܢ&K_Yz|h)0'Sʓo4xrww3H[gfצkv8udm:5r#߹pUG`)=Rmd(2mmdy]m*ۀN?ȭli3&*p(&,Ncz9Qi?3b,ok (pY9>ٮ[LLH`@D;& k=m_ M[sTW7iiy;NwđsOA8gK˒ρ>RzRNVeIN!^l-b{zzZ/i؝%8IU?&m`Ǎ[>1R4M8Y>˒P!OO[Zw&Ex d=Rnpu3 40Y#/q,s+2. : t2x)@ǐ:gaC^Gp`fiF,"P|?Cw 5w{9 IOR!rm% ȇU2yэdbZd"dh'i2bdXAtN.ckhqAfZ˺s;OC=G/sނfQti ꢭz߷HiB#Ɔ.j}Q3pAc5L[tf%pCznceI^MC/Cz4%bה=-M!"X=fM9iوvti8vvM+GNY'U Qĩ 12d8/3^lEXbJ.Qč;x)}! P(U?T_Dc4!c;%c(U*(S&eI!C6.CL %HRI%r>Amѳd_x @Jn5 a6gZ(i;KڤsWdJE}9a2@@׏N~O6Jϰ< (("^zlXMoZ`z4b8r>U38ы_(6,((R̸ɪdɖɖX1T;gS :`8>ԄS (¸S7z7.:7}NO0_{{N 3}9i֌vH70zh #f)2ǧ]U$ QM$0#05u_O^8/+Z[*+{, LdQa#b" htz##u}ϪT` L`1SFS4{D% ZuK%ΞZ n!-K'ipicdj]O% uWT G(2lBH!!z;7@k-4 -DMGN:d%EMfЄ#:i1$!'U@Z^ٴ~v8yTT^޸DN*oAA)o1 Wޗ`-_q0,MO- jn1D2aGU5h #z#T1GUUQMS"#S"bEA4we .fa_M搪sZoALިC#\t퇆?42G W2t/21<'~x*WaH'^&Yzi6PK]tXFti;cߦw#56.T5Q&-l,55(㇯EGzlc\>{[rP;bLWnv2*Ҥ5ۉ52^ζU[Qi׋f~D= Fd$єj Aj a:RG:_v>'8u3uʱGcMxҫ+DH2 ^ueiK~3x1jeY, DIZ17( ^v !QNYnkcѕ N+Rv's"U82L5Xz`ezتǍ$thZ ;"Q3楚fK:bX^`eb^jŀc ;-A߱!N >ǻ Zl'Mu@{t G-RֶcK42,,]d|d$\tXƈ8 'zĬހ+|Yrz8cíiХ78r6U]NTײTk:`en0nbo>*8=  z1G_OS!g][jB\ˡ64\-ڍtG+~&r˂("9MTTÍH*OA׶Bb{^r!hBIdD׾.vԞnn-=k̓$pfHwc0/cOD02,. Rb)(2Xڃcd`\83Q0.pJ"g~(B>:iS88\Ug__U_?wSN;77& =#f!;KT̩=pnSwM__ܝhJ% $ 01fa2]>}8KpAqt4tfI*CxDG#]=?2[ S*e^|IlRk7svf (W-4}VD)Q]}wI| lT0(g6ml:rylMy˼7ʘ31=.pФ# Q|! Sp~Bӥ^9UЯ9MRB_&z0CGΖUSΟ^BUeAD*&l؊elū—>_vU#\]@gk F,4WL4FM6(gQ_O\ȹ5:rQbOV"D6n ĚyFO+KR":<-Kg76|ӄoM74Y`kŁ3}@Q'JH*vj<>R=@(2=m@lX@b=qz; .Si-Hx,kF+Q=ҿOO;uӂQ$9v'i3}PVD66&>,Tٖ u7*KEXnW_VLAZ7Lo&mQj4;"aKVUWfAAfac21wt]p7Knd6K;5y4 bsNͰԸFMv5w4.K9a7kؘ̰2CG@iS/ (r$0ޥԽ#p(Zrsg/p ooBoe’2ukxGi+[^y5 艕J.ft2nDl $pJȗCǓq)_1=ﴦf4Q>(RY*  і yBAqbcXf`5B=wkR 024:,wDnBDl "g=~dg"X/ ~r$&,:W×dC> ڶi;sGh}.đg i! GzW~=(2Ao=3GDyy9 wX40"Jьk&k{N_zyoCYBr: WQ? 3 a) s320ҝtzZk / \$Ï@2&I:C% "YW{=7f! $nWP#VΥ"YvPe"لv1QgЎH$s;;{ yd$fᨌbgt48xWOup 2<$<fH7pn+Jap|掞^V1 *&:À ]{bwҢܺErXF}kЭt1ˎC4t1% 96?Re<=B7*_ 9rH/E (/5, $`ȒEETp}*]弭_5c.imۥO/qdH*m#BA)f#RnjHaD>)?X[roAp/!sSpK{\Glp8#~|f(רpv#~bi=R٭bK(2mbK-3lXIq~ޭ-F7I4RjWHmsԴnַ%!a:;ߩvI.q X2V^)EЍ4cb#e1/ۥ.}m?gmizrciBqM74i[KXFl-f σeI^@@MH# uմ<{k񟢜n v)ֵ۔|?W\gj r$ߝaZ{ϋLY D׫@zQ-c2t4݈_08˒ԛ:f@ p8J'=-I Bs+[ʺƨQxichdtX56mJ|#}P^,(RoibRɐ"_[Q1u@r=;?~a65j_D'>emHaFfe%t1@%0L؍%#|"TEJu n t[Le- -"gP'`T]@I$~4pM\z;\^͕ʄ2z}}rI߹s>KZ&21&%bO\IU{X.Zߟ/Qϟ@r?HIk;FέIRIf(2Iofi9LԪ:R:ܣZ2OtB.YtAg_e &+}@R=w2k;ߺm_1:ղWyʩv'hk^܍:L3yX,@NɷqqYx*?8Y/@,unȲ &K&u~VM?ym!` 1Zeq;@^hOY׏f>;:qۚ"9!'T*UQ&MN; ;my~F zL_$x41 'Ӆ!/-? ݊w|F e k-rH3ER8kj47@DzϴqҀpz "ZPe"ڄ41 £"zxBxݓ3$RW`6)@9|(ܕxfd>ַh[%nJ?9!= zhSvD;5:NڧJ*#H]F34]%!9p y.K;l|iy*6,ڥY:D@cuiJx!,[1gJK̋piީ]NZ9U+x\y,)NBvQsB;m nCH<L_+/ nNsŝ7EZEӼQ< [07wDhaಠ: Hum 1G%)ŰḾ<E)-9?}r0mѺ7v<0֣mzv}pctXID4m?Ṇ黺e# /2ˡIpCApKs1-s1yYF]Y&_ p MK|m*&I250LXЧ g.qd}VgC,U \ MX"M L30-30{_0_yg%Lc*4+̘^m4N BG.![tIw8a'3MGٓ:W{HT LI6NZNY/}eATߩR\o) X VTUܢukMt |>C—_(تi:>hbEyKCbD'] N1a.;/c8!`ZN۽f:۽i_y(&pY9@vhƠIˠ>Q q ܩ^(¿-KxˆʒpWs{Uhvnh"yAi j0U0 VcR>"'4k杄v.KB;NnI'i'h^6=HZ/~OZhMه,gnm0 c^p$QMđd/9=RN(2mNژ;i;Q.d1Wy{,mပp)+ʅ U@ p\D ~DGBi뫊q`7viF^rQ=R]J(2]mJ*i*4/8p~1ՙ` K)@t*׵:IwCI#e22DHim.đQaCeIJLM0]̘tĘ XS>?׬"bYZ9O2TN[nQD)3M@΅^ D).nXgF K%8}3ȟG՟.:m!oLO s\Ö沍a_y5U?;][ʷӻ:^Pt'?d$lKGl̖k a?W_}[{C?8IӍ:_B$Zy] ?ĮdbǶrúN<7<8R~˃**}2xoOU Q bb#emDn [4x5ϝNg}j&g,{ol";xz9,VˏFiy6gsYb91*pBA)pLKGLctq`TF"NT7 7 n $= xI13t9Â:ih>}uzdDݶТrM]#+*(&19Oa{b9cɞb;}YE~{yRs|ҵWd&P0d*EYN;]pk=MGcO]5a会i,pY9nKGnʮny)D- !,.,w3)p9)xC: LQIDKGi;ȮP0z&BZDH.S:STHPk9Nn$#C&,n^J[gIa* o‡BS;(t$C7bg9$;ZBOTDH LDH.&Q:"Q\Ey)ɭdӢ~ud) F'|qH Pǵn3"(UM{'PAIdt#bf'΃eIC@PMJ#(="(>|\3hC/%]9$G>f Kt& C@| ( nE^ܷ53h@n% /zQ4Ns[>đems| yQE71}|NofHowN\[].H 7?.%jaHcGg[%u,u-z␌_:(=b5 s& Mȝ59Ah48o"D9N$.5;f>SMkBOT L>F 0 O=>)ψl:oL}n;vJj}μG;8ͳk.ϾMm\{Wr@.z.ݴ(IzKsb(E Q\xv/.8Hi ڍ(GOKđ7R슟YVQD6Q}LaHa| _{'(hݓȭԤs(dǏAV] €0;WrdU;_\*UQ&ME=D=epTB ni٨1N+q5@TRuU Ц=t.qd G˒A]>.z.QڿZU\Yl 9x( 5G `"Xo%AjH\#qeMk8Ms 6]hV۸nBDD7i 'fFt_KC:著jtAAitPGGڛ IE|op*`R";XZjiABƝ]ͨ7Fx%(oFG K:ڱOö;櫟kk;:`d>yGQUPQMPC; g> )o@Ǣ(!pn FKm>>,l&SN5tfҁ\`\ k^(,ȅ(˰ bHcS?$?|?\닐/ Ӫ00Ns FN(dD:!ިj Ո#eadHղJ3W .7t2$iJe1a1 S{W+1~ؿZZ/YB@Fw!+SFhc%02P˰BvypAAIi1@gR wXFa6eĴ5z/-?_j? בPۖ6C0L~eGsrYFPerF 11!uWw,J(|/)6A߽-^N߿{:;  'dvuS}j=!]w7pa"oh0#.v5q\VqD6qC] p8bs̅?}7MO]&/X"(\no/ɒ~2r9Nצ!GJZs(^OT5G7"\5v}ڍbÔnP>V,-5T.BϡT> L>!&(8vM/BN8fGm޶.npkW _OGOb%؇ n}SoHecaR?o{[c-%Ţ y ,ư bcj_$3~8pKuۓKƯei{⽦fWnvg1H9G2IiAaznYWYB+5*ǧSUxQMx*ɭ$2)Ou`E+28!EV+N]*BM}ǣfF ±UQ. 10dy o~оs /i"E_ ߻ڽ՗7$ pN +@B?v;jp#;-* (& aYշ~nYjLKRe' =mwOn%+7 >G1s8.,:^/ݗ$Qf:U5=-`o~t % Jҝ9J.  $:n iҒz["?ʄ@JdC,D!M8eBpIfb^zpXSKfz珴⃑}<2; i?||*?ʒZUH>M*o)Hĸrb7J{&jawRB"ۮMs_R2Be7qҩ3MoUߍ}9đဪʺӳ+O0эcbD"j^㟽'ǐ`f Ky-HD@"t+@H=6i&hdkVWұOS@Y4ޯ.U*(&bيي7?Nsah-.RdK,ߣݘ>O.&Cݦ )D3\Pfޘf`'$s&zb7R FߣSDٚ׿qH_乙0{?oI 0m<m~N[3 M˛BaQ7<%˒΁P1F(FD(i;E?{rn%ATRӗQ75e@zWqa5.|dRBTj<܂3s>hdRy ,ĸ cdbDdBF.L_fm?%MALKp}}s+qt%~_aŔm/l,$vVԿk}W_E$?$+̤\+f$Yaҳ,\2MPC#Bo$Lm^KK6LpjuYژ3/['T] tb[\[\ یP[%ôWEkhS2=R;(2m;ptědN/!/~%MFopX?ﰗ!oܮ͍y7_P}#-.R-S%ckFlôD`] FZgW$D$PS48)[F&95b|Lj| +Y]v/Atna0GiJ|qA4rn_>2e J.V&!oOj)}8͏ ]_ Ƶq3\L`$W]ʒZ~ GF 7'uFF44lґdf젙?e|zR5Q-G]XG|ufGfY,}鍖>0S"ukw΄'W/c[B *iyW54qb=rK8?R- ʴ稫:"s8vx->KޠĈJ/H p4nX˾jROcF\uLϞW"j` Ai` 1h^:RrfT1gӅ$$/tp*_.M\cDwG;G43O2_FmFG_fK9F*uW5Q- hob.5 IoC|㠐Emg^tG1H/n.tйed`xCOz?a騟 M"H#g#%B{eIOg=EꩋĴGS"'m8]G.\IFST:baQH#ojqmUҀ82rv~ ZJdAAIdab8 %ӷ =bpqlςF_IJDR!&{JlI'*-4w~jm@}kƨ]zaC h銚]^iۡN:0-jۮV$|og*}P*^#>.Q&8A#E8,xbLX&t$;nr5'9֭)yR+Oun]g ӿZu `d*2KaڔG,%)a|.Rae~>b6)&fS )r$4[i]LjK/a߾I(1$bS:+m٬id?LmeJq=mbSL̦dSo5}vG \QHy SMSK`K3pY919cys))s A2snK 0 MІt¦OfOސR6\ٕ82LwVb< ]7d&JƔEJFgGm⩼ Cvq3W§|kx1eh$3U6JfP n C] 8"<2y,)ȋ݄yDJuԈҴȭVFʧɂX褊m*A9C%;_Qqߋ˃ڕt ܌eشeˎ1HIӓvJwNWq3DN7q36f,r3N=mڲ$t[NgygDyJE*f˽~c;:/IF@~Dzź/8xݾtf{R.GChN =82:ZqO(U*V(S&VYYE\,vKQ̻m~vz%5XtΜ01т u(xP f};Xm Fzi-<m8*. Wov۩9Rb z‚ZjMIж$>=3wP7xp;ZΤgK%L]+~"BZPeB1XS#Xs$ -^(%!"lq(sZs \p3z1_#v )ӏj@tIgU*UM(23b0F0Ɲ~?IfQ^9F'/u{R!{T1~>*'Z'<;+TV'c(\T,NȚ,{FMkʤOyJl]CAIl]StMt͑a9?=L8'#L~ae3m6V.(T"=&8(0%vibGdc&qt.K8RoQDDq`erNM8ZR@(KEUa•3Ku:K7t_Ȑ覷t34CBdܒ#Ij#%UچFV$D6$uLY@A9bU_]V]"~I9XLm?܇.FG:J}3TۖO`r5ޭ%CjA$8K㾴ՁTHXt!ɪeG%VE{?zzQb7!%uYDooœJ~;.un7_HWּnWb%K]Y+Ul;\t!-KzteM7T>` L)T b fC{Zإ9D}Y2Ȟ&ǟfZ5'T5irô1VHO+^R"(2l"hTđBf;c7~Oq=n[_{CT d@y ଽ#DHtّDü^302@ԝS-W4 ERE"l6M J4 Jp{MV1(SNꜤ&wBXٛgM;#|2gz_I\r+2l%uD]CeMiNm*9W*[I쓧6Ferބk41!U޳/~pO~">Λ:\P wBsg/k=#/aJ3ȐȬeܢσeI?M(M 4;gULec򒥖6K=_Ÿ{,.6%,[S M{KM]lX0w쭾 hb c^B~ ir" igS 뇯c3\& B <_GfM9Ḷ`dȠ+|od4&f28{nW-XjZdD!a;2m zBb3 ZE5uqomEiҗ%Q{h6aM=4%!q1!0.HQdOzTs3}?)ap@JR qL0;㸂aMiƣz:pRUv%+풷\U@QMMc4pTx;1ܫjvI+}:W}lf]cA'oRP 5!E,*n(&nΫO@Ғm}Ϙ:RSWJj{o^շƣN_b^}[5"Dk% ʹ3/*(&εb ,ݖd- >/cpt|ǣlzad*!}^BeeAD2M\Es-=o\s%"e{qiꂫ% HшubH4i0|\όM^Ȑ3uA^VLPez.1ТÁ^B}q.)n!%A[R%<6B HoH=`lpo5N&>{IbwtJuZf5n`dH.>\UUQMA3- 07HZ !n󫳳\+gk}б}aX}l0;c!BnR&`dzNa?R(2lZhZx% KRF9-KʁNcd#_gӣ0}S }hƋtGiտ~u{T u(?x;_mr~J9΃u0-i+tioÂq8"k#Cq{5Ny&$sp&n׳KtA$UQvOqKH7雷MvDV$N&,E7}/q䜥 pY98v'ƜD"y;`e"SA[!#a4c0GU! #gN.ГIbXGPebG1"\!]_{ ;xjKʓWumӠΎoHځWLYK1"WDB[Q'~㠹'߇m (pj{!A,\ٕMqS֮*`\6Q嬎ٖ sAA sHDH:"3{LFp(SdZd|~W3s+f/1M&wy?iێ-`,Я.*(&QQ0.ެ aц"{:?ئKw8/qr _WzU 9PEr6]trp, Z! X`3R\0灻MW^C!\U-*(&}MoO|(MNd"S":Fom>vu)eY 8-OP0uf65oud1ߗi_,UtwiC_:S s7 ~'^*UQ&MBS R Lg^X2zifN)dV<Th2MI?+`m7(Ǵ6˃ŧӆW J] ʤ]bvCvozazsBGU]I='va|ܠSCFnǣRl,v…Lr+~Kej djbCL%\ZJas"{2-Tu0cRۘaI$ݵT L.f:d>sŤAб#]F;Kxj ?H>)VtÐ6Bn9sm,*Ā(&ĠLOON2i9NT m$q?Q} "\kW>"NWQZȸyD 9\nPFb,QaBB|(p^uBW DB7 }77|0K_-,m#"x҃%R\8O}q Xsv ?r ԡ_p+ouڝ ߀ h!w`Zu=) II %ڨ FaI'<'T(,,(VcRGRt7?+b[_ťDž|{ȇ,r( 4.vPٻڥq>E֏dÜk&=\Ȑ"ٴiheAA(EY&)ŜEOq3 m\Z2P\>ԶetĦao91ۍӮvX)vN/U*(S&98CIt졸,ٳ<ݙk~P3; 15BafTFBPƟNߌ 6E7Nkh#F=o090gYUtJTe Le>F zB  /" aAep>,~Q~딮mg^PŽWDT)}E"L%QQ۵6=Z(-5}eFb:@}r#~Q7 }77x׿w*1}ne-n{H]ųW̏S ΰ:_k\&ŝ\{QoMr#ޠ~hFpے-u*u鎠+m8~%.EʒͰ-YmױN|Uos 9!g&jRT;ܪɪ$*30 ŵh†%{oQ {BA(S. o F<pt1}\FiD_(s>sKr_>w!rN<5LWoME.x?nZH'*2CՍCg ZFa4[%>heJJ1Tbbg(k7gLpu+,n5u*2s'Pzp]zp4WM+N~*kv_Nws]qa!DuvU`'~mLrE S Cߚp▟y\7A#42F QVߺ9UFCYj"1jJѸ?&Eb:ۖ(vjU6G]͝Mӝ-&zQ&]H#=#GA8.b. `j%v^E/M۲ s)CZSR2?mS$so+?\+,qd )J5۸.3H\tmJ<HD\ߎ6ٽəkQM Lѻh!MM4㽛E^>-d$\î4]+IwW_{^|d$J&;/.Eݛ|krZMCF*reHK1!B@Dr]8$a_N/ttQk~U?U d$O5bN2[FHKIK7uv4= rf>гu cM44}s8& 6fȦGWM Ls<>=ߝOc]^rf~np3ri'Oyb=negY2{-(&Q&]44+z,cTѹëjdA+=]rdW׶K';B$h 5YB]Z^;˃Tqbz:"A_fZ7Sf4 N-. AI9,ov L!oDoNҽQUqb&ya-hcjՂ鬗1ժD+  Gjfoe19;zFrD 䴋bZf~@ 蝈YZD؊RGxMN-^缽Pڡ! Ǫbl>hJϹTD0S̺0cxf DEB E8.?e(X9HC g9Ȼ WJR;џ,U}!Rvq.XIؐx^Z#qLS؎l""}6D9`3ϳ=Q~YQe מ0ss]PyCpQg 3#ߊ~<%$bFR ZZKZM,|[xiEocnd(a!V+K'ݮ0~yf$ _Wz rԤET{`I|^"0Z%7 H mYJOl_7u)oDU邰JU Aj2dȘ!C\.ܢ[=%jݎ_?q Xy8 "_WkOh`]ˡ{Hb$;˹i; Ba;hCYp @3@"j2_M L01D &j:Ƀ;\#;7־Z @fӖNߤiH>sUb.&"Q]DcA Tཬ\LjdvIk 19qwUQ9V*.ם] 7sD|>R g5J;w5zAˀMx:=RAX)t2-43npg˻3 N 4sh凿lKϓ2zS 8ٮe7c*[\w[3q7Z4KwuVx"Rmk9J۠Ak1܆K_:EлYm}9 2ՈW JgK/w$3 .5A hCZr/&Q&]D#,d"з]+Ac:צ . W[d |iqPW:_*M L01F&|{ -ӣwބ~#&<*X=ӈߏ W;a-f..jL=vɲeUN`˙i I m8A(.pbIh_);EvMe@%|PkU[9,kk6|{aHO%0PUa8`3_jzۑֆ1L{D+Cȿu<𣻣^Hh\8W`9M64K(ΰ}ݍ87%O(rvTb. s\-tlɰ??n;5.DO\g\.?ef;qbFħ/ W."ni*XixJu(z^ }wSwŅ4#޺l-o/99wB%]а  H~EGHWڂ ێ$&$nT8]W?HM҃[ B+_yՎuMA6p0-?Rl"#heEFؘHF<Ϳl#pl_߹ՌAh5$޽) ;,V_sᯠK %VTb<ZH` x%1&T,bnϟQ4P:ބf  Ͱ1aA<\+H,'/*l\tJ>=㠪k-a2K`V+=Rm.heb]ؘ]b{8kv~ ca'/@*$*L0 eچ:v8"R BE0iuoL kV/WT՛8Dwq 6@,s uJX[%eV8+C~E #ih$ei>0V13R{J5qm,VUnLر s}0i2 tKAbw$6&H,$K&󌓡U#g`1"(29f&N'NR4c'4]ƺi}R̰֢'->9D]޸zOt;mA|^~pt)Һz$JtCC'-/;#./sI] WRlBLhebم1bR7A|Ɯj8*glUrKQ7:<#P|q t$pSVx] ĥ@3]ՓZ M)X ؤgP(dC(M .c%r7X\SJr9i j:}^cLo䧿kaד_9J ?yfYke/&jȎ:|}p{2{%WeCǎAehE(1t|]O.Ħ:< "{<pp+  5 _ˏ/IPGd{Tu} mz0-<cZQ\Nzۄ cD 2 Oܔ }K^[6Ic:TY㞳/+5u^q)@È BC@hN׏RLkn pZ1P(=R1A?]w17umodqM@tk*G(ȪS~&n0tѰd[?OnM*MN!(p-Gcpܾ XҼo9K ƴvVBdI#MOC R溭ihKN5s֏ ^!oujY˄v5"Rm΀i@5*2@yN9X6"42Ei2HOZ=&zekG#:gkF~gVa}'W~;r O4COXZ΅zj6}O&r< ~'ВB܇Z?X3}!ں&Mk:T7m$ -g>Rv߈B C aD]J+M]YH舟WC##Op=\A4__SrY`ߙM+ط SR1l2JAaG8b1}wִX:* E ZX_ѪѪzH!hی&A`hBAzn.T&]HS M++!@u^yEٺo4@п16h)݋M bmoӶ72hɎː- 8F hbto\S_[>;T2UuFp{? h{)o3Tw7N>/4z#9&53D9A^?nC nEfvfhf"R+Mk!L}u5h9=CT@DZw41ѬaA$w%m6pU܃Fhؚ| Ht}l=6M1}'ϊn*cB(S. 1&H9_g9 z_-K:>xЧå=9ֵ( !UY&L<'pmڙ+,FK7L?Lwt&Q+Pp~I9JwjETcDvMLw4yCSvLFS55m,&(=\dP) 2WxO[OoژeyE{EH6n CSw8f@ 4-]M.Ke >~xI ib$K3gv nM4+Uk8BNGggW3ϻ4ߎiX2 e=$q!i&aA@$K{8gPM\ LD).Ĝ+O(&C,&+?;\Z#Dhl_s3T>w ʇ}G߂WyQ|.NZVd+;+>-s5I gR'iFikfY J+k*Wh\#M~>"-樴h8;?Li߲ޕLn3  bf*澛%J:n(3t bA1H"Hr/"w:ARx;"Q>nqZĿ&MK[ enkkݖvI]p?:wfƨol.t-g&JoR7342BgiswBE_ =Ѹ ?ZQaI6EYE( $9$9ӴmӏuBi+r-ɠe00 Z*M*429Biil~mgͽ?\%4k"_* 믒F3\ȶ! t-#{?L%QM%ZE1"suN{i-Wz5 y gIJ9݇ilGL珪o6=m`yQ:tK A f L L$++B DhtvnwߓpSx?Mw= +2B(5mLTZdjMgjMW0ͦ1ʹ"F.5Mt[*!6-Mm̉EJ1p"pG߇Ȫ_m= #_1s[9Oq7 Ypq'vtަQv S<;`+I1ݣfC4}Q9rboŒ"h9S9Mvv*%)^iwQ9mLH, *|U_@qen2H0δ:DQ ]~Ѹw$ l$ĈxQ L?pf22/J;)&Dv/m }dK*/`4ªYAЋ#Sr&6Bߵۆt[Rn! h+J/-/w>)= ζlm6ȇ2MHbg xB&Zc)cTw>U\GZ:Ӗ/b#+&Q]\Ks-r- QO w.{L"8Et|9u&&ݲ={~<2e{h?^PjW^:KJW_yL;u \?֎o $Wh6[+&߁BR>҅4_RrIÊ \Ex$/%~ .*%Xm~}"w(4D~ָlZ~PX-'dǥ;dWh}*Z-mOmB(.yyͰ̓SK3l!]fUB03$8 blȸ; ~=J!irھT)]G6.429]vvLvlPo;X[`w>*TWZ߭~t__.$u7jl@ta}>Zd{b.)? l}}L'b1{Z(u[4PceǘtoD_^vt1k1ks8UN[R9"4.WDJT=; ~~)pYM,GT}ʇFn>ūT JJ;"0 Z*/C@$K0.iiX*'@B>P4; ia7Ϗ8kt@tnjBX^6q342f阛Jퟧ>Mk`\?S5Ri]kʚmF2Z m,YJl Lb.j:jzØT$%^eXFuft;W<~x 3H)Ƙim9`3?bDJɁ1d^/>f\zd\󫰱c2ʹ^IFdIw^OI/'ʹ=2l4"ͥ(&{DxR܈9JOLH,sRw^> }  * .CPrJ ɸ }ɚiV#d]O3]*M L"(>DzDؐ 1K8+ߘ`G]=Pph vja h9ò*33{Zo":he.JqR*wi]n+qsf9xC~WrNӆg?.٨3]h&jflƤ72$ xX6 IJ cGA2{cL5x~$}UF=1s"q%m:')h"&[GK[US:h|oZWgZU8VGKS-&V:`3]`t[pFOTzp Dv}SSH}ߟ!piŶo/rU|7I.&jz$(&`lRgRkzNSG3\Bbx ԫ]PlUEjO 9`3vneGI1w}%؍~FFvcK2~FkkgqC}g˩8'Rfz7r>NDTDRw! }|g)fv@B4k;ၟ῾IϋIg FF̴k92cye  ]tt?M>o1y2#VӪidkOP. xQ][ݷhLSE[5 x+֡lॡuڷ(Tt *Ahd 11 !*r(<zYeYxn/ dP'qEU/nHPX}ƶƦsՏ2F*BQ~(U&DvC C C%i- EuRV‘4ufVֻlKҗȢiM:7nj<`Y8h%;*t~PJw*c̪VE)S&t¸[h2`4sW.C4 zA!5c0xXD}ʜҷ3G|h'[qBwϡT@[DPmeceV %&+8.eܗ:IF 7ťAiQRAF %ƧL!CUb C< +7u^E`٣A ibǎʴh:nXhXk$c)8\g2ɱloe_gS*-LS{艶jbMe艷BeYfo󞆸+u0|;bif/ƺs:`ܓ~Ҿ'sZ$Yo p Np@U[-Icnl_C[dA^|4BN "'W5ƚʰ%=f*p91kQ7^ n9r_+W{+4m8Y]eVJXɠ)GuHh]k?HT tRaSh|JdlJpe2@%m02P[ݿ2NJߙ?7aT?.S?TN_vd:Ğf9YE `.I")RЏ#jZKGҟgW-?R)%)]nRK)C~ȫ7Fx$!=~ JWo= 0_ T{ ~zl{"2xj952YcJAk/VC /7|4ȉ>>Y>uI)!{}>$^2V;Rr_nIH|WQrN Gw^>V$!ROڴ!դh dh-X.ZQ&=J[D3Ag=w43IFXQ+ʦu 4!S}CA􃝽pH-zTЎ7 i1yf\:2>bFխ4P|ΥLLBeޅĘ1$; 5x/Wwp]/oqtEB0tsZ'eL2~:5nns=KI@7{e%S }vr7PP-Q 11c2TO#TVЭ֪e;ã?Z3x i)Ӝ%s̝u!\HPqz)T%zH_72Di; oxJ6/42B_L 2'=1~V@^=18kdON1'q q4w޿Gk~)T"õj\ y20or 2]⎄MqڑI_[-ݨ&zAt ʤ|11b2䋗nT+:\ԫ]]hΎb~Ϝ9}$(( he|9LW2SNJ %_+jɘ/&Q]D!ZV/ ת^Xh4LpVg{?j(|ZNΜ׽|e{:Y6xPX'i+ gM&9^nIa#00^AS{DǔUxt)s+_^gѺ1nN+-K"Mfn̩k;NB26(|Vi[u> ݒ`/]0aQ`uy^=J}ȮqM=Јߚ(gNՈ3XM:`3ƺ7u%ZJ PA+zB)ň *?|鬿u9Z;Isbk%`}.Ay~~q_"kV(er>~kyM8O=VY# <`+hUCfݛe\>צT@Dw2&eLU&;ݮv|j;4,oBT tNj:v%h]Z cVGY[%hf11b24ˬ?9ΙU1-H WFr BKSU'ٽ8J91bdc9" -Y$1-XمkYŋaeu9QYZ|gG.{6NSWZKI'W*s2i;K$fF( ߳h>a펁:t"[in$~ƖߡR>=B1B FD.4eiƭtwagV ^3MddO0"84e2vh V=|5, u#達*jyC(S.eߞٹI(F{6O@b`v7Hbo'K|gQA\z=-"J:n@s ~2ŧ;a?'aU(|U/~i?S /mu"MY<f/W0r3_ZM L8s>9@ %?{*t[];5' UW$&W r˜9>\ȷ5dlǺ"ZUo;SɃ̣Э2"xK 9Acrbc2r/LwNX&FCcf -fR"U3otLw\vn{0|-g]{+ V=gQi 8z-_d!>ưr25Tc[{lLɲ<\2 u~t? 3}\sw:M)\AeC#71;݇_h^c%#bٞzH]X~BU]*b723}(>R1nBUheJ*v M1R3NxvaThpʮrOVm&4eۡs2,!v[*M L :D$N݊ sBf-Q!* QK;G>HFYzK9@& j ]r6;`35zvQ- {@JŶAm!RDŽHM鍾 :¸֒ f9?4LhM5ѐjI2O\WLT6]R٪Kg*`aPt>GTkXt2GsRj=D?ݬQeaX.KK#yUfj%AD{G[%z8RHM (|=!aiFC@%zIGk֭ Fp_W\sՅ'm,>Ӄ&iFJyN[Z\*,.>/@$K+.`:Sǽuw÷?f.@$K 4.Tt?0I?|ʮߚl5YC8|fLMbDvm 8͘%<`3kIigl4Q 3*&CDv!)uԄxChN8!63+9:m-(,?.'.ЋѤT4;stkr$רj}4Ma>Łk Z.rVEUXi̕G[MX LXjiѬyDQ1F6evEf°j&zѹ6S5֧72X&Gjң(Tt *AE41Ұ1L>s΅~W!KzW z'24f,H42iǴ3 wVX^Rnfhe4144[4b9C)`rMURidVָsZN*eB%6S=]*8=ɢJלRM %zE41 W"!HBTJ&#\r\֋>>؅`p"X%I &n-=a|-?RImKheE41] ]rK+ݻpC<(L{pJ#Vx]ߎ1\5R6 :F[eѡI~JT /ibA ߺpc:M˨В5hG#W"g%Q6QPq>|zdF$kK FlqSh3ȝo$_hǜdP2$]( ? ĢTu[ |[˰(~(SwE1v]1 )9Z9$Q97SW4iAOlNP-QvJ(I(1$?]AhTt,!W+=~_a؂'Wֆ(/̣. ڢ8RuhQǾ|Thr>G(&Q]8G-NCi+䛌QPƵvt6:˫)2}RAYaZ/}v@l7)42SLiLWX?$; 1W2kN 4!hЫ(;oCM~B5?tdƴ_)\uDH9NSHΫIJ1-I4JQ c̣H~8ե*V̢luEW?qsYD.c@V9RV^rUB$_() {lL'Ul(ǢGYM LKژiY = 2S!Z 7h{.kSߟrԟ:Vǂ0nab֡?Bp=KQoG;}#VI ٧il~7jD J0A /Mԫҋ  -5߃e?.(SVLI"CSD㴪m }G@3Rl=he{t1!aq"ԣ^sP$A wgI2IJԓ&t ZٱXѣ7P-HQ$nhJh7Y[6zyè~04:T' qyqlЮ)wUӈѼt-?R mBSheڅt1tpg$%6"`?½X6P"Byexp/o9=in4I^Ӧ_ ;R(o4_'! lcÔMT@Dv']LtHyDiEiBޯJHҰ. u 1Z/? mCn TQ(yF l-/&DPva$]tp.ByJj|i]lmQ|ڸ6=gLգM,!B? yL{MsmiL ɡMܷ|K A)dGi13O%c*"{570,!ώ/@kڬJp|V`Zzֲj| Jx B(.YI!*H-{tv-Q8 2֧h7;f!@7IHeeH 薄p KB9[.NRN ?,rO?m|R2͑F9yIpb*6gc׍q&>ː-)EbCO Yi=wd9,K&>7 렱ը Pu+nXbDDj"Bl;ؚp h/1z$jڄS ԴDL O=lxe[2֮?k'T~z_hLק\ƦuR)RM۴-vu[]dkbxˏTQ Dv}L_82O *UBit/t"^җs>g).}y/VKRC]BdRSYZZS㝿Qwx (Ϥ 'KM?5KܵY7W^ԭ]R8 MFq~o$T5GZJJKALzI N>z)]CcGS/%oI.`y|\dI7jf-̟gsle c`wMv0};RSIM6?VW!-IxH c@[JhBX?mAީ'Hӆ|7Y' GB3a];-@h&/k-rq3u%]mw-}\E,ghjrSa<=!Qo} ͖~/8 /3F7DKwiIӱ"WIhB(.eii֪7.cDp>%W&)$D|/LZzv~ FC~o٢&CN?`3巚j[sJ5 Ail.2ĸȀ8i[ʶ##p-ۯ?C\ڝI}8%BPi;cΏ{ y.Xmas]TЛtP/V`B^5zpúvQ(Ȩ/ǾC_3}@**]gtۚ4}-W7T뇞h71;429bvّcj8=O۶3f-ějWX8ȉ O wQa@В=i~hq6ò W(ڥksǮS1zi4K>z=]L !LaY%"&|ő0۬nZ n\-nu+n7e˗%~0L $<,7 9Q}蔍!5zF&2VB>!Mjz'ZM0 L)4M3!1ƉLKX~;^fBcZNL"]&﾿R?Ӽ'rҕ=yIg8|]^[q6s*cs}2\nѲ4qdDŽ _Ght)=8 nP2*wP-Q$q4@Ҙy\ \îil.͔Ȕκ~4Mm'-I,Y#*7qwT,"DXvEcLjEx\SozPtF&V$O`eL)|zOv9)-94y%M^)w!EchG4㜒w5!E#L_SeUNEcm%0[ξv(]'Wn;xx{r8Tex{rf9ٕք7E:tu/Oqk@Ӧ+* s8 +TS*M LX1f S#C[7J@ߦ] yqn%*kw'7gL $;O  X,/w!{L״`a> fp%4XWmUj.tfrR5,ڴW[#Ug[*M`%rE1y4fwx )2eɺxQ0'H` \s p9 rӏ'3:.@K@>.g!1ռBS C}JqS0aԹ̜?uBKOnB`Ҹ Z,;pOThDv8c  mczrgeܸVO ߅٠{k]@M%DNk4k͈t84d32q2 ugt2kƘ3,˫^+ /U&>Q&=f;^F_O .L8Fb[Zb,[9Զ39[p 7Fݦ冃([tL, N8jgG?3r:e#;U]P~Px=^T'l-=3;n_ߟq ǁ1r_W{i:D'䠶Bt<2eM J|5- VL Irl.u- ,BZإ{S*- L{3ͻ`ծ_^YǬIT\zΔ51IX~4&EZlL5B p:VDpqޢ>2 e2x(eLL]kAN=0Pg?M#K-C àfBݒ\.@NʥBdRS?KaU:n31{#L3'ٽbxn崀!;/9Jד A-:@I82:UD脫p ݕ|R>G[ e\c>H)i L*=,@IR\iX=+K(Bݒ.Nj5Epئ~N9iwZ+YYApiqk]_11vvpzsnxg'>;ˑ$@F eMzx-C\͗M_߉RIoPpeރLtcI ;ӇWF_tk{2Z.PD<&յ:wCYˏ/Iu`^׈x9`Bz=҄>׼ُiuCcN`M~5U3/!rAjGTBeét˖xro\7p@g6,)hyKkV7XR1/ًS3C:${-g{qxS|*¾ ʤ}11b}9b\wKxظ[2![6cR]mhe 2 :\}'>_8~uG)LQBrNOKcpJ~.Ϭn#{u]i6$Hx=T*ij=].C@$KP:fcbJ 4Y1?tcal(t4{:=:\OK3Q2`6־^#/T&]Bd VB[]Vhݜ#4tQ]K] sjJ(}sU1Jc _| XPw2&fe 2@.'k>MԻ9OۖF0apj~~}4r3}7#77}TRZ*#NKAr7ccn"7 ;-~m%V\G5BMj}ӣ' Lu]a=wDwS+977! ZFyPGBE+oN.^D=#=)~.+5ue+9M$6agȿf?D4o/3T2dQfI߿l!_d#5 9YKP C-:Z;P8ZεE<*6!342mBflXJtc K'2) +&b%$JcVBBrd 0=[)>C7Q$)))}qV46O)YR2=R%A?^39(.?Ս+лYa;S *`jZOS'9W4F'fN΂tc;`+Jtu &Z`BYjwïyw06a,b a~?८Ef dƪ mɪW4Mxꗯ2ik_*9 Rk3P:`˥H-Rl"RU,."D3H,/tK/Ol:(d+]H:K ۾ңwsf>Ȧ6YKЛ~},4<*Օf4ץO aeN8mҳ)GݵФl8jMD!ztzD[]]IGOeVz"1C6!k45_jpg n4*]wny$,fyp]6N@W\EKCz,"/ *r&rVWRX *ikvquqcVRr+wAE&2m~n"0}n"ЙjC-jj(۞+yAp%,XJ7DK:f4 bZYJ}|6+{ǻшp(]=qDݓi͟L/ڂVz*U]7Bp5C7[R%zQF72IU]-sw,ST46Nw'geDhz V.9L1$Y&}ΐ=+y&0V MGhiCy;t92TUUM%:i1Qg tG^,c짉\z4+`|JiFB7`+/v=>`3Ysek̃QyIM(&TeR"]H"My͖%^j'1qb1E8E+g[O礶Ӽs:ïp1o`</4xNH :mjyV 2ONea`j{SVPw)ML4"/V$Mq=2`KZr&-6 Jk"e">0nk逐Z֚rhVV)Jl/rva+M4lx :lwݯuXXvȝ8regO.Lن^mbcNkף{ c0|mi|N=\i5IRL_ ue kM~-)f3-b[%fĀK\ϼcn; K<yvs6ZsOn>H7pijL+CYm鏲ttZi'my˷T7p~;Kt gib,nfӺTg欆6`|Or~%) {|4Fp'rBKm a dzj8k}vpV{ZM4@ FjrX$:Y1ilb<ңWM %41d wlǦ0Xh|߇chqR%r0Yuͪ|Pd@ϣIXc^[9VeNs,!t`5D06\ ^$\0ьY#/!;7xބ*'&^tFÒJk0l ͔j1v) @%)q+\ vHLAb!<951G#7 m'j|iPKmJӔ(qoDy\R\v;e@s0e8dN-?RB>J ict͠3 X>^?>@ `hd@oThί4/v. y$͝j9W'R~E1M>X?`3.nePɖ[…uS]L3my80u{ŕYg=tv_K`@8DocEz;0mlLZ5wk1x-g\ֻ辗mïfhv!0m&ͲXvٱ*O~!뮽X*s+}2)+g;@h'HRh+zȥ ҰJ16_OA+^-8_80r͂Đqt[Bѥ*Crvtg/-iK~ic/?hpYanXhZaJo> DŽHZ x^dE Zp-#=7QɤIfGr`Y2I8xdP]piw.m |z o5)K!aMe0?f+pÝs4HAҟ ]l/Nz,MfszCN4p1I:ԗ;'DPtxo4oe-W82xi#nҪ`|KQsk8']92KIXy_m{io,g3n29D,5F brƒ!>WR1$u(`oAgyaW*y֭A)g]D]S,6Sїbv1QMĔ>&*bywc0O##0s67Us(dyP [0a:b`UC#b`dHLT"Ĝ.!cGOSO+s@G$ж(zsf!N6}a= IcץEvW -vV5wuM>҅ U<&?6`9њYC5qil 6/|cf~CnAsBքzZF$,I-AꝞ otOy d졚\7Y ;!a@dD GPw#g?=0_U ^%DcBEft *@* IZMC6 1 ɂɄ&q"emyµv uuLK@;aDcDiBt qܗf)܁~ d`^AerOj#_(;IHK2ʇTHΫZ`F^LԦpwO24jr{ MhvUۦkEp:X¡5/R$u0^JǴS7]&;ޠΒXUB1 V6HTYS%>H31|+G:AT5?R8-&>HAzz߸NǙ囕H "Kn B% 7eM{q }.7VCcqXQ*UK`*M1!xtԕ؏+92x;%읃ou 1caRucd5YTx|tq/M˽ X.գ3$oO)d|L*YtBӻ$<'Dg1Gzk4S‘j$&C70=xq& ɪ ]uQSuV7R{=%ҕ:YvDHJƢ ݋хu%az5PC<͒%\z:>әnzJ0it GNO'qi~UM! NCê'>K: qb^e8sdgy̜@:Vt账js+ "'T7+S }¾^ U^%Dbbϐ!86MX\ʋ̾H*KHd ݊q)>Nٷz\}r?P09@Lɡ5pEc~0ԫ8TaLd)7&H,;J(m+02l{k)@L-^@~W%%M񅎛3c 'EancN۹Bq10`R:ۆ ~զv- WkXI;_v;[\ǡi[-B(E*#)9h,Kȇ1lٲDž>CK]Ȣ+'V?ҀGLɆ/Ҙ^y ģlS0a/{ !$=τg!("%ҵW82d#\rjLK95gDcjΘ;IN7"gr\ vfI뒬Zl !p>q 8!{]Ef.l=xZHҦ*=)rt{mktaʩMWOc024軜3=B$´D^H7QkƘZ3f5$ DRb^a`p-fdJ (Qq9ɷ-n5cz?a.nR) EQmR U0K31ˎ )ѧNDŽYHlzq.ԓ3k ]7{'Y&侚rʨdo4_ H[caSad4k~[wEUM|1滌9gf!H~9 f%XtJtr\W,Q1)颅s+~;ۣʶѩ<$PpYCEYM<1桌C?T`VY ~"; o#_haeP+"hgD.TQ.U._ LcTvA٫&dob1ddhmEĸ4$hHA}ƱM{LcOzV\U4^%D#c4o|qD^S%Y{=7 {q^2pE }vږٴxfӵB hd"^tK )24b~ wxjo'4Y7^mvIVi> Ԋ{tS~×eüfZc ijWmqەQi"Q8J#?tTƘ!12CB~m2qH6-kFQ]4U{)L'2>'g߉wLvm}lq\=U3+`Z9&z+FLk:h§@X\')O.N11:"-Uk *0=EM[iJL`u+I2as0A-L O )L#vmw̷҇|geӾ!1뵏gDu.l`ȼ?IET?Js- .4_C?k2sࣻUI6r2FMiw7xs7fFô8MۧXpf-z)TY2˱*[,}@D,ȹגVTl>ٍK)Y){#%3_"m0߰H"7tSkӥY,laUCp} _xqY>J^LV/}5+O#]G:9Mt04CGI4{#\d .JaB[-DbHa_?O}7cqӤg][5aWX⊞Oz'eVa h}#PFwuRkw?PCGVwWcMGUihR!9.; G%ԝ&]>Ffou=jkٓ[CM_E4Dhn7KM؆\b<;DWn"f!㋻"ӺqKlH{7pgд- ]C15g*+sCk6VeiRMM&_:p0f7604mj;INIBaV }F<#&Q5 -H_1v]faN_!鷮pd #7J| 1 xˤX(V0n~_L/@F’F~}P3zS۠'!s%ԅڀ9E Z7i 6Lid@6>NW\*E*dm"K,a0gjlREuNm'^Ѻvn! ~B}q* 0^j-[Uc.E*tlMZ0&~)Ђ/\05'Uoq\B'jpGyc\4uxy_oC(]T\mk#O'I\z(*C̛X&faLfW^s'QYGX+UR,cm 4m =}5 n{_?ca25oӒ /j} ~ؠ$F(NqSD j'H;HA <71:L0>Ѷu%4WMC^QGLJw4礧hB4|fMX"e~ix͏~RK0ab~ z!٤q Ѧ\I8h'moH){U@0h;"}=$0rQ:1`3.*2 C$&&L˒R_^_Wҁ[d>Vk|#&SP9CP6 E\K99;=NW5Z4&<ڪ,RxQknu*UK4'JOtE?Zo@LM pڡi+Fvز K)W^K%(D{11` {agɝ?f0*^h)HBW/t:m-*)}ێMԄ<>ﻑmCq' 4җBC3R*imEvWh*Q0\*NX#A^w&6 `ϿZ@l9lZQŜٿsJym'``7hG!3X #Vd?g),$fbcE7w0o*$Қ]E_Ϳ}ZX_ʀi*D"i $RVi5?RH/&7nz*0e8uJ24[6>ãĥ[H xJ\JW">듂m[y>b^% Jҭlf tROWΦ W82l>{]*E*?"bE.C1]֟\t$\A7W(eM@Pec_~yLBJʃ$Iߙ:môyA۶]&V_ȹ#[V56XDH7Gp̺&kxh tOi^A~/Q AR/wJ\g׼օ:C;"1g";z<ЦlC1Y]ƃ vl% a +Xs(([I?W򥰉ccFEygZBj'x ɦIyI1>*;)gvJ6fN@.*79 Kv8L]unUg8BӷADzG~ *7qlH8BC~&pڥM-Xtv̯>~Ϸ70tmr{#A$g.<<3n C'u40"K;9X3s1r%8 \Ui|\94 m yUh~i;5IS‘3KAff j6QQꘊRc |򯸬# ykgKHG ᏺ цlnHu}Zabô`:!ݔ G^ Q`)VUxoJMTj| }jON \8ezܺYrz v|yȋwUC\ΉC9ؿ+~4o(9)" IF{0<=RĮ0.J.StsK:m7VMYj7GV62+q7]_ 8]րjS kH`Gt G[y,0-a,z Y(5f?}h0罦$ SJ~+H)RTjzy23!M‘ -%?\ UC L7RꘖRc^kϡ<=,̀3=rR]`~稙1k޽y%;;|D΅dQڮRsϪnt Gmzj`i8PM:ֿs_L0 8_޴Ҧ"e7 (}51o\&ot 'z;W‹|7g0^N#?c%;d1`"mHA޶ۙoyE 'Hљ *cB0d/BU6nGӏc_6VDO G-Ѕm!Aũ7QqꘊS#!?w'&5(VE_؉}.].d4nf~/ӭw8̩=F,9W{2줻] U4^%`DibN~+_-U]'U 4,s7гhiF"C2P?C\W !>oGFƅWc1d` )\9Xu}0p#vMA!zaZ@/c&Ml$$<@QH,8:b_v*NZNSuȷz \yIE뇱2Aдi7 G5!P U^%ĜibL섏NY̗# ̹{$[~qF06V?"II>ksuC4oߩoI }OD u~ Q&|Npn޷$:~>S{r|xX 2!Ӣm3jc0ا+w8Lmm5! $ejJV鯎k^^a`xy< x&^i9MYٴ`xdٿ93=*zNT|_GI_89'6tWs`޶aӅd9l .* /l41ݦa;Qw ]}Y<}Q$@[&E5]蚠znX3$l48R.%adhىR=Rx".&nLscuHGp#2_9-6xZ<'Ga&:Oy_noxXlE!Fz;"3}5 '' ^讗bme `6kX0棶^HQ3!f4p!]u8MG" `ԗ͊־0邽_\(0P!,rZ,ӰZZ1`<`qKⱘ^Fdiɢ롬n+d"Z UλGVܦ 9><]O-+'tbj4WM8¦lK pkPaz 12BC:TPS[ܹ@=lrboY띙6b9QX=mD]DiOl:\ #C}dK! 8/myi.Ar:F_ĝ??}T ]NW "vҍJ{}mUЬ~ۦzvW82bHk\*+bXa|1lb1[ECԄp1M西^zԯ˨O>Kf& 5բ?f 6l>rx)oem m1E'sG|RTK'Zf9Y)%L9FWiE;.?Q* Ҩ+ ugqnѿ3*)$T5 ֌1si([ 44I-*2 /m"Ӵ1%>!X,u ש%ׇ-Kf*!ackM^U=WþJ)!q5 BciD6A\ݶ# E 5MLg\ UBD7 Դ1%,rݑ 슱Tװ@|fX %gtRP_厨/ )5nT]_"oQ&ݍsDcc jȠ/U Ѓ)L9ฉ| p9&_[(*$)M`ʬLiMGqMNe$1N^9%[(76]̵鈢qQ+u^Ov 50]&NWLknC;&Ɖs/@al| Qz!$j} Tؤ;G9ڴ6 :%R4q1Q#2D# |ZYjdRH.16nR%(4o8&]QFSHEss3QU\E(Jv̑rr E1q#Br*ز [Gqaˁ]K^']}}枼Og*`R@ФE]ԤmC~4 DRWFŶ` uvths+gk~HZE\M4.t&?w{0b,ZB7j˴!J텪,O4;:i ̖Pj M@eXQLDZUxiDϦL0d"Sp)0=KD% 'WCyS7NfSJзmA.ʹ)xÔX;ib h6e+WdZ6BQ\Xn'JfM~a\9"o$}ifM5UmHAosF"ecR69Q[Dm`tb9E0LQ_G6 V8ҡ(at%PL5Osza+ j!is4M$.&it9?׼;&,hy_(jҠ;8}ymJ`IUffS4Cmw$͑{(&vZ0stIihI^ș)]\P)FʢM.&tYς zbpYN9h+gyjH#BX dz,GJ+U(B H\o1z*H\%ЂN]L貄ު6}Af %1w+MJY;AKr%l="`^"r /eH=22AG7VГl&UOLk|^)*N."hm1'pBd|WEpOk4`~-SЮ{_r\+ͩ=v 3Jv2TuS>ϜOAmp% p~I!TMF;b%akK<]pˠ0-bzM.}3*$Sjۄ/I\udsJ&WW!VXE yF ad,<]3(*."mycHAkqi:@ndWvW9aLEi3>wIA_}r--m¬,"/L7( 1Uߧ$W8rNU9zZ eZM>N+M7IKc2J_.zt}1RwQT$sԇ6V|%km_0H3-uZ8J,ա;6+(e+o3UhzOG}V cw,ȌRKe`k22]kxDy*0-!D~RKT ME,{Z"S;΋jKE"ۗ[^p,y[tКV4U\Ͻ贩us.^?DOw(bAӆca5K1Y~լrKK}A7=Ra?bkqs!H_1eCSڒ)rWfEDcL!NNHpOI2Y4YtZ?7^#V_Ᾰ1P4BcNrT@0Ҋ0t>Cq۬ Bp! %i\@f HONa|tQO~Žӽ k/HRhPQUtv&]BaӮLvit#gJqW)J9jBVL>+E 0`niMQ90*+0!.vw 6ڃ\3]:aC%MY#iF<\sU+E8Nw-qUzfx+#ɽ{bRWJEs?ݩqŶ$OJ~r!K޻Hض[m/ : ~ئ?p68/h$4O*B 5}LP+ֵeOt~_/5d)S"߭q;z7ak\Xpu?Y"ATW0B' Y@0uyU32,vN}pLK`X@C4-N?⪃CYFR>vf6񊆘W4 d˨o²p Ȟ ȶSO?L~r|_9% 1{ȳy'0]ߥw8L ncNTV&^c)*"Dm 1h@S9tq2\gG0$^ik]/ L810 )t>LjpFl$նӕW82dM_x00쿏 hP#'&iA[,aIcgC0ܭ7Ai電I)*~"ICOԥewVؿtbm`aMF~u,:,B!_(9y0D]q۶ksD0r& Bx2LK09hDb2ЀdL~ˣ&/O2+TQ,|䄾W/ $IoXw*>o[ s90Li=ad8*5WG)W.Ԗ^#pqQ>qSJ(bXM+H`MУ`Z9QC ˘5 9ai#qNwZ/?X@3*Yud:P\!uKRv|qIt>Q]@ d%+U$\_E+Ӊ/y'f%)3d"*}'_A%m#9R1nf7Rle‹w qB740֒  q"h=i6s3 =G>_unȪ e:|/$۠8οS*y /.+LnڻQZ]Y70PO)({6qoƘ{3"Ɓ#t2[j( >${PX2עL?|S};iK[Eئ̖w4Tw ( NHT2]|#fS&yv8 zpgTcLY}෺p_ݬ4KQ~ax>x7)GA:3t{&M 5w8Lc8A(E Gءf[}҃(E*V "lb1+edVfN+a,;Ahp' {=]a ,Q& =I\wHѕPsѕtptLPU\\E5c\=GBpO)ֽ9tR: fq꣠2a[_o*GrWjk~ZuZM̍1fn嫐VUY`8>[8猔NygBHpRC7v5AC]]}У 'ӝbB&6g#ddnh ad(TFy#0-̑qsd##3Gm@JĀ%'Wxtq䜿?~|ՠ^T/{Ĵ9V"{ԓ3Ea»;.Ÿ3u.0UJ^S5ytDnGYU\EDczDc]H;< 7,Qɞ[+>_ Фg(|.0G?Fz D "DhI3c'2 brOBlP|K!j "cL3Tg~u31n.ko6iFl3K]7 Q+-ɚ0L#؎ 5lERƊZ)V|B_L5;۫UZBj,·QN!-t#gɵV'T *Wk/&E ]gA]/揁M{̿k*W93*esÉQx\!\P$nEd\4k0#Ȑ3vq^0.]!^䟀o"f6 *j7LΑ>{;fmyeQSt>Q5ґ@M|eid3L&'r:w}ӛ׫]q) 8Cp A_x(U1ED۬R #ʢPψ;):3C Akk@*a)a//ex dlcd|ON8$CeBoy.$|x[oѾg>^z#O+!EzaZ hfPMÏ IlJ_(IfAh dDH2Au\`ubP|M Z{lfӷ2:nƓp _E0%}6 s .[ 5^|E&2Gո˽*I`z&OdK, vѷ`G=z ], ঻^4?5 pPDC'C7m 8grд3p9¤kLE9Ѭ";&5ǎpYLSt =vnpO3ϰz6a6SE@({`o Rf胇iBA\=q_w R`fx; xr1;'MävnvfNKVTz+ria <0.^z}s~(zf\1pU t *QBN>cb<d [3@R uWC 4ҟ3M#5-Pq1B (P1~q$~B6G.[rBr)4=XDN.TAo|AȾAw#ƨE Mܫ.H>;fRtWh8zlo|!5N]^C+E Q-b~]$ NIm1OlJ̜7`/oxrHlc;tIf3 FzJ MK 9%Lzܙl\8Ǿw{etqᒼ3b|t-$,qpΎuxC }:aNtUV‘FO9/|(\ÖA#P-cb`Bq/YHwdҶ0sX]Hˆvg+]jxVܑeoeB h>j4?THw9:3icU8t͏ܨ>B|Ҵ_1mK iVI3p%=]yh>0-4cb>9%]c5n)B!ʺԠ31#iC8=rMj6B$ u;0l:b-1"ҳ,*QM! d9&k T9.dA1m<]]w5 b54Mw??9~͈,! ަ+;*k ^ ƽ>,WI0 #`䃛1`BA4L 9?׼rJF(&f==@hN9w䅁L-$dȺ_ HJ$4#ǘ/㙘>ӱu}^i5R8"epD11 }P3d5 UdaA>4ibva; ?NKh,CNqH 7z@wM8^>#s1_sʰNEА?DܰK8#nJĩu1.0c*׿`xMC'-;I@)~@YpA„f.F%$ݳaϹOxWmtJ yiql:fCp"uۧ;^ M EQE~/sP&)R)R7گKΤ%[:в;v!֯VEHIcx`_~5w_iD+ \x +|`޹lzm/;]fA0 vmG0r$n=UvkER6JYJ)',.{H@z^nL6 އoRn?k u$}HB* =,ObڡzQ7n-KƱQ 6al찝 ]nol?z_yLn NJ1JN(&ZiMiM7%抚u||N=2rUdnOϗЍ<:@ RLeB G_-) 5RĬ eDA1"1@C:yq!J-unFq.ʗE:w|Y̞@U`LfJ5^̥ƽ5Ampz(ѿN;<9U;&e7}[6^P֏Z\J<% %Xd7QlLIHIRXj] Inz IlIrҒ`R)&괒G<gzG@ $^)*,mbؘc#{$* w!cARSNc@{q$QDz+؅cR #ˑC5JG?$~4KACFp/Ƽi>srzXȸz)Xj{1ײv>:j] K9))_Jbo0G&ëi m Mc,c=A/}O,΀,m;š}>f;ҞL's .N]ۄvO*ҺFOpj0Uբ#b4M] }NE\!0T`Z9h&vͤi&5LDXi}_j.`(ܲ7̆:Ȧ?y'LmCv1gu9G7 .[T~rRB)tvi9s8'ׄ`^Z-)C)L 8"#pTor1F.m`<%hZq; .! :~q_HhI_A 4ґFp r;tlO;tu5[1^4Qƒ[_U 2 /xu˨1'#*͠e#'l wpVwp2˨M; ¹֦QU ^%ĹcE }\ik/$`v]7`/S.ߨq8Tp3-P=OV>~O>J7ZZhQi#rK㉷-?'2ì|T!CvbϩX#-*&QML:frUzW^Iݩ'Z&4L9G_M\#3} \y6&LD})Bo3U]i~ JQLmO2XdDd6,eQ#"1]W6_r]]QdQ(sy#*+Zr&vA%5mNxu2郚/qr"BmWm)V] ~/`A"6m(|1&]vYB.N" +7\:**ZQM:H 9k}7@[ڱ93̯i[FtL5I;ы-ȐŒ&&͵{Z U 2 HuLʨC@t\[C{]_ s/]-v+ !1ӥp*vaL8 5?Rdbceƨc6FlYӼ۲'\ZO ˾@dNGUtP rwF2]G dD6%,Q3YB?ps0Y_U'D'&>s_Կob~ @*B(h$\yt"rGͭ}[E]ƪ1f]1u6S1.Vػ[U\ 2 M̵hkqXZ1-֡`dce^>aYGocQC"X$L@b75A~tЁ G6PCu mTO{O _у+DL ##lbe41+AV;ބX{'-{:f6KzdђO|>pwy\pL4W^Eھlɶ-% +a8Ah66 ic߹@ m$֞jGHC`yGs(jdJ/.9jJH}u+hFɩ Fw+tkY #Č]۸\ۃl2Ymo_@ {_V/W~#jUT׎M?Z'<|h 1GhnҢW8rf J`/ I**D:ibI8zas ݋j7'D>Q #A@gȽŵ&Hՙ7@}dž Ij9o1U;kTn!6d~ MþQmCFAz)I1 b<%D{^Mniwݏ&DR 2#%VFa6.u<' XGnR7J02d6WFOX'dD6Np D<ېF,u0Ӛ~/peISU{@G0~:#˸j UxG8"J+: S,C7ϯYJeM 虔im(&JV>xQar=& ,b2^g·R??!P.ܩu?ɓDn(vHcn`-&a ND# ~n?.csp[Mܖ&4mC8@W ~m]؊Z`a 3}g'CXCꌭ:~‘!mXw9pzdX[E!#ʰ:ԙ3k_E˯U!#~$H;fYpu^sYN[Վc `Ymƨ*<vZLƴi13ڒ2ȧ' MP!f `5bMǰ{C(8Tw8taZ:L-p֦̂S'z,xiOdDM6&Hz(Qr>n%qnido]K;Խ--پ=N,4=p7Bye0NO'  e=Oxu3mT Ѡro?XgqHWqpgIoF3 MCAzHix .TMT6LQIx9vg\r'.! K5*squsQaݪ?P3D,qghU{f#' S9rmҩ+i ɗBv(&RIJZ&hK^\NhU7K]5Ȯ'$Kµ.} pH"t`6qp"ubs#kd&g_/*QM6援ӧ^ k1`֥Z$UEwܵr|x}5K~\jޝTo*mRN{>dPl8g#w,dR㴩4Ej 0J`b5JK1dBFa4E212JcIK44J~*_Muv%~hǍlx1=ҝgƀ4Mdet?sL ELCv#ձY9*8[%М-nb1[%,D3̓ƱW6@{roQobnnwi 5paGyG h/e1PN̥uw:Ni/;;bF;Mv8LdJ#C-GWU2 {#];"A gY50ZjMvx1bfPv縼Wl?ȕdh>]jao#02Һ1'gNO0-(S;ܑ#]ƷxkoZ!+`t o);^OC_)ځՑ+֒CRx1D,QhRbBv(Ҧ+!QםT<$ , zpa%#g ٓ׼JqJ(&zHC:1Ufy:-W` YuBbPC>]ԜJ}4ڂUΠ5i*)cji+I1.ntOj$dD6IL$~WVҗ - ȲZF }i,Po P&|RIxTlt9wmu  Kg=)#۝xh;m E{C<͚KMfГ[nv*_7a@PD:/D#;-s_9&*a#M.M#QF`V EKM{釐f]**XE!#ʾ 6t1ac wAteK_ ]w^jnfgfsu1`e d:̚r_ԇUoAwD1fӄR1~:IW82Jy*0-TnU*RU:c!HSXY_&d}Q<{n3Cwl60P'a8Zt/K*QS<sX})q]p㗺a}n sK>,Kg$~:py.o0:v]ڮp2++۷4gq!0`ZQ~ᣏ =>"XdR_k%V'3dgi{[b;YwЭ;NpUvi UKAFaoII=4*]XV$OO^˸[K^%4Z\A 1ÆuLhYnG36R*MA#3e`rT etKjAF&E0GR=- s0aE8UU}l2BcQ f톱ɇQCg\W q#'``KwuS  ] }̾}Td?>ꥮ>B7I`{}$ ^sW,2)&،Da[km\Ƞ}c _H7`dDJ6Q+Z#y"(+k{u ?[G&p+E}FL"V}r1y301F0,1@D c4g1`Z9&e>aHxH S+, 3o\g! 6ܬR/2۽Jra'O1|8"Na,+{bZd(E*NQM>dy'+݁n(߂k-v&_RQ <\I)o Ke>a2l~#UWw?CC-4902lRb|)xVȈ2lb11GSǼvnG/9^ f_hMVt q\ v(Et#rڵƊ`ɥXE #ʐ YFL4m9~gwc^,n$ EM~EI9¿BoG[ܥj 0HͨsΆmxх}x1j5vG)C3b e::$<=R"*ep$h14i EwEOL] p#0sV}:όM1AeN^ઃ'e'v8j‹V#C.U,C\xi/dD^M!/ _xၻ$} P-Oɲ/P_u5A)B0d /Ž-$r5᪩;KnP_ W82!e5RFO)VqȈ2\m& 17a@ns Z^pjIFl4|]!d#Ot4dC ~S- UC57O)LP38 czlo5'?!0U Xso8G׫(dD7U 1b@s:E 78sW7<9,$BU -Nd߾~A<*ЎjreU(ד6mۥ˝v8^TiҘ‘LEXc,E* 2 yCL(iԂB)f*ȶ?Sꅻ)F!7]S^i+t1|K6 "'PFp-4㚟A)|V1(x!gb2(a$⸷e>kQ/'۰kʔ99_%_.o&   F4JqH02lj 9}%>1lO 1}b>nb6 P,)Zm`B*$vTkmW82 5b&YBeğb:Eyu^8e泘+fiwZ‡oS]!~[Icmar7zSP>Hċ*m1)ڶ^U/o,s-0 *ܟ08u,:չ)GY+:!w\!vyM Kq~y1{H$8֝ _80Bq+ɒy']bGCkxwAZ$7a>yS(o ] O)tin񼖕P:b\*E*QMRC dG)bIU f7RRn;s %vfti\v "@1iDqs_Dyh%0-adi%#$ɦz:Rs O}1H-m.E9wvS[rݹ0l^sq?)M kpMs>vi|^ȹK]Y!`ZQq%e))#$M\B21,UxEY4>rBi|y ʿ1<E$HL:f+mZ9QAT4HFبrmJᶊBFmSe*#4YWMO?H6 '\eB>ρəܼ6;` .ijFar<< 7JQGBFndy$#}Gs}&Ki@6VJv$*j%emK>?N[T,,]?ٛ4#jǣ$]Ucդ1p#fVD)VAȈ2m1dL{q5f0wԵl+_޷k_pm@Ypr | eon s!9JijH7ޱ]=y¦6 G[z#zOH&dD(7LƘd2Bb_AQ+c%T $ou>ģHu*F:4jwel.綔]D:OsՐ;KXxUD}J’WUt2 o*cLW2٢3qb\*,Gn$e!8t# Ec^;7su<tʸ2앑+@?t^W`nIeɦ?{/$}P6Ov`fޜ`@HfJ7Mk- L*qHP i  wt<Ƙ1# !$-5^Nk%B2DI`j34 dUadp6H kb}(zuiXP;;k6˹urE8n^T:-o~v]!IL.R buq3YrN{f0RںMOpdpVF}bi4bшĆIY"fMYcH r>(.a( vhRk5mN ݞu^fitWmjffWʮiWhRl%4LalF*s>gk~t[DA#02V6F2Q (sER7]cImCW5ߵ#y#q6yqB%}PI:[սNJn*3wRL @jA+؏PQ m["+Rb5h3,Lϲx2naU#,ӥ{74Az^;jK܇)Y,+U؇FZ~7'%ؽ;="+9?INQ?E.eSƫV|F?8Fcxl2B.%HhɩW@-闢} (X51d?}{DCU\][ϐ&y4h))fi~-99ǟm&ƹaNfQ$OxOKᰆFa se\p(dd-[:=w[|Fd0TY̡R.e2^kh$rɽ~">J񳆉Fg e~L'{:HýzT_+YRn_hzP &LD0ĭ RkI8F}$~,rIt-@ H0FިfP%V?kαlਗ਼.ڌ_dT]Ǝ@:"G4rpf5'Z 5$4 [H.c5PD˳i'I['wͻK Il;`ش759S]ms͏5kIЈ2lᫌ*? ;WeE ]A9 Zv ~n.}ME\_\R|vb\O7H+|դY0"ۦW82 ҹk~:ZC A#`bbj:Dut]e1EUtM/U=﵆L~T!OC ;̝ 3>GWj 3C8(ms7f6)Kk|CiD`o=h*x42:)_ZPKFl(ML1D?rZ /$7.!KB6PV8=pI@gkc@V۽A2yZ$>:Hا;&Qmz{#Q]UD2 $&&H萷0aж/[NxӬu۹GK/g&yHI1u?,G~ۄu Hn2ll50H3tv0k~ҥ ]FtgĜ?^SsүבgΑ0]ӈr|{=K[>8C>zp|ĽKm-R ͼذ@TN+>Ϥg902?1MPd02xA݃r >Rb~e01@^w"A;w >D!{SÎ&)y7HCi{`l躦#]g=S#By&4gY҅ʀbbpC{,p^lfqOch^VqNjV]|$JLȪL2y7BV^ Ec2}5RdeDA11@H# uȸnLO@ e4sT^G's_UeSW?i|О ~.dhfH\Z4W5\%d6MD~T֎ug5xW82& W* QmocbA7.՟r•.Ⱥi$lЙHy'/ۋ=y1=OϿ4_"=l@ sK>EE20m+_40'FӏN~pp&h76‘cDwJgoy{(&9<xIέKТ/U,ZYwifyJzR!=@|OKACF`%Ĕl͂s/D!E_& _v})F (e} 7c_G⍭cMl*~6ɂO<7dDx6olLL"߇ԋ>?uN]RzMRB3q4GEdzlYG)y4щD=C|TsAKS$SJ<$[9QzF%FΎo!.aZ%QKV^k,k?.o \֑Ef/ _'\ɌKEpC!$eм?|㍆z}!gfy%\L%ع'W t cv0R JTn|#}\EsH =Rx´_<kٛh96X\!V↕,Pcɷqb7r6U7%:FQttԽaԎ.}RM9ML/lVblL? aW.r‘WKcЅccEO?Br[sD6%C6m%:mE^zV' i}6U}q~mrojޗSVGnj""(v C HTtG] U4 ^o%D1 " y\'pV%|n'SsԀ~|owM^~> ⒣\[׽! ~CQ&C^EV \!խI7()oF<@Fky{ QM4!ӄ,҄R8b\3Khel_?Jto:xtq7/S՞nwNȫoۺ֎Iis^k:QW7'KcT58m̭mj*Mw:1n"&٘dpdKu(*2B:GSdawo#`4moo.t1 {аTF 1Gӏcד8RE- ,E ]yD0-Ad"Ldc2E2эӧna'jFӭ2$3X>ڶJ3}>Z6ܪ$ P`l I!Q !8?h5݄Leiy(mK{+9xl< 'yp1"-0{Oq,8w(8t3mI{(I'~̭7DV%2'ѩ.9<3ZFh154DDڔ %ڔp+9W9-=RDMeDcT+uu{EEB/K F*+m  )Jw0`޻-W\gqV uŖu2msWYh$B%Tf yW@Z{;±dP =vĿ4y->vzp\t DE")){ҭ*hSoȭna0qcd'ULxVbŤX5. u5iA46݈h#ti~ێFmhXt_KŸ(&ѫ+]tk\mV<՟ջipDE])Wb^4x?fD1ZԛFOY鐕FVQe61T#t- VݜXa)Ŷ_`05* XDɹ棛;vGA>7r^Q4^lH<hjY{wT<# L<У:FjDnuƢ % 0ϽH7~Wsle{Lq7lI"8Q$xhR`Mf\bض.*x(&x{uz]5G¢E4=L斆gq'4bágG!h~ԻsI.s2|z^b˨+{,*(&[xeoE1PrcAZZvʘ_jdy;ŝ2(]*kym0M*ʦM;,ȒRU] πr;~?;V/. WX^`"U&@:\A/RkٖZbaYW8֕L+~K嶊_MOs<5r<2 D ?]v^7:Kqf|ԝǽKWt8kRoTX1,V(y;⡍w]=xa6[Qx@iM(M4 4{;؍^K[E^Dt*+hHt$ W@3gNLݗrΤOۯ]/Tt R lI&i&ٓʧUКJ>зPL1 ¢1J3dO1դ%:GKԪkIR8X!7HTJP LJP&FADAw18  W @ #6a^ {[rRrF=Pt;rrMoe;a09TdAwT L&JJti,ԹR:X>e a(9E6  yP -,C bKlج͙',*(&! o%)}Ny:XY(-s,k u YY6c+tV(AuTF LF&F8C'¦HFJkvabJ(L,x|j3ۺ͞O [o챓–V{Ij Ya˱B8L!wZ͠$'[i@r@W$D@7$M4p} =kC2#LJPL_2DAȏL;04Kkw,kK5VW/-ցUS юF߹*R饻%靂hR Dzbr'[>b2є*ZC6~ c1} p3WSa'#T:=0nӕr1ĨҘ4@flDH7)^]by([EPeD41){Bu2wy]/uviP\_#D{z4l*}Rp-Ʒ}zoiF1m^" lb_OjI6!m̆p.zD=gxڕCt&\Kӿٍ@sޘ^ؐ,3~/cKsm$-B"K8~hƑvvvRY Y:*[UUHQMHH#!-rךjZNǾ6J˳h,}1lz'{*_I  $Z;.җ$k8=,ٯ52)8ILOOe/eNڣxMwTP LP6FM jU't+' IvK"CgqMtG_e7,%lRP*XZUV+I,@BoiVQD6QmLuepʲX']Kު/|_d>4aF]&Z&Nouy|&qGБilcM.Yt}jGe$#?ҭ,UtIt2nbBژ i3L+ϛ?/keN Mof%)8w7B{"uHt?ipqbC𤋮H 2ccKwTp LPp6= j^ls戣fƢgvLͽL} @ޖӄ,kܱGj6f`,=5&߆R4(2m4h3 $.˼lMhyD"޴7 Aq{0wЦߏ4ӟ~ky*˱i,8'8=OAM)U*>(S&7.3 ڛL\䲿_~6ͲNu2(2ޝlecJnόQ /|~̯;$fz.͜Vgl7,$=탯$BE8&7מUsu>\L쁾h w4+fd -ݯ~o[L5Eq>#qF:13ZlO+fj0L'M+e nl)WU QMLc3c3k]vbYn_/~) Z ZE+@3zRbĖ3N2-LbZcZfwU_$42b"b f5Z'WeogT?FL_uKJ&*kS gB@z$JUϡ Tb>c>'V[/NYRA3%/3Nka }ִKlQd(Ru{(2uo{cW.es< knG%b57I4M̞U[1rZ3ؓ_!id8 nM=~-UzE0nIVAD6A] u HL&>{uvM^A-1'R~nm7Λ4 ȝq $*}3fr4椻T*t$S@;&hv5{6+9ND0tK47y..ZNjC[6 nƠr.&I} o?2s5Œ:.W_"9ybz ;K&]~iЍ՘^]fd*qŷPU-(RUhc-Ӆ4G:8]rbFWׂgʼIƕ+[e$J71u2\Q.zqOV: g| q}L:RbE(2XӚEĴHaOt/{\fwDduDzcdq2/橛39:Ťہ8f^y5.j[&ٗ[V:ӏo&!rre>]+Qi 98i}t "QSDB3>ĖL5kO@$S,&QQ=}qDsc$5echJAZIßJz[kjJLhsw@naV'D6'} xɆpղ+̝.P' ;Y2~vvLKHɽ bLyX•ّ Wbcqg6GV,ȼ(5VCmJU$۴h/eXM.RůP(2oPBBfkf7;[,(jЁ՞fɵf(q$dWHG/\bGn5h`݇ȓ3c%Aq /U hyǏ'AREm߷ \纪%2i1Tb[CR-BY(2-nBYeey#Y@ [WZt0) Hi:NZCgB6+,bxQ(9Zz]{A'y-ZEPeD1=lJƒ 2SKB6V2wF/1h+⅖AQ=ZPe1gD>`i}2yK3, J }OvW~fx\챜y@?S^C,y=/t)umYc۪qar6=2,m{Tfx Lfx>YzY)KM7d5dߒY϶}[2R=֥9`й=!F[[ դC:r|i3Cx`L*p_b&y U:R1Bh(21oBhɊ(/fv&JqC;{g 9Gǂ>:iIV;+ VEB}@ H&fa`Xz~]װKjD':,&P?%I++JT5ݴj2q%VE lVqlM7fJӷ-*gRI"Zѭ)U*t(S&!ggUw]Ώ{7Wj8+xUL.\VjcG3]]-4n&TĚѻ_*U Q&M''jϵ3 ox<}ο}an~~+@a"[_k/2{b)S1T ^MN߄p__dr/hsץ.8iTlP6 ;V6qnUV&D6&C pŅ?B?pEj\Lƥdzw? jl(eϛB. z08KHHu'sJO_bIJsp߻{S*UQ&McF]Mtw))3lAU1,ǶyvB`9I!;bB(4s{nXيN~e1jdQAAidQ1Dgҿ=~*k]kʱ?Oi^F,6Teܗ=z2NmQ871-ڎP6[!t3Jճ'D=!&8k$;iFXkٰ'Δ\b.鬛N݆ '13K*{3lYV^CdJuѵ4a; l }}: [FOrq4tK80l"Ƙt7NOv7@V]/JRA!c9 tm˒iȝWyS?w^εܗqELzMnL> tuߡ2U5:;Hj4d26*eRE71cXpN=ztLAW'n>!xLQtſ09R,}TquVu{8ƼK?*vWzr[Q3^ 1*s@39͘}/e(6)U; ݒN`10F8vKo@>; B^vrH}+]Is\pWpJom҅.KQI<>A˰yYOtKu>x9Pd7! cp|=I&>3dn(IQI*G:DcRb64W $9ߗR">(21m">Ƙ='>.۫W~sz^+ ?r̯|d^#2M^,!Vq%#~& U=ZfͧO\|VgHz Lz1&DF~O##9#ʤR$?vVx!]l:+P>s Δm|/x :v|Oqwy^ƤG=W:95j|31wiO[#VH[7fmL?%ݢH]uf4y̗mǽ9<E(tI?-%@39N0U=5EZNuj(*(SM.1]M̗9?"h~T<_D7*DV~~=i}uPw08L/P!1.2r_&@PLg!u]dhwH"iӠ+- ʸ ]cteQ w#rw}&'_tN8dԂCUvaBq]5v`WcJ\-< RYEPeRI-['YEoH~9,pDj=u|:Ð_NLof>dµ8ϧ7ӳGlNהĖXA*my6+M*(PKzD`s}|. gϽ?]FB8_G .X;u2 JUiٽË63.;Yěu%I޾f8o1[_b}W*mir{<Ի ԻZX.)K7^bB88<łݒb;]+&ZTgwk:B A하x )}Hf|*Q $I)8V|p7PGl 8jFr Q[Ó(sk{=vYzdUkLq6;*؞d웴K6 {vĖsC H{B^{,VD,R9M b?2FkLy٭RTE's>ʻ,Yv&F( Vm.̝uM23=2t8J1NAwpzxctcH[e{"#j!# k%O=7G=ߥ꧅oۆkgu=Ox!9k>=fk g(I?h؟!x e{KԻdj5EFiDCj Vy0'P.dݺu{>jws(`/s񠔌rEmZ|݋ݫѽK ߋUB%fRYWiWlzQ+S ܄(Sdj5JDFOnUa[SXSި8@8akt}&/]_i6ɟG*IC|O`?$ڃiogwqec[..eXV 凱L탟хd01aпSyXdpw՟#fRiRi T[#U|<7#} nIiCUBTi_a5S+ 9ƃ[O|"m3cR#zRnEKo#*~2 VkK "JhS ^Ԟ䟑~ٮb~gzQ>Dt&)5N?ҟ 2@_j ƔLnIۧI&.e1sպXgwN#9o*^Y!Iӓ..jz5xoG)t+S!fbb60=?֕㮒OdD% b6x/}@e LbHI36`qz:c H_b`U▎8< jB> OAM)˔[^G۪y)\Cr ؖGiBz%Bbۅ5;MV d Ms^؝7*dRDgUH{cb_s/v{˜ S F2xO3O#x.q0{J7aii -U.tnAD&PeF%~so{2#n(c(R=]gh',LW7{KOwhC"Pie\`3⳽BѤcZiCSUX QMXX;{:> =ڌ$?dB\bU}i<?j[b]cvpurFh⁾fwۭqapn7 鮏9k !2bv(2nbvlXfvX%Q~?yr8WJ6S;lE,%4( u6OĖލ4b2 u(2 lulXu΅tnLU*rt~Owe_=RZ`N}u~%[wiOf-flF^.3od+2-ЋzYŋ_SمzFHW䑟m\~o KhYm;-(jnӇ8 #v +qS*[FަyN@S.vbcfQM+UX9ưpNJU}O$T=tvΑN6?׀oBx:FH֭u*݉/6ڑ o1'svY׉am'gn[9C<?Oer[ŜcS"M̉eNf9]/uگ:42oat@cwФx]qxI.{ ̀y@Lz"Hj =>eZEPeDؘ$Y$Rt/]%U4z^HtPÐHCU՝uz??%Womz#}1XR:=fj4Ay=;K** L_!6K8}y_=mK$uu-nyp4;>Z)W9!iH`ȖVnc݆:K외Y5/0 l<-iU^bKf,0I2: ĺ "cC$ӣpk]ƊgRn$w Ip&Ex+'=,<:bB>]2 [l8oi ikhV\UW{(,3mp{r݂("a՛Ѝ:F7!gC~1Ni(/֡6d ?#S٘YB_(2kq;Ag{$/tXTO[֊sFrVDr6u h@=TQ{0dL>= ƍ8ۜBynO {eUgLyw48eo Gbz1s4zTt野AM׎`w~ͺNcHS5R?nE[Hb:bQ}ܬbc(όMlL15 z?駶#\^)%W5`'wc!PΏky_U}iFs |rQj%Dkq iO*ʔzfj,G$3- LczF]/ BR ?g|Z~_oZpbvKsd}'}޴/:7&e"mi.ME:g}aIhMF+OC@S9&:[ߪ\o>NASNe^c?wBB{>,if A3wR_ c&.e[̲4X tK8VSojdК;'݆ni hMt01\ o48ɶt;xY l&ơs]SWm'enIkMtM5 2^`k2ZXʲZՑǘ_:lG6&`z"Wd }֑_uމComGf^?ֶ"F2G _"PK*^ibAo>UNZ1лW`zC PkNJ-(A9whi*0+}_Щ%AqtOh2T^iK׹=le2^EPeZD41 !1uϳ.}"&x-mVI6~+0 BVaC3*髦1c:Y[f>gL"ÏtiM0M4 Rs=83|fEuܡ[-GNc{(oc[s]:8{$#咓#Sv+`.β+,_%Ѹ)7hF.9Ėa\!?ye^Pe41 '̟Ճ۵d"(_'6Yn`E~p{ [.\)*7^Ë%jh\U7mў GIr|rMV9Pe41 <$㏷RYrZeV^iW&P_`+ok<ȈF:]&U Q&MI' 'ܪ=tv鬛"rCx|p_ߗF1L F@YZwYU뾸캅"p+Rdғ l6USu}m\E* ZU QMJs+ kZ !u8Ŷ4("`-&[R.5~vnB+v]ɼ-U**҄(&ҤIxIozc8ƶ *BKU)J6)(pX=zKZk͘.u|Kq"t wV%D6%M̗4tӻ_̇fHQU,ѯ(IބtWQmv_]A!K5gLCvצS2bݾj͗2&5K< ,ݒO4`6EZbí !Xcq]Bʑ )h6\Ėae 2P~F*Ohc⣥Cxg;Vk$v,鎶toK]6ɹ+RPy ~qzf[agvټ/I -XJMMZ䐡>XQBWD6m st2EQN(N'mjhPU鹖){.g_Oo46} uͼ`[mnB> hc\CsяՏ^AbZʍwL 1m(Fz9>t$2{> BHpaR *h+Z<0XUD nAA nF G,?;2vO©lNne7=A=nZzQg?4Ճfns3Q弹 ,RF"XEMPe"DM15?kV(M_1Wf֖}!E{ B LӋ[~qhu>dH{3sxegf hA׈ !v l7c1]+[MU!)U*(Sv 1ᔶc#mjщ=q y>1/p~jV>f>wlFglG|$ Ŏ =߲b\.XA.ugjf2Є.p\< tݒzN]6.Z8ggh 9tv҈HK+u6om T+*C3;-}Ďc$4u+MxE-tJƞ另9ۥSゥK1 {w~.!K7{ ◊b]J|7<;5ٛάo_mCAG $Iy~"\H;\[Fn|=[)xvƼG s>,(4}jq/"[ڍt5ٙȍe)b@ !t9`H(:c5#A˰:V=*U*(S&Yɩg)ҭ^'y W Evb&2[":MסfZq%VM2p&[HnD҅m"B݉E}:o=jaK"z Y&+FZ="۳+z_|o/~$}*-bF\u}~uuCZn'T;-oi .~ &URWiލ\eH+R;IJ*a ΤN^p+䪶n,eq{ Q&M N38]{u>=^%!KP4KZ@ؘLM+\`k_ܽl0B If}c'B0˜I_=-*Ȇ(&Ȧ!.ټ!}N 7xZGћR!ɯ ڹ?P4ӧk`U98/C*ZeAڔbb3r }ƪ':rKAJ&r-}:bz|P^TiaJ@$ˈU}T]$6%C9!uRI@Lqth L.q-!U )4D tK<o"Zh3D˫Ll&t}N\IXʎ",tQH)ӊL>yC*jBA)jpJS yj!]6bF4V+jѝφЁ;'qS'wtD32$}e*ߴC&6~51mk=5_tJ/ /c%k=/P< 370m&,\۷RX(,),Ent1ءc^t͑_@t4q\Y3 KGSM.ZUt ?U% D1]gװmB-p Q/aiם^}$;ul;t 9"mWBK?#n,-a%t Ku + t +c`%. .YVTbz(1hlO^ԪkتGe(lt--U*(SA *YVA>n Lꃷ{=/%/! 0ݕ ]M= 噞ωwSH{#B}K/ً/*:\K*ML^`3l3,-nsBAsXHXt|y-="K)b`w|z&8=$J3c;2Ij7-\_ʰ{U*UQ&MG=;Q3ApVcwcAQ^%km:0r0_ҥj BA*X/.z,ڴEF˧s:u]v6:P!Z\2_œPeZē 1O20O*x}Pڝխ+PK:Eu2u$p4$ epg d+ZPe 1@20@2]Ѝ˜[,=Kv~~'v\vibnhmZVAHKCW|_J ʄbRd`RD1-3B^RvPg)b[?{| |ҹ2!DŀςfTu3bE,h9pԜoΕ}u)aW2\\ɮR;#Nų81t/NlЊlAtCpG_ۮoyy%@ˠv wT7 w 1101 EDȟ7n>[].\F  SW`m~-lo빨Mz`f4[$z4&2-7<\#T!)'i{7*]ߊ1-wB'Z1rO/:}~zZYҾ Κ1AAl H\Xk`' Ҝl,qvdž chpkJ{?^bK=xLqS*U0Q&M c<ѝk$pCߋ8Ŕnj^$qFNͣxFxɞޙmBŸ鵖#+C1ck ^N7m]xK1cJGMl_'P-(︉c^dD^d-]N'?ޥ7*g pT}"}q=t˥f(a{jL\`3?ahڡjLϗilwT L1F4FD4nxxͻZ.*؁d8@4@0}=gyUͫ.:}(@5EB~lfZNO7/exIMKG^)U*r(S&rcɍɍHYs1 dymQ)4S|> a-נf:ęqyA#֨ }-*(&cɏ8;Fj=F%CBNp(djWʕИUw[`,U.7ݶƎ?{35v^b-m<~ŷTD(2}n"=Ƙpvpp<W0vIq~gd R"Zv iږaPIl}k b8vqfR{#!~أT_;X[Zk?@iLDԧduC'o&]L[57pwTRk LR[SXR̈3o yDZZX6;#5ei<7ZM5mU.+J.gT8IxJ% $1UK/95 5.Œ؈:XDw3wdCٟX?G𾜞=:ߓOPx3}oލT/|~+]dj}_>LǺCCs~:Ȋn$ GU7Ć_Շe7lQ?I0l9)eO{3~&~BZ0O-TO> n(Y\k +q`Kw.-E1ҵ:5u_f8.kgeue 6TU[imI[=k+k[bVQlKBee04cTI#cae7QZ,5lxb1@z̈́n1"tiKl閩-`x-DlelN6 尒0O߸Lg _7A@$F[%P^18HE(ltmݑ FALQ\_E In 2}ŒCV O0-.3R$0T >K4bzZQ{up._j޹ۨzy컬+m]nA/}xHFC//7U:_[ʔƛX*[e{%tVC,[_n8#6!+-k?k٦Zhej ZEVEiMKl/9e1(ngv.}-8e^7is nzف!f GAJ,U(Tc,AXn}lTs_Y}BFvc6*T3ǔ]8+W9&of#ga`DPog}n{bt =:09V|w<hY96o !Ao!cbB !sН~TW:9aAKGoԋ d;ZlBmnBːۈ@KFnA=Dz&@ĀA@Y,/@%ŵ`:$ezdǺ4xqdgR)j96cE37zKU$ Qo"YLL$Yg?2ț 7/ ƨ}NI%LN [/nm y{䤹rӝۃE?ޙ >c[MVC:|>I5ݿRѭbY(2mbYL̲dYwkx+gt ~i9F󁒓 o:L/"7ރR{Ғq_*}^iVLSm-fA@-ô^3Ӡ!- hل 18Ɨ ;ы0inAv9,!܇7ȷ|e[xsa;CF֬4V lF$|Vg2K*g QM ƭ޸7o?r ")[:]:uUr>Wi,'q5Ǫ\ ǝ|ɗ|޻mթ}C]vJG*S3loaLH+i5caB[) 11b qK$6﫭5+-9&`0L̳HVlhyQOZk \ugR55׌~:CpP1һ_*t$Sfab0ߡx(K*#U 6Sn_$툋\kZinidy ~l7Lo7,D<~1lEu`,vn Kݼs徟c׏|s ?2jcwW(vo#?ޛZZlgD:r? ~! ӄ qӄ!>츦3"L&Lme RLi t<]hbb0̲y#?vcvtu/D3-̓iJ{F_p ]_fZuNgbNDzjbAx[J N N1bNӜwlk-Wga}xLJ#{45ޥ"A`cMJͮo,yQpwc%Յʤn| nbflXff/E->gRLAX+3E+C`[0N-èPZoNjoxCA hxcc2xc,3'cMe݀ ?8Hһ`۪iF*J|A#.$6Si:IT2 L2c3{B3 9z/&y,lQ,*\(|F\y^l5JVZB# L7T+ L+/jO9}4//3uvRd0:AĐlǺrsi g|;\KxK+T  L C,! eϋΦ՜<1pBNv7B^Abn_/,A߄SoP %/z"91N rڂf޶8q($L\CnIOP&E?ͼbU}*O~tXkLjHmMϱ.3w\`p40 tK:b7(6Q,(n[PǤg{rsr~i,h%*7O `HHj ۖ⅐ֶ S,7n Y##4HtK8b7!!6FB,"!tk8MtB#'귣'7o$-@d;#.Yz-X" /rtYHsu)~ٰe1ӴROkf [Vkczw-g+¹i 薤 n/lL_X/^)2MՑ^nܧGAU@T+eOjE/{nLmIDޞ=)S!z4-3CkwZ:Vvc9 ݒnOAyMGS5RoP1'(TvHrk8I0[xG^7z%zW?׉'R~2G< b4$kj˅D؝g=th4:@@`Hjkʧj< RE­7uLrHrȣ k\ fA";jSxT}J_J1Ϻ:-u_(;ۤS.*ئK$_b ZbYEmPebDm1Q#?ԧQM OfTϢT v)rH$UY$!ivc&4s:|-CF4P٥n* kQDŽGMN؞^b H}^."b:EKTv |-ʞܟW;^3mf3IMr;+C'سi+;ϣ=R|^vǀ4nA;ҮLݍLW5cd=1.f14 tK">zRoBO= =ىRH Ȣ!Κ\d>ۭdԍ_d*?/Xd_!K>wɭ)9ukgF9@~jLRUVZ?9YYr[&]'[FNg]R*U( Q&M(M454Y؏{#Y/-Z,`Sx4޹cXzOlۏR 4s3k:!af\i 4 tK97Sofꘛm&do\ }/V)ptY@D qcRE'+֒HTm`enQ%Ӹ+~K cJ&Jf_1ɣj16J@/֧_p+2G)Hə49zK cr&rFvÙ͟~]ߗLfLQTG&g;ͦG ۳+1_xgZ]'HR$_?Aoˈ@]Φf0-cB9@'ttM7Tm_]L8:\j\Vz/5/nկM1m2Shg[X6/!N@o؞Jkӆ}Li%KQdbzI< ݒNAԛh&QQ'ծxaT\Czd5Fd(@ ,*+wJ}cRCG`RD}TouZt~t'5s6.4!-=YV̡ɹnUʠ[PQ&LEHC6Wij,L8)\\N;a`:PP59(*Hh7R8#A;,,nyM2RW|_K O  Oibg!ijK, a ]TZN>=Ė%=]dW"DS4!%iq.ndW粒c f]gw?% *kaiؖjE8yܵyzѹbb$QUh&i٧(.eЕ&z4 tK:FlH#i# O=͊3a)gvil"W{xho<}}}KWDU@X~TJ#gF_6;\ %3XۡN^.ǵzVfPq@d nv$Zi]>nArV&Dr6&mp\LݹR ji􁨖߹Ti 8d+ m@髶2$8OSipq ݄st1S׭3wrKEb*%#O%{ `ZV8w x*iI;Vل\%3(\] @J2V%w#:I,\SP(]KAIt1tq= =>Z$n¶"EuWkDxOQf{;pf[ZLs~aWt4ܒl4'%1fkT1]Hk? xK:~fGwP\r`tzgyECH_0` ?c. ycvt3C, cCAwcŌM܀W戢ֵMReAd474g/C8b{,LWb\٤1Kl9ۖ"жREU(2ElUWI !vMW'$ERDEtU<UVUƣӾLgU[w!WWhf",9;P"7'] tpWX Zʧh1w @Ծ\BM9_)o'&`(3k0}Z9eK]ۦh/f璧N[)ntIg[!sߌ͌ާebZ5?ԓ ?zW@]eoHM`RTsرu~# 0cGsb%n[mTw|=>5po)X PM/KѤw.e8ZmS4 u)PnjŨMC@ylqJ+ąk>$AJXѪEohbm;ںMWVĖad .+tfV3DRČ9RR/7FEuyPbA-@Dg%Tڎx>imlxrXl@ Nj%CN%~?YU )[VU QMM36ZzyK}%s~ AMA#uxͷ߫C 9ꬠ}P"zHf 5؉ / 8":-+~K> Nc~<_~|%޳d scQ|z ՋI ?L+yslg2试%t ݂("H>&iz`=jr~Ca}9Bf *<+Xs9up-55٦Y ]{fz~Q_ۧs.զm%LnkBpVPeل1ñA"uE R--(_aw;Ln4|^'~,ˮ3w[,Os/__NE;MCI7ZKl | A6y4c^'4Q]EnFwFs)MWuiúnq͑2M5E!e^J>g6A6} ;׃n=LZZUR\^qfn3y{1vW?ۯ#RAϝsbOGq|\38 %g~YFwzql"\a0L C+,C13M+ɱH[`tiV1D61}DbpP,SCaXJ;}]miZZ6ZŒm/*(&a }#o)nI19e RFp]=Rb!R 4mj:\ *'} b+zKUx Txba@ᵬc;nQ!t0xT!:iEg$gHlf}Ő;GzqId?t6;_s6z]{@HPFГ~Һ4H?>{ `464s&ṭ?mPRb4(2nb4xE+,o]3cAv#NWIL__</^?ڙ޸YtsO/ǭLe?5s|A)𭼰qUĥ(w1~̕G-C;/Fs@?i l\U4Uh%T*UQ&,q݉VhY:x~})g{!J{$B@(&+%&gܡ[J䝛}tD|2H6Tjv{Zo w+;3g?0(}H!Rv@0?nt~L0w; ?%D 1E2EwE+||9lIUЍT~ndCZ̋Inw0|g8gb|6S>cf֗͏/JOWUX rce$e'W<_g}~>.I3fnkF a2pZZ/(zMp)#)STorz_,GQ>gjߴ5S[ݪ;m΁oקg=|D7{= n-<@OirTh Lh1eFeTF^hc3,Lp)Z(s$1(+M!ЗvsR+;&!л^*U Q&M3#3|Ha -%5CqGy՜TZtY7XDq k0$sXؖZ)FԵM|P.c0h`{ 6=Do0E ԅ V*ޔ[IfP/ i>4{@a'oPK΄WEɛ[Content_Types].xml (J0_*Mi@Hm#3]G̶RDE)$3&G-߰K^ a#u ۵1cx+D"\Br6"J=*xO% #u  !"&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstRoot Entry F$Workbook<@SummaryInformation(%XDocumentSummaryInformation8  #i\pMicrosoft Office User Ba==p4D8@"1Calibri1Calibri1Calibri1Calibri1Calibri1*h6 Calibri Light1,6Calibri16Calibri16Calibri1Calibri1Calibri1<Calibri1>Calibri1?Calibri14Calibri14Calibri1 Calibri1 Calibri1Calibri1Calibri1 Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)                                                                       ff + ) , *     P  P       `            a    ||?x}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-} 00\);_(*}-} 00\);_(*}-}+ 00\);_(*}-}, 00\);_(*}-}- 00\);_(*}-}. 00\);_(*}-}: 00\);_(*}-}; 00\);_(*}A}1 00\);_(*;_(@_) }A}2 00\);_(*?;_(@_) }A}3 00\);_(*23;_(@_) }-}4 00\);_(*}A}0 a00\);_(*;_(@_) }A}( 00\);_(*;_(@_) }A}7 e00\);_(*;_(@_) }}5 ??v00\);_(*̙;_(@_)   \{1~ 1~c}}9 ???00\);_(*;_(@_) ??? ??? ???\{1~ ???1~c}}) }00\);_(*;_(@_)   \{1~ 1~c}A}6 }00\);_(*;_(@_) }}* 00\);_(*;_(@_) ??? ??? ???\{1~ ???1~c}-}= 00\);_(*}}8 00\);_(*;_(@_)   \{1~ 1~c}-}/ 00\);_(*}U}< 00\);_(*;_(@_)  }A}" 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}# 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}$ 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}% 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}& 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A}  00\);_(*23;_(@_) }A}' 00\);_(* ;_(@_) }A} 00\);_(*ef ;_(@_) }A} 00\);_(*L ;_(@_) }A}! 00\);_(*23 ;_(@_) }-}> 00\);_(* 20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L˭ % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  L % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23 % 60% - Accent3M( 60% - Accent3 23 % 60% - Accent4M, 60% - Accent4 23f % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23Ў % "Accent1AAccent1 [ % #Accent2A!Accent2 }1 % $Accent3A%Accent3  % %Accent4A)Accent4  % &Accent5A-Accent5 Dr % 'Accent6A1Accent6  pG %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 DTj%[2 Heading 2G Heading 2 DTj%?3 Heading 3G Heading 3 DTj%234 Heading 49 Heading 4 DTj% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  e%3Normal % 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title DTj% <TotalMTotal %[[= Warning Text? Warning Text %XTableStyleMedium9PivotStyleMedium78dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\`; no-col-names= yes-col-names>empty-col-namesI! abvar1var2 >/ - PK!pO[Content_Types].xmlj0Eжr(΢]yl#!MB;.n̨̽\A1&ҫ QWKvUbOX#&1`RT9<l#$>r `С-;c=1g;#=\;S8MklX(*|C:]g.Gp m2:ȍc _nLkjt>.&< :bo~PS4J3.OC^Wx}sǗ?@o?E@{^z^2|oT:=a($9AWW[@f[-4j .9Ō%b_K@IZ@qJS2(a+ʠR#tf-y3$8|h_WW<_:GLDdϪ(qo&skM݄o7uĘ;Ű8 8(Bİ@Ct6\㞥06uKA,3Df،Wb1Dg½b;Wk&$Lu zPI=C,$E¢)ݯSYM[{`F((APb~*8%^ThN ,lS[)]ElE򎢋yWR^QgE |P-$y#eՃjtӢkdvݫd4LCUd״1ú lvM^c1h3ޖZ Etk4f2d+RQwx4 Mۭ=: ުvlTV@ggD #i =8>  dMbP?_*+%@"@333333?333333?U @@    `>@ggD #i \??  dMbP?_*+%@"@333333?333333?U @@ > >  `>@ggD  ՜.+,0 PXd lt| '  no-col-namesyes-col-namesempty-col-names  Worksheets F$Microsoft Excel 97 - 2004 WorksheetBiff8Excel.Sheet.89q Oh+'0(HPp 'Microsoft Office UserMicrosoft Office UserMicrosoft Macintosh Excel@Mѱ@GLlM  EMFD@   N  NQxMNP(x N(N ׽y«׽ypͱCompObjpreadxl/tests/testthat/sheets/mtcars.xls0000644000176200001440000001300013067126266020052 0ustar liggesusersࡱ>   AB=\508X"1Arial1Arial1Arial1Arial1Arial1Arial1Arial1Arial1Tahoma1 Arial                + ) , *     83ffff̙̙3f3fff3f3f33333f33333  head(mtcars)K mpgcyldisphpdratwtqsecvsamgearcarb <  A*+%&?'?(?)?"dXX??U            5@@d@[@333333@(\@(\u0@? @ @5@@d@[@333333@@Q1@? @ @6@@[@@W@@(\@\(2@?? @ ?ffffff5@@ p@[@p= ף@Q @q= ףp3@? @ ?333332@ @v@e@333333 @Q @Q1@ @ @2@@ l@@Z@Gz@Gz @Q84@? @ ?>@ Root EntryWorkbookreadxl/tests/testthat/sheets/65536-rows-xls.xls0000644000176200001440000004600013336631200021037 0ustar liggesusersࡱ> !#  $Root Entry F1j"Workbook=SummaryInformation(DocumentSummaryInformation8 pȀ\pMicrosoft Office User Ba==p68X@"1Calibri1Calibri1Calibri1Calibri1Calibri1 Calibri1Calibri14Calibri1 Calibri1Calibri1Calibri1,6Calibri16Calibri16Calibri1>Calibri14Calibri1<Calibri1?Calibri1*h6 Calibri Light1Calibri1 Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)                                                                       ff + ) , *     P  P        `            a>  ||>!}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-} 00\);_(*}-} 00\);_(*}A} 00\);_(*ef;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*ef ;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L ;_(@_) }A} 00\);_(*23;_(@_) }A} 00\);_(*23;_(@_) }A} 00\);_(*23;_(@_) }A} 00\);_(*23;_(@_) }A}  00\);_(*23;_(@_) }A}! 00\);_(*23 ;_(@_) }A}" 00\);_(*;_(@_) }A}# 00\);_(*;_(@_) }A}$ 00\);_(*;_(@_) }A}% 00\);_(*;_(@_) }A}& 00\);_(*;_(@_) }A}' 00\);_(* ;_(@_) }A}( 00\);_(*;_(@_) }}) }00\);_(*;_(@_)   'ə  }}* 00\);_(*;_(@_) ??? ??? ???'ə ??? }-}+ 00\);_(*}-}, 00\);_(*}-}- 00\);_(*}-}. 00\);_(*}-}/ 00\);_(*}A}0 a00\);_(*;_(@_) }A}1 00\);_(*;_(@_) }A}2 00\);_(*?;_(@_) }A}3 00\);_(*23;_(@_) }-}4 00\);_(*}}5 ??v00\);_(*̙;_(@_)   'ə  }A}6 }00\);_(*;_(@_) }A}7 W00\);_(*;_(@_) }}8 00\);_(*;_(@_)   'ə  }}9 ???00\);_(*;_(@_) ??? ??? ???'ə ??? }-}: 00\);_(*}-}; 00\);_(*}U}< 00\);_(*;_(@_)  }-}= 00\);_(* 20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L˭ % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  L % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23 % 60% - Accent3M( 60% - Accent3 23 % 60% - Accent4M, 60% - Accent4 23f % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23Ў % "Accent1AAccent1 Dr % #Accent2A!Accent2 }1 % $Accent3A%Accent3  % %Accent4A)Accent4  % &Accent5A-Accent5 [ % 'Accent6A1Accent6  pG %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 DTj%Dr2 Heading 2G Heading 2 DTj%?3 Heading 3G Heading 3 DTj%234 Heading 49 Heading 4 DTj% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  W%3Normal % 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title DTj% <TotalMTotal %DrDr= Warning Text? Warning Text %XTableStyleMedium2PivotStyleLight168dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\`%<Sheet1IHELLOWORLD . cc PK!pO[Content_Types].xmlj0Eжr(΢]yl#!MB;.n̨̽\A1&ҫ QWKvUbOX#&1`RT9<l#$>r `С-;c=1gGR.e1a$n%N91G7Z(Lj$>{ҿQ>HjlIh촪b-{gv|g'=/:~E[7 r!7\&0;9$4 kas6r}SXi٬ kGAsPZxC}s7T A`?^R|{֯A)oViנt] f9dQ)/P yt),b-FO@)$zh QGpED 0\UF:W@?i i !SNy?yW޼W6Veda?~ǗH }˯S+.Lۯ_:w9:1c# $BĒ@v_#m' xg:J3F{; pOeXxJ=B5w%%WRُE!ED `)Ǝ}Nec2L>'^I& B ڲǨk|f#a[ ?2(v?B2r O/0epp<^ ø~Lױ䒜t!L䀝#/]1I"8EC&]cf~@^w?!rcH&"@7+̬aWʮ]N[->˜s4{A--FU+";V{IMGDX!; z+Q#O}i!T9g*}@&>itWYK w忋1ؗO-ؗ /-ݔym&Z3A`-X/DT]b+޴1$l~ڞ8vix܊uVg_J9jpۚZ%1Tݜu\w5}Wo/_2:^Ƈ㺗NV>N/S/٨ӎG{|ұ\S|$_4 *9}܉#en8#,Dz!%pbc6KO:UuVVd1^ q8),NrBn(ː0&I$Ae$} Fs+(,-~@- z!8|z]̏}ƴ"ZMn+{VM)u[}B^%UVLfQSwӰ٨];6  #76jt0xrQ CM_-[mvBv9h{4my&Oފv~-*pX A R7 aX zPXdW~Wt]xsKsc2eM\_Wk/=Iy6j۽F]J*^i7A?lG/|Ln4RFEoK͠Vnkt_dm @ ggD&<3   Oh+'0@Hh 'Vaggelis KapartzianisMicrosoft Office UserMicrosoft Macintosh Excel@&@1j ՜.+,0 PXd lt| ' Sheet1  WorksheetsCompObjp F$Microsoft Excel 97 - 2004 WorksheetBiff8Excel.Sheet.89qreadxl/tests/testthat/sheets/datetime-rounding.xls0000644000176200001440000015300013071030541022166 0ustar liggesusersࡱ> "i  !%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghRoot Entry Fz#Workbook?SummaryInformation($XDocumentSummaryInformation8 #i\pMicrosoft Office User Ba==p4D8@"1Calibri1Calibri1Calibri1Calibri1Calibri1*h6 Calibri Light1,6Calibri16Calibri16Calibri1Calibri1Calibri1<Calibri1>Calibri1?Calibri14Calibri14Calibri1 Calibri1 Calibri1Calibri1Calibri1 Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)"mm\/dd\/yyyy\ hh:mm:ss\ AM/PM$[$-1009]dddd\,\ mmmm\ d\,\ yyyy[$-409]h:mm:ss\ AM/PM                                                                       ff + ) , *     P  P       `            a      ||@}-} yyyy;_(*}-} yyyy;_(*}-} yyyy;_(*}-} yyyy;_(*}-} yyyy;_(*}-} yyyy;_(*}-} yyyy;_(*}-} yyyy;_(*}-} yyyy;_(*}-}  yyyy;_(*}-}  yyyy;_(*}-}  yyyy;_(*}-}  yyyy;_(*}-}  yyyy;_(*}-} yyyy;_(*}-} yyyy;_(*}-}> yyyy;_(*}-}? yyyy;_(*}-}+ yyyy;_(*}-}, yyyy;_(*}-}- yyyy;_(*}-}. yyyy;_(*}-}: yyyy;_(*}-}; yyyy;_(*}A}1 yyyy;_(*;_(@_) }A}2 yyyy;_(*?;_(@_) }A}3 yyyy;_(*23;_(@_) }-}4 yyyy;_(*}A}0 ayyyy;_(*;_(@_) }A}( yyyy;_(*;_(@_) }A}7 eyyyy;_(*;_(@_) }}5 ??vyyyy;_(*̙;_(@_)   \{H Hc}}9 ???yyyy;_(*;_(@_) ??? ??? ???\{H ???Hc}}) }yyyy;_(*;_(@_)   \{H Hc}A}6 }yyyy;_(*;_(@_) }}* yyyy;_(*;_(@_) ??? ??? ???\{H ???Hc}-}= yyyy;_(*}}8 yyyy;_(*;_(@_)   \{H Hc}-}/ yyyy;_(*}U}< yyyy;_(*;_(@_)  }A}" yyyy;_(*;_(@_) }A} yyyy;_(*ef;_(@_) }A} yyyy;_(*L;_(@_) }A} yyyy;_(*23;_(@_) }A}# yyyy;_(*;_(@_) }A} yyyy;_(*ef;_(@_) }A} yyyy;_(*L;_(@_) }A} yyyy;_(*23;_(@_) }A}$ yyyy;_(*;_(@_) }A} yyyy;_(*ef;_(@_) }A} yyyy;_(*L;_(@_) }A} yyyy;_(*23;_(@_) }A}% yyyy;_(*;_(@_) }A} yyyy;_(*ef;_(@_) }A} yyyy;_(*L;_(@_) }A} yyyy;_(*23;_(@_) }A}& yyyy;_(*;_(@_) }A} yyyy;_(*ef;_(@_) }A} yyyy;_(*L;_(@_) }A}  yyyy;_(*23;_(@_) }A}' yyyy;_(* ;_(@_) }A} yyyy;_(*ef ;_(@_) }A} yyyy;_(*L ;_(@_) }A}! yyyy;_(*23 ;_(@_)  20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L˭ % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  L % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23 % 60% - Accent3M( 60% - Accent3 23 % 60% - Accent4M, 60% - Accent4 23f % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23Ў % "Accent1AAccent1 [ % #Accent2A!Accent2 }1 % $Accent3A%Accent3  % %Accent4A)Accent4  % &Accent5A-Accent5 Dr % 'Accent6A1Accent6  pG %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 DTj%[2 Heading 2G Heading 2 DTj%?3 Heading 3G Heading 3 DTj%234 Heading 49 Heading 4 DTj% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  e%3Normal % 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title DTj% <TotalMTotal %[[= Warning Text? Warning Text %XTableStyleMedium9PivotStyleMedium78dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\` <Sheet1Idttm dttm_string / - PK!pO[Content_Types].xmlj0Eжr(΢]yl#!MB;.n̨̽\A1&ҫ QWKvUbOX#&1`RT9<l#$>r `С-;c=1g;#=\;S8MklX(*|C:]g.Gp m2:ȍc _nLkjt>.&< :bo~PS4J3.OC^Wx}sǗ?@o?E@{^z^2|oT:=a($9AWW[@f[-4j .9Ō%b_K@IZ@qJS2(a+ʠR#tf-y3$8|h_WW<_:GLDdϪ(qo&skM݄o7uĘ;Ű8 8(Bİ@Ct6\㞥06uKA,3Df،Wb1Dg½b;Wk&$Lu zPI=C,$E¢)ݯSYM[{`F((APb~*8%^ThN ,lS[)]ElE򎢋yWR^QgE |P-$y#eՃjtӢkdvݫd4LCUd״1ú lvM^c1h3ޖZ Etk4f2d+RQwx4 Mۭ=: ުvlTVD} D} D} D@@@@@ ? >UUUU@4UDyyyy-mm-dd hh:mm:ssA02016-04-28 11:30:00>q@4Dyyyy-mm-dd hh:mm:ssA02016-03-23 09:50:00>UUUU/@4UDyyyy-mm-dd hh:mm:ssA02017-01-02 11:30:00>UUUUO@4UDyyyy-mm-dd hh:mm:ssA02017-01-03 11:30:00Pddd>@ggD  ՜.+,0 PXd lt| ' Sheet1  Worksheets< F$Microsoft Excel 97 - 2004 WorksheetBiff8Excel.Sheet.89q Oh+'0(HPp 'Microsoft Office UserMicrosoft Office UserMicrosoft Macintosh Excel@:9@<GLlB  EMFD@   C  CQxBCP(x C(C ͱұҽҷͱȽ׷ȱҫȽҫ̿ҷȱȱȼνͥͱ彥ypyȘɽͱտͱȫͱͥͱͱ͟ȫͱȱźױҫұȱȱཥױϷȱȱͱұҽҷͱȽ׷ȱҫȽҫҷȱȱȼνͥͱ彥ypyȘɽͱտͱȫͱȫͥͱͱ͟ȫͱźױҫұȱȱཥױϷȱȱͱұʱͷȽ׷ȱҫͷҷȱȱνͥ˷ͱ彥ypyȘɽͱúͱȫξܽͱͱ͟ȫͱҷȱźױȱʱͷҫұȱȱҷȱȱȱͱұҷͱȽ׷ȱҫͷȱҷȱȱұfpνͥͱ彥ypyȘɽͱúͱpyʸͽyͥͱͱ͟ȫͱܽźױȱҫұȱȱױױϷȱȱ˱ȱ±ñ̷ȱȽȵyɽ«·ȷ̫ұſܽ±ҫñCompObjpreadxl/tests/testthat/sheets/inlineStr2.xlsx0000644000176200001440000001535113067126266021015 0ustar liggesusersPK ZFxl/UT !%U)%Uux PKEz?g]aKxl/workbook.xmlUT NNux N0EHHM>QJAvIcG=NRر^;Y=˵J0t6%+[_^$WA s ޹frXa' =#\ >2U q7 knafzޗ))bJmVd6*)yiVYnKD'EьJ CAgDzAOdK^Y$>eU$ fcdn\0uu_s8=MN)~[^`)26:_DҽS:+6%uGs1g/N1hnb2фϿPK ZFxl/worksheets/UT !%U.%Uux PK[FfKExl/worksheets/sheet1.xmlUT Ǹ%U1%Uux YKs0wAk;MC6L2^$ǯx8I/ X+oѬ;#!OF2L %TGk.@! HJCBBLSHHEL6łT8"i:$,e'ÄY *˕!K%֋Cy$VF1wQLok6Ww3u,Iv![x55Lg?lvv+l:F5 ߫{n:_a+:;Vx[fq)Gj"&TȂ_#Q8˔Ik JK3 ylYkq_r`ף,XJiiOi}no-ru6P' }HZA5a`o{`5Ic{,wqěPS~WizXF*y1,˱fT͘aeyWp2Wbe{ d3zkz GRT,X"Q4*ڊEKWH3tto@ rQ T .ٝHA[PKEz?yve xl/styles.xmlUT NNux ͖o ? +NTd*Eڥ+Amb jڨ˴$a;DdWWDVf)`g/؁!pgm !SJD:UZ`T jk3. $tȩրJuf6zf~gDR\i`]n⼉KbAURK`|3UW &EXey]יj hc/'s8ybZցY DžDf/g?dMzR|?RNk4Vͻ>s67WeEҵZ`vPЬ%X-JĖFỊUO\OVxםq͋s@ %REY6I _CU>-:QޥӲɺU2\}笑$=s(xo4nHo%G=}_>3Y)S-'1i,_ƛc1c>QhPK ZF xl/theme/UT !%U%Uux PKEz?4<-YJ)xl/theme/theme1.xmlUT NNux Z[7~`;6 YD@Mxt&Yxd;䭂JҪ/և-H}f[JO.;g&,,h>s|.>r!eU.-Dh0nY^hZ׮~|Yy'2nYRRI:0E\.|QK#gj(/sץrg@HaXңP}ҲD @ h-12&H8֚/*h@Ne tYFh@( 1,LrP鄦 ic蓦sDVSb<\rV֥nVjR<^UR$(」i~H-$e{AZVݮojY*;YnU3٪4T,U#iajĩ /@>o 2/Bc^|gO^|???Gn <#'&Ghےxc41=%0@$yw^( EnFĬ0 ƅ҉IapO&!Ģ!($TefxL3ܣ4q^;\rW{1-2p ݹڜl%I2f8x_Yt +@p)ؘ0z#"e&T!uIPt suA~X 8yq.WERdg8jgw)Qo>czf" d2Ėf4Xb2 %bJ܆HAvH5 xuIKth3Z^o$߬]/l=]ؾ2rKj30MD8kJ(\}N$X]2)r\BsoVY8{FѪz5X>eޘ%4^l^JM 9ujޭ:gI>%.~\iTƓfd=8 _? =<"kJ4| U{l& +*^BX̵P-eW?M𘍃( #s{HJΡl^VU͈:RufѲY`2[nkANn)MOKZk3{4?q](s ̦ՂO Da=p.T{ʴ"bwJB+t3/7 T"s&&O:=+ުs3ϐ 6āL`GByeQ/3 @Ra.mݚA7 \y]5k\YL/fSQB䐰N }le͐95q37z%T7Id쎷nxP] nB/B49%Utm^!c<4I*(KƢހU1OKa;0CǼoVp~,j*f~6҃ѳoC? ͠ #`,BlaJ~1]438c>.&4/̸i)H@!4$IוyqsuDR,%%;ڴzPK ZF_rels/UT !%U%Uux PKEz?R _rels/.relsUT NNux N0 )"7wCB5eB &q6*iqϟ-y;؋Ӱk5ԏ{P14c 'V3rMzUK? FDq#]i$L3 2oTUpk4ი] Ykr}H}GZNHo2zĉ,%B#/}e\V皖?>Wۦ)TPKEz? JD[Content_Types].xmlUT NNux MN0H%nY vl .`Ic%=(mnbE3}/3Vio [AD]3p7kLmqϧm5;yRxUVb8>Z5Ej! nG;KRNnUOʥI칧 gWsJ&k~/JI܃xC \K9$6؟ѷVx$)1D vɚ2[+!L"-ވDSs\0?hŻ|qivC,xga 4E KI@', ^zg|vlT"a&PK ZFAxl/UT!%Uux PKEz?g]aK=xl/workbook.xmlUTNux PK ZFAxl/worksheets/UT!%Uux PK[FfKE/xl/worksheets/sheet1.xmlUTǸ%Uux PKEz?yve rxl/styles.xmlUTNux PK ZF Axl/theme/UT!%Uux PKEz?4<-YJ)xl/theme/theme1.xmlUTNux PK ZF Axl/_rels/UT!%Uux PKEz?"-xl/_rels/workbook.xml.relsUTNux PK ZF AdocProps/UT!%Uux PKEz?bdocProps/app.xmlUTNux PKEz? docProps/core.xmlUTNux PK ZFA_rels/UT!%Uux PKEz?R %_rels/.relsUTNux PKEz? JDV[Content_Types].xmlUTNux PKreadxl/tests/testthat/sheets/los-angeles-arrests-xlsx.xlsx0000644000176200001440000006446013336631200023643 0ustar liggesusersPK! sheet1.xml[6->SE OHLT2S38v9߿(,(Uf̥)^{ߝ?˿~G>9/us~_wo?7oϻO~>?Ͽ?~?OD]7~yo:7?~~/<8?~~tϿq_ލtx'}S1Lsyy/7?F^uč(ons?n'軅;/w0IH;E;ERQe$C))r'#cB '~Y_E>z%jGIB$A_*>x>:Ydɗu~|?zӵ_4|N8bCkF_$ =O~ɯ瞼~{2O_t# [WWo蹞So?_M6/}o3_OϬy:zyI?}U\OD?~}||y.j\)^n)]^-[?U^M|\RdgUv+U\o/e7?56.+x4.i*}.~2xVRuPtT^GүC5>hu,%gzQu7WЕ VIV~7A.y僵]KiW]" (r<_"Wv0݃@G\y}Q4/t+3)/ 6wZ)HW>}@FQB:+ֶ8e僵6X;y7fD ]]0 Q2CMQÝ]{!_ԃ,-(:'!<Ncm>R^4I]Q5+<)<$(i/N9k $ cd<1^#󰓼i::F0ڀFm( !δYUZ2ϪؓRϟ^+l ˤßa#T-Pqyx8ZS!G\t'RIgR(=&*=1d@W媨6bjA0B/%?-#U&p>ir^~W٣^mhg@$Q}N|vD>!(Sߢ*h3Ԋ|U(XXf5˚`ђ=c(OT<R_' y$qT8@Չ;ٌR5 >AibsP@4uÈ#n:3VL U=Cx wL0f#> 0.Gl$^mʺS =DÅ̹Q;Qk .|¨)*CT;L)I) *1&Ԅ[m\̮i9۬`#AӪx!#ڜ=B,9 + FU 0 0l@Slj )#CF& d> !^LHq4NWU).6O|k*蟖Q!Fc0Х~46<Ny$MMdȟ&ɟ*1?r%0*=Bo\ Zc v Fl]E^VU2mhŃM^c= г,bBviX8dM5ni+"?r'oP©$_΂-W"woPW kJ]-!šL|e_>HyS Ww1==?"j8\;ۖQ1JY!pa)"?_C|J>g ^Vq@'Դ3^?rUb٪+SM?+Sbvϧ63H:dtS,٫U yaa'J/2^;ei{ !MS ]S R Ҝ|tX?yUkMEuŃKV W@o`?Byg4Kale*}TStX˚ ʤ^p@qDQEn0{TS%: 2t4"ݳ o[u[X,/ HcdΡUc @' ~n]\c[|>E?D/QY%őP)gEqD,Xsrq0 q^"g%lS`'PCaVOQ0b ! y4 PLtg|M`{vJÀ&>|}Qpd7fu0[ʉ" ݰ,xj@f )5yeo,tahe]%_/l ">agXV낅T @tcC4 5DXWbKш;Č8 qx-K`m.ɺnzB<(h{ 0vTS)&c$HCVU]-m ]Wn%Dnre]58ukTQ>1F{quNIcR$$0.c_ z>6$ ?j,~oc U&#/ >S*OO`=qJꚷcFqt5NE<%yM}TBE'迖~Ί[^8˪RcĠe.+3V 9i|.hRL$h@2DM9fFh@-̨݈-_YWu!l"AVqT12А8{-n맼ˈVb-@*gʈԍtb2#Q.l2oUU.Q|1J=#mIQY*??K{甞rO RJ5db2}(~縯VT^N%.YZYkPeUMڿ+MA Z0AxI[gv("C7-@[' ӕxx+2'@\/a(HtTHoQvj$}m0qzd%nvGqۺʛkZPfi>Tl5i_ ƆhXޚ͇V o=Fp$ >/Rusi,Ncyy| ׁ%5iT=t/ '^>Yq0lӰe!:KAn[FĔhM!¨jqX'XӘJ޶o{b< +a£فILFF)C݈Vؐ&+m: NZÜy7skl2gNd~A'SJ|u+/T^mjk,DBp+Ylff 1 .W"o4AE7̻ Zmah*f5 u TFWxwx.B!Ճ}adH(w sQnyQ`)YW%יXK.&P TZLDdC]zBH8 :\:h478DPMG 0dbTh$HU4OO&((Ib#–-WoCaR6lX 겫tj{NnN !hEU XX%_i /UaE2?ã]-ߠ.g:`7ez\cu!Mj"Gx-t=Ki"?|WUrwauU0L &*U=jxaxF)&&lcl2"ʔ/9 gLb%G?iUtYnc!&3~hE7mZ`4ҦOrC(Wf`>{P8䒅{1zZYHp O#SfF01y䥳_f5VC|"D)t"'> u· ȥޞhMB_S6bPӰ6O΋ȥXuAc:3U\AWBZ!r HxcW nPOtn;!6xC)/ CǢ4MB!d e`PJJ"Y+FINs Do.vl.0!CZg1(9#">!0Dg0h6,tt4%L6|e^ !3'ڐM"6gn9qyU읚@{ϵM TW]8}f 0d G#xPSsk3ƒ>HARp+;lESVu9[(WRba g0+R0F4Ц(Pf]-J2&j}w[B':5áwр)4#o۽BM'-:^ߨn+Tv/Oi9/x}Q`^56 U$oU7zdjmQʈ&6zsy?5&4_: ˡӒ5Rpj$x?0G81xH\לwk^͖BYauQAX$}!`gI,љq8>zGvLYŇ;Zh%2,ΨmUcnN˺CfUbг5 ^k/>K{Pjc9~Xz]V-yi=ږ'ξaub|-p$rcw3G\erG3+J^o7 18D<$ :/rjHvi{5[|>ȇu|^|NL ! )U;R[+yMZ0iW]Ҳ~'YuBKI!C}~hϻvMnǪtriy9/+QwZ7>\N^65F6a "1K~jyUe€ř1)ZyUBbrzS نB=7mH%&Un{z~O3P(|;6ZtP4!Ha3^z[ T9Bb{bjy&-818-3)CI4 ki@$ky!D6M&z_VF)*9ffQo6cKV:o1Bm)ZcM 56>cEZ_XW~aYrF( <K&MT~ _*7aFB>cvbӔ߲G~yYDj!*};`{ćh \V4FϪ p..D~w8lO0y!Oy9r%GCBJUꁋ-횽GCݞ!FU[(.^j*hQrC~߽Kj;F!/iKD[VcOBX)u&m= K1Ar@VVkD:/J7..6ȱaƛ0F,2X= ~rh.1yA7 HSիl<۟ Ӽ1H3˽'"oϱ2zHz/Գ#7R!׿vef5u jjWuA<)k9r@ʊ\MM&j$tVZz zhk'C#KAj{m?QeEJܞM#j,!^-쑛hg12.Xc|BOUuF?"H3z8J 5 f0&0"368M*BFYMӛs!ib5>iW<2DpBx59+1Ɩ33x! tQ40&u٥#N^W0V)W[eHUWNUgؚ(sI$`PT7 KApԬ{3|$~wT|g~S,S -tB޴^h"hLӉL_ׯC"J,l5"W^9ș4EjUlϘ [b-}CiHoeJ#I;Fix^6Ģˊj}@!2,h`8̘{A-k NMdѬ:nLjք{xu^/teU.r\Bol^8!B8ݑC(5` љiXDW Q= k˼LDaą̼V$ԡSFF{>VJ 6e-KIrUAN²]T%w,:H(oJ⥠<ڗ$҄}abQ.9IՏӳ0L|뻼DZ3c@L)ߺu|O|~Jꅺ%"bǼ#/6ň m1R_(7PR{ы!}:BO+QY3:kgVeN^>L6\Q;c[|Z$w(o.frnϤDu^ &e "/6&6 V}7 INdzD:=iϷG: "'0$BNc$'.jKX~Ee 7Lm-LC7D C"أ|C֪kXv*u:(`7|~0!Ä\T}+LGx*ڕiBq 9YcB/mOsAAc%غuQ c_[`}3ɓ.ۼ4O-[APjɛ6Okw Mf]ͪ|Ǝ!(WQ. PF4NYTwAk͊e 0k^Z~κ&/y8g Q41!-K @S]xaiCʼe{z:5_|lWg3"hg_YU=<ͼtZb!P9#̑8ٷ q$+ I{,;ݵۃW}ƼkL2|VXDkP'ٔAG Q"%l#^߳'V|cbβ*e>|>.|3 cM9O`CÅv%5Wrnd[=jP4s덳d%[(ꉠU]zbL=EX > *w=z3~ˉlu'|H?tG,"F;M׬>So-#Ⱦ[K$I U]Cω5@[ ")M $kPk+y Z  Bv⤶BB$fU'kMw7m-O%<@Srxs5e0RO1щz|}\7}?ذ:ؓ4DK^Úo[2_gy)!l('s`FRH0^iYP5iޛ· 'PQ5\5gbV}v2D^2=jY%Jȫz sqQ`:1%elER.ma89rI1McW5o|i k|DTt"sTS&߁DPƬ8w[_0\f̬=уhj(Y$ira2H0}ی.%6>ystٌ=G|J QtGLMdɄ:`POǀ!Ò jpg6_TKUȡby xA K-wb! J$2o襧i$@m+xd74h959*i7UI&RuG.uV,},%Wl%eVԢX\ <,&``?"L !ixu ^A^opgY/NPZƞ(Ls(w I=m`s4Ts/׋RО(T. '2SJpKg| %ޝ"=#uJ,Pdl?-ZNQ]0~"SR(ת\{HjK$n(^ȌCzu' 'nEiQb>Ԭ4o' 3/xYG{l̖͘xSuIynfgWhZ2v)ޝeMr'ӊeY>ľfS,+z oݯp^TFP|2Vͻa`72,LnQP&Ͼz+TuF5LJr&k]2SeՅYދ Z.ZF|' 6$/A5YSZ7?H'㻸3N  TǂG =5*6D~z( *w|Z~UR-}oщ" >K~z:1:rA.,&PNsB:]rDXrexZ2(3=8$S+yo 88 <hɠ 0c/1'꿋 CADO'Ɨ =(v8V S]v&lr^pPS6؛SÊRQk}(Զ,' )jCMj6R0dM75e0C}O1V*E R f X^XIѢceQlA v82!fli}Op$!:x,[;eלz(&3bQ|AuL;U"EMm߾h-!%HX6ot8΀ץг.ӿt '%.yXϟ$ "Tch8Xj"SWf̢*0 Yf'2=Gn &bЂ㻾DM$EH8\^CXmUʛ/Fy+:yٴ+'$5 {_-=F^ nayn% } M]`?DHTcّA"f*|IG^7k{r\%YTM[Kr{dVH(d}: $' oO:l2ҨNCMFq~caIasFɆK޿`CBqV,fP2x9C"`X =X8QӭCqU(mPN~1q T:$&^xQX^,\`i7&LcQOS~&_'9 `HOkZ'Ρ*!&΀ ! M^r(mNOsQ! PaV-' <@o~h'2?B! ;9 N 1~DݪfVu5F|^ɷ%qȻ9T\kg"D!]`LuEjZoIO4twF uIOC4}wB4J!h۟F8ͪ˹=QAf`Zԇ*:ci&CaUTq\C fZ06EUfbi]au>)(/3F5v0Qlqb~U:1)Q瑪b<ҽ7vm]5i!RX;ϖyͥJt6eṴ+RIDӏamO4ѧE+_E7F8#['{Z*4HNV$v1Qq&_BvAKEMBa9}H1]`lZ^/1x3]T%)iy a,{O+QP#RoJ?wVK_+VX!q|@%^  q1?;:Qw)G7,g"4|{v^լY/w'>x@|F*w5h39*>tPS:˼iUG.s=Vуޭ:wQeQF} j! dx"z~kdᶣbѕm^~}f_N wTB6,BS >V(TJ\MUC:* hXfKG^F6|?\G wP$@XPNRc!gCJC_u+輏 ,c"/Ƃ; 08FX{;w֟*'J}*cOSS&>Gm0\ @P7ho4]1 Q`ze&M є `p|J`5˝wG[2V5*eK^M= 8:B@bReA6*CXۑ¢!x] #4ŸXʜC)=~"L7Lp# H\nwjM5P!=N9.HY͠b`6(re B!f\8Q^p(Q$քlQTz|/be -/6!1H[f7"\o _ ?zOAT *6!;@+^g6Rkv/^>T h|6K㫨yjZhӴp!.B(U84혣! Jzz1|A;Q;Ck|.QBADX8ӗ )Pn5 2s_Tk]Bl2]Z@%6_V-vD8kOhAB\^(F9(b'>`POY&t= ]G?Cʼ |2ϲ L)O`/y,)@mX *e޿gZðUAQP2Ov3cyys!g{,:Qpg?&2?ǂ@LpŸPo!Uy94^f:ü嗬.0p؛z`q2z Y;$eVUJ6@o,!rv% XOu&pJL@(D~,:^a%(sĂn f/ou'^$xNA1 X͢Z}h}<@nns,)X!tH,txvsT㛳$AHO{֚o8QW?^+bvB/`0!7yT4 6mÊ[ ??q?*N;G(KVm7NU>~"(%aa(Ӂ ^#>gujt0ЇCjZM5;{6Q3gׇGDL0`ߛ^Փ{ -##@DP!}-\D>wc+Fy3N (Ϳԥξ дV;|Èe] ^l2{ԋ1C'oq zB@jPS-哬7"x\V(d<4!q$`@!vh2!`G`h%^?h)$~qph$0!S?]nv]C @b->Rs?qR^/Iu&-Ss]BG=r"**킖m{inUf_.{`LX-;ս}M|?CXӔw!_U_| G Kȗ_o,6$$DGUaX.*%(`pJc#@iGë47N:zi -4CP5!^e;95`(y0J8"Pm@,ΛN%B3VXߊubX:V?*3AOHc!k8˪n΢*ͺ2,p08 GbW_A\`7ڤ$jJ„Qatysko"Z49E}-0*A? " o2ʥC|풡K V}n.I/dNJq(AY|/aBsEI`QS/&`K{9 uzӴpU/j6R\?|;&P{w R7 OTKVjԳʊL)=JU tLX {Mf?~ 2}y>0qM«:{j%ēӒ|C8rH^.v=ŰyDG z .uɗ3Ӽ(L#hH,rIEc7\êEj +]Zo9u5{|d }ny2wd'WkS^$PR?{'93V̪7qV6 9|M˟8} J0KA"L#~;GX}2WKug*Nm^1H`wU'(syF:'>=ǢR P/oZ]i5Vb9`ۜa3^8VC'6MS.x@!ҷNyq&^~`ZH)`cU5m9M(/GϰLHWyo' &!hh 3/xVXYH0B7Z9+J:ǔdjnB!}|s?XP.Á4tE cqvPO?|& x˼ɜuD[#a?]0&EL8^ XT#2{3F]T& !Ȯ0r(S)KA=L`XfU QƉL~^# EFah@S쳼8ZC}S R6|C&z>O&1$Ml0A/ujU䶴d2[%&UCVf w%D*(F=8xl5#БP4TVZ-7^n;7iBi* az"aE˜inzTŊyr,Dg@`DxWi0tj)4V5>#G5EgbAR'}mND}&;Z":ǀ FbYi2)"(\m/ |Y/y͝ \b|wJ@ ?vCwXTF|-d,pgng|vr_TkFE#zhp6Uy]"WyTWVytѵj ܒsCOpp)JM|!`Y;k|6'6aLb?ш(> -z, (!㰌-E/Y ]2HQ]dfO0Q'$ I$8f=^b"p(quΑ kj$R̘%Hboc\LJX+fm l-)vPBÆ %3 5,2:ʝ#6^( 5T.jסKT# os,iJ$P3!BĎUf׾nP.K`3LFj,7q=- G4g8[<ܬ/N˖+^PDaŅso;wrgXZ/t!*Q~}C їxZ5p]kB[!VgҼp,jiDY[-Qv~J[Y0=ByXƳЂ(`7ćC\·ztgfAQOQ,e H)PB1qJg7k S焻!9A=^*ktBB2 i=P&5d[J8/q@fWvĠ?-K?UYY0lfÅzz1hd\HC#QBQ"a-{tN|dӺäIxZ!wf屆Y3 GLZԱ^~ngF*i"cͫ>e{^oTtot EzH GxUխXV'&2d *,ϱ0+b{H(㗦U],{jjxaZm 2f]9PF%ŰcXk@@ed,;}RrTLcnD0w.0XpӞ 1W7C )8#;_4aS{u1|bmT(Gyڣ*-Qޔ~i1 (|ׂ[;*5l>M>;: |Ɛ0$҄Xa/YH( `:!Q!ېڜ?uHڔUkl2489 iBi Pi=Z;;Ja>4̪'̽gsqB 'HPZJF7'J]buH8}>!VQ?}  XO%6 }=S4Ą)n":NJMեPu&>Truʡ)r4AÐ!VGOxX@A1 Ah,U߷ U M@(-!z! )ӄj1ٱO1Lʔ-XKՏP3cg-6Km" RmgW?㥮w[*,/DcW4B.HEO'Lq\h̟Rv"s,Iӄľ4M  (W48]v'9Pf̬H Qp`e B7EpMB=v9U i44>0FEjfu T( ;zA@yJ}E'Q(+*nX=lHFg"g`/]\LJfBDE:TJ |W{"w+~Ƈ.C RH4iCJ u]X+2+vl2Cyls,6jsI=v.xWm]3L*c}&Zd.Y%y23 (Ľ`G=zU7򨿍n&*v$llVUװ8^ pMi`+G pm))9V rE`e]b/#] C6z.~'YW8yb{ס`I7DrÅOϱIC:!* PC@`k,٪x+{'B<)Sa8Ǟr+5!P1j"F`,7GꟆ=C{fXڞ6w*门)FC!#6|F ʗwnDONtR4-$J)5>b~CRJ羮5!Ej1ig}02SՒA%kۅh`z*BLB}GOG4&wF+ck^l< 6jxk\#7duoM1a,+3<]0L^JvSGv31N]D,d蓮z&D(~իAb4άN[UŻ`| >!*`5N<j{G -bRvn9{[wF}eMX7yQ@p`h/Q'B"!'lG)+9{ Fa! MDS?ȮnLiB،(#H0TЏ=vc6hx^;KV ޴RB~*ktyf n+XPup >wqlnO$#˪x[W%ĥgCLT;7r{Jv>(C@ j l@VW㐈Dą̻ZDԙǠAT)(l6ۅ <_ϥfM1;x$(g" t¡ o>U7VX}WFU_?|߁`7~Mjj39~gp+ĥ$ "@=ǂL`BI4*>cg%%FVcu@i{sw7c~8^Gӄ~"Znݛ{bU)(fY?Ʒ5g&n#G,IC#d`]yꠇvc]P1V]`&=cJe3}a@;yóWxÒ~}CLԠ&众֙i&oX{Ď'2?BLɃ7#Q | = ]`l;3^$g)5Q A в 0uBGAPJY5mLN<ܸgo1T !QCj1\} Y+axmVkϡ ΠFBBP7"D²@+TJ+HGOa1*kM˙AyTY4ardY)3+2Cʏ(o2&bR2S%Ŭ*VEռ(W>9xyDp Mfސf*?Ҙ zTas(ONQ<3͙EW ip&ϻA3 o:3}LCmg'&uӠ 7Fu4k&DAna5 >mTHa"J0nO1 ~߸B~66]z76S ES]ʬ')BKi X{Df!g+=f!t fz OROrQA@1dM4f"}܃>{P%f0zυ4>:-vP,Mx uI=%e\?5@[j&mS=QhitYW9rbq9W`rHSo&P);̼%/t+߬lTu5B@4<8Nq:r~AaK`kIQQ Npg@n<06Cf7GL͂q~IM5BV1, cMxm%P@8u>GnKc*"ג'V:ey14`(YhnGq`7$TSXFN5 /5L>`{<"o^8L̸VYSEYb>~=3J~ғe%R% y}D^)1]MG,c"/F~ >&Vؕq1@W"&4XDt@!6 :75Ugbt>nB>nB0 3ԥD۪).㖶<|,YiAIZ C5tRv*$^R0̪jgSu*7O\GEbFTתO&਩7ۯ=REGiI,/z3V˲50l냼3kDۖTLeDHi4g{ =CjwL-ƚ2}uFTTƲ8Kg ,[\qQNF؁um L4e[-W -.?H>t9h.POy$On 5 tl j)w= v)pMhI kdV MDPÂUJ/zNC}"ylR3eN]&;n&Kc .cCp %> KYflB0d̵=+[+! )OyʝV.;EBeۧzϝ\h?,k2>=δzʫBT'Wu:El2pc=Cnp2=R7SVO4GU銵\/PiӪ> dBIƆq<Y,L֩V$7_'h\ ; 2Wc=mkF4Čhw1W IBn}&:s5Li&.QJYgi~jh= ruɃ1 [_R+X' ZI9lɫG0dMmnȨavFN4!C FNs(Oftw8GDZe* G/|ZoJY R-c өɪ%AL86.!ap" }8p)Q)X"3Q5kcTP'$hW7y {W u; &!!45ٺg'zMf]KS0S}HMctU,=ZV|~ آgl' *O`+]{%[?g@-;¡73UE>/>ˣ]eXӰIOM`7y5l\W.A9kRd/f1`ZU^(M{{Dk7",Q4+^;:xy15 >#C4EbMZBa tfm8Nb0;k[ =զzk12}aO_t+:n<YrWr4NAL+&C,K#VNIvXy^TfHx{}`Z3c_"t V3Ą<$ PXRE}L&-XG 92y/U3S^BW8ZƆXQ~H+ ]x<8`~4 7h%lժ(`y7r-OϱP)# Q1omX.x )QFe?W^bv$cc@R݈8Caǥ x)7dQ&m{;2 p+I+qy@u jPgvr)ۨm. 0Af3ɤ&0hxP`Nhq{b48lGj Fa4nnկ lڶ/B}b.vd]6*M]^tPВYѬmoFN}]'e u+T_ C:ͽWщ4Ew!:~ o\U^f p;g+o~&>? ` ;.\w9Sˀ1~ {ǣᒟOPK9LP*PK! workbook.xmlPn0CچTUs#g/ Ro=yg;3;bF>hg(690 =큅(ڬ?:wfoC*Ʃ4aAۥ.'mxӵׄv>iq-SbeQ??2zZR\PfK]P{ W /[گyf?PKZPK!_rels/workbook.xml.relsj0~ Zv˾%y!, >"%C =37Te #M)(: Χ;b:mC+4uV}՜~hq`d{)Ɍh}@Es: 6Pś 3!6Xv bەqZ'd炎 >4"WYM)Dgݓ6 q=*ήPK3zPK! _rels/.rels0D|EsRpa1&l ~@-GM[M܈qr23g2E3#yCM/Ҝ6{`>Hʙ XCU&gb,B0`{5>%&:9-CVIȷYe VÚ? u#F~ }%pz +єF(x~ PK m0PK![Content_Types].xmlN0<Q \O ,&?y}qhBʶffYl ;a$]w vC_5gu`ÆH|aH,5|L)HIjD $|@G )?  Uu%w ]*2cp4ݟuhgnph)[u_XGQ zʻF!{摒l-Vyu9"(DFdo>NO_NaA*XV[Zߦ-PKXwPK!1 `b sheet1.xmlPK!9LP* astyles.xmlPK!Z 5cworkbook.xmlPK!3zkd_rels/workbook.xml.relsPK! m0 ze_rels/.relsPK!Xwhf[Content_Types].xmlPKigreadxl/tests/testthat/sheets/empty-named-column.xlsx0000644000176200001440000001766413067126266022510 0ustar liggesusersPK!B;>Y[Content_Types].xml (MN0H!%nY v*Q`Icձ-ϴgPM~}d2۶6@D])Hd*[mߊ I9wPM//&]X QZxUķq)Vj z4wrU׻'[= &$շ774OH"xR㳔dNҨ9ɨAw(7e(3O ރhm| sD"$4DSOUNh9.)k0՚0!!iɹS]٬ `2K9Gyvq/PK!RZ'xl/workbook.xmlT[o0}G?DyϜ{( zmϮ6fۡ/ Y72]'jÔ,w*<헭7wc0W]M~Raԃnmm!dHM6WVJ l!GdMqejJ( ̤;"d5p`ivєc M3 8CxD 3{@]GlwJ= aZ0Q{Ph$"GA0\(#-u86vS1KM!T'zm[a5L Vh[%t~ ثZ'e2e-&ޛlkռpѭW*iQ~Ǒ|[4ԃAO/ }1%A Hu)I{\CgR'߇p~{VE!Sv-< c='ce>?VM@`@ɍvn'i]J~0̡X-I^^&^s:g^ZoE-ϋն@ ΦxW[nwJQ8KgC$6:dyd{A^o$^aTE:D;Bg>q]Ԥޭ-G(B")PK!,Ibxl/sharedStrings.xml\ 0 ;]yҎ "$G񜴣ѣO?yUJ2`~.q;J*76d X٘ +* 7cJes#4P3t<1A-2ڙ 1+b&Nh0Ѥr&L3y"İTUOpoZ3י7?rhR3:E2\({ *u{Յ<q +2jg.ُf[N*mB ~l*ݚ7 onwoZ o@)d1gA*%|lXdV1Zk~EȰ9Rq YPP\@VWW6̧V v١X iK-T;Fs$UV7;OW_~|0^='_R_ l逷߽7o_ ~=2g4Zâo仰 Y{OcʜI#iGy^WwOKv^vWֶcة1r(M.aOa#Yrqt+RX <\"W_Pƾj,E'\Bo\mys>m꓋e{B]1ĜZuNYZmҪ4CK. ބfA^ބm;0##w{zEH#UM2O@i9ZZ-]'Hu&J#2Jn/#d9:oGfh kuKie1t]FN*ܗX,BHejS<*S*_k[j6Ê$f-I`;#.J*SEi::GC6'¯S3nA #/pm\{fpv"%W:^`Ykyfq7_);Zn%#F^*Bܒ\lKax I g9+ÔY; # BL]!Z]V$+r̕5{Hh{{RHu&% 4LtO|l1ߴ=݁mk" LOK6nVV\k^{-n DLE+ p+7Bl4AZzBdm2iQa);o^tzJߧӽ͙Ϋ˻ϛ9k bh~11_|/LI $)þ5SwPK!HG xl/styles.xmlo0'N ,HR2ib?m:ش}g 6/>?Rm1Tdo[ad,9JؖÙR!MV7ٙ bfv ԥo*MIn!0|A=a#_˔e'ƙm;F"]a}̺AQ)&[GA6\% M%PK!d!xl/worksheets/sheet1.xml]o0'?X/BZ/&M׵11; IJ靏_{>E5dJݮh@+t!jE|ZRbo Vާ?%{m6p ]ڹ.f̊EFq b S\t$.K) bu#@DSfV"rHw(?U6ᖏD;\~lFgN}7$tGƷp" (qͥ\"gYᅡjWpw(Q\2p.㎧{=dl 蝋i"k<(R?a;C׾jpZvEl1p0@6>/>_ w@XK ūB!a.Qݎ3|㦒% Co)109OZ)GtVPK!HKaxdocProps/core.xml (|QK0Cɳ]usT ;Brۤ$n޴crr%rWW+JQ4!(ŵjM oP`SUZA`2HxC6ltI')Kyҹbly 5P^,G l xJ510lF": ͧz*A9ILmg-ݾqOقY9۶qJ)76ٚ[ bd*'rʊY[/$}h <l,6gV[ k|wP6%<$Lsق.|{i'.<.$9 %PK!docProps/app.xml (n0E1 I,Ԁd=F8w$!f<../iPɧXTFjw~ b5RG$ue߿3: T[iM=BQ6M{`iNo{cd}Y5cEw2T5a{ؚ][;rpqGNs hK8x-Gѯs0ķɚW=:N [T/ *CYԌu舳}LZD&E0 r])΅"sĭYC7sap6toۦ`||h6-d%SrL[;_4.7>]~ZJy/lPK-!B;>Y[Content_Types].xmlPK-!P|NL _rels/.relsPK-!nxl/_rels/workbook.xml.relsPK-!RZ'xl/workbook.xmlPK-!,Ib xl/sharedStrings.xmlPK-!zq xl/theme/theme1.xmlPK-!HG xl/styles.xmlPK-!d!xl/worksheets/sheet1.xmlPK-!HKaxdocProps/core.xmlPK-!`docProps/app.xmlPK readxl/tests/testthat/sheets/big-texty-numbers-xlsx.xlsx0000644000176200001440000006021313336631200023326 0ustar liggesusersPK!&vD[Content_Types].xml (MN0H!%nY vQ` (0$1lg U%j6b{f4lU5%#VHS}ߓ,DfS@Ivlz}5Y M(I{44 u`^ގFw[<d:yU̞'pZ0,"(mO8*tn8 L⡑.>qM- +Kق4ӭ_֯>]ݩ!U%9V灉DIs`OMx`6$GI0ĝ0tٓhsg $@ ~PK!}T _rels/.rels (J0rߦl&R`66dFj=Nfv7ځa "m\+k,&pr(#UW K3>]JA: r`!2ƒE);~kjZ7g7G[XL!PpC& d/b\zk\(|$uҌgcBQ/#KDKMg;@/l.WN 3A}3.1PK!s?xl/_rels/workbook.xml.rels (j0 }05{R>@D2߾og0O׊/ x KR/W+(^oAkW;T0 !ڿa9~"$#NS{tSi2Բk4}a8 ±Q }LWUcś_C5?DF6:`!nwI,o ctknܼm É,"S`v[pZAF)wbggPK! <xl/workbook.xmlTn0?+dI^`)p"HLSņJRޡTei.i{!gH{C-.[)XU ꘣/p*Њ,,޿[yk9[Z1I셮68H0Rڊ1'G K-p5m$S1Lmk;I8ICST \pw@Q |wTڐ(!|-95ꃻ(ܓ|Uo4Qԗ\,\^'"-X)ce2HX0M}p4pŵ0_ nj"r oW{Ui an8)0:'{{M\4FZeJ1{[TdU#,~/ym_(Lh' zjR,|qvO 4h*)GCd{^?=}`X9xA#ߔ9Jp?Xts:?wc9fWB!(SwPhc >|ZѺn[x~Lf4M0Z/0ɢix%0Y7,/ӟOv$ F|aH#N#[@iOI_#}5Ǜt=t;fF8d*4~*۷QbRIΗVu?c{PG PK!'}xl/sharedStrings.xmltJ00ݴD$@Bnͤzcv #1ԨjS*@biߨIލQ_jk @%n 2=k݀&NHb NrQ¨|yRř$kg_~5Ksh1-9c a;Na-d )~B>CGs -^@CTa _n~owPK!xl/theme/theme1.xmlYn6wtZ%l[hnebCH'5{a7v؞=)"cO tb 9wӔ:8e=qslFE}8:f 5?DS@jaNPm&Ԏr[&Xn "G3io炗Y2}U6mkX'lVS '-ă#Q{@j5v Gu߅֘Ie!BDBZXt-,:&T(n]ԶQEKR♌Sq εFz3d@亷{wEE Z$4L ٩\gUH zPhw>F\JA3熭bscrb}es1D<)DP;=Wv 4S5 ,.ʧFn8zص WU&[AOم3 p(9#p*.ML*rD *g] -VBN<^=UKiY͙Y.oXUnmu7Zj%ubBШU$]]ԮqAy"aPr bT.<; 6}1\nr "OEF'g ~ F5{NoAj74"-c8E\s1KL]quhvqγ9m58ԺQ8 è=?wsGZ؈z~[kfo;#\@ (}UPK!|q) xl/styles.xmlV[o0~D@4EUI{5`U_1mi}64>'kμ;**EFCʌ"D_n1*E$DRFWhL*D+˹Wp\ȒKű*TgQ|@œ1±A*y5M(zcm!BHGb<eӔF9g>X\ ]yL[!El>ͩ({wy~Ii"-9qgN1v7ǜw$=`\HQPz{#g`HBC{$-K^.lDPO%bXx|)jTIs? 7[QHA]t3r[QHu*Zei։Zr#eR`fdUk*%]oL:Dcϳe ZiDgY}Z@CZ, Qm֝5vE[d•60G}A=[G^!i=nN^uٳ`F+Ern}w9WLPq 1+ߊ{y&J=ɼO^<(QRS0+ek˓ }@_OF\_iZkQ^Sv1>k3ƻE>d$57ۏ!$5SWNjk"DNYZ_T0W+g,Lb9NNe<?{Iv'a4W )dD텨0/cqC?hA3PK!,Lxl/worksheets/sheet1.xmln0Oݬ=vb lAshQ4r*@SEDU^ҧ(6\lȣuY%j}ÈUT%FJ*%?1ׯF+!UΘFP1εhJQ V2!KV]UKFRTny}$P!Sv#dnD$+~Zj%=G$qQ(k'+QIwJH2+ڏm3S)ȴrn{R?^EٿnnmiJ4#%S,#BOs !y&) '(@>QMB~6Ft(Z&l(|sdu{#w y5`l ׂoa 0kZj?|f|@oGnfgɑ6ڛxk4: :8G=ɱ ˰ :𠼃9,͓3 SxrX N 2<){E8-zz/f,-|':DےcC]WlP}v':D[]Zf};4ƴS9O'_vE9p`2sqM>(A7l7nGDɜ}&r+ ّ c`Dm:s{û8-Boơe!PK !^<<docProps/thumbnail.jpegJFIFHHExifMM*>F(iNHHp8Photoshop 3.08BIM8BIM%ُ B~p }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzCC ?47NNwgf2Pf$I''</ +KmAa?$n/ +KmAa?$n/ +KmAa?$n/ +KmAa?$n/ +KmAa?$n/ +KmAatg( ( ( ( ( (tg(x.!]խ1\[\? MZ)6Y"6d]&Dh7_||c3tuϏ|AnNO? ։>>1u?:??n 7@'Z' fDC?/ZsiIkˈ- Wêkᶶ\M1+"%M ։>>1u?:??n 7@'Z' fDh7_||c3tuϏ|AnNO? ։>>1u.>:-ijZZ-͵LJ|=ĺ7¿V ){aiXj/>YU&{ o:Nw_+\6>jPنP:}į$I'>RkrCAKs6GR/,W'O[IJK'~h9hO<~75 [y pxm[^ |BiJ# I+CW!^/h_g@ K#\kB_gWa^=΃AWC<)X\MO|'>)C|^agⷆ> /'¯xgSEhZ?? f:ݥŝ֝v-Gz<-Hf ߄~'ݟ~oW#uK|E tI/]Z,MGT %67K~|}+ᵧߏ~n78~Ѿ?6oZ_Vƥ_'^[xPղXh|[:xr)]SN5ׂt 7O/XYlj7m~ wXއ{W_ڻ|CuO4}I{oTZWCxY񞳤ibKOԬGc N]O7~%xDž|{w^-mGӾ x^&_].]h_QI>3XK<lU}O>03/ŝ/׊A?9m7▙-'TO񗄴K^&-;/خ?oįP|<ះEx༟ߍo(k^i __ P퍮k}@>|]?ß|z>w|+t>SZXxjYMVB:\zuwjIejtg(M¯c3]ś=r,Eo_k6I d\L9mMm/4]{zmƞ[ß/}ae WQ?SMm|eE3?vn'վZ~kg59YxSLj(jo#o<(a?O ):eMinNGOˏb ]Gk Z|Tt 3[t{we<gφ =ƿS^oU |6ѵ蟳ſ_u{/<;3zM~Ԯ*W7&I?K:??n 7@'Z' fDh7_||c3txZEΑgv~+V_rgmSe<;s*^6X^\4VMw<z?Y/O}yK~k! 8|IW||;m|2{ 烾چs?& uk=2k=&o6xCB<5|d}xO5&5CŸR|C/A|f+/=ݾkJe+ƧR~6-ǃ?Ŀ~>:5 xX} mdw)]2,7z>^V ,xskE~ k_{G~|FO߇x?~~ωu[/ xZῊQ^𿈭5O oF@>a9|3m>ſ|a߃}හ oǍOV⓭[2]h| ͷot+LK[`x3iZX~_sㆁƾ*6+K>hUIwf/7xeh+Ї@^ Y7~!zFS/ ZǤ|;|uxR~|Ye-n~ Uߎ<{<{h:o[r|/x>?ik}Sথ'ouxgx3~4#m|GaoS]|[?|ao4ھzՏ}6ݯ-qoPq[zk>X>kXEF,to&_ W <9K^1Gᇅ?-GÞ-|+_xݼGwi6AhNK[(?tg(~fχ/wWχ;Vy-)[~ko>3?<'/Mgg/xQ_-R]cKk#ғB)Wgᇊ|=߆ rkg'khĿwğjQ/@xv= (;_ P矇ࡶGJ|izGj ~ *hcoo?ͭ\<9}-M4X7?;k\q` _P}.w#o^ 񆑯~eMoT/ Y[DKxs°xwU}ύ5߈#4]ZwS]ĚTzW'9~~Ҷ/|W῎4wX?o>jƯw૿|3XL8<?; ms vuտ?f~5xC|1{ǎ ^*?4O]Y95ZzGK7¯KT1> _~i_+[A3R-]hm˥P ?_kxk w HP<-"X5V>񮷣h@:<;? _zo?J(?*>"@>'tg([|hx/'Im_QES?ō.iKY3 6SEqiy%xZö_ ~h7Z>躗/Wּ?7OePo8ᝧ­#]힛iQ] _? Ckfe=Í,6VZV?=@75&;e{[_K|g/,l|5O[_hĈ3>/vKKۋ$>-ОYJ>xoĚ|g8|u>;HkKO<#?|[i/뺧[^?_~=S߱]nX-/d]SX|SxW>_ -|:hQ?KjKр>Dh7_||c3tuϏ|An9OxH,jLͪlLJneUF4p[+ˆ)YkawTT\xgǿ|M9|ny !gt> 4^|o+\մ{ggk_%e:寎?iس^/~KY}vN߃zٻS᳭jzlcv?<%!-~;@>Q5=#֡+ǃ< ]KD~&|4㻿KUZ'X|2kyxm↙cxkO[x+>gÝ_׺h^݀}?Kj) Cn75ZJ UO|,5> {r+MCI}E[o5ͅƚ'Z' fDh7_?Η^8K2sO[\Y*MH=P }MHtg(w$'xcL4o+ k}y/ zC1~?E]/Z޹n3[Xǩ[cӵ* x]<[~??o<~^2;7?w%]Ӽm.Ũͣ[_/4^#Zਟ`/uhU//\D׉jROeK@ _u uFhkĿWo~$_Oe/ĿG⏁lekOWN^![IVMSV}dC8|kKu$Dk\MXxt1kqx?ž_>..|u-4%C Fz (;_ P?h?l஡%EFMNT|k񜗈|,9sSѬ4|Ta|05ۀpn/ l/|v]Mǿ'k=__j2|";EᅴB𦏣^=|@ߊ+am|.M0~~Va<YGFL ~Ɵ4/7"|E}n./wCƞ"? /puYc _|Ogqx\߇iOs@G-׺wnu __Pc_+I㨯4ڗQ]8HMůx_>"xs].ᯂ ՟^4Vj7>0Z .öMe]5ʏP?x~vzwZ{GO!|m[k6>ƕ_Z}iySLԬXhy~vs_|4|,w?O [ m[?~/w47w7v3xo+MM/j}3dok*XYho7-^Ρf-<Zch4m>k᷃ዝKT:N?'Z' fDh7_||c3txZEΑgv~+V_rgmSe<;s*^6X^\4VMw<:ݣxiaD~ƍگ+oxCHDe}OXo5x/kw:/ bXxV_:_gD{F? ~>]h ~Yx|>jZ>>+Þ0\z 햟kjx7XaaJ ?O mV m&4_}h#L|뺇-'=R?dž+|?_g[/?׆w|=B# QOZjФsyO'tIvoGŗ_ ]k>i27<+2dZ?ῃ5㞋_/.;Z) /]Zោ4Kiƾu 7 x{_7'V^+=>+_zEKGk GzNC{Oxwiz}_ oti>*xş*Oc!_]}6+ WF}3..|u-4%C Fz (;_ P?h?l஡%EFMNT|k񜗈|,9sSѬ4|Ta|05ۀpn/ l/|v]Mǿ'k=__j2|";EᅴB𦏣^=|@ߊ+am|.M0~~Va<YGFL ~Ɵ4/7"|E}n./wCƞ"? /puYc _|Ogqx\߇iOs@G-׺wnu __Pc_+I㨯4#@i_Aῆz:}cǞx׊< OoTLuOZEO sCYwC~PGO(:{tg( -" m%<;o?[äYݧ洺ʹΛeW#?mU֫ ŷI?f+!(|@l|C iЍO|2G<;ix}u$G 步xY?x~vzwZ{GO!|m[k6>ƕ_Z}iySLԬXhy~vs_|4|,w?O [ m[?~/w47w7v3xo+MM/j}3dok*XYho7-^Ρf-<Zch4m>k᷃ዝKT:N?'Z' fDh7_||c3txZEΑgv~+V_rgmSe<;s*^6X^\4VMw<:ݣxiaD~ƍگ+oxCHDe}OXo5x/kw:/ bXxV_:_gD{F? ~>]h ~Yx|>jZ>>+Þ0\z 햟kjx7XaaJ ?O mV m&4_}h#L|뺇-'=R?dž+|?_g[/?׆w|=B# QOZjФsyO'tIvoGŗ_ ]k>i27<+2dZ?ῃ5㞋_/.;Z) /]Zោ4Kiƾu 7 x{_7'V^+=>+_zEKGk GzNC{Oxwizo~ΟǞ'isįa?c@ѵ?|'q=vv|G %P}U} ։>>1uu\ij,w>+ŵŝ¤ڽ䈳] ݬX ma$Ƞtg(w$'xcL4o+ k}y/ zC1~?E]/Z޹n3[Xǩ[cӵ* x]<[~??o<~^2;7?w%]Ӽm.Ũͣ[_/4^#Zਟ`/uhU//\D׉jROeK@ _u uFhkĿWo~$_Oe/ĿG⏁lekOWN^![IVMSV}dC8|kKu$Dk\MXxt1kqx?ž_>..|u-4%C Fz (;_ P?h?l஡%EFMNT|k񜗈|,9sSѬ4|Ta|05ۀpn/ l/|v]Mǿ'k=__j2|";EᅴB𦏣^=|@ߊ+am|.M0~~Va<YGFL ~Ɵ4/7"|E}n./wCƞ"? /puYc _|Ogqx\߇iOs@G-׺wnu __Pc_+I㨯441|I?|Wn᧌ou߳% >j?_35{_E>I:RʏPW<Ȼma` OtnU#?mU֫ ŷI?f+!(|@l|C iЍO|2G<;ix}u$G 步xY?x~vzwZ{GO!|m[k6>ƕ_Z}iySLԬXhy~vs_|4|,w?O [ m[?~/w47w7v3xo+MM/j}3dok*XYho7-^Ρf-<Zch4m>k᷃ዝKT:N?'Z' fDh7_||c3txVkoexy/5OWx_S?e^ zΥw<{j#կo&xhW53N$k>6|^Ѿ=ߴGχWZC}_V^;t_fږ :ogu{eꚶj1e^ V?t~Ҿx/_FI+Ƨid2|eoZG # go j#WKgKִ'N- Huu<ğ7WBs?"Sxff+υ ot< ~g;q|GMnW?| ռ9|φ4ĺ+eQfx>P~ &}]Z^ |Q㏊__+{᷂_ }/O]Ş%|a_h_|)6[_.|UxZ!fݵI@>D~x~5ռaSO_n,5/뺅yŴTtsGC*?2$lhtg( ( ( ( ( (PK!}VFdocProps/app.xml (Mo0  9: bH7bvgNc$Wvڍ/^>+zLdrQ J<~\|1\X#?M ["[xDWRiZϝ&8i/CX7k׫F -P1NgJшP m<7"4LEFh4ʲ&@H\v@Tr|?2Rg䘑lg9<3'C|PK!*N{docProps/core.xml (]K0C}~8@eW7Bv 6$n޴je ^&OyI؋&c%J b\nKY/9 #FI(,ZT9U`x9%9s-݁ 6ZA?-ք-4GqwPDtD2:"iz Io#2q w:Ɲѽ|4mYOṯr Fsj8eFYU౮9`cxV~5v{k_  ||(vR^Ui܄I:M4˳[|}4!:brg  |]/PK-!&vD[Content_Types].xmlPK-!}T _rels/.relsPK-!s?xl/_rels/workbook.xml.relsPK-! <) xl/workbook.xmlPK-!'} xl/sharedStrings.xmlPK-! xl/theme/theme1.xmlPK-!|q) xl/styles.xmlPK-!,Lxl/worksheets/sheet1.xmlPK- !^<<MdocProps/thumbnail.jpegPK-!}VFBWdocProps/app.xmlPK-!K.^Zxl/calcChain.xmlPK-!*N{ZdocProps/core.xmlPK r]readxl/tests/testthat/sheets/types.xls0000644000176200001440000017500013172305601017723 0ustar liggesusersࡱ> -{  !"#$%&'()*+,0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyzRoot Entry F D.WorkbookTSummaryInformation(/dDocumentSummaryInformation8` #i\pMicrosoft Office User Ba==@ Q68@"1Verdana1Calibri1Calibri1Calibri1Verdana1Verdana1Calibri1 Calibri1Calibri14Calibri1 Calibri1Calibri1Calibri1,8Calibri18Calibri18Calibri1>Calibri14Calibri1<Calibri1?Calibri1h8Cambria1Calibri1 Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)[$-F400]h:mm:ss\ AM/PM                                                                      ff + ) , *     P  P        `            a>      1#4@    ||C0 x#}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}A} 00\);_(*ef;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*ef ;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L ;_(@_) }A} 00\);_(*23;_(@_) }A} 00\);_(*23;_(@_) }A} 00\);_(*23;_(@_) }A} 00\);_(*23;_(@_) }A}  00\);_(*23;_(@_) }A}! 00\);_(*23 ;_(@_) }A}" 00\);_(*;_(@_) }A}# 00\);_(*;_(@_) }A}$ 00\);_(*;_(@_) }A}% 00\);_(*;_(@_) }A}& 00\);_(*;_(@_) }A}' 00\);_(* ;_(@_) }A}( 00\);_(*;_(@_) }}) }00\);_(*;_(@_)   \{  c}}* 00\);_(*;_(@_) ??? ??? ???\{ ??? c}-}/ 00\);_(*}A}0 a00\);_(*;_(@_) }A}1 00\);_(*;_(@_) }A}2 00\);_(*?;_(@_) }A}3 00\);_(*23;_(@_) }-}4 00\);_(*}}5 ??v00\);_(*̙;_(@_)   \{  c}A}6 }00\);_(*;_(@_) }A}7 e00\);_(*;_(@_) }x}800\);_(*;_(  \{}}9 ???00\);_(*;_(??? ???  ???\{ ??? c}-}; 00\);_(*}U}< 00\);_(*;_( }-}= 00\);_(* 20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L渷 % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  Lմ % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23ږ % 60% - Accent3M( 60% - Accent3 23כ % 60% - Accent4M, 60% - Accent4 23 % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23 % "Accent1AAccent1 O % #Accent2A!Accent2 PM % $Accent3A%Accent3 Y % %Accent4A)Accent4 d % &Accent5A-Accent5 K % 'Accent6A1Accent6  F %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 I}%O2 Heading 2G Heading 2 I}%?3 Heading 3G Heading 3 I}%234 Heading 49 Heading 4 I}% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  e%"Normal 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title I}% <TotalMTotal %OO= Warning Text? Warning Text %XTableStyleMedium9PivotStyleMedium78dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\`;guess_me? guess_maxA smorgasbordGlogical_coercionM date_coercion\Onumeric_coercionQ text_coercionsuIGJ-abstring_in_row_3blankbooleandatenumerictexthelloworld hello world text formuladoubleintegernumeric formula boolean true boolean falseboolean formula trueboolean formula false date formulaerror #N/A expliciterror #N/A formula error #NAME? error #VALUE! error #DIV/0! error #REF error #NUM! error #NULL!cabbagelogicalFfoo72 explanationtruefalseTTrueFalsestatic logicalformula logicalstring logicalstring not logical logical Ffloating pointstudent number2, -U-.Vl.. PK!pO[Content_Types].xmlj0Eжr(΢]yl#!MB;.n̨̽\A1&ҫ QWKvUbOX#&1`RT9<l#$>r `С-;c=1gDJKK2e,$nE<@#Jem)4 Pc`{w8!A=2̙<&JꅐfM T5BNd tY#9~#*@ K/AKחFF]et`~!کկm Y\n?aZ]'2Gc"ry Ǹ8E/ԡnޙ`5xsѵɷrΚ\xpK*y7NF~b\c|‰8'VD5N(B<=. |z]ң}'D;4L|6CGM|VoC Gao±eǬXE>%qm #8j>-~ ..R(zys^FnVԇ$*cߓqrB3's}'g7{t4Mf,t,Q;7ɛ1Ѝmmƍ` F$vNyad@}m }w^-/m z<}%s7CXWM->Y°t`Qә")Mi?F$@3ɌHK8ۙe/o}'U}f@bvyE/G9#sh [1/"ZXZըfZ#0b8k,ބ] xy Z4M0#w;(5!ʬDx@l7&vy ;H)Okള0i1?tr`d]v%b :j8mC88IolW;6kϬESSEÜq8RmcWYX%YWk:.beRB톖 $T`Vc XэGbCڞp` Z?My֬Ӕ ήcF8&%8 7V`Jm^ݍq7EWeRN)zie#EHk#BEPѰ#`A,SphStq"A%}g0fDzd#Q%uejCzRt s \oN)F{b:P3,!gdbKU z=uAYk;֌˫rYaϤpg?0jCoEAV_] 2H7HhIv>kj!f.6Q8/ٙ_۵Ȟ.QXQ݈B~$“tO$ɤ6F#YOG [BkFE6hM \\ I,&.(dh&1oYYG;&kŕ{%e (w䳨A񍁺]y 7x5R`8tMc3ݤPK! ѐ'theme/theme/_rels/themeManager.xml.relsM 0wooӺ&݈Э5 6?$Q ,.aic21h:qm@RN;d`o7gK(M&$R(.1r'JЊT8V"AȻHu}|$b{P8g/]QAsم(#L[PK-!pO[Content_Types].xmlPK-!֧6 -_rels/.relsPK-!kytheme/theme/themeManager.xmlPK-!{֩theme/theme/theme1.xmlPK-! ѐ' theme/theme/_rels/themeManager.xml.relsPK] #i <?  dMbP?_*+%"D3333333?333333?HlU }  D     >`.@? >.@@ >A">.@ D!@ DDDAqHELLOOA#>`.@ D#@ %" DBsworRdF00   r>@ggD #i t@A  dMbP?_*+%&?'?(?)?"??U  ~ ?~ @  <>@7b(b(ggD #i rBLG  dMbP?_*+%"333333?333333?U          DAq HELLO WORLD ?  ~ @`@  ~    ףp= ? D   = A"  = A# ~ >@  > @  D   *  *  A $ ! #$B !  DD    J "$  A , ' $$,|B1++1+63/-4  >@ggD #i HL  dMbP?_*+%"333333?333333?$U }           & &A" 'A# 'truetrue (falsefalse ( B! ( B" ( # (  ( B$ ( B% (  ) ~  ~ ? ~ >@ (T++:<  >@ggD #i MN  dMbP?_*+%"333333?333333?seU }  ~ >` @ ~ z@~ AC@~ >4@x >@ggD #i P,Q  dMbP?_*+%"333333?333333?seU }  ~ ? @~ >@ ~ $@x >@ggD #i  ZR"T  dMbP?_*+%"333333?333333?seU }         * ~ @`@ +~ >@   ~  ,>@  ggD  ՜.+,00 PXd lt| '  guess_me guess_max smorgasbordlogical_coerciondate_coercionnumeric_coerciontext_coercion  Worksheets F$Microsoft Excel 97 - 2004 WorksheetBiff8Excel.Sheet.89q Oh+'04 PXp 'Hadley WickhamMicrosoft Office UserMicrosoft Macintosh Excel@@Va@~DGLlI W EMFD@   J  JQxIJP(x J(J ͽ½ȟ׷ҷܽ׷׷ͫͱyyŸȷpȥܽy·ͱ«ͥͱ««ȱͫͱȱȱʷͱҷͱ׫;ͫͫҷȱͽͱ׷ͱȱȱȽɷpȥԽpppǿͫ±yͥͽƴ̷ܷܷܷͥȫ±ܽ½±ȱ·¥Ÿ׽«ȱȷȥұŷȥȘŸ±ͥͥyyͷܽҷȽ½Խȱзūҽɱ«ȿ̽ͽū˽Ƚȱҫױ¥y˫ȥyֽy׽ֽ͘fҷȫױױCompObjpreadxl/tests/testthat/sheets/dates-1904.xls0000644000176200001440000004400013067126266020260 0ustar liggesusersࡱ> "  !R Fi.`Workbookn(SummaryInformation(DocumentSummaryInformation8 F\pHadley Wickham Ba==Pa@8@"1Verdana1Verdana1Verdana1Verdana1Verdana1Verdana1 Verdana1=Verdana"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)72_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).)_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)61_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_) m/d/yy mm/dd/yymmmm\ d\,\ yyyy                                  8dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\` Sheet1fN+dl&܀ `l& j0DsĄs)|cs%+""dr|+ss_csN+"xT"catȁ;>&\h?L\>-^e/T?LTA&;#Tfs?Lfsܣe fs؁fsaBfsx8]H;H&u&#;:;)P com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 300 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 300 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket PMPPDPaperCodeName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMPPDPaperCodeName Letter com.apple.print.ticket.stateFlag 0 PMPPDTranslationStringPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMPPDTranslationStringPaperName US Letter com.apple.print.ticket.stateFlag 0 PMTiogaPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray PMTiogaPaperName na-letter com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0 0 3058.3333333333335 2400 com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -75 -75 3225.0000000000005 2475 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName na-letter com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0 0 734 576 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 774 594 com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.jobticket com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName Letter com.apple.print.ticket.stateFlag 0 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.type com.apple.print.PageFormatTicket Mz,, ` g(HH(dh "d??U }  $@@@@@<>@@  7  ՜.+,0 PXd lt| ' Sheet1  Worksheets FMicrosoft Excel Sheet8FIBExcel.Sheet.8 Oh+'0HPh 'Hadley WickhamHadley WickhamMicrosoft Macintosh Excel@ '`@p&`GPICTM HHM MHHАMMIo{sgZwc9wgZwkZ^swok{wcZswg:w^_swgZ[swgZJsVswwgZ{{B2cg[VJtgZwo|g:VgZ{FSo|Ng[] swwFS>s^1k{wgZ{^NB2g[V_Vwo|c9ZgZ{FSsNg[_ swwkZ9V>RwwgZ{g:Zg[c9Jtk{wo|NN{gZ{FSNwg[7swsRkZwg:{{g[{wo|gZ{g[&k{c:k{gZwswswo{woswFSs JR{wcJR{w^JRNsVNswwkZRV^g9ZNsNs{JRZ^VZNsR{F1wNskZckZZw{JRkZckZZwso{g9g9kZcwo{{JR sRg9JRRNsJR^Z^wsJts Z{ZZ{ZsZRRg9kZwZwRo{g9csRRRZR9kZR{RNswRZ=VkZkZwRZ=VwVZVVBRJRVRJRo{^RNsRwss>ss F1cZF1g9ZBRVB{wsF1ZZRZJRJRw=co{cF1g9BV{,=o{cVJRBZo{kZwg9RJRBZ{^=NsF1F1ZBww=wZZF1o{BVNsF1kZF1g9wIs{skZkZwkZkZ{wZwo{w/k{o|cVk{o|k[{s{ws{s{s+sZk{sw{ww+so{^sw{ww-sZJtosw{ww#k{o|kZ{s{w{s{s/o|wk[Vowo{w{wsw-s{Jtssw{ww+sg:_sw{ww-sk[V{sw{ww%g:c:c9wo{wsswo{wo{-s{Zwsw{ww-s^FSo{sw{ww-ssZosw{ww%k[k{kZ{s{ws{s{s-s{k[Jto{{sw{ww+s_osw{ww-s{Nk[sw{ww-ssZssw{ww%k[k{kZ{s{ws{s{s-sgZNo{sw{ww-sFSZ{sw{ww-sFSsVsw{ww-so|_ssw{ww%k[k{kZ{s{ws{s{s-sgZFSRsw{ww+sZ{sw{ww+s{Rsw{ww+swssw{ww+k[k{Zk{kZ{s{ws{s{s-sZZc9sw{ww-sg:1ssw{ww-sNoVsw{ww/sw{{scw{o{wwww-o{sk[Vo|sk{{s{w{s{s-sNtg:Rsw{ww-ssRcsw{ww+swssw{ww%g:c:g:wo{wsswo{wo{1 s{Vg:sJtkZsw{ww1 sk[_RsFSsw{ww1 sZRgZVZsw{ww#s{sw{ww%gZg[gZwo{wsswo{wo{/sR_w>sw{ww/sk[_Jtsw{ww1 s^V{Jtssw{ww#k{o|kZ{s{w{s{s-o{ok{oc9ok{{s{w{s{s1 sN^sZZsw{ww1 sk[_Zssw{ww1 scZkZVo|sw{ww%g:c:c9wo{wsswo{wo{1 s{{o{osZw{{sw{ww1 sZ_{k[Zsw{ww1 sk[_Z_sw{ww1 sc9_s_ssw{ww1k[k{k[k{k{k[k{k{kZ{s{ws{s{s1 sV^Ntcsw{ww1 sk[_VFSRsw{ww1 sRFSk{_sw{ww#s{sw{ww3 k[o|o|c:g:k[Zc:o|o|k[{s{ws{s{s1 s__oJtwsw{ww1 sk[_o|Rsw{ww1 sVNwNkZsw{ww%o{so{w{wwwCompObjTreadxl/tests/testthat/sheets/dates-1900-LibreOffice.xlsx0000644000176200001440000001054513172305601022607 0ustar liggesusersPK[}H _rels/.relsJ1}{wDdЛH}a70u}{ZI~7CfGFoZ+{kW#VJ$cʪl n0\QX^:`dd{m]_dhVFw^F9W-(F/3ODSUNl/w{N([qTuhDPPK[}Hxl/_rels/workbook.xml.rels 0E0{օ4u#BR? IGވpj826삎:q 2UrX6҇j;K,hzo7jq:Ljt Rd|$+OJ_ئ;;j?cɏ=R Jנq_j܉ZDInpD|8PKPK[}Hxl/worksheets/sheet1.xmlUn8}W|Hv|IYEki-7ZYD(RKRvmlz\V":6\\$$+qE=l"T2*yCgҳҏ:fEJk86y 5BZ|(*OdWK\%!Q^U=65nZ zϟqNV\vkS'x{;k=$rnwg(J; PszrMXơ+A}/Y:b/GX}. eMusWq n=Er;nOFfb,918PK,SiPK[}H xl/styles.xmlYOo0SX> &$UeTUN\0Īqڤ~vX*qx~#˱!XĄ!l}2!a^OF1Q.q wv,_0@)xgRF30SW|.B$PF 8Rm" cy8 e \>gr)oV-w=e7h ]j/  tsgM 5 6R'He\ˤv4!mT[.<-C#( h}Dc ?tl} fI+yd$"RPu9Ii\tTySzM%)Og] P'"Rq tHIBF\bWvl 򨤓`zI7B B^r P4Q`"a^ZX]g Ⲋ)*l;&gSSKLc%erj)T.' ގvcfk1Әi4f3utvKi픛Ni6cz3_[u !A۶YMlub5ՉV'A۫b3k̬-P>yr KK e#w9Xֺ1C-eOW!eU-B`. ^ERW{zР",EkpPK4PK[}Hxl/workbook.xmlSn0 }WzO|IAsjnhYX,s-]aD:<קFz0Vhp0TK ̳UɥV3XvzhDP8docProps/core.xmlPK[}Hxl/_rels/workbook.xml.relsPK[}H,Sixl/worksheets/sheet1.xmlPK[}H4 {xl/styles.xmlPK[}HSڊs xl/workbook.xmlPK[}H:" [Content_Types].xmlPKRreadxl/tests/testthat/sheets/missing-first-column.xlsx0000644000176200001440000002101613172467023023044 0ustar liggesusersPK!|ll[Content_Types].xml (̔]K0Cɭ4&Ⱥ]q&!'ۿ4@n z}4pjLقye`Km߲ Jg`k@6]^ kQł1;!ȝK3 fr.g ލ(`c[ 6>@%&f+! `e֫`{KT,o8u+`ӡ`B[l"C| a.ߝ"t ʕv 1<bi]_>cO8#"=$I`\3v#z̹k g}$8(N߅]dݹ'!Q>4.ޑtoڼS:E'PK!U0#L _rels/.rels (N0 HCnHLH!T$$@Jc?[iTb/Nú(A3b{jxVb"giaWl_xb#b4O r0Qahѓeܔ=P-<4Mox/}bN@;vCf ۨBI"c&\O8q"KH<ߊs@.h<⧄MdaT_PK! (xl/_rels/workbook.xml.rels (j0 }qne:A[&Q6'o?C@.$}?ЧjU%)Z(8>< ֶҝ`@CqNsD$%襤`)qm.cuy :itFǣЅR2~yWFCF2Zt?$.͜1WTPs72 hܔhw5phj.5?,ehk~ G 6#›ר(QG!=8~ضo,WKU~NW%֓ 1Iq;;-PK!bmxl/theme/theme1.xmlYOo6w tom'uرMniXS@I}úa0l+t&[HJKՇD"|#uڃC"$q۫]z>8h{wK cxLޜH]ś*$A>J%aACMʈJ&M;4Be tY>c~4$ &^ L1bma]ut(gZ[Wvr2u{`M,EF,2nQ%[NJeD >֗f}{7vtd%|JYw2Oڡ~J=L8-o|(<4 ժX}.@'d}.Fbo\C\ҼMT0 zSώt--g.—~?~xY'y92h!ы/ɋ>%mGEFD[t3q%'#qSgv 9feqwW@(^wdbh a8g.J pC*Xx8rbV`|XƻcǵYU3 Jݐ8b3+(QuK>QELKM2#'vi~ vlwu8+zHHJ:) ~L\E\O*t@G1lm~C*uG.R(:-ys^Di7QR8,b?SQ*q7C;+}ݧ;4pDZ_^'܉M01UJS#]flmʒgD^< dB[_WE)*k;ZxO(c5g4 h܇A:I~KBxԙ \ YWQB@^4@.hKik<ʞ6b+jΎ9#U`δuM֯DAaVB[͈f-WY؜j0[:X ~;Qㅋt >z/fʒ"Z x Zp;+e{/eP;,.&'Qk5q&pT(KLb} Sd›L17 jpaS! 35'+ZzQ TIIvt]K&⫢ #v5-|#4b3q:TA1pa*~9mm34銗bg1KB[Y&[)H V*Q Ua?SE'p>vX`3qBU( 8W0 Aw 9Kä5$ PeD)jeI2b!aC]zoPnIZ diͩdks|l2Rn6 Mf\ļ=XvYEEĢͪgY [A+M[XK52`%p7!?ڊ&aQ}6HH;8`ҤiI[-۬/0,>eE;ck;ٓ) C cc?f}p|61%M0*<ҭPK!~`txl/worksheets/sheet2.xmlj0 qڭA)a0ƶ(il]۷27 Ir>mQXuƿ|-Z<_w77!t^5`K RW 90dZ'a|$$VVAu0`q@};?ьgBЭʙQɮdާT{HF+NBw^ R6mgι G/f/ʌ}^8VB%m t%iWH"-G72Hvwjm=k9s#&(τ,04SuGUaJzPK!~`txl/worksheets/sheet3.xmlj0 qڭA)a0ƶ(il]۷27 Ir>mQXuƿ|-Z<_w77!t^5`K RW 90dZ'a|$$VVAu0`q@};?ьgBЭʙQɮdާT{HF+NBw^ R6mgι G/f/ʌ}^8VB%m t%iWH"-G72Hvwjm=k9s#&(τ,04SuGUaJzPK!8xl/worksheets/sheet1.xmln0H{$K)TZV= ! gXk{=DYi<ˇk|*%)gg!JJ*~o}"# b !ʐt譌^уl$kDPkuZ ăAaYu J?7 HF33ޡ_wR9xZy ńpb{q/T&ۙ۬nٟN5y*BKclAOh+%bLD>G0ϥ\@\*ZqZįx"%&hT8o/w2ʺxb4LRF9]Yj:HJq$Q>\H}=)IIWk̤_ŲQY^ twů4uq2鎼k0Fk4[j=MHT׀PK!Ќ |xl/sharedStrings.xml A 0@ѽm iڝ' I 7d.o5$= (r\ YGUAV,gfcClYݑ1l+Bl~dډRILMElm-$H +DRAeM?pݹca$sRv7y<7MGtYU$K4.rQjhU*KGNTgIZhTuE%#6T>s+'9  GCu3* \d]zF ;08z\\i,X@яN=hi\pZiE3!v~wDtEM}.&$2=x-gw㑿A@ thp\Y~RvDJ|72v"WZb`D >eQ׋`̓| z͖an(P\jb` Q5 )ְ58a9RŴ5mXUMo[$gySŽ P7bH\2ڎj!>l+nwcQ1 [r׹Vp2A@݃閶4.V--ZS/m&5ə@ن}sLX*Ɇaؗcvz85v kGO4>!{wYu|1;i/;E1^YCpPjK:ǁe'߅\&lϟk_5e+9#uʔ+jlE&xROn n巾.N}!IJ'-{x\/Q,o8])Ig$>Å8F?qNx9>(PK-!|ll[Content_Types].xmlPK-!U0#L _rels/.relsPK-! (xl/_rels/workbook.xml.relsPK-!َ6aq xl/workbook.xmlPK-!bm xl/theme/theme1.xmlPK-!~`t`xl/worksheets/sheet2.xmlPK-!~`txl/worksheets/sheet3.xmlPK-!8xl/worksheets/sheet1.xmlPK-!Ќ |xl/sharedStrings.xmlPK-!HH 7xl/styles.xmlPK-!@4docProps/app.xmlPK-!aJukdocProps/core.xmlPK readxl/tests/testthat/sheets/missing-v-node-xlsx.xlsx0000644000176200001440000001112313336631200022574 0ustar liggesusersPKLgLf; _rels/.relsJ1}{wDdЛH}a70u}{ZI~7CfGFoZ+{kW#VJ$cʪl n0\QX^:`dd{m]_dhVFw^F9W-(F/3ODSUNl/w{N([qTuanF+y~K3k]C/E8LjZ1|:0zF5M^c/ZrkWDI%*Xso7PKLgLOz%xl/_rels/workbook.xml.relsMk0 FIc8AQ6ֵ~.[ eГH4C vV͢h%؀I/Z8Y.b;]JNɺQ/IӜS[n+Psc _{0 r3Rb+/2m=?"#ʯR6w _fz o ۭP~$E|PKLgLXvxl/workbook.xmlSr0}Wxp)0 5x&ɳl,y%@:e>͹3+Y8 *ׅP}{H3YR+,Y[9dZIe:xk:[mċV.7Zʘ9^Q"vP<$TO1]O$ hlnA+,GCݷ$g0]©gzE o:r;OOaKλ*; $f!(`!0nN}TD!l9(? քv.jo@"' Ѣ;RI@' %ُh̦ ZAn'dnӔ&lytPK: }$P.su= ׎Oݿ#XPKLgL4~ xl/styles.xmlAo0+$Mv.SҤi X5663&UkR)|~M *ͤLjDL!1҆p)hke!Ц ˜餠%'dR@U垮%J}敄 bYƥ(KaF'!W|MAM0r/TPE8kQIL@?GDr!cYY+8#%]ӂ( voßy oHnh ;!nB QPc1TP{=+UaDԣנ)߅T),rJɥ qF>'Xg!.ml׎]@ f>@W5- l=뽽tBױtY.Jxix#GYB* h;yJn2ߥ! vId"m:{PL$7ٌ?|1~tۙ~ni{V٭ȾH{y[,7Lda NeI֔t9~:lZ*EERwi;i|@;{;햪f] @A LPKusLizO=xl/worksheets/sheet1.xmlUT 1Z1Zux upxl/worksheets/sheet1.xmlVMo8W.֒\'NYEҺX[`o8PJRv_!a=UCμyC>:}d 4Ĕ5j_W^QbSI`Aw͓ٛ-.h\}E6/bvkP)Olm񰨒4/ E 7Wr9뼩@6·-P!Gvlp_w3zwQ8K bXf9!_;z'ԇl$}` ՙ3K-? H=ؕ 7tl >^n"j吀C<,Mo#UV)uK,AJ&%_(yѺL"II?VO{Mɛ|)t魙W JZpDsnq^>*u<b2D=$zC ykF?%R$Ɇ_Od醔7)/砆qPb=YST {{Ll2{nḎ,5@LXnqF i{RYعcCY\>hvwacCwtL8th?<߼_'}Y)S@PZÏuХ7$2?hyȯA{Tr(fPKLgLf; _rels/.relsPKLgL'| docProps/app.xmlPKLgL*V'7"docProps/core.xmlPKLgLOz%xxl/_rels/workbook.xml.relsPKLgLXvxl/workbook.xmlPKLgL4~ xl/styles.xmlPKusLizO9 xl/worksheets/sheet1.xmlUT1Zux upxl/worksheets/sheet1.xmlPKLgLZ9 xl/sharedStrings.xmlPKLgL_6X0Wd[Content_Types].xmlPK xreadxl/tests/testthat/sheets/names-need-repair-xls.xls0000644000176200001440000006200013406366260022662 0ustar liggesusersࡱ> 0/ ZO\p Jenny Bryan Ba==l k,B8X@"1Calibri1Calibri1Calibri1Calibri1Calibri1*h6 Calibri Light1,6Calibri16Calibri16Calibri1Calibri1Calibri1<Calibri1>Calibri1?Calibri14Calibri14Calibri1 Calibri1 Calibri1Calibri1Calibri1 Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)                                                                       ff + ) , *     P  P        `            a>  ||>h }-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-} 00\);_(*}-} 00\);_(*}-}+ 00\);_(*}-}, 00\);_(*}-}- 00\);_(*}-}. 00\);_(*}-}: 00\);_(*}-}; 00\);_(*}A}1 00\);_(*;_(@_) }A}2 00\);_(*?;_(@_) }A}3 00\);_(*23;_(@_) }-}4 00\);_(*}A}0 a00\);_(*;_(@_) }A}( 00\);_(*;_(@_) }A}7 W00\);_(*;_(@_) }}5 ??v00\);_(*̙;_(@_)    }}9 ???00\);_(*;_(@_) ??? ??? ??? ???}}) }00\);_(*;_(@_)    }A}6 }00\);_(*;_(@_) }}* 00\);_(*;_(@_) ??? ??? ??? ???}-}= 00\);_(*}}8 00\);_(*;_(@_)    }-}/ 00\);_(*}U}< 00\);_(*;_(@_)  }A}" 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}# 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}$ 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}% 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}& 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A}  00\);_(*23;_(@_) }A}' 00\);_(* ;_(@_) }A} 00\);_(*ef ;_(@_) }A} 00\);_(*L ;_(@_) }A}! 00\);_(*23 ;_(@_)  20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L˭ % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  L % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23 % 60% - Accent3M( 60% - Accent3 23 % 60% - Accent4M, 60% - Accent4 23f % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23Ў % "Accent1AAccent1 Dr % #Accent2A!Accent2 }1 % $Accent3A%Accent3  % %Accent4A)Accent4  % &Accent5A-Accent5 [ % 'Accent6A1Accent6  pG %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 DTj%Dr2 Heading 2G Heading 2 DTj%?3 Heading 3G Heading 3 DTj%234 Heading 49 Heading 4 DTj% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  W%3Normal % 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title DTj% <TotalMTotal %DrDr= Warning Text? Warning Text %XTableStyleMedium2PivotStyleLight16`1;Sheet1%)a bc%&$abonetwo - cc  PK![Content_Types].xmlN0EH-J@%ǎǢ|ș$زULTB l,3;rØJB+$G]7O٭VGR.e1a$n%N91G7Z(Lj$>{ҿQ>HjlIh촪b-{gv|g'=/:~E[7 r!7\&0;9$4 kas6r}SXi٬ kGAsPZxC}s7T A`?^R|{֯A)oViנt] f9dQ)/P yt),b-FO@)$zh QGpED 0\UF:W@?i i !SNy?yW޼W6Veda?~ǗH }˯S+.Lۯ_:w9:1c# $BĒ@v_#m' xg:J3F{; pOeXxJ=B5w%%WRُE!ED `)Ǝ}Nec2L>'^I& B ڲǨk|f#a[ ?2(v?B2r O/0epp<^ ø~Lױ䒜t!L䀝#/]1I"8EC&]cf~@^w?!rcH&"@7+̬aWʮ]N[->˜s4{A--FU+";V{IMGDX!; z+Q#O}i!T9g*}@&>itWYK w忋1ؗO-ؗ /-ݔym&Z3A`-X/DT]b+޴1$l~ڞ8vix܊uVg_J9jpۚZ%1Tݜu\w5}Wo/_2:^Ƈ㺗NV>N/S/٨ӎG{|ұ\S|$_4 *9}܉#en8#,Dz!%pbc6KO:UuVVd1^ q8),NrBn(ː0&I$Ae$} Fs+(,-~@- z!8|z]̏}ƴ"ZMn+{VM)u[}B^%UVLfQSwӰ٨];6  #76jt0xrQ CM_-[mvBv9h{4my&Oފv~-*pX A R7 aX zPXdW~Wt]xsKsc2eM\_Wk/=Iy6j۽F]J*^i7A?lG/|Ln4RFEoK͠Vnkt_dm @ggD Oh+'0@H\p ' Jenny Bryan Jenny BryanMicrosoft Macintosh Excel@@g@7`i ՜.+,0 PXd lt| ' Sheet1  Worksheets  !"#$%&()*+,-.Root Entry FWorkbook=SummaryInformation(DocumentSummaryInformation8'readxl/tests/testthat/sheets/more-than-256-unique-strings-xls.xls0000644000176200001440000021400013172305601024554 0ustar liggesusersࡱ> 79  !"#$%&'()*+,-./0123456;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Root Entry F |B8Workbook{hSummaryInformation(:XDocumentSummaryInformation8 #i\pMicrosoft Office User Ba==$plp?8@"1Calibri1Calibri1Calibri1Calibri1Calibri1 Calibri1Calibri14Calibri1 Calibri1Calibri1Calibri1,6Calibri16Calibri16Calibri1>Calibri14Calibri1<Calibri1?Calibri1*h6 Calibri Light1Calibri1 Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)                                                                       ff + ) , *     P  P       `            a  ||>+F}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-} 00\);_(*}-} 00\);_(*}A} 00\);_(*ef;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*ef ;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L ;_(@_) }A} 00\);_(*23;_(@_) }A} 00\);_(*23;_(@_) }A} 00\);_(*23;_(@_) }A} 00\);_(*23;_(@_) }A}  00\);_(*23;_(@_) }A}! 00\);_(*23 ;_(@_) }A}" 00\);_(*;_(@_) }A}# 00\);_(*;_(@_) }A}$ 00\);_(*;_(@_) }A}% 00\);_(*;_(@_) }A}& 00\);_(*;_(@_) }A}' 00\);_(* ;_(@_) }A}( 00\);_(*;_(@_) }}) }00\);_(*;_(@_)   \{~ ~c}}* 00\);_(*;_(@_) ??? ??? ???\{~ ???~c}-}+ 00\);_(*}-}, 00\);_(*}-}- 00\);_(*}-}. 00\);_(*}-}/ 00\);_(*}A}0 a00\);_(*;_(@_) }A}1 00\);_(*;_(@_) }A}2 00\);_(*?;_(@_) }A}3 00\);_(*23;_(@_) }-}4 00\);_(*}}5 ??v00\);_(*̙;_(@_)   \{~ ~c}A}6 }00\);_(*;_(@_) }A}7 e00\);_(*;_(@_) }}8 00\);_(*;_(@_)   \{~ ~c}}9 ???00\);_(*;_(@_) ??? ??? ???\{~ ???~c}-}: 00\);_(*}-}; 00\);_(*}U}< 00\);_(*;_(@_)  }-}= 00\);_(* 20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L˭ % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  L % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23 % 60% - Accent3M( 60% - Accent3 23 % 60% - Accent4M, 60% - Accent4 23f % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23Ў % "Accent1AAccent1 [ % #Accent2A!Accent2 }1 % $Accent3A%Accent3  % %Accent4A)Accent4  % &Accent5A-Accent5 Dr % 'Accent6A1Accent6  pG %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 DTj%[2 Heading 2G Heading 2 DTj%?3 Heading 3G Heading 3 DTj%234 Heading 49 Heading 4 DTj% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  e%3Normal % 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title DTj% <TotalMTotal %[[= Warning Text? Warning Text %XTableStyleMedium9PivotStyleMedium78dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\`BSheet1Ivarx1x2x3x4x5x6x7x8x9x10x11x12x13x14x15x16x17x18x19x20x21x22x23x24x25x26x27x28x29x30x31x32x33x34x35x36x37x38x39x40x41x42x43x44x45x46x47x48x49x50x51x52x53x54x55x56x57x58x59x60x61x62x63x64x65x66x67x68x69x70x71x72x73x74x75x76x77x78x79x80x81x82x83x84x85x86x87x88x89x90x91x92x93x94x95x96x97x98x99x100x101x102x103x104x105x106x107x108x109x110x111x112x113x114x115x116x117x118x119x120x121x122x123x124x125x126x127x128x129x130x131x132x133x134x135x136x137x138x139x140x141x142x143x144x145x146x147x148x149x150x151x152x153x154x155x156x157x158x159x160x161x162x163x164x165x166x167x168x169x170x171x172x173x174x175x176x177x178x179x180x181x182x183x184x185x186x187x188x189x190x191x192x193x194x195x196x197x198x199x200x201x202x203x204x205x206x207x208x209x210x211x212x213x214x215x216x217x218x219x220x221x222x223x224x225x226x227x228x229x230x231x232x233x234x235x236x237x238x239x240x241x242x243x244x245x246x247x248x249x250x251x252x253x254x255x256x257 . .5/c>/n///#/S.0^0000C"1wZ1112W:2r22273oR3333O24j444/5gJ5- PK!pO[Content_Types].xmlj0Eжr(΢]yl#!MB;.n̨̽\A1&ҫ QWKvUbOX#&1`RT9<l#$>r `С-;c=1g;#=\;S8MklX(*|C:]g.Gp m2:ȍc _nLkjt>.&< :bo~PS4J3.OC^Wx}sǗ?@o?E@{^z^2|oT:=a($9AWW[@f[-4j .9Ō%b_K@IZ@qJS2(a+ʠR#tf-y3$8|h_WW<_:GLDdϪ(qo&skM݄o7uĘ;Ű8 8(Bİ@Ct6\㞥06uKA,3Df،Wb1Dg½b;Wk&$Lu zPI=C,$E¢)ݯSYM[{`F((APb~*8%^ThN ,lS[)]ElE򎢋yWR^QgE |P-$y#eՃjtӢkdvݫd4LCUd״1ú lvM^c1h3ޖZ Etk4f2d+RQwx4 Mۭ=: ުvlTV@?@  !! "" ## $$ %% && '' (( )) ** ++ ,, -- .. // 00 11 22 33 44 55 66 77 88 99 :: ;; << == >> ??D@l@@A@B@C@D@E@F@G@H@I@J@K@L@M@N@O@P@Q@R@S@T@U@V@W@X@Y@Z@[@\@]@^@_@ @@ AA BB CC DD EE FF GG HH II JJ KK LL MM NN OO PP QQ RR SS TT UU VV WW XX YY ZZ [[ \\ ]] ^^ __D@l`@a@b@c@d@e@f@g@h@i@j@k@l@m@n@o@p@q@r@s@t@u@v@w@x@y@z@{@|@}@~@@ `` aa bb cc dd ee ff gg hh ii jj kk ll mm nn oo pp qq rr ss tt uu vv ww xx yy zz {{ || }} ~~ D@l@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                D@l@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                D@l@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                D@l@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                                D@l@@  D>@ggD  ՜.+,0 PXd lt| ' Sheet1  Worksheets'{B F$Microsoft Excel 97 - 2004 WorksheetBiff8Excel.Sheet.89q Oh+'0(HPp 'Microsoft Office UserMicrosoft Office UserMicrosoft Macintosh Excel@POY0@'{BGLlM  EMFD@   N  NQxMNP(x N(N ¥p.ȫ‰y¥p.ȫ‰ͱȷp.pyyf¥pױy¥ͱp.ұ׽p.p.׫pyȫpfܷyȥ¥p.ȫ‰±yy׽ͷCompObjpreadxl/tests/testthat/sheets/skipping.xlsx0000644000176200001440000006226213067126266020613 0ustar liggesusersPK! [ u[Content_Types].xml (̔N0M|f+`bapK%g[k!LDol_Oo8^6:YGeMY%` +r6}JoYA)5 ./ӕL`X̬C3+D1Aw kVP>I%uU΄sZ"(ogyg{ FХdUFqë>T;i'镄d"|x ޭeAhR m1ok:Bb 1k2=q18 / 1'ӏ$8 + x0r<~j{4!㻰:u$>(F:Rvh3R1G_PK!}T _rels/.rels (J0rߦl&R`66dFj=Nfv7ځa "m\+k,&pr(#UW K3>]JA: r`!2ƒE);~kjZ7g7G[XL!PpC& d/b\zk\(|$uҌgcBQ/#KDKMg;@/l.WN 3A}3.1PK!;xl/_rels/workbook.xml.rels (j0 }qne:A[&V'o?.]B/I~Hvյ5)Ȓқ w 3 H+no/jMdDTq2)iJ|.V*:1 uy5>l:x M k Ɔ$BULNXJ31[ ). C`ݎST.fXo ^3ZI?W}+-ܞ(J:d+@v$gd.9ʨ(ܑ|7 $Ϧ;.}gG)[1vs #{CUXs*5{.,ӒXP҂M _KPf֙N\[xwLZ6Ճ=w`Z2{Ѽ׆^eN8q -<`h4x}a}n%ۛ"3{ݒ-rzWwgS7zU=ǭ  ڭm DoERgy{QWGqfNk$o+5n9x'5\9I1̈́Qn7p큁[Hqr&""9M \;KaF_v ͊}j!xp$r/ؖC]nv3I,$ڛB›H] EG߄jŭ+6*hr`sV Q>Cw]8] gݫj9M49P9kMj5Xҭ ҺF Q[L1d+RR5.4O{#xߙ]Z9Al֕*Յ~'O@-:6Kr-Ց=,^V=V!" }D*RSؙ*IȆ԰'Ϭq˜D`@3I<1cG/SL"|xձmv^R;J]HnK-!EDض8hhu++"] 8]7Kul!YP9j~Q KpЏ!''PK!?  xl/worksheets/sheet1.xmlMo0 k9ibmPC"Ӷ$%i({tړESz^>[vƮ$ :p3dWIߖ{tF τ+}=tY(tY 4]+uGB^ V0B~iVgl 'Z3ǦC'׆~]Iud ʡ:$c/{7He^i x-(d͢kML < 3ZzGCW@wZnMx'M\fda^d>A=Zz,`5M(Oy.vT;]N9A*h$uu&u RwZIgRF3{gyf nHDq K~!=F-=9 {ӄ<1&G\PK!8HKxl/sharedStrings.xmllAj0EA:lJ((4X#W3kMɣPT8@owO|t#X\I%:X+@e_&e*5.LHh]<یtef Z03^oK^爃Y[ޮ6\GႵ܆swzvyFPK!̳MF xl/styles.xmlk09^&v!In^e[vDa$7d;NB:NН˵JtbT ;FQUPKp,O?~ks&\"G&)8)TֆKR( ?I=a%Hj^:ȵܵ #+ zh~fw7xs.pD%(dIƥV΢\7A=^v+{4?+0I\ m@`SQTbC ʒJ.^9Iy+ cTi q̨l +xú2F sƙ64ΥgU V:Wkf9rVZQS!Lo T"ȝtEM}"$2=x5gN-Wa=GO(kp\%``K BwvW T`%m; _Xv">=Yh/XQcx=ۇ],"}b`9_olnw0 7cke R_t F(iNHH8Photoshop 3.08BIM8BIM%ُ B~ }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzCC ?|3 O?9Dҥit %Y,-I$,;K3I$@xWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@|)"ڀ7 ( ( ( ( ( ( (?|)"ڀ7?gw¿<gм}~5Ov-| a?|7u'/I\AMg[}S]uS\K4mr~_na By?8:Ҿ#3P5mLošv|OdҙuGaXt=S=į ,|]j/ W௎4.}-кS5WZ:~o7ljZZ$0/ٟ>mxU9߈053|*C/m>WiE9| 4r= ŗ$x# |G_WI񷇼E(񽽖Cikw_l@>%xK (<sq "0+*WX-|k kXC=1[;!(*"*u?x 7%x 7%x 7%x 7%x 7%q<7ćQ'tf}o[Vv*.vPi?Jz?"P?Jz?"P?Jz?"P?Jz?"P?Jz?"P-ox.^nn|-.'46i$M,$#3#;bX@O +_M@ +_M@ +_M@ +_M@z<K|+iz9VGG[P2"*xS y iL,u,=y$ػY'4?Jz?"P?Jz?"P?Jz?"P?Jz?"P1x.~.-m1[[T3w$3C4v$SE"+|)"ڀ7IxZ! ( o:<= h?<> ] WXTռC{{ß|%Ե _< j3{J ⿉~6kRj0u?jOҴ;]4ּω_c/ iWecE ?qdIoSlĉDJΊ?1[@3}< y?1[@3}< y?1[@o<#iC7w\R=xMr aUω_><ω_><ω_c/ x3"h<1}oĹkoO $Z{ijV7xM@?3}< y?1[@3}< y?1[@zGOdy6 BH4W}FH9\YQcӚ1)o#f@ Jh{><ω_><ω_gƯ 7Ţf|3}oǹ[o쫿<ۤzDGHMT@|)"ڀ7! m]K:t 6?t~T+K|M j>E|S%mM~#?{i!@VwGu? ƶ+qGBƍkB /3EHƶ^ տiO,j~%~:Z|KѼIxF*5/QhZlK]BT7_ 'w x?HGm;fMW] @' Pi?@' Pi?@' Pi?@' Pi?@' Pi?@co>> .)-&%h^9cud7Utu*Eu?x/ A]x/ A]x/ A]x/ A]ek4t&~,̒Ij֓**ff *$ 8  𷆠~ht )])cӭHP' Pi?@' Pi?@' Pi?@' Pi?@ 52Y]&8(I%R8Y* |)"ڀ7~ G7<3=S^x}#Lo-5bO?ᴸ>h ό /RKjР'>|tF{X48gEo '|Io|k@%\t}sͷ=Jt U_U7dWZG _/~|UÇJm-u[_v3\m=+KmAa?$n>:w-৊#>.|K3>.4 g+x?h 'EƩl 4ψ>Ǿᕾh>4p4]z 㷉O?c]+n gK_7^+ψ;DX|XolMm5gxJy!Ka~VBcԴ[LYx{HsK;Co ijßv5iѪ~nijwO_}W6Y_~;_EP?/"ocz7ZxZt/KY o2wgĿ _ּ#V񇄼W}mVbMUִ Hmo=熵[RlkC~gZ9o`<x'9xoL߉<%Þ_L<;S6:ot xsLխnM6< /? ?'kqsuk|$Oz˘4_Oa3GlN<̓@wC?~;_EP?/"oyk&~֚`'Qu2Uxkh˶=ʇyR}1Kc>%^c ~/X? }@wC?[֞4ox=u lm QqcTj2[[ cz7}1Kc>%^c ~/X2?X2¯"G^91i.IRnːH7kT𥧍6`99M,q:ƒ̞8IdT¼ #`P ? }@wC?~;_EP?/"o񽧍~/k[/qm]O]GgHh&U1|)"ڀ7|-? hU,,n>(Rk+%XO?hҿ?d+7O?hҿ?d+7O?hҿ!vUW#"Q{W0^x_|xfC$S(Q '4i_| CF '4i_| CF '4i_q}i6~"m":uߪ_HGWa4' Wo7@,ѥt' Wo7@,ѥt' Wo7@> x.~ ͯ {^fiVK 'u=hO4nY>JO4nY>J/[]^Mzq۝UE@W¿m[OM2) i4rŧۤpTw Y>JO4nY>JO4n9@]|[ik=6{ +yFTQK|)"ڀ7O~Ӿ!-+]|Wm sgs|b=_G-e{2Þ>J\KoV5gό~)oΫ|5%ܺ6ZNXi2_I^_;5Dn.hh>?;࿄>2W]B]-xgᵾk\Zxi?hm#׌!i[ᅯoGbZ_ϏaOk<-i~.<[OX |!oj+&xv? xW\̞9|sqoh~"м1;(gg>%0>׌|x~hu;65+aqCoh2^ڽ'Axwjm@p I~/ (G~ Gf ( [FsP?ȣo4?6ZG@P%:76@.]54ڧWKJ `Үm>]g4H^EDž< o{HyndKt}MKx-Fie`dwvoMO G<[ES{D+h}2P=Ӥ{uKlK> !ʹQoMO G<[ES{D+hsſQ5?'1?oMO 9(ǚc@ Dм;2ZUGnͧҬ(DK$P39c@?#-=VjOxc9(mx&?[@z߇V.|@ԥExJZ2ɧP*YHaf*[)j6I>`vHVItEH@3;&7oMO G<[ES{D+hsſQ5?'1|kxiyu&} ñ%I]4,:zM̀D*+4|)"ڀ7%m;LZ[xIW^(bU[ᯆkFn9E0]|[]|[]|[]|[]|[[/`n;nMto>;nMto>;nMto>;nMto>;n9oxIWCI?  i6_mse&9 C#kϗ3tkϗ3tkϗ3tkϗ3txHE#[?KLQ{IT_Q'GH|ʠO0x_pY4x7"-lbIђ IH\|._/8xh6޵Wt[xsRiu .V⇊㎟?k6>*g|Gτ9}(x?f^:C77O߁uOk>$Y#-Oڮ^:ƣXOkC˩th욀> >ȓu?<_w@P@be@uP@ `KH ~G.hl (K"x/?|)"ڀ7<-ۭJ_\iJ|ud2Z[߾yaaFYRuĞ$g&q&4}t<*Pjͣi_۴bi֋6lC'ß}7/@!>x|9̽ 2G—Wn5_x/. #5wnHo,M)(a)@._\$$&tSw%’k~h-Vuhu$iv-!>x|9̽ 2C'ß}7/@g ^\GI]؍>O?^C|sz?e>O?c_nƾ1Y1LYtG[94A,C`^C|sz?e>O? s7躼>4&9K i)1( Ѷ@|+;ټ1ɗ2YtABOa"O I 0vF$Gse{^C|sz?e>O?gƾonƾ0X<3Lַ7X0\|9 rC0X܇P|)"ڀ7/i4|]jN|PjҬ-.-lKn01 N~PyH l?m@&БڀM#_)BGSaj?7xGWqxwm?oY<]4fLo!d`Jq@BGSaj?7o7 :M-o:M֋u -' xƊ*nO',´?!GiCZ'P Nj?@+O :9=u<#ysE-߆4 M2O>k,B@Pj?@+O :V?u<@+Qx*W= $-/P7ZUVV#!<=A@|->ROq!OG!oUAgbUQ €o´?!GiCZ'P Nj?@ύ~:-":ͼJ){BREV 0|)"ڀ7.-_O+ƞ$۟aߺ?.8v6` D˟?D˟?D˟?D˟?D˟пi?)? GS?#vmS|Rgo7yWſP j?zj?zj?zj?zj?z0+w6o$C$^f߳~v1g*LehNWyy^wb|<3}ln /j?zj?zj?zj?z2&/\->:cV9"QP\ 69Z 1%Xh-󳌷kF`x9:R-Blʋ6 sh6em'q|pL0p ۑHGdn 8Pbu`Ltw:ĝߋu]ԥC P5TdSn9mF[]ࡪ$`mdxY3V~qk_t_mN>K{PR>h\te%Q|*s4d.4kQsA#tǷ--ZTBt7,{XZ,%N6$}l| 5"E`(T;'9)vHj\"n4|J3 r9;^c)*ӱFy8y1ހ/]Rc~j~uWE!`;r,`:e v}cOCןgUo4Lg g+4${-[T҂L?_Ize0MN"9ޙ;l+yҎ "$G񜴣ѣO?yUJ2`~.q;J*76d X٘ +* 7cJes#4P3t<1A-2ڙ 1+b&Nh0Ѥr&L3y"İTUOpoZ3י7?rhR3:E2\({ *u{Յ<q +2jg.ُf[N*mB ~l*ݚ7 onwoZ o@)d1gA*%|lXdV1Zk~EȰ9Rq YPP\@VWW6̧V v١X iK-T;Fs$UV7;OW_~|0^='_R_ l逷߽7o_ ~=2g4Zâo仰 Y{OcʜI#iGy^WwOKv^vWֶcة1r(M.aOa#Yrqt+RX <\"W_Pƾj,E'\Bo\mys>m꓋e{B]1ĜZuNYZmҪ4CK. ބfA^ބm;0##w{zEH#UM2O@i9ZZ-]'Hu&J#2Jn/#d9:oGfh kuKie1t]FN*ܗX,BHejS<*S*_k[j6Ê$f-I`;#.J*SEi::GC6'¯S3nA #/pm\{fpv"%W:^`Ykyfq7_);Zn%#F^*Bܒ\lKax I g9+ÔY; # BL]!Z]V$+r̕5{Hh{{RHu&% 4LtO|l1ߴ=݁mk" LOK6nVV\k^{-n DLE+ p+7Bl4AZzBdm2iQa);o^tzJߧӽ͙Ϋ˻ϛ9k bh~11_|/LI $)þ5SwPK!dxxl/worksheets/sheet2.xmlMO0 H(wncLbBp@Bsm$ii~uw?މob((˥`)TD:TaBn!ɻ|qZL-Q7S*Nv8Sc8J]] Mީq_+m;,h &?K{7༎uwaw(Rx3{nF]:3f#&bš2Ʃݠǚoխbb^YV."ԅI|Zؤg{]"sUȼ/UGׯQ:/[QKVP뵣i6h|uH l rVm [ͯfÈKMgt/:66$n;J[oX"}_yMik PK!dxxl/worksheets/sheet3.xmlMO0 H(wncLbBp@Bsm$ii~uw?މob((˥`)TD:TaBn!ɻ|qZL-Q7S*Nv8Sc8J]] Mީq_+m;,h &?K{7༎uwaw(Rx3{nF]:3f#&bš2Ʃݠǚoխbb^YV."ԅI|Zؤg{]"sUȼ/UGׯQ:/[QKVP뵣i6h|uH l rVm [ͯfÈKMgt/:66$n;J[oX"}_yMik PK!#`;xl/worksheets/sheet1.xmlKo0 W$5Ab= βLB$%i( 4Q"$\<*I`0zM(47tyk&5=O؝J (Sƹqq%no`$ᮔd0rs>H"1bB!u?FGNErfa5#RUyEFuNI-i9F&(.C;PV3n YYV%1_hjQ/l ?swг}2гZ|X^np׋Ov2mmCk41?^: }}/ƣMGm| t)»PK!R[ hdocProps/app.xml (Mo0 96 bH7`tgNcdlOe7 )sSFrr>ˤ@oC1R/s!{bd$R OەRd+lfII)ClS*K">(<3PW'ߦE==6mkg-(,6`@|Xk5ĹCw&jꝅSBMkA?"ۂdW' 3 p! rysmc2uKBd*Nؽ3[c`I-qB/;zJ:HK#VàoDд;snx܉P)0hu1?ӡ݇`涨wD,:cZK& OSO1lG2iE/PK!\a{docProps/core.xml (KO!&~ Lֺ6w&{%s?ι!| }1f=X锶1^.fF! D,gtG % \c#B/9lK獈W]) P" @;d$ 1MsUFm:ă+q66FṭiJ.r% ŽPFXtWU:l!K f[̵.2Dz2ocz-= +W^ }.3]k>`|Dߚ'MKft3>r::"EPK-!O 2d[Content_Types].xmlPK-!P|NL _rels/.relsPK-!;xl/_rels/workbook.xml.relsPK-!|f xl/workbook.xmlPK-!z xl/theme/theme1.xmlPK-!dxtxl/worksheets/sheet2.xmlPK-!dx"xl/worksheets/sheet3.xmlPK-!#`;xl/worksheets/sheet1.xmlPK-!Ktxl/sharedStrings.xmlPK-!7#cA xl/styles.xmlPK-!R[ hmdocProps/app.xmlPK-!\a{NdocProps/core.xmlPK  readxl/tests/testthat/sheets/vietnamese-utf8.xls0000644000176200001440000004500013067126266021612 0ustar liggesusersࡱ>  # "Root Entry F@Ɲ5!Workbook;SummaryInformation(DocumentSummaryInformation8 #i\pMicrosoft Office User Ba== 4F"8X@"1 Segoe UI1Calibri1Calibri1Calibri1 Segoe UI1h8Cambria1,8Calibri18Calibri18Calibri1Calibri1Calibri1<Calibri1>Calibri1?Calibri14Calibri14Calibri1 Calibri1 Calibri1Calibri1Calibri1 Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)                                                                      ff + ) , *     P  P        `            a>  ||>Ox}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-}; 00\);_(*}A}1 00\);_(*;_(@_) }A}2 00\);_(*?;_(@_) }A}3 00\);_(*23;_(@_) }-}4 00\);_(*}A}0 a00\);_(*;_(@_) }A}( 00\);_(*;_(@_) }A}7 e00\);_(*;_(@_) }}5 ??v00\);_(*̙;_(@_)   \{ t  tc}}9 ???00\);_(*;_(@_) ??? ??? ???\{ t ??? tc}}) }00\);_(*;_(@_)   \{ t  tc}A}6 }00\);_(*;_(@_) }}* 00\);_(*;_(@_) ??? ??? ???\{ t ??? tc}-}= 00\);_(*}x}800\);_(*;_(??? ??? ???\{}-}/ 00\);_(*}U}< 00\);_(*;_( }A}" 00\);_(*;_(}A} 00\);_(*ef;_(}A} 00\);_(*L;_(}A} 00\);_(*23;_(}A}# 00\);_(*;_(}A} 00\);_(*ef;_(}A} 00\);_(*L;_(}A} 00\);_(*23;_(}A}$ 00\);_(*;_(}A} 00\);_(*ef;_(}A} 00\);_(*L;_(}A} 00\);_(*23;_(}A}% 00\);_(*;_(}A} 00\);_(*ef;_(}A} 00\);_(*L;_(}A} 00\);_(*23;_(}A}& 00\);_(*;_(}A} 00\);_(*ef;_(}A} 00\);_(*L;_(}A}  00\);_(*23;_(}A}' 00\);_(* ;_(}A} 00\);_(*ef ;_(}A} 00\);_(*L ;_(}A}! 00\);_(*23 ;_() . A 20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L渷 % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  Lմ % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23ږ % 60% - Accent3M( 60% - Accent3 23כ % 60% - Accent4M, 60% - Accent4 23 % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23 % "Accent1AAccent1 O % #Accent2A!Accent2 PM % $Accent3A%Accent3 Y % %Accent4A)Accent4 d % &Accent5A-Accent5 K % 'Accent6A1Accent6  F %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 I}%O2 Heading 2G Heading 2 I}%?3 Heading 3G Heading 3 I}%234 Heading 49 Heading 4 I}% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  e%"Normal 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title I}% <TotalMTotal %OO= Warning Text? Warning Text %XTableStyleMedium2PivotStyleLight16, MySqlDefault8dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\`9Sheet1"M tBN STST ln sn lateriteCT TH ln sn thch anhCT MN CT TRUNGST ln kt vn silic  , # PK!pO[Content_Types].xmlj0Eжr(΢]yl#!MB;.n̨̽\A1&ҫ QWKvUbOX#&1`RT9<l#$>r `С-;c=1gހbFӳ Z't4ʥ9g4r PVV1ZWk ~Ȱ)RˌqUTP \@c1jl_2ZZ=%ؙgBYҖ  np(VV7;_xztF_PK4*o}/|o?/ԅOhB$zL.)O92711fd׈B\%fu=-u q,h~'s6.'“E+ wy>N*l5xf0*(3Bj=ԋ1 |szֆdB^!&3RqVHh j/NDNp܀a9^ LGq4)<௓G6lHY#̹~;ib?gPpU?~gƺt?KD(5iU Bp~K6İ 0G M_b_5׋2rC&߇e/:ܿxh*s~$폤I{]/>U[Փ[9elI[&F0c*)nY u' l TgoZH$sёD7õ5N ʞObCbugvxKR*2Bіp]e[r(kjiL3i+]!6'yy ф-Dy. j8aFf:6GEZLn3E23H]Q$#[ yEm-]'IuE>$KE.#Kd)f;@!κ1 R/1*T–l|NM/q8@&`0`dlCXoˁ6[;P G?d>'rǜJB1ghCu?3*0~ =m'k4e1Vhn<9oni[r-+z=[@#)݀ s` nF6;ZR^CQ/ȹo{0moNiHł%S}WkkrAsef͞s&JݰINw缃1Yw>)͆ib=Xv^#j*9KA'o4KeǛ8bc,7D-D/~ ܊- x Mvp ';hIͷN:jb};R`kˮܜ^`bmֆ2{Eah^dLbwk_|=/LISL>Խ?PK! ѐ'theme/theme/_rels/themeManager.xml.relsM 0wooӺ&݈Э5 6?$Q ,.aic21h:qm@RN;d`o7gK(M&$R(.1r'JЊT8V"AȻHu}|$b{P8g/]QAsم(#L[PK-!pO[Content_Types].xmlPK-!֧6 -_rels/.relsPK-!kytheme/theme/themeManager.xmlPK-!theme/theme/theme1.xmlPK-! ѐ' theme/theme/_rels/themeManager.xml.relsPK] #i 9;  dMbP?_*+%&?'?(?)?"D3??U } D}  D       x>@ 7ggD   Oh+'0@H\| ' Le Minh SonMicrosoft Office UserMicrosoft Macintosh Excel@tp@ Ɲ5 ՜.+,D՜.+,  PXh px 'flatgeo Sheet1  Worksheetst 9A WorkbookGuid'(abbde0cc-16f4-4f79-a72d-2db20c53ad13 F$Microsoft Excel 97 - 2004 WorksheetBiff8Excel.Sheet.89qCompObj preadxl/tests/testthat/sheets/geometry.xlsx0000644000176200001440000005575113172305601020614 0ustar liggesusersPK!Iy\[Content_Types].xml (̕]O0MKoV@capǥ?g[_i ¿1dHf֞}zҾJ& p^~# pO;4gh <./ӕ`9C|f,h)S,૫eŌU@--C 2>B2$OK&r<5V9aJQu(\hCeX}-B T8TN'8$ SN~70fuoД(bk5@P2c8O / 183'wh|4̞J?uk怿)wr]x'Xi.lbN- [GңMVs-4FPK!}T _rels/.rels (J0rߦl&R`66dFj=Nfv7ځa "m\+k,&pr(#UW K3>]JA: r`!2ƒE);~kjZ7g7G[XL!PpC& d/b\zk\(|$uҌgcBQ/#KDKMg;@/l.WN 3A}3.1PK!n axl/_rels/workbook.xml.rels (j0 }qv]uz^Lġ,O~&c] %\ wvVA 殨m|AmgQAfDHK s(%[MІJ|9OBFdP(bwmWuO.o "Q+dɡ10aS0spMe&S 9&y5?ìF{,^هSS01taw2cȾPK!Ixl/workbook.xmlTn }^huժ\+k.WU]'NJi 03gf7tL |סȜC\ohEK)h枨vo̎R祿w@-iRPT0JQRK~8f5rg$9QUG5p@X̩uNۃ J /9#Jj7g:/ |]ٞUsJ:%f3CMGlCEJ8 BT\*04T lR 2%i8Wk[e31❾ĦpjUf.B8!oJd ݎ@]2u/&V2tTgvo='4wLO ގSM7Qv(}4xwe2skbbƻ̍Z~;vvD[ lzvBa jax|PK!* .xl/worksheets/sheet4.xml]k0B磋q\J2cYkY>EIJ$F}E+5+:IRJ[KӮ/M͕5G8X@ H0~E1/:'48u-^bY.Б0lHk+vL!ؿdO4->mwGD% JCkB/'0yR8mıѷlɐTDvY_9ѓ5&WP %1m\RaAr@)o2Xh巏Xjtzu0S=|v.МQ^ %Y͚^]P88 | p-க`?|1kU>:F XNxH7 PK!"|xl/worksheets/sheet2.xmln0E1eF(vMS#0*Iw$AFx,;M+r5"J[HSees)2zO_ғu{_3Z$yQ~d0N[W18EwH+Gќi. aR X[q`Bqx}-?д;auT2;(%Z$O~O^Kᬷe!~򴐨8(3$9ey[ɿ[`P(v5}Td4Bp|a_ƿ]v'M.ޯ̛y?q+"8%8$/{~=KIq^i_4yy`'XO۹<mcQ1RvR>HটM;8Lf`:fY21"s[ DP6S>tk+jv5@@SZZM; ;PK![T&xl/worksheets/sheet3.xmloo0Ow1!$]PEU٤jʶ׎90IoDTԼ@p=ϝ t:(#l)MӟJ|<},>|iB2Em:n]|뀗!XE 4t # [URڊGpñVK%åRET^i7oZ gql(TdDAn.w ʊw藄&ߠ +P )%]ا2b=(c:FRmqndz̼Ȟ{XY[91)G~Wu |JaMi/2g{=zZMNH-2; ͣSe |v%&5gmyC}*E/_NC;[^wjiF(iNHH8Photoshop 3.08BIM8BIM%ُ B~ }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzCC ?|3 O?9Dҥit %Y,-I$,;K3I$@xWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@|)"ڀ7 ( ( ( ( ( ( (?|)"ڀ7%? jW^^(F4m:ނgI $m +_M@ +_M@ +_M@ +_M@ +_M@ໝ&Kx^y>9^oRk_[ZX GaQT%xK (%xK (%xK (%xK (%xK (yx?Hn$:=΃45[|ڳQwTp;O@< BW@< BW@< BW@< BW@< BW9ox#w^ }ׄ<ω_><ω_><"ƕw[_4_qO(Ou0-ߞHO*?3}< y?1[@3}< y?1[@3}< ?:O-|֙<ω_><ω_><ǃ<",|փZ\Kʴ EK9icwd@4?1[@3}< y?1[@3}< ]_δ@.1jGIwiK)ld@|,m|mtŜo=96d7ω_><ω_>|jσ|Z/-|g:\{ʻͺKO8qdtI4|)"ڀ7! m]K:tn>>9RmsKx`tqo,S %H匲:u?x/ A]x/ A]x/ A]x/ A]x/ A]q__;O^(G|ޙ ɿUt*]rr0a`h7_ '7_ '7_ '7_ '7_ '7|#m\Ö>4E$+,nFꮎX(4K(4K(4K(4K wƞD#ŞI4A^ҙeTE[Up'W~2xpE42\r,zuItt`X7_ '7_ '7_ '7_ 'nj|#s[x×AK4K0I$;*G+;PX@|)"ڀ7|cep,y?;J)hXdg$n/ +KmAa?$n9?k&#Ş=PZBF'j"(誡FuZ_l?7@V@6 tei H?Z_l?7@7m7Nz3ae#ec^ 8+KmAa?$n/ +KmA|;8k 3he%I'$Y6 tei H?Z_l?7@V@NikLu:V #S.س7tVfkX 36jK11y$O't_Z_l?7@V@6 tei H?ra<5W7uo&6R0E*A%1Kc>%^c ~/X? }@wC?[4m&?J|rf;ƾ [5ȖX!1@=3u?c ~/X? }@wC?~;_EP?/"oyk&~֚`'Qu2Uxkh˶=ʇyR}1Kc>%^c ~/X? }@wC?[֞4ox=u lm QqcTj2[[ cz7}1Kc>%^c ~/X2?X2¯"G^91i.IRnːH7kT𥧍6`99M,q:ƒ̞8IdT¼ #`P ? }@wC?~;_EP?/"o񽧍~/k[/qm]O]GgHh&U1|)"ڀ7|-? hU,,n>(Rk+%XO?hҿ?d+7O?hҿ?d+7O?hҿ!vUW#"Q{W0^x_|xfC$S(Q '4i_| CF '4i_| CF '4i_q}i6~"m":uߪ_HGWa4' Wo7@,ѥt' Wo7@,ѥt' Wo7@> x.~ ͯ {^fiVK 'u=hO4nY>JO4nY>J/[]^Mzq۝UE@W¿m[OM2) i4rŧۤpTw Y>JO4nY>JO4n9@]|[ik=6{ +yFTQK|)"ڀ7-Z( (On( (:/SwtP@??(oLTP@Կj|-bZ }"'Rh|)"ڀ7-k}?=ϊYCh/g^M9-6*`@_#-=VjOxc9(mx&?[@#-=V1Wm5T'm^4_ഺ{k[/9HQ@:G<[ES{D+hsſQ5?'1?oMO G<[ES{7i#oB:h?N/U,{4{6GʪsſQ5?'1?oMO G<[ES{D+hsſQ5?'1<xoxFkj6KH-Bk VK6J,CHtx&?[@#-=VjOxc9(me~ZhRK:Ji)h&Ce!roO xrH|}&VrE7!Y%ӚY%!sĚsſQ5?'1?oMO G<[ES{D+h|٧w^פ/ė1&t[4k2Itl|)"ڀ7%m;LZ[xIW^(bU[ᯆkFn9E0]|[]|[]|[]|[]|[[/`n;nMto>;nMto>;nMto>;nMto>;n9oxIWCI?  i6_mse&9 C#kϗ3tkϗ3tkϗ3tkϗ3txHE#[?KLQ{IT_Q'GH|ʠO0x_pY4x7"-lbIђ IH\x|9̽ 2xG—Wn5_x.@[_o7ÒtFnf0:C|sz?e>O?^C|sz>xZ:L?+C+oR'ģyS#m]!>x|9̽ 2C'ß}7/@!>x|9̽sǂ#p5e˥Z8MɥidWlt 2C'ß}7/@!>x|9̽eE>94AR\xx [II@G(mm_ L7ˠ }xjIQ1$8E, 2C'ß}7/@!>x|9̽s>5|[p5zf ť]9C&0L˔E<2لr:|)"ڀ7/i4|]jN|PjҬ-.-lKn01 N~PyH l?m@&БڀM#_)BGSaj?7xGWqxwm?oY<]4fLo!d`Jq@BGSaj?7o7 :M-o:M֋u -' xƊ*nO',´?!GiCZ'P Nj?@+O :9=u<#ysE-߆4 M2O>k,B@Pj?@+O :V?u<@+Qx*W= $-/P7ZUVV#!<=A@|->ROq!OG!oUAgbUQ €o´?!GiCZ'P Nj?@ύ~:-":ͼJ){BREV 0|)"ڀ7.-_O+ƞ$۟aߺ?.8v6` D˟?D˟?D˟?D˟?D˟пi?)? GS?#vmS|Rgo7yWſP j?zj?zj?zj?zj?z0+w6o$C$^f߳~v1g*LehNWyy^wb|<3}ln /j?zj?zj?zj?z2=Yh/XQcx=ۇ],"}b`9_olnw0 7cke R_t '5\9I1̈́Qn7p큁[Hqr&""9M \;KaF_v ͊}j!xp$r/ؖC]nv3I,$ڛB›H] EG߄jŭ+6*hr`sV Q>Cw]8] gݫj9M49P9kMj5Xҭ ҺF Q[L1d+RR5.4O{#xߙ]Z9Al֕*Յ~'O@s_5TdSn9mF[],%`cdxY1V~q{k_ ρ|T:;)/ C$Y9Mb^u9~wчjMR$4O'@R|PK!cH{docProps/app.xml (Qo0ߑWLr "$  !%Root Entry F0x\#Workbook?SummaryInformation(DocumentSummaryInformation8 #i\pMicrosoft Office User Ba==m=8X@"1Calibri1Calibri1Calibri1Calibri1Calibri1Calibri1h8Cambria1,8Calibri18Calibri18Calibri1Calibri1Calibri1<Calibri1>Calibri1?Calibri14Calibri14Calibri1 Calibri1 Calibri1Calibri1Calibri1 Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_) #,###                                                                       ff + ) , *     P  P        `            a>    1  ||@@}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-} 00\);_(*}-} 00\);_(*}(}> 00\);_(*}-}? 00\);_(*}-}+ 00\);_(*}-}, 00\);_(*}-}- 00\);_(*}-}. 00\);_(*}-}: 00\);_(*}-}; 00\);_(*}A}1 00\);_(*;_(@_) }A}2 00\);_(*?;_(@_) }A}3 00\);_(*23;_(@_) }-}4 00\);_(*}A}0 a00\);_(*;_(@_) }A}( 00\);_(*;_(@_) }A}7 e00\);_(*;_(@_) }}5 ??v00\);_(*̙;_(@_)   \{s sc}}9 ???00\);_(*;_(@_) ??? ??? ???\{s ???sc}}) }00\);_(*;_(@_)   \{s sc}A}6 }00\);_(*;_(@_) }}* 00\);_(*;_(@_) ??? ??? ???\{s ???sc}-}= 00\);_(*}}8 00\);_(*;_(@_)   \{s sc}-}/ 00\);_(*}U}< 00\);_(*;_(@_)  }A}" 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}# 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}$ 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}% 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}& 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A}  00\);_(*23;_(@_) }A}' 00\);_(* ;_(@_) }A} 00\);_(*ef ;_(@_) }A} 00\);_(*L ;_(@_) }A}! 00\);_(*23 ;_(@_)  20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L渷 % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  Lմ % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23ږ % 60% - Accent3M( 60% - Accent3 23כ % 60% - Accent4M, 60% - Accent4 23 % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23 % "Accent1AAccent1 O % #Accent2A!Accent2 PM % $Accent3A%Accent3 Y % %Accent4A)Accent4 d % &Accent5A-Accent5 K % 'Accent6A1Accent6  F %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 I}%O2 Heading 2G Heading 2 I}%?3 Heading 3G Heading 3 I}%234 Heading 49 Heading 4 I}% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  e%3Normal % 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title I}% <TotalMTotal %OO= Warning Text? Warning Text %XTableStyleMedium2PivotStyleLight168dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\` g;DataIN val1,1aabbccvar1var2var3var5val2,1val3,1f/ /@ PK!pO[Content_Types].xmlj0Eжr(΢]yl#!MB;.n̨̽\A1&ҫ QWKvUbOX#&1`RT9<l#$>r `С-;c=1gͧ/"4K"hKU_^NiF 9 TR1.M4g+!3U&{Ioe䐡؏)E%|kY4au V$wY9#Ai|0'j]jy{}SS+7,'VLδ;xyU˷qd<,=u2ӳΨ}v =Ѩ7(mqB-}I ợ-{A-(,_MBRz Y ~v ߡ2*V"ׇj-BN`4ˉt1Vd`9[ޒET,YѥEA,|Vd;!t!c v@DOt?l7F4O|%^k`,4Kx- wFM4+w pפ{ qMS487r ͩ&XSƂ^X %V|ad1$s@&Un[a^M>c\&#w!09AFC$r-~:m2r(N(dJ5(_/۽1|HٺI{G^8hXKȍMkvy`?3q"Ē]'ِ7T;P2Ȉe,+ ii8]"6C;2lEeOe~OwOk;&C3&=;eǾ|WvS).}Ck@Gɨ %"tBSc'2BUN)ۊ]nm8yjw)1}-n,Wn-ZUxӗP{uQOֱYR .[!v h`@p(iT .M],3E*%-sdQ&=G周yFh{J|uH e =lGsr?^Db( /j1+0b|kf]r,l޽]xJ_J]iGe hr0rf?f1L-]hd{+&vkIb{y ~Sϒ)o[F0_吉}st+sJ5-Zu[Bm<зFۭswŶ\9O4ݤb:e S,T,J,w` F|EoH_I_sNmk[<ҩiV#:DR(\U89#b[6)i_Eb&^ y4Uk`wv{u1[u*Ai3ZX{*0b=_x1ssqJeU [\]1Q.dVGtkm,{Jz8 x`b3EqiU]dlbiWLpl1?J$ =}4ڭPK! ѐ'theme/theme/_rels/themeManager.xml.relsM 0wooӺ&݈Э5 6?$Q ,.aic21h:qm@RN;d`o7gK(M&$R(.1r'JЊT8V"AȻHu}|$b{P8g/]QAsم(#L[PK-!pO[Content_Types].xmlPK-!֧6 -_rels/.relsPK-!kytheme/theme/themeManager.xmlPK-!!OG%theme/theme/theme1.xmlPK-! ѐ' theme/theme/_rels/themeManager.xml.relsPK] #i E<>  dMbP?_*+%,M  d,," d,,333333?333333?U } * } } * ,,,,,,,  ? ?> > > >~ ?> > >~ @>  > >~ @>>>>>>>>>> xLHHH>@* ggD   Oh+'0HP` 'ThysonMicrosoft Office UserMicrosoft Macintosh Excel@@x:@ Q\ ՜.+,0HP X`hp x ' Data  WorksheetsCompObjp F$Microsoft Excel 97 - 2004 WorksheetBiff8Excel.Sheet.89qreadxl/tests/testthat/sheets/empty-sheets.xls0000644000176200001440000016500013067126266021220 0ustar liggesusersࡱ> !s  $%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrRoot Entry F0Ђ8"Workbook=SummaryInformation(#XDocumentSummaryInformation8 #i\pMicrosoft Office User Ba==p4D8@"1Calibri1Calibri1Calibri1Calibri1Calibri1*h6 Calibri Light1,6Calibri16Calibri16Calibri1Calibri1Calibri1<Calibri1>Calibri1?Calibri14Calibri14Calibri1 Calibri1 Calibri1Calibri1Calibri1 Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)                                                                       ff + ) , *     P  P       `            a  ||>]}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-} 00\);_(*}-} 00\);_(*}-}+ 00\);_(*}-}, 00\);_(*}-}- 00\);_(*}-}. 00\);_(*}-}: 00\);_(*}-}; 00\);_(*}A}1 00\);_(*;_(@_) }A}2 00\);_(*?;_(@_) }A}3 00\);_(*23;_(@_) }-}4 00\);_(*}A}0 a00\);_(*;_(@_) }A}( 00\);_(*;_(@_) }A}7 e00\);_(*;_(@_) }}5 ??v00\);_(*̙;_(@_)   \{s sc}}9 ???00\);_(*;_(@_) ??? ??? ???\{s ???sc}}) }00\);_(*;_(@_)   \{s sc}A}6 }00\);_(*;_(@_) }}* 00\);_(*;_(@_) ??? ??? ???\{s ???sc}-}= 00\);_(*}}8 00\);_(*;_(@_)   \{s sc}-}/ 00\);_(*}U}< 00\);_(*;_(@_)  }A}" 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}# 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}$ 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}% 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}& 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A}  00\);_(*23;_(@_) }A}' 00\);_(* ;_(@_) }A} 00\);_(*ef ;_(@_) }A} 00\);_(*L ;_(@_) }A}! 00\);_(*23 ;_(@_)  20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L˭ % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  L % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23 % 60% - Accent3M( 60% - Accent3 23 % 60% - Accent4M, 60% - Accent4 23f % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23Ў % "Accent1AAccent1 [ % #Accent2A!Accent2 }1 % $Accent3A%Accent3  % %Accent4A)Accent4  % &Accent5A-Accent5 Dr % 'Accent6A1Accent6  pG %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 DTj%[2 Heading 2G Heading 2 DTj%?3 Heading 3G Heading 3 DTj%234 Heading 49 Heading 4 DTj% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  e%3Normal % 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title DTj% <TotalMTotal %[[= Warning Text? Warning Text %XTableStyleMedium9PivotStyleMedium78dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\` ;emptyL< header_onlyIvar1var2 . - PK!pO[Content_Types].xmlj0Eжr(΢]yl#!MB;.n̨̽\A1&ҫ QWKvUbOX#&1`RT9<l#$>r `С-;c=1g;#=\;S8MklX(*|C:]g.Gp m2:ȍc _nLkjt>.&< :bo~PS4J3.OC^Wx}sǗ?@o?E@{^z^2|oT:=a($9AWW[@f[-4j .9Ō%b_K@IZ@qJS2(a+ʠR#tf-y3$8|h_WW<_:GLDdϪ(qo&skM݄o7uĘ;Ű8 8(Bİ@Ct6\㞥06uKA,3Df،Wb1Dg½b;Wk&$Lu zPI=C,$E¢)ݯSYM[{`F((APb~*8%^ThN ,lS[)]ElE򎢋yWR^QgE |P-$y#eՃjtӢkdvݫd4LCUd״1ú lvM^c1h3ޖZ Etk4f2d+RQwx4 Mۭ=: ުvlTV@ggD #i =P=  dMbP?_*+%@"@333333?333333?U @  0>@ggD  ՜.+,0 PXd lt| ' empty header_only  WorksheetsGL F$Microsoft Excel 97 - 2004 WorksheetBiff8Excel.Sheet.89q Oh+'0(HPp 'Microsoft Office UserMicrosoft Office UserMicrosoft Macintosh Excel@+x@NGLlM  EMFD@   N  NQxMNP(x N(N CompObjpreadxl/tests/testthat/sheets/unnamed-duplicated-columns.xls0000644000176200001440000016500013067126266024012 0ustar liggesusersࡱ> !s  $%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrRoot Entry F@P>"Workbook=SummaryInformation(#XDocumentSummaryInformation8 #i\pMicrosoft Office User Ba==ndA8@"1Calibri1Calibri1Calibri1Calibri1Calibri1*h6 Calibri Light1,6Calibri16Calibri16Calibri1Calibri1Calibri1<Calibri1>Calibri1?Calibri14Calibri14Calibri1 Calibri1 Calibri1Calibri1Calibri1 Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)                                                                       ff + ) , *     P  P       `            a  ||>]}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-} 00\);_(*}-} 00\);_(*}-}+ 00\);_(*}-}, 00\);_(*}-}- 00\);_(*}-}. 00\);_(*}-}: 00\);_(*}-}; 00\);_(*}A}1 00\);_(*;_(@_) }A}2 00\);_(*?;_(@_) }A}3 00\);_(*23;_(@_) }-}4 00\);_(*}A}0 a00\);_(*;_(@_) }A}( 00\);_(*;_(@_) }A}7 e00\);_(*;_(@_) }}5 ??v00\);_(*̙;_(@_)   \{`m~ m~c}}9 ???00\);_(*;_(@_) ??? ??? ???\{`m~ ???m~c}}) }00\);_(*;_(@_)   \{`m~ m~c}A}6 }00\);_(*;_(@_) }}* 00\);_(*;_(@_) ??? ??? ???\{`m~ ???m~c}-}= 00\);_(*}}8 00\);_(*;_(@_)   \{`m~ m~c}-}/ 00\);_(*}U}< 00\);_(*;_(@_)  }A}" 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}# 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}$ 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}% 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}& 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A}  00\);_(*23;_(@_) }A}' 00\);_(* ;_(@_) }A} 00\);_(*ef ;_(@_) }A} 00\);_(*L ;_(@_) }A}! 00\);_(*23 ;_(@_)  20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L˭ % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  L % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23 % 60% - Accent3M( 60% - Accent3 23 % 60% - Accent4M, 60% - Accent4 23f % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23Ў % "Accent1AAccent1 [ % #Accent2A!Accent2 }1 % $Accent3A%Accent3  % %Accent4A)Accent4  % &Accent5A-Accent5 Dr % 'Accent6A1Accent6  pG %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 DTj%[2 Heading 2G Heading 2 DTj%?3 Heading 3G Heading 3 DTj%234 Heading 49 Heading 4 DTj% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  e%3Normal % 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title DTj% <TotalMTotal %[[= Warning Text? Warning Text %XTableStyleMedium9PivotStyleMedium78dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\`;Sheet1I!var2abaabb . - PK!pO[Content_Types].xmlj0Eжr(΢]yl#!MB;.n̨̽\A1&ҫ QWKvUbOX#&1`RT9<l#$>r `С-;c=1g;#=\;S8MklX(*|C:]g.Gp m2:ȍc _nLkjt>.&< :bo~PS4J3.OC^Wx}sǗ?@o?E@{^z^2|oT:=a($9AWW[@f[-4j .9Ō%b_K@IZ@qJS2(a+ʠR#tf-y3$8|h_WW<_:GLDdϪ(qo&skM݄o7uĘ;Ű8 8(Bİ@Ct6\㞥06uKA,3Df،Wb1Dg½b;Wk&$Lu zPI=C,$E¢)ݯSYM[{`F((APb~*8%^ThN ,lS[)]ElE򎢋yWR^QgE |P-$y#eՃjtӢkdvݫd4LCUd״1ú lvM^c1h3ޖZ Etk4f2d+RQwx4 Mۭ=: ުvlTV@ggD  ՜.+,0 PXd lt| ' Sheet1  WorksheetsGP> F$Microsoft Excel 97 - 2004 WorksheetBiff8Excel.Sheet.89q Oh+'0(HPp 'Microsoft Office UserMicrosoft Office UserMicrosoft Macintosh Excel@`l>@GP>GLlM  EMFD@   N  NQxMNP(x N(N ppұfȟ׷ҫͫȫܽཟ¥ܽҫҽܽͱ¥«Șyȫyy‰ͽͽѽ׷«ͽy˜y͟ͽŸCompObjpreadxl/tests/testthat/sheets/missing-first-column.xls0000644000176200001440000004700013173247604022657 0ustar liggesusersࡱ> "$  !%Root Entry FG܊#WorkbookB?SummaryInformation(DocumentSummaryInformation8 #i\pMicrosoft Office User Ba==]0/8X@"1Calibri1Calibri1Calibri1Calibri1Calibri1h8Cambria1,8Calibri18Calibri18Calibri1Calibri1Calibri1<Calibri1>Calibri1?Calibri14Calibri14Calibri1 Calibri1 Calibri1Calibri1Calibri1 Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)                                                                       ff + ) , *     P  P        `            a>  ||>;c}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-} 00\);_(*}-} 00\);_(*}-}+ 00\);_(*}-}, 00\);_(*}-}- 00\);_(*}-}. 00\);_(*}-}: 00\);_(*}-}; 00\);_(*}A}1 00\);_(*;_(@_) }A}2 00\);_(*?;_(@_) }A}3 00\);_(*23;_(@_) }-}4 00\);_(*}A}0 a00\);_(*;_(@_) }A}( 00\);_(*;_(@_) }A}7 e00\);_(*;_(@_) }}5 ??v00\);_(*̙;_(@_)   \{ c}}9 ???00\);_(*;_(@_) ??? ??? ???\{ ???c}}) }00\);_(*;_(@_)   \{ c}A}6 }00\);_(*;_(@_) }}* 00\);_(*;_(@_) ??? ??? ???\{ ???c}-}= 00\);_(*}}8 00\);_(*;_(@_)   \{ c}-}/ 00\);_(*}U}< 00\);_(*;_(@_)  }A}" 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}# 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}$ 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}% 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}& 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A}  00\);_(*23;_(@_) }A}' 00\);_(* ;_(@_) }A} 00\);_(*ef ;_(@_) }A} 00\);_(*L ;_(@_) }A}! 00\);_(*23 ;_(@_)  20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L渷 % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  Lմ % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23ږ % 60% - Accent3M( 60% - Accent3 23כ % 60% - Accent4M, 60% - Accent4 23 % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23 % "Accent1AAccent1 O % #Accent2A!Accent2 PM % $Accent3A%Accent3 Y % %Accent4A)Accent4 d % &Accent5A-Accent5 K % 'Accent6A1Accent6  F %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 I}%O2 Heading 2G Heading 2 I}%?3 Heading 3G Heading 3 I}%234 Heading 49 Heading 4 I}% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  e%3Normal % 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title I}% <TotalMTotal %OO= Warning Text? Warning Text %XTableStyleMedium2PivotStyleLight168dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\`;Sheet1<Sheet2>Sheet38# PK!pO[Content_Types].xmlj0Eжr(΢]yl#!MB;.n̨̽\A1&ҫ QWKvUbOX#&1`RT9<l#$>r `С-;c=1gހbFӳ Z't4ʥ9g4r PVV1ZWk ~Ȱ)RˌqUTP \@c1jl_2ZZ=%ؙgBYҖ  np(VV7;_xztF_PK4*o}/|o?/ԅOhB$zL.)O92711fd׈B\%fu=-u q,h~'s6.'“E+ wy>N*l5xf0*(3Bj=ԋ1 |szֆdB^!&3RqVHh j/NDNp܀a9^ LGq4)<௓G6lHY#̹~;ib?gPpU?~gƺt?KD(5iU Bp~K6İ 0G M_b_5׋2rC&߇e/:ܿxh*s~$폤I{]/>U[Փ[9elI[&F0c*)nY u' l TgoZH$sёD7õ5N ʞObCbugvxKR*2Bіp]e[r(kjiL3i+]!6'yy ф-Dy. j8aFf:6GEZLn3E23H]Q$#[ yEm-]'IuE>$KE.#Kd)f;@!κ1 R/1*T–l|NM/q8@&`0`dlCXoˁ6[;P G?d>'rǜJB1ghCu?3*0~ =m'k4e1Vhn<9oni[r-+z=[@#)݀ s` nF6;ZR^CQ/ȹo{0moNiHł%S}WkkrAsef͞s&JݰINw缃1Yw>)͆ib=Xv^#j*9KA'o4KeǛ8bc,7D-D/~ ܊- x Mvp ';hIͷN:jb};R`kˮܜ^`bmֆ2{Eah^dLbwk_|=/LISL>Խ?PK! ѐ'theme/theme/_rels/themeManager.xml.relsM 0wooӺ&݈Э5 6?$Q ,.aic21h:qm@RN;d`o7gK(M&$R(.1r'JЊT8V"AȻHu}|$b{P8g/]QAsم(#L[PK-!pO[Content_Types].xmlPK-!֧6 -_rels/.relsPK-!kytheme/theme/themeManager.xmlPK-!theme/theme/theme1.xmlPK-! ѐ' theme/theme/_rels/themeManager.xml.relsPK] #i ;N<  dMbP?_*+%,",D3333333?333333?U } D,,,~ ?~ @~ @ f(>@ggD #i v=  dMbP?_*+%,",333333?333333?U } >@ggD #i >  dMbP?_*+%,",333333?333333?U } >@ggD   Oh+'0@Hd 'Marshall, JonathanMicrosoft Office UserMicrosoft Macintosh Excel@̖Kl@G܊ ՜.+,0HP X`hp x ' Sheet1Sheet2Sheet3  WorksheetsCompObjp F$Microsoft Excel 97 - 2004 WorksheetBiff8Excel.Sheet.89qreadxl/tests/testthat/sheets/utf8-sheet-names.xlsx0000644000176200001440000007641313172305601022054 0ustar liggesusersPK!L[Content_Types].xml (Tn0W?DVCUU$8Hƛ%-hDC\b%띙̎=:ZCetʆɀEs#.S>{X^h)j!ek@6ɮƳ[c*=WLM¸Fxzu%"h0}#bQiE7JE}-Uʄʅ'lJM/]|U/̓~) 4!} ZBb: koѯkK>-TZ ց5vzm>v uQ`,T1c)sxt6!5r>D4OH鿽x[t:a B{'H}Ggk8:wa PK!}T  _rels/.rels (MN0H} PnRwLibv!=ECU=͛f0={E tJFkZ$H6zLQl,(M?peKc<\ٻ`0chGaC|Uw<ԀjɶJ@ت` %TKhC& Ig/P|^{-Ƀ!x4$<z?GO)8.t;9,WjfgQ#)Sx|'KY}PK!Gxl/_rels/workbook.xml.rels (j0{-ȹBmB^[&$}EBS{1=,z5#u)(:ε v7 u*`S]__לHe+)X4e>KAsAnQy 4Lm} b7wo7:P!9qa ԱEVpG( wK2}Z :b1]xJ1`%a>}ܓEu,a)6#Ͼ PK!iԶ1xl/workbook.xmlRKn0cʪm M@QAjd&9IUʶ^Qz$uMp>|3d5;|>K8no_֜(]) :#~^}u{F.伎T V6(S2w"4djhHd%ԎO * Uk ăn/J14_{Ù!~,u2 rg6Zm2YrQ%yY)#' ۺs9'd- FcHРԝ.\kWbyݘes. ULOwuIV5|j8i7MmG(_Ör>>IizRJE" f|,g jU]RsEFz{ǀU)bZ;+g}.2o.Wk"FÑQڋ'PK!L}5 xl/styles.xmlRMO0 #!$M 5[.RT;mzv_Kk;~~;lRN'Rnؔc{"F]@(W7ES`*喨}Q*mu- !zMF66)SQymQVE؄c*ҷi}M ѨsPe@p+G%Yu9P& v^Z>⾩i G2_|/oOiwR'jfL%F*qOJZIg"+ K n-ᏣśGνY>>k_r}=>ؿPK!{֩xl/theme/theme1.xmlYMoE#F{oc'NGuرhF[x=N3' G$$DA\q@@VR~MԿ;3x8!zgkf㘡C"$I#^$!d:W$N4 w߹7TDb>DJKK2e,$nE<@#Jem)4 Pc`{w8!A=2̙<&JꅐfM T5BNd tY#9~#*@ K/AKחFF]et`~!کկm Y\n?aZ]'2Gc"ry Ǹ8E/ԡnޙ`5xsѵɷrΚ\xpK*y7NF~b\c|‰8'VD5N(B<=. |z]ң}'D;4L|6CGM|VoC Gao±eǬXE>%qm #8j>-~ ..R(zys^FnVԇ$*cߓqrB3's}'g7{t4Mf,t,Q;7ɛ1Ѝmmƍ` F$vNyad@}m }w^-/m z<}%s7CXWM->Y°t`Qә")Mi?F$@3ɌHK8ۙe/o}'U}f@bvyE/G9#sh [1/"ZXZըfZ#0b8k,ބ] xy Z4M0#w;(5!ʬDx@l7&vy ;H)Okള0i1?tr`d]v%b :j8mC88IolW;6kϬESSEÜq8RmcWYX%YWk:.beRB톖 $T`Vc XэGbCڞp` Z?My֬Ӕ ήcF8&%8 7V`Jm^ݍq7EWeRN)zie#EHk#BEPѰ#`A,SphStq"A%}g0fDzd#Q%uejCzRt s \oN)F{b:P3,!gdbKU z=uAYk;֌˫rYaϤpg?0jCoEAV_] 2H7HhIv>kj!f.6Q8/ٙ_۵Ȟ.QXQ݈B~$“tO$ɤ6F#YOG [BkFE6hM \\ I,&.(dh&1oYYG;&kŕ{%e (w䳨A񍁺]y 7x5R`8tMc3ݤPK!VۘJexl/worksheets/sheet2.xmlTn0?<ehA btI5d;lh.A˼yoW+KJlU珛K|-T<߿+}!X_>2/{0/pK':#-.&'r93BY>#-uJ5р 3- ȷBQZz*>:[e]%zB)d4gF;N4duMf @Y2SeJֱalE[RA۪j#gVV"bAWu^Wq?>*l+ >ǃNALg hM@+*3fgĺcg6Tzj"RB'F+]h.< 9eF5풏T/l9;FW%e>MbNx7j{RGCOT:Gb"*krtW^irgn=/ $A\1·=N9s.y*hd i.5:uicK$:Oߥ"N PK!NFRuxl/worksheets/sheet1.xmlTMo0 0t8ɰ0AbZ4h,t,T=v?JNݡH#l4X"n?\,t4`%^ r9t1 +EՁa=8Ң<dɗJĄP``j &F+U?B3DzWb8:Zy R)ThȬ*w Ɏɳ&Jv,>LEjhV"U>_m5:HIaWeY|X]X/?>j؇ (Y"딘o Q*#l^rM9R*_MYU-l<:Nh`A:bKI*=3&zjQ,R*:X-|9Fo OyXc&㝻AU;|;:%t^zCq}^Vv!32Id F"b rHcnqSlrsO[ۥr8(Hv~\J{(7-6,;{`ˢA8iH93}~è~PK !rH[[docProps/thumbnail.jpegJFIFHHtExifMM*>F(iNHH8Photoshop 3.08BIM8BIM%ُ B~ICC_PROFILEappl mntrRGB XYZ   acspAPPLappl-appl descodscmxlcprt8wtptrXYZ0gXYZDbXYZXrTRClchad|,bTRClgTRCldescGeneric RGB ProfileGeneric RGB Profilemluc skSK(xhrHR(caES$ptBR&ukUA*frFU(Vaeobecn RGB profilGeneri ki RGB profilPerfil RGB genricPerfil RGB Genrico030;L=89 ?@>D09; RGBProfil gnrique RVBu( RGB r_icϏProfilo RGB genericoGenerisk RGB-profil| RGB \ |Obecn RGB profil RGB Allgemeines RGB-Profilltalnos RGB profilfn RGB cϏeNN, RGB 000000Profil RGB generic  RGBPerfil RGB genricoAlgemeen RGB-profielB#D%L RGB 1H'DGenel RGB ProfiliYleinen RGB-profiiliUniwersalny profil RGB1I89 ?@>D8;L RGBEDA *91JA RGB 'D9'EGeneric RGB ProfileGenerel RGB-beskrivelsetextCopyright 2007 Apple Inc., all rights reserved.XYZ RXYZ tM=XYZ Zus4XYZ (6curvsf32 B&l }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzCC ?lgផgãN< kOjrxk^ZFSkk+OPEW៿:8$Oiꫥ'{'me뗋Mu9q_*բs웯+? }7 Go <44 - \S(_&h+(_&h+?%|uJ&ه$IyuEExx>"hX> K>ŗś.pSm}aׂW1|N)USj+])Z{8>Zn-NZ~…QBf7+;C/4?@ sfǮ!_x*gj{@.{)+Ok,[#Co'Q/F*1g압m+jm{ae)ЄܤY6kՊ[+]…QBf7+?B(3C^ȔCR^2xg+_OQ rP+Ğ/|?%8!&6i/? G}[`(R*9(vI_Xݦf\iY&q+T7])/MtZE |7W¿{š̾9qK^mKe/tfMKMеO ͞N+;d*RkrMY5f4NB2VO'ty=zG(_&h+ zo"PxSW/>5|[υy}IqqZIXv2V-[FT&H{)b8aI%)VoWvvNRxL[n1t\ߚڻ^+ocB(3C^ȕt(_&h+>,?g֞3WP~-|mN/tsς$|E|#ϋz֋skSn"Э u;J J9(ө5M7T iNOk7sRTsEܡ6rQsk*~Zٽ/o?Eυ5o _ vp_fҎYt5F['-dlI~ث|7[StݚS4{Ei{'(_&h+4P ?LW%x?^Ѿ%Ҵ qoZ :`76q[L-qsxtY+)-J1tq2i7Sox޴kkGjsԔ|,Sj2e$$٤P ?LW%s G  D |_h:k\}#LtO4%$E%`N*IO3|YxgC~>%Aо56AE֣1ߍt,h|sf/&YKݥ䔂u,2IJiJU}Z^vMs GkRotd]hݮ#ᛟCn-gχ{Tfᖕ%j - jEkFQr"W4RowʶiYwOY3oQ!HQ!|LsPu~3,ǖ6|:sidN-ď3kH1$JѢ"qe2j:I:^ք#ohb)T9wwUHnkEJ^e#i_CM\񭽥_XV^vꚝvA\B(F*CTe(ߖR|~2n;}h΍<7*4HGjTDPQuЪ `*F;Q!|M/h??o&~ F7Xk( )s;̥|Kn!Mjnm=no~rZ}cRE{TԵ|^wy%=Q!Aa(W) ay7j6Yjv3ťγ-ʹ3E4KXiM[m՚{1)\3BIMŸ O)s>>t#SY(̓bf)R)=&F1bE$o뾬EJ^Ԍ?EJ^~3|gR|ycqhN$~mԗ~  B$o1D1(,պnK\SR)ޓ|7}RmY-wg=76<,?EJ^[Y&UѼ n ] A`/T:^O#dmEQz#JoN-\+6TFJm]z UUNJX{?5Z2T|EԿnSV}ύ &W}o}/C⛭bv Mw~憀H55W? Dg_hh_] Mw~憀2DzŭxjO +2[ ]^Gn, R 8]˧jmq5p"s7r?@/ZQ>E,#՝,oLJ,t(AЉ¿ B&? C@$ + k"k344AЉ¿ B&? C@^,x/ZyLxngfDL&n[y2:H55W? Dg_hh_] Mw~憀H55W? Dg_hhuqGwoQzc f榌kcBұRBrw$ + k"k344AЉ¿ B&? C@$ + k"k344uj^<6p]i$Pܑ[Xi\ 2@!QvWᏇ5Yv:> ݱFTQfz:2 pA]WT)%t[{5huXn2$ֺ5K]>U<]uw*>xK?g4|3|[iXAluoTN5EK{]3J]Jњ{*tUMrQ~M^J0MrwoTU^:"ԥֺ[⓵nwψRKAvgM^VPo#p>^,5xTm][qhIƤ\ZMovO|!A?9{O|!A? ???=@'hxZQChg ~> 2b}'|+"ХmWþ[qzIώKh`MxMX FZ\U3Fه\:O|!A? ???=@'hCGKS^-gV'2n}JyuCO{O|!A? ???=@o ?ʚGo-3 x_ÚH[t:r=@'hCO{<ύ֡$/$X̨;1'AҗDδ*6)$~熼E/'x↓[PGx3^ 6-S/KK֛zsw.#)CORQTNNMV/(|Szߖ<6Q>ZͬJyDҐƞ(G,ABp3\aTP@P@g?X'( (8'G+?Pg@P@q ??ը (<(kA5~>񗁼3-N}}/ MA>c[;yqh D*stV1Tinn˻WӜ''wiSO|5o ~Z>/]x{ޟ]ZnFkef 5ޅs]7rk},aqiϨwުK'+j*0iBnK^ݗ͜|^!PNMM9JS-ݳzW庵>jZl۬5K(2cÅkXM)+;A'o/z_\Ҍ7WOpW+~W/3 Eor?^O7@+~{޷9?t_g'O|; u+K)U^"b\q@g+~{޷9?t_g'?z t½[nW/3'xGxk |.Qpgݽ|yKwPY Eor?^O7@+~{޷9?t_g'?z t[`Υ#\;6),1wʀut_g'?z t½[nW/3 Eor?^O7@[MOEs֦fHc3( 28?>x{]߀<-qៈIiiasKc6"{.72G^b{mVX{.juU,v<|F7J3Kם_O/=.||Jm3ൖ Gÿҭ|exWm [/ݖ<Μw3naUVϑT/f̭&)i{K*ҏ=;~ ьyWj-/{ߍmRѣMkorڶ"8'lι!Uq\ϖE+;7V>EKLc\8T'G'weҿI?oC.O@weҿI W ?}7J'o;2_$gx]+9/x9A2(D6"Մ?yڬ4gx]+˥t?oC.O@weҿI W ?}rZeO|V1g]3iwUO?1M[ u7J'o;2_$gx]+˥t?oC.O@a?,!F'˳? t ٘6F W ?}7J'o;2_$gx]+˥t.៏_g_ kmqzG$ ƒf+<᱊~@?ihf dYn$ $X5UE&1m&Jϵd^0JMG 9%I_ijch~/|3_KO>5 |_e௄v8b jj^ֳxOH,9j3ZjjN 3[*j8YEViTqsOmɽ%,B9TZ62i\c~Y6[>?5-?V1isK,5[)harƒ+pFqtq1J>ʤo䛺\jVrIݜ'ʻ&E$)O Ћw'P E(?"IAny? O<x[i?r9?k$ð j~""Qq-U]&G!h1MJ? O<x[i?rH78e6]7o=:-odž?\i~ƕ֚%t e _\TJxҖHѧNmgRyp.;PJS/g*&%8ےT-5̥~m3߄$h(SLݼ;eVG2l=⏏5xY,Gĺ65OMqoHg*|ID(BIݻ))ԓ#{|اRӏI7+Umƚ]l~מ+(KЬ ':Ξr~9fΫSpA_AP_AP_AP-|M?3@~Ta}@~Ta}@~Ta}@f&1o?* ?*0 ?*0 ?*<@$syW ?*0 ?*0 ?*06Uȡ?>~|9]Kğm='NN3NKy v:nK :?3˶H`#UE2#*XFS 9;uJRNw{rNrruqɶ1E]Ƨ,R蒊[%f}j˯CL|ZZG xS➡h#?u_:>#(u?G>=)Ԑz. Wt3 Z2(&5Q9')r^ >w(Nџsӧk+|1?xvĚ>*iSi[|]XjPbŷQ)c@@6_ORq,"RN-QF]u; )*JxDeSIMI=cvCğ:=rA FOU7 x®ѿcCǿvCğ:=o$/h]'{@~w R l{X@:*D6qe<4$ҳ#uo$/h]'{@*??t<{?Wh1Iá^ FOU7 xi <_cAT|0"|Hw5='Ds;%|_6B_*??t<{?Wh1Iá^ FOU7 x®ѿcCǿvCğ:=r}"/. jZ;#ڜM&ڻ2KvG)]'{@*??t<{?Wh1Iá^ FOU7 x®ѿcCǿý'No\Ii}f8o"xPⲙ.o5.b)!2#)"?~|z¾'uimO}dwWk ('eM8Ejx+.g[dɥfXgSuJW+tUml|+ǽӴ_ |6~4j$tS0X\w8Gɿ%N5/oKʣ$Oj/^E{I}]Ts=*q_Yv#,[7v}~šn%M:^Xl|wIMىd𼯖+>W*TglV+søQUIɺI8>ڗ?&Wx%%Zv5۔v| 5^|@I#<#Mcy?)kAOXG xG/h!&>+ xX\ 3vmU12 DZrUŀ:#<#Mcy?)kAOXG xG/h> S?$?{@&|p S?$?{@&< 5^|@I#<#Mc!g{bKAMlܥp 2ɬrGxElF~c<CO¿]7-/.L5_XhOR}K֯ic|+MXe^PX5U凜niӖ87VJ7fUz+\Z񥦟qIgh <qZ~$Z]C?F %i;2jK譧(T2Ƥo9(s*~{;+Jk]q9T&tnS.is6~ŏkԴ:mM__x9=Ra,ijNXE+uڍ+T!,M4ߒvc5fOZ)y?eh߫fv>U߇{\ FB??J5_Q}{QЏW~j#/hU߇{@I#Ou͉g*+x7ĎV[A!ni7kKw/w?#(GG^ FB??J5_Q}{QЏW~j#/h|I!o#hu=a'm|9XLInjlF۹QЏW~j#/hU߇{@%(=?(GG^|Wsǖx?VqMm3 ,F4Z}Feu)%uNf$OG? go\9\xJIm>Wt#kɣϦ[ë躅Zd9ky}^wOgVu%M7B޷iK]*P~hSIޢQڮ[O'OX|O|[xgrjWLڏn3M\ogf徟{erY&kTr߻Sw%1үBЧДvݒջLɤl5t'^Hh2i x?M#aɤl4u4 NC&#_xRpE74ܣĭ_$0/Zd7y%& (fcxR}0]}|?_ˠb<oooo+̺_NXzUc*NKͦnn-[Z~&< ? ? |xu=;lomu6c-O KW )AS?KxS>/§R–|_N(-O KP [Ÿ:?#*u/9@~xf@k,5covDhCS#uy HrYu?)AS?KxS>/§R–|_N(-O KP [Ÿ:?#*u/9@2mbe&3]myYCWO)X/§R|OM'׍;k=ŇuRW6$6R,H&ks@l $K/[<:u!gNrMRN7~*<]+뻲fsԎ!Η+ݛ練^~%>!|ÍS[KsῆxOh"Ag('d_]cBqI5tI6&Vgѿd5+\Ok_"d5+\Ok_"d5+\Ok_"d5+\#k_@mG跲8q=XJw*drUIb 0]Ok_"d5+\Ok_"d5+\Ok_"d5+\#ZŁ5 ƙ_9E1$GddĞa.&;:x^.h'?5_x^.h'?5_x^.h'?5_9vƣ~jiNETG˙PdVzVBU@e`<׆E˚> xkW<׆E˚> xkW<׆E˚> xkW>m%gƽմ mšٸFy"oH}Vdp8SV<3O>/|K iSD^!wicAQxJ -c:ٽha2]4RnNp-*Տ=T\IJz.Z~{2,_>/):ͺWE-jv44ohx{XC}ZxK~u[]B !=/M:O\fTk{kX_FΪn7&ӽZjZ?K|[ S_ |񖍦oXgU?koc,s޿H DLHdbXכ*t),E9=ZZ7}-s5*)%tJ.kTrvSIu|A`n"|9˚?%?Es4KЋ .h\\ .B/?7ß]s_o?s@C?볨DDx|!/=Y@W1ݥ,Y:Iu|A"|9˚?%?Es4KЋ .h\\ .B/?7ßKL1\z뼚gC/ֵ6UG`5]VB׆ost4Q쑤M!.Y*U9ef_im}5ZP2uisG8vvmtџ!5_٧Yǟ<%A/ǿ |q߽φq {Ƒ߅5=wM_OХ5k)Ռ ]J ZQ(6ygEYIIGE<Ʃ OF2d%(ɽTRM?ceV_ |KG932[Me6oi[Ge ݴS]xA "ו<=xIЩxN8*9I+I^MJR}g_X Iun<C.Kt _7@,ˤR?`x+]' _2?nX Itx>-.)'(*|GKcaH$SUu<C.Kt _7@,ˤR?`x+]' _2?nX Iti9xŗ -,C>TCr]UNÖ̌u@o,ˤR?`x+]' _2?nX ItW O/e)rZ|!/4~";mOYy\,Fs`4udP[ _2?nX ItW O/e)<C.Kt _7@}ce;OiS[c $h]؅QIxz}Đk-OᘼG'cCOem̭yd#_ToZVwӿQI{5O־>'yߋV׵7)oPE_EHi> w<y?BGOO4-/QK_]JtU*5#R(^q/uB.2[͵Oo{Xsޛe*w\$~워o+p!+M"XxxdҥΟ+Re-<[ro-w[(vw{=%-7_=bq%0ؿ_hؿ_hؿ_hؿ_hؿ_hؿ_h /#Q_uZ/Z6/Z6/Z6/Z6/Z6/Zt_McexGz~]ؿ_hؿ_hؿ_hؿ_hؿ_hؿ_h/$FBƫ(ؿ_hؿ_hؿ_hؿ_hؿ_hؿ_h1 U 3 >Nzg?$8mXk5kKK[{ x"EbT("*]ߢe\48IKBR6ۂmVn|?7+1U(ƬIM蒚I.}# o>&A&_\7ז˓x ~|O}Bω4-n[[\Dבnh&1K:xL (FQq|}5qq2c,EyEפeVm4M9[k~/—Z_./—Z?`Ku|{Cֿ:X>=R_@,)uN׍[PDG^(#K+KP##c/#fb/,)uNw'P ǿ; ]k_./—Z?`KuD:K,/,,i4]e!䤲 ,^dZ0O1ۀ%_./—Z?`Ku|{Cֿ:X>=R_@,)uN^7He^*[vwC=R_@,)uNw'P^7w/EݥO ֿͭ\[C")'RUIPK!dGmdocProps/core.xml (_K0C{"@e@p2-$w[X$ۛ[s/\R,XѨ%QPBJ^w(*NFA:hQ]_Lx1%Lh&[ImʋH찦@w8QC= لԟaAr'Q )t;gs6hdl6j!ϟP5TfTO{* <5ԺV.ܗ|82V9+qDU'ygad)>>x!O1II9 |AoPK!D/docProps/app.xml (n0 `@VQzXI3+ӱP[DHvi/أI&H⬇DS]&0\d/aȈx#+ZE0ER GBJ25@TvR4n*kƛyct%Poқ78R[={0ֱ:lT\y:Wri!T$;~}+xѡa3"{D `o!nqO>PȤd2N~sc`Isčk"F)ۑSl_ }aZLP? .m76}e nПxr>7AStPK-!L[Content_Types].xmlPK-!}T  y_rels/.relsPK-!Gexl/_rels/workbook.xml.relsPK-!iԶ1xl/workbook.xmlPK-!L}5 xl/styles.xmlPK-! Dx? xl/sharedStrings.xmlPK-!{֩. xl/theme/theme1.xmlPK-!VۘJe[xl/worksheets/sheet2.xmlPK-!NFRuxl/worksheets/sheet1.xmlPK- !rH[[cdocProps/thumbnail.jpegPK-!dGmtdocProps/core.xmlPK-!D/wdocProps/app.xmlPK yreadxl/tests/testthat/sheets/texty-dates-xlsx.xlsx0000644000176200001440000002044413336631200022216 0ustar liggesusersPK!B;>Y[Content_Types].xml (MN0H!%nY v*Q`Icձ-ϴgPM~}d2۶6@D])Hd*[mߊ I9wPM//&]X QZxUķq)Vj z4wrU׻'[= &$շ774OH"xR㳔dNҨ9ɨAw(7e(3O ރhm| sD"$4DSOUNh9.)k0՚0!!iɹS]٬ `2K9Gyvq/PK!?*/xl/workbook.xmlT]o0}x`H*͇imm`Y]m/^u|9/;)XUcꊫC|3߳X៘/6;=Pk !Kk& SPk#m #sRh2I$\#Bfނ{NJV2Fq@ּg4I'ojĎ NImJv&gd_AKNz. $_NP- v;Dd=A[WܱSHal]|0_nj"-r ԃ+ʀ5X}f[n8kS%4#;{M\F>!Ɣ:!c rБ& a3}kBaBQ0r->S2}ROJAa N!;;^1}`P;C0٣-ce>_WnQM!0 bA2DP_ [V5,^BǃY>ZW氂NϧiIp\xjIg69 qv~#xn+ɁGt:4_pMx J6qH֓ L(H&J2p=rۨJB(ٙ첅vm9,g`(#:QPK! әxl/sharedStrings.xml4A 0T" B;fR3S.?v4 qȣ; <939@+~YLQR&/uy䒂Ve)4xh#LWr|t[ު[kPK!$0xl/theme/theme1.xmlYKo7 XO6",9mİ9R1w )ۺ(譇^)EՊgw y)"D'4tI3N4#2z'JIFr wTbkmM0}^ȰW1YK>[kjkyrg1 jyk8֬GaI]#L@u"'gCr"İTOp oDL]@ OIW$' 3I݊0~g8aVgkQy: ʻWkZ>\y7KY,SFmd|{xzPh~ Jd |@7Tޥ\]k~Ȱ9Rq ^ÌEt8kڠքeZZECmb2A2Ps9SUJrVףxKo+/?{t/].'_R_6v߽7o_֙4+;CY~*6 ]Qt^,^^L٥=]~P5Xv9Duy4Ca{Gлp[0eVKf8ƻFw$W{Ն)#* U2Mz]bd,%JWwNwZҤxgm=cS LTM DM)){$x< .bAa&?D?6uT(Qrƙ=x,D1JI!pL#^ VheTe.VU 2i<)Kd#VTFZ`SpsSbQHzJ|6,7h 13f6fQ%q %'r=JUUpꬲ|COfA ŕFA%fA85\_R0 0D܄g`wdl(Z@@y}!i F 0jr&w%%DA%VqvVNΕJSVI}e2K /3E0P up{:9x9tkauI][ߐ^V zh .M~I7y]#rW~slj" RkCy'oLZO"B[L(iEneOOdvVٓ"ŧkwBz_hj]Nd&|\MGoQÚ 6 elODE|~PK!tƏxl/worksheets/sheet1.xml[o0';X~onQHaҴ8'jgOcЮ6s~sǮ%;PZ~I z.+oŜmX_Vx.KC%m0Լ@Z\MrN]&Q=LÐu-8$vQ2F zu\vQVRnK~'lxWR }s^IE^ (:nRJ"w&`{hOR>X;܊E2nnm<"ze“N?k׷OLíl4(QAͶy\>ƠeUh ĥeBO:a}Z^'i:)lгm)[md75R=M#k媲b{Cbz`v 9*7s-"ƮQ"֝-n[Ij=+q8gt7KNZ/omm lGtEdHmsGۗΟ뎶/qv?W| lڈ^j73J(w#;3'r\5x> vH-v R <ZA*04Kv5{mZ|OwpPK!LNfdocProps/core.xml (QO0Mn D͞\4qƷlВ-!f>x{rM塮/0Vj8"(ŵjf.P`SUZA`ѲxC6ltI')Kys =FޡXjS3G l8!dkpL0p NHGdi 8 jP8ׁ 2qw|GضmԦ} ?oǗj(Uw+spno\Jwb-V.x*K!Z04zha |*:t8+fċa<$ !4%]_]>q!3:K(_gPK!}VFdocProps/app.xml (Mo0  9: bH7bvgNc$Wvڍ/^>+zLdrQ J<~\|1\X#?M ["[xDWRiZϝ&8i/CX7Y[Content_Types].xmlPK-!P|NL _rels/.relsPK-!nxl/_rels/workbook.xml.relsPK-!?*/xl/workbook.xmlPK-! ә xl/sharedStrings.xmlPK-!$0c xl/theme/theme1.xmlPK-!m xl/styles.xmlPK-!tƏ~xl/worksheets/sheet1.xmlPK-!LNfCdocProps/core.xmlPK-!}VFdocProps/app.xmlPK readxl/tests/testthat/sheets/names-need-repair-xlsx.xlsx0000644000176200001440000002102313406366260023242 0ustar liggesusersPK!bh^[Content_Types].xml (N0EHC-Jܲ@5*Q>ēƪc[iiBj7{2hnmƻR U^7/%rZY@1__fqR4DAJh>Vƹ Z9NV8ʩji){^-I"{v^P!XS)bRrKs(3`c07M4ZƐk+|\|z(P6h_-[@!Pk2n}?L %ddN"m,ǞDO97*~ɸ8Oc|nEB!$};{[2PK!U0#L _rels/.rels (MO0 HݐBKwAH!T~I$ݿ'TG~xl/_rels/workbook.xml.rels (RMK0 0wvt/"Uɴ)&!3~*]XK/oyv5+zl;obG s>,8(%"D҆4j0u2jsMY˴S쭂 )fCy I< y!+EfMyk K5=|t G)s墙UtB),fPK!\e1Kxl/workbook.xmlU]o8}_N S ]Ei>0 `jDQ^0ڇlcc_{55lӠ}+ߤ旫TH{TX^fԐ $ˆvD`舂ArTTu-rl;@a9#$-YIs^ "hKЗ ֕o눸׬e~5Loz.u no< WGu\Z4Ig!8ې<$9<;Y' ۿAZV;7\jүt 2 Ng5HUTL*5C=}6!!Y Vh}0*ZUW Az%c**z txW57ao 7.鏑 _%eBQ165 ΣbCC8+V5D$z"W6`I 3eHHQ^(ay A@ ձ!?h9EYVzeoeuh/D9^c9,l'#?K/S{/H8|c}_p?J5鄁7IMqϤ,5b7+\V 3;VEdzBiz5F?g}bu "g O[-AFvzI zPzgڱgم[^;V乎r"/2o''wFlPWuuF$(ivx>%Qf@2b v, PƠbˉ^$gNv^:~NssRқN cr2]1UꊫM> #먪Њex,߿K e!P6[!2In/6:ؚ a$)+< ,d? J- =F\o6t-jMhhjbԙc"V pk^tdNhyF!E ;J 1lǽ|8OkEn1oYsSOIZhHGQɆ[*p﬩b?sڇ8ɡ>x!.ĉU #OA>nj*`Ӿ &m1tZ &܏+O5| s~Vn—2 (dB h_>G^ U кq€Yu^^ߜSDj tU) iCdl?x:`a`Ey0_q0 `r͒`,WA2]V<_ ׿. x$̡Cg_G~?@{}OÏIu)uI]R$#+DxqWG lR9*AoPK!N xl/theme/theme1.xmlY͋7? sw5%l$dQV32%9R(Bo=@ $'#$lJZv G~ztҽzG ’_P=ؘ$Ӗk8(4|OHe n ,K۟~rmDlI9*f8&H#ޘ+R#^bP{}2!# J{O1B (W%òBR!a1;{(~h%/V&DYCn2L`|Xsj Z{_\Zҧh4:na PաWU_]נT E A)>\Çfgנ_[K^PkPDIr.jwd A)Q RSLX"7Z2>R$I O(9%o&`T) JU>#02]`XRxbL+7 /={=_*Kn%SSՏ__7'Ŀ˗:/}}O!c&a?0BĒ@v^[ uXsXa3W"`J+U`ek)r+emgoqx(ߤDJ]8TzM5)0IYgz|]p+~o`_=|j QkekZAj|&O3!ŻBw}ь0Q'j"5,ܔ#-q&?'2ڏ ZCeLTx3&cu+ЭNxNg x)\CJZ=ޭ~TwY(aLfQuQ_B^g^ٙXtXPꗡZFq 0mxEAAfc ΙFz3Pb/3 tSٺqyjuiE-#t00,;͖Yƺ2Obr3kE"'&&S;nj*#4kx#[SvInwaD:\N1{-_- 4m+W>Z@+qt;x2#iQNSp$½:7XX/+r1w`h׼9#:Pvd5O+Oٚ.<O7sig*t; CԲ*nN-rk.yJ}0-2MYNÊQ۴3, O6muF8='?ȝZu@,Jܼfwq[մM((kUuxk6uPT=MZpPK!ԺEGxl/sharedStrings.xmldMN0HQvԡv8`Hxf&=FYTJ[85eS>qIyLǃa$l#MUmm`"ͧz*P$!*gCLJքNqlqtM$ͬy|Gv[`hF+2IaŜ߄u$U{nb@B,: kTf)Y$ ge4]Л.PP &B(s|5oPK!^YdocProps/app.xml (Mo0  9mQ bHWbvgNc$Ovڍ/^>+zLdrQ J<.?| .xIOjB*2ǕdZs i4}0ozWey+k/PL״fࣗ1f`ίO֤@ - :%29hޒ.jk: 8B%? aXl"z^h8쯼+Q=$ 3 1v8!RȤdL1k籽Qs`09βCl ?sap4s7>9O{wy^TN>cdrɺ]wc8vQ^_g5%?ZPK-!bh^[Content_Types].xmlPK-!U0#L _rels/.relsPK-!>xl/_rels/workbook.xml.relsPK-!\e1Kxl/workbook.xmlPK-!XR g xl/styles.xmlPK-!N 7xl/theme/theme1.xmlPK-!Edxl/worksheets/sheet1.xmlPK-!ԺEGPxl/sharedStrings.xmlPK-!XiDDg<docProps/core.xmlPK-!^YdocProps/app.xmlPK }readxl/tests/testthat/sheets/iris-google-doc.xlsx0000644000176200001440000001573413067126266021754 0ustar liggesusersPKwFxl/worksheets/sheet1.xml[S#9]&qMmlnb0ݗkK'޺8$)}:$7?>_|OKs5\^l^vO/o/_~ʗq{^9\|oOçv}}޼Z>fCޮ^.|û};v><=lV/ϗ7I_o~W>=w݇nM'כ7Amzm߿|'==?xu~/w?Y3N_n|nr]@Mkkp~Ӷ50ݼOon~}.ngy ?_x|Xy>xt?Rx}Wfv}?~z~n$={ ןOt{nt.nt.!|8y%R7R%]KG.!D&]K!}NNN']&]j. (W/']KݤKt =4OD|0nҥJT@K#L'.Iݤ˕tI'Ù{I9r7r%]Fg$ H:%I't.#OFO. eg$Ds&]ˎ v\0=ʎGt.9Jd$^f\ܔH: M\It '7Wn㍹t.h䰖#%e&]ˉGIr^fz4sݤ%:$Ie.w.We$^ftr5St_7J%]}:9)DJANWe&]+H:9Y;bnҕJIWtҔ(H:uòtpOWeAO' NN/K7J%]+G^NMRIW X \tTzYI4$\.ӕnҕJ t%qhXIW*JIQ2Lft4pH:Üttfh#m8P]ێ!4v]Cuk{`!Aԥ=:ږ^e9e}:s+>mz?}j+eKC$)ttSI8+j> T !^>GX;d7·ֹo}*5%dV }*ܘJ綨dOTYPJ$51Њtخ\ 'p3QkeVvCIcHbZlz8f4Wfe74,'OP %UnJN]PRx(9Q}eVvCI]2,tI7Wy$l,Ua1x|^6>ʄLTbPҤs)Xfe74ya$`s)~JeY RR6n${+lJMfg1P@eBEJ*XoULThP"T=MkXF^e4uZfe%,{c()*$v!lʵQEͷ-?|^5[fe7~!lϻx^dS/i"OE{KNoPFFpQ$6.6RRI&n(iK]{+#*hS)b,RRg]1v]fe7H9cl/9QeNvS8JGɕ|^DuY %݂^TRR% 3/JB!4mm˒leDe&*n( X(eS/ L{P^s^D՗Y %%?Pj?gcDe52+,7c|̕a3+CJ*W䂗3+ I‹QIFG)OɦqeK"%Ue'Mv 3') cy.ZـֿEFLj]|PKj3PKwF!xl/drawings/worksheetdrawing1.xmlAN0ph D0ؓc[3.moEɾkpr~H44󾇎.eϏtZ1997R8W'E'}ҡ|e0F'FBsڢ, ^Ѽ"N=Q {Ac ihM`i̔X/ԇf7?$0l6|[%."`PK`(PKwFxl/sharedStrings.xmluJ1wsw*EAA9d݁$ffEh/||`< <O&ivGA/] GYoETV3+=i 1~b$ -saM𤲭 ݍ2iben@dysT4QJyh(s,3T(lpى6%Z%|vߤ V>YW뽭Le=g pe^K8[*"˜GRs+ bŻD(VD--oŮI:tbiThfK&8<0j5u[A;(9Riuld8Ě hU.6 ΂.W^V?QQENQPPKZPKwFxl/workbook.xmln0 `PmXEeea{4"N8tgJ[ q)%vסZd/zxB|.6"Q.x(Hʧ_C=Nɥ$]*Z>#tDp*=նB:@b- mP1BOfȆ-t&L[sXLט-r~ΞIYJO$qk9w0^[*q7ȼB^hnY-O޼fbGktD)PKս:PKwFxl/_rels/workbook.xml.relsN0 w|iZ˄+&Q $`&aȎ_}Չ21hzP,16FXH`^$=jӄ\Dt1O(̽Nhؓ^ hLsέ@DaǮ,m=NBf܋;.`=E*TЗe<ҹWW5b>'_|ŶPK)l:5PKwF _rels/.relsA0xfRpa1&l C!@iR ~yba +r`h= QZ-'(`u)/8ɘnB?b>Fw<g2rhӦ#?˘Foj.ܿP}| `nPx"u_$Ko0 X&$?ވ,׽f5'iiFs4AIΩDjZrL? LOwH ;Ѽ܍|VK`+=pNDwW "p  !%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnoRoot Entry F9Fz#Workbook >SummaryInformation($PDocumentSummaryInformation8$ #i\pMicrosoft Office User Ba==`@8@"1Verdana1Calibri1Calibri1Calibri1Verdana1Verdana1h8Cambria1,8Calibri18Calibri18Calibri1Calibri1Calibri1<Calibri1>Calibri1?Calibri14Calibri14Calibri1 Calibri1 Calibri1Calibri1Calibri1 Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)                                                                      ff + ) , *     P  P        `            a>  ||>p}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-}; 00\);_(*}A}1 00\);_(*;_(@_) }A}2 00\);_(*?;_(@_) }A}3 00\);_(*23;_(@_) }-}4 00\);_(*}A}0 a00\);_(*;_(@_) }A}( 00\);_(*;_(@_) }A}7 e00\);_(*;_(@_) }}5 ??v00\);_(*̙;_(@_)   \{Pw wc}}9 ???00\);_(*;_(@_) ??? ??? ???\{Pw ???wc}}) }00\);_(*;_(@_)   \{Pw wc}A}6 }00\);_(*;_(@_) }}* 00\);_(*;_(@_) ??? ??? ???\{Pw ???wc}-}= 00\);_(*}x}800\);_(*;_(??? ??? ???\{}-}/ 00\);_(*}U}< 00\);_(*;_( }A}" 00\);_(*;_(}A} 00\);_(*ef;_(}A} 00\);_(*L;_(}A} 00\);_(*23;_(}A}# 00\);_(*;_(}A} 00\);_(*ef;_(}A} 00\);_(*L;_(}A} 00\);_(*23;_(}A}$ 00\);_(*;_(}A} 00\);_(*ef;_(}A} 00\);_(*L;_(}A} 00\);_(*23;_(}A}% 00\);_(*;_(}A} 00\);_(*ef;_(}A} 00\);_(*L;_(}A} 00\);_(*23;_(}A}& 00\);_(*;_(}A} 00\);_(*ef;_(}A} 00\);_(*L;_(}A}  00\);_(*23;_(}A}' 00\);_(* ;_(}A} 00\);_(*ef ;_(}A} 00\);_(*L ;_(}A}! 00\);_(*23 ;_( 20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L渷 % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  Lմ % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23ږ % 60% - Accent3M( 60% - Accent3 23כ % 60% - Accent4M, 60% - Accent4 23 % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23 % "Accent1AAccent1 O % #Accent2A!Accent2 PM % $Accent3A%Accent3 Y % %Accent4A)Accent4 d % &Accent5A-Accent5 K % 'Accent6A1Accent6  F %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 I}%O2 Heading 2G Heading 2 I}%?3 Heading 3G Heading 3 I}%234 Heading 49 Heading 4 I}% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  e%"Normal 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title I}% <TotalMTotal %OO= Warning Text? Warning Text %XTableStyleMedium9PivotStyleMedium78dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\`8different_rows:same_row_first><same_row_middlefX x 7y 7a 7ab +  PK!pO[Content_Types].xmlj0Eжr(΢]yl#!MB;.n̨̽\A1&ҫ QWKvUbOX#&1`RT9<l#$>r `С-;c=1gDJKK2e,$nE<@#Jem)4 Pc`{w8!A=2̙<&JꅐfM T5BNd tY#9~#*@ K/AKחFF]et`~!کկm Y\n?aZ]'2Gc"ry Ǹ8E/ԡnޙ`5xsѵɷrΚ\xpK*y7NF~b\c|‰8'VD5N(B<=. |z]ң}'D;4L|6CGM|VoC Gao±eǬXE>%qm #8j>-~ ..R(zys^FnVԇ$*cߓqrB3's}'g7{t4Mf,t,Q;7ɛ1Ѝmmƍ` F$vNyad@}m }w^-/m z<}%s7CXWM->Y°t`Qә")Mi?F$@3ɌHK8ۙe/o}'U}f@bvyE/G9#sh [1/"ZXZըfZ#0b8k,ބ] xy Z4M0#w;(5!ʬDx@l7&vy ;H)Okള0i1?tr`d]v%b :j8mC88IolW;6kϬESSEÜq8RmcWYX%YWk:.beRB톖 $T`Vc XэGbCڞp` Z?My֬Ӕ ήcF8&%8 7V`Jm^ݍq7EWeRN)zie#EHk#BEPѰ#`A,SphStq"A%}g0fDzd#Q%uejCzRt s \oN)F{b:P3,!gdbKU z=uAYk;֌˫rYaϤpg?0jCoEAV_] 2H7HhIv>kj!f.6Q8/ٙ_۵Ȟ.QXQ݈B~$“tO$ɤ6F#YOG [BkFE6hM \\ I,&.(dh&1oYYG;&kŕ{%e (w䳨A񍁺]y 7x5R`8tMc3ݤPK! ѐ'theme/theme/_rels/themeManager.xml.relsM 0wooӺ&݈Э5 6?$Q ,.aic21h:qm@RN;d`o7gK(M&$R(.1r'JЊT8V"AȻHu}|$b{P8g/]QAsم(#L[PK-!pO[Content_Types].xmlPK-!֧6 -_rels/.relsPK-!kytheme/theme/themeManager.xmlPK-!{֩theme/theme/theme1.xmlPK-! ѐ' theme/theme/_rels/themeManager.xml.relsPK] #i v9:  dMbP?_*+%&?'?(?)?"D3??U    ~ ? t(>@7b(b(ggD #i ^;;  dMbP?_*+%"333333?333333?U   ~ ? `>@ggD #i <=  dMbP?_*+%"333333?333333?U   ~ ? ~ @  (>@ggD  ՜.+,0 PXd lt| ' different_rowssame_row_firstsame_row_middle  Worksheets F$Microsoft Excel 97 - 2004 WorksheetBiff8Excel.Sheet.89q Oh+'0 HPh 'Hadley WickhamMicrosoft Office UserMicrosoft Macintosh Excel@Zc@0zGLlI W EMFD@   J  JQxIJP(x J(J ׫ȥy˜OpCompObjpreadxl/tests/testthat/sheets/sheet-xml-lookup.xlsx0000644000176200001440000002353613067126266022205 0ustar liggesusersPK`Fxl/worksheets/sheet1.xmlێ `x?(u3fn55i:I{HwIՊ~& SѴz|(@i7=L(VmӁ S[2*'M"&b2^k] [vTuބ؞o^yQ]E ^ivfAVdgk12/q09: I]Iq 9ITCCWT')pJ,|"/>MO KDA+)# %c!]I, .s7c9apl"zK?]A\dy{ ?_|e~w]A\;2.4bM4KA/z+n!/qIǞߘ)4O>[zc;vYyn,,0vHr4M2PKUVoXPK`F#xl/worksheets/_rels/sheet1.xml.relsM0 Y t[[m,޾^t` ]RO,q)x@M~0p7[P;gwط͉gF)*cq(vDȾleLF? _Stt5?v!>y.ZـֿEFLj]|PKj3PK`Fxl/worksheets/sheet2.xml] "jiif?S3" ЏK覽SyyysNсIՉag #6Pv"k0#В^ l3?6_꣐oj˘Vn$w4,6gF)*c Q }!-˘d/40ӫ͛:g un |;duax.ZـLp "#s~$;]|Ʒ/PK*t3PK`Fxl/worksheets/sheet3.xmln0``$Z囹ۮ]pT#9;SrٖEx]p`RaZ4m60P DSc< jn͢H[Ʃbzf#$ʷH$$Iiۇ 3yOlښ-Eן!uTjW?yqPbA-%4#vP(=8݃ܙmꏡ9ýg[̌?; >At_oo27I?6cU9DiQy|820?ePk߶l0h؆;$m(19~H\RMRc 9UY/D5yz2:JXO>LOSbhJ}["2^V.r_wqq~BN3C1@rM@gd9c 0_?w azp  7a5[c#!Wq 4,-:f"-@_4:MI_!inPKЅ|vbPK`F#xl/worksheets/_rels/sheet3.xml.relsͪ1 'J "q#[mg^BA˜/zsFI u nq%1x6pcM3~сIՋquHi2vd#[L(2#0ezHEĎFHNIFiapҏ񿄅%Cl6=e+A_dѦ|w#8S)h@$ hNMU8"N~wg"w~T9,;[y|q|J&NY&gjm1v/6Ss[EsaMiˈ_ڴhulC~ß[,yfG cPs"Hsچ/D5<=I$z!B"!*$9XDbr(Rxr!Qzr$^cY@Xz O.Pd`?d2(k`#\/zYP|酄]s bOr!Xz (R}[ \)@3"]qԥߝ̮\-0/qNC7| ?_PKGtXPK`F#xl/worksheets/_rels/sheet4.xml.relsͪ1 'J/""q#[mg^BA˜/zsFI u nq%1x6pcM3Co4qDS)րJkmPE\=SMۘs\-C˘}(/@&3I{|X5$bi"#6GeJ~9yWaFEy즟*H7o;ch|y6;{ i1H%O\3Ê\S.9E^]D^=qmJDhJl|DddKbN /WpZ;T !tC6c&M3~p~y 7p 29~$F(HF(~hC~y 7` uI9 2u$%x0pxvm-@$NBnޏ ~s6Ǔx~@Ƚ]ocIB NYKIJ-H#b'ec?^PK̿x`PK`F#xl/worksheets/_rels/sheet5.xml.relsͪ1 'J/("q#[mg^BA˜/zsFI u nq%1x6pcM3{zlR[K/ϻ˥VZp'd/JVJw1EM=HICL` Bb]q==XҪ#J/ө#ُ7`uɶ.cSNe8?LR '0eq9L2!9`Ix'{1Mɒp9BiHs<رڃ<6KrSJoFcBlxT. eݔn\Rg 鬓Wdȝ<dҗ f=kEp7PK]ZPK`F xl/styles.xmlSN0:FP&ٰ$c\?d(빮ڪH D}c WvEEn]^S=geCG]{Q4|J"mJ(p^Z( O >HǼ[U3\[Zn.pEB8ÜRZsvø9'r wa=OzAqr6E"ΦB[7}( $l jF9+=gS pJF=IaBi3(h/Aooђ.x3ΥƐW79r3%)@,!}xQ'"e_PXzqShw3s½[# L)udY1]!?]wP|nf-ش#O\X}lC@z!i[z'"f?,ß޾PKyl.PK`Fxl/workbook.xmlKn0EW= JmL8lC e#0_w JNtF$B"1y!L'L #igh9@^d!g4IUҞ-e^I6T11Û yL2MU:%5Τ~ʍjMS84^)>&b\T(&W)#RXIfBFw<g2rhӦ#?˘Foj.ܿP}| `nPx"u_$Ko0 X&$?ވ, d&V=Ik26J,A[!"c_K(lz5R e =rNy(MT 58 _x85MʃM'XJY3)C\|mđ`ozTu u `64*1 lj<ǓRYh(d+SRaOa@GU|/X1WnӞ}MrAZv MtX3j'~tT4 v]eUC_Yp.hK_qhּ~?PKݖSPK`FUVoXxl/worksheets/sheet1.xmlPK`Fj3#xl/worksheets/_rels/sheet1.xml.relsPK`F38mXxl/worksheets/sheet2.xmlPK`F*t3#vxl/worksheets/_rels/sheet2.xml.relsPK`FЅ|vbxl/worksheets/sheet3.xmlPK`FOQ:3#@ xl/worksheets/_rels/sheet3.xml.relsPK`FGtXM xl/worksheets/sheet4.xmlPK`FxI 3#xl/worksheets/_rels/sheet4.xml.relsPK`F̿x`xl/worksheets/sheet5.xmlPK`Fl3#xl/worksheets/_rels/sheet5.xml.relsPK`F`(!xl/drawings/worksheetdrawing1.xmlPK`F`(!xl/drawings/worksheetdrawing2.xmlPK`F`(!xl/drawings/worksheetdrawing3.xmlPK`F`(!0xl/drawings/worksheetdrawing4.xmlPK`F`(!Kxl/drawings/worksheetdrawing5.xmlPK`F]Zfxl/sharedStrings.xmlPK`Fyl. xl/styles.xmlPK`Fkxl/workbook.xmlPK`F~aixl/_rels/workbook.xml.relsPK`Fo ( _rels/.relsPK`FݖS[Content_Types].xmlPKN!readxl/tests/testthat/sheets/style-only-cells.xlsx0000644000176200001440000002171713067126266022206 0ustar liggesusersPK!Tep[Content_Types].xml (TKn0W"oEUU,[$L/iN"mkIO)*Huu|pNSաSDa5AGءS4#2aoPK!P|NL _rels/.rels (J1ޝmiz0&M&$Qooj13ov7IrLx ވ|p2yKxpbr)CHP|nQ$/V\@fqS3Y0j{u8w`N̋cOD!S8k'|8>U׻'[= &$շ774OH"xR㳔dNҨ9ɨAw(7e(3O ރhm| sD"$4DSOUNh9.)k0՚0!!iɹS]٬ `2K9Gyvq/PK!Hyxl/workbook.xmlTn0?+ j(I4E[l$U(},%m/$̼G.[)XU«yLQ]ru헭?EuDDhrta]-<~@Us-$JLQImm)mŘGAaIBܼCd ‾xmG4I'yhjjYā .=($NJr %F[}tWAr8r=RןnĺM+sAńiꛆ Xc*E[i%=Ґ3p 3ZB`U^cD}+Sꂍ1~+=o]Egש  ,`@uiIj} Rs/2 spKW`8S >,}>k) !̜ʰ??Dн7Rhc ueh]߃,P6u77ikV/WSPK!;m2KB#xl/worksheets/_rels/sheet1.xml.rels0ECx{օ CS7"Ubۗ{ep6<f,Ժch{-A8 -Iy0Ьjm_/N,}W:=RY}H9EbAwk}m PK!!OG%xl/theme/theme1.xmlYs84~o А)M6q"[I$忿d@ IWyH~jW~JD5H/[ U*2Vt8!JC$+7NtAKJpN`Z'*eP/EM+|72?$!ݒZX J$q>g)%SC29]s|2 )74 vXlhZ A>o:!e?8i6qgob?;fC80mO:W.n< = 4EM,>=\@.Qxюp78vvǭ^0[wwh U TpV-vơIC} . ?FqoQ 2,bBN`4^t)Fʙd` [JΒET*YəYA|wZP9"wt&cZ v@#ǺVc!rg]~ d)R狢 BQ\^ɖUg.>6{qeEgb^q4䴢wbAiD/vdJ5X$S6JwDb:\~&CcZ hE~Jy`ƷPHNA1!oV2 4z:\qF(Q_u%_!Rj|BsPQYU?Cȕ13<ό~|by 6@̛-a>2XBW{U3,{Vΰb~ۇVsXVWʞAU~?_m%"lWmMpѶv.ٌu_&3"⦀ƶbrՐi.qޣm$u vC[> ;vZ3:21k;-TmEE1Pm2pW5\XZCm43vw-HGF]ֱvkK&o#$a7!)ԃd~-k2o;R-]?6\òA Ucf}.\G hеt>ةR*ʛ"#3׀7dLm+y!cm*,MW2ց4֤:F䤵nQ٭rOWŦ3Lsx7)|$BB` N$^ځт oHIosMk5ˉdxBRzeFH򆐍(O\U;g򩩁=s'Pդ)w?&firK槶;p-^}(G>Smw'bh|}Q[= 1c2SqkF xS ]ya]0Raigot7|1K}7Y.wO3vc~15&5z?Wt9^Z/V޺ᮽ1sӿPK!*. xl/styles.xmlU]o0}G?D+Y>J2vƄ!$Nk:NT6Xjksvg#Q-"E"JYQIїܝ!XTIAR'-޾IZgnKvB)j,<-B6DJ-LF\g^Sc*EX% qKiA 9\|p.py'Jɺ%yr=@)e'4Tr 96镬d2A^x,8@0]<MfB]Y~w1O`0JɤrԦHQϸn[aF EƜu+3Գa^̳BlرN!8D g(l}(xtfI!U^h AD/Ix%Ӈ+PK!xl/worksheets/sheet1.xmlUn0?GcrCLS+$$m'.Xp..*N((L^P 3Vޮ>Zz!P4qj^@t q&b>ԍEUhVLԴe%2 jӒ((A>UCse N¼8RJ*?kخļGS}%Z&@5>Eif`N 霆/'vP76Qb˿0!vȸGXCY&t{;iN?>nþ)cֲ-2S$ rv(Ϳ"ͦl os }apF]ev`l-pY~I%؍9SMnh E ?h#G0VK%OOuų@u C,kq5]G, <\"!b"F.i+ ·1.! !y Y[̺y}vlyψxy۩l }m@ T]b?T,vvVm|mh2&%5(mXsۈs+>Q)Ҝ^YG04(^XP"螩6RńĉrӈN"l l!sW7_PK!WldocProps/core.xml (|QK0C{ss=9P| lD{nq%PW+PZHжXKXǔ`V,ZW)o(n8 6$e)o2w[;KmjpNY1f$R|j8bu`jLt];Nق}r4m!P5Sn9mbYRȦf]G_AdR2 Xε~QS`0)bi!90N8wnp:ܕ!}ɝզU aRh & -Vϋ_]/ep6ScPK-!Tep[Content_Types].xmlPK-!P|NL _rels/.relsPK-!nxl/_rels/workbook.xml.relsPK-!Hy xl/workbook.xmlPK-!j xl/sharedStrings.xmlPK-!;m2KB# xl/worksheets/_rels/sheet1.xml.relsPK-!!OG% xl/theme/theme1.xmlPK-!*. xl/styles.xmlPK-!xl/worksheets/sheet1.xmlPK-!WldocProps/core.xmlPK-!3  'xl/printerSettings/printerSettings1.binPK-!h=docProps/app.xmlPK & readxl/tests/testthat/sheets/richtext-coloured.xlsx0000644000176200001440000002002213067126266022417 0ustar liggesusersPK aWFxl/UT &U)Uux PK!BaDRqxl/workbook.xmlUT 0þUux QN0#ԭTB!Qڳ7Uǎl:U vg=ώS8Ih0Ln2mon)A)53xʮuwkOiB`%Tl O *=!} *p8eP^?(T6?V`EāR՞fBi^6"EO-|x*Lm뻣0,Z 8Ak:ǜO#3 })Br)#mC wJ2|6O};ITg=6nTk\{PظE_lcNznSb\51Ly:2>PK bRFxl/worksheets/UT ȽUþUux PK!~Ttxl/worksheets/sheet3.xmlUT 0þUux QK0Cn:up7mX[m4s"eoГܤ\&B[iSV`lWϏmF =ܣ H}C=3/!J1?8m:d43\Yz"JP p8A9*lz2t\#;%oV+8!܋ѷw7HUQkv),_f\TE[.bPjgCWA|)C0%}pƔ0?T@X!uɳ1;nHeԀy_BP4*<'KeUx1\^Ocu*԰6R|[M %kE(F=e ߤo @]sIq>E4ƈu%g b<&c8_PK!~Ttxl/worksheets/sheet2.xmlUT 0þUux QK0Cn:up7mX[m4s"eoГܤ\&B[iSV`lWϏmF =ܣ H}C=3/!J1?8m:d43\Yz"JP p8cE[|dl5g!lyFi hzG˃Q"g&MkNCN=|Jf$(JR^h=-P$Aּ*f MڻL:8Yq5Ŷ]Ap1 2gЏ<-o 0Dq5-$ IEԕͭ-m}PK!:BY xl/styles.xmlUT 0þUux K0Gml/$Y¶,$^e[va$9[;k43fF(? TdI*eys%$\I|qSj IfSAD5TRZ S]є-܏I< mBX3l׳0JCpJ VheTe'UUr/| q5P ̙`G46сpЄOBq9FA5,)+"u}`PSC?u  ,b_mHc8 K`Fy5P[3`zxךta4Z7W[zyP1{7Zh-iJ؂ru7ku>VH"L0$BB8`_X> Eu P2nM,\{umt%HlLEDK֊ʎ^ɝTxbУ}2QY<>.6Y̓ܛ~3o1[mtlEW]8p4XKdH?H{E71PK bRF xl/theme/UT ȽUþUux PK!bmxl/theme/theme1.xmlUT 0þUux YOo6w toeRuرۭM$niXS@I}úa0l+t&[6SifX[$?|"$Ir.6,D4 ;BBR$'c͈l~e"+R*ݰm4yJXscCځ7fvXcL %8c4XZs}_لľK)rl0q9=&f pH+ 1,,tFZnJ 4s:],~,`um;穁U޽pxkv Ļ+vcjV*xo_[.U|M&+,, cήm`U'nŊ&HR2>z8 3x`mT& I_TuS |gOg<=zÇG~6^I2㥎~K3P_?| -G:|Hc"Mrx 80´B#@}U7gp]Ru:Wu?SE Q\pκ\͹͙&Y=L{B۟e/"5wD$! ek|B.P_p ݥ%C:Rfk4L B+ٹo*3K*n Fqt "3W.D:$~@41T"cw,"\GnI/qjԙ&HN`b˕Q ^͐l qImPΖַi7H2 36$){R49l3 u}ٞ÷3%b]mny[:Z+"R!6QA/_$K| 0Tij;Вff9,ThĦbn*h2-7^5,8ڧ5ž 򑦞]k:GSwהlB lv,.Tġ \ -2^bge*xE. PT$U`4uΨ3 ueZa,{2-ͫIwXi;ZgdI mLkkׇg9 $w74!jZO"XR0T6kJGo*zQZz]u2Oӵ PL2({q<'UU[+?{|B~pc5Er&Y/ Ch9WHg=( ^RzqzxnyڇPK bRF docProps/UT ȽUþUux PK!@z4docProps/app.xmlUT 0þUux N0EHC}!*QP *8µ#|=Ndžxx,v[x0e 8s6{Z .Y\w= gb| `#f$f.ape‡x h{G|v.|Pu8鿡 >U̓⺪ъ-/(iEV߃LJ+ 71X" PЖY |H|ıY*lC[ )ް keۯTNZC,N)ڐ|,*/ē>qzo;K:}#7 +ObUy|EXD`MtNҴ]cOuPK!f:>udocProps/core.xmlUT 0þUux ]K0Cɵme] Ż$v[.,s|QMF&E^hP-x4-ra0^B >L3a T`^TO:Bw8Cr׀SB%؎FWJ1*kP4p_Rak"zGzl6iS1yVkJ*s)pq;_񦹉:'qʆ0﮾A>l/N;Ȩ+v+i1CeJmL8# 0}%B)et²APJ PK bRF_rels/UT ȽUþUux PK!U0#L _rels/.relsUT 0þUux j0 ѽQN/chCn]aGҧOB_eƏ<⇄]dv TPK!|lW[Content_Types].xmlUT 0þUux T[k0~?Ju0ư&94 9G~^9-memD4増uEڸi.'HzXj0YsQ{)V'"~ST1SSnV8J#jn)yZ:I"yX\)\.n2fLLlxiѐUU3J.q,;,#/KSżfJ!XPmvje\ F. ꟘOrQ9b1JEo).G%!+a 9|#K}jhH-~~PK aWFAxl/UT&Uux PK!BaDRq=xl/workbook.xmlUT0ux PK bRFAxl/worksheets/UTȽUux PK!~Tt xl/worksheets/sheet3.xmlUT0ux PK!H xl/worksheets/sheet1.xmlUT0ux PK!~Ttxl/worksheets/sheet2.xmlUT0ux PK]WF xl/sharedStrings.xmlUT"Uux PK!:BY xl/styles.xmlUT0ux PK bRF Az xl/theme/UTȽUux PK!bm xl/theme/theme1.xmlUT0ux PK bRF Axl/_rels/UTȽUux PK! ( xl/_rels/workbook.xml.relsUT0ux PK bRF AVdocProps/UTȽUux PK!@z4docProps/app.xmlUT0ux PK!f:>u]docProps/core.xmlUT0ux PK bRFA_rels/UTȽUux PK!U0#L &_rels/.relsUT0ux PK!|lWV[Content_Types].xmlUT0ux PKreadxl/tests/testthat/sheets/numbers-as-na-and-shared-strings-xls.xls0000644000176200001440000016500013336631200025524 0ustar liggesusersࡱ> !s  $%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrRoot Entry FV:L"Workbook<SummaryInformation(#XDocumentSummaryInformation8 o\pMicrosoft Office User Ba==ndA8@"1Calibri1Calibri1Calibri1Calibri1Calibri1 Calibri1Calibri14Calibri1 Calibri1Calibri1Calibri1,6Calibri16Calibri16Calibri1>Calibri14Calibri1<Calibri1?Calibri1*h6 Calibri Light1Calibri1 Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)                                                                       ff + ) , *     P  P        `            a>  ||>!}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-} 00\);_(*}-} 00\);_(*}A} 00\);_(*ef;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*ef ;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L ;_(@_) }A} 00\);_(*23;_(@_) }A} 00\);_(*23;_(@_) }A} 00\);_(*23;_(@_) }A} 00\);_(*23;_(@_) }A}  00\);_(*23;_(@_) }A}! 00\);_(*23 ;_(@_) }A}" 00\);_(*;_(@_) }A}# 00\);_(*;_(@_) }A}$ 00\);_(*;_(@_) }A}% 00\);_(*;_(@_) }A}& 00\);_(*;_(@_) }A}' 00\);_(* ;_(@_) }A}( 00\);_(*;_(@_) }}) }00\);_(*;_(@_)   'S P}}* 00\);_(*;_(@_) ??? ??? ???'S ???P}-}+ 00\);_(*}-}, 00\);_(*}-}- 00\);_(*}-}. 00\);_(*}-}/ 00\);_(*}A}0 a00\);_(*;_(@_) }A}1 00\);_(*;_(@_) }A}2 00\);_(*?;_(@_) }A}3 00\);_(*23;_(@_) }-}4 00\);_(*}}5 ??v00\);_(*̙;_(@_)   'S P}A}6 }00\);_(*;_(@_) }A}7 W00\);_(*;_(@_) }}8 00\);_(*;_(@_)   'S P}}9 ???00\);_(*;_(@_) ??? ??? ???'S ???P}-}: 00\);_(*}-}; 00\);_(*}U}< 00\);_(*;_(@_)  }-}= 00\);_(* 20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L˭ % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  L % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23 % 60% - Accent3M( 60% - Accent3 23 % 60% - Accent4M, 60% - Accent4 23f % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23Ў % "Accent1AAccent1 Dr % #Accent2A!Accent2 }1 % $Accent3A%Accent3  % %Accent4A)Accent4  % &Accent5A-Accent5 [ % 'Accent6A1Accent6  pG %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 DTj%Dr2 Heading 2G Heading 2 DTj%?3 Heading 3G Heading 3 DTj%234 Heading 49 Heading 4 DTj% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  W%3Normal % 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title DTj% <TotalMTotal %DrDr= Warning Text? Warning Text %XTableStyleMedium9PivotStyleMedium78dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\`;Sheet1Iabcd . + PK!pO[Content_Types].xmlj0Eжr(΢]yl#!MB;.n̨̽\A1&ҫ QWKvUbOX#&1`RT9<l#$>r `С-;c=1g;#=\;S8MklX(*|C:]g.Gp m2:ȍc _nLkjt>.&< :bo~PS4J3.F-r-{^j5_ e`B exw[ݞ_2|oT:=aW|]z^m1zl|oШ7(3},@)$qjghU"J)qN<[q*J˟TFFLΐIJ~ ^] |1I>rbXd[廿뷟߿>tu|' J>4vw?~_XwR4#c<ė,+fEӁWp]{؀Ga.|1e5'r.-£e2O.u.ls(1R_.@Zeac8‘9Ɩ='Ĉp5$#26 ictLbFRmeԶ0pc j!?Z \PL"HWDL1eN9@ggD  ՜.+,0 PXd lt| ' Sheet1  WorksheetsGV:L F$Microsoft Excel 97 - 2004 WorksheetBiff8Excel.Sheet.89q Oh+'0(HPp 'Microsoft Office UserMicrosoft Office UserMicrosoft Macintosh Excel@W7L@GV:LGLlM  EMFD@   N  NQxMNP(x N(N ȫ¥׽«yҷyܷ׽CompObjpreadxl/tests/testthat/sheets/empty-sheets.xlsx0000644000176200001440000005414413067126266021416 0ustar liggesusersPK!cO*<QH6ҿ?s]JA: r`!2ƒE);~kjZ7g7G[XL!PpC& d/b\zk\(|$uҌgcBQ/#KDKMg;@/l.WN 3A}3.1PK!Gxl/_rels/workbook.xml.rels (j0{-ȹBmB^[&$}EBS{1=,z5#u)(:ε v7 u*`S]__לHe+)X4e>KAsAnQy 4Lm} b7wo7:P!9qa ԱEVpG( wK2}Z :b1]xJ1`%a>}ܓEu,a)6#Ͼ PK!Epctxl/workbook.xmlTn0?+dI^`9p" -6\Te*qK^D8z|͌f3kb.:vQ`QZEfGmwZ?lJ)ƖL{+d$Bs2dI Òp:y9e+Mkɔ@ }[hNXW!ղܝ<( $nJ o%F[w;oFEllHU}!E@wQ>W/L]]\iM?@1cKc/K nuoI5qeP#|gAƔ:ac n@OW}?X|.y[ 6tTgmsv/a :^>1~(':i;2GiCO s;S?5P -9BrؘmΓK0ZOObg%^]<60l9Rhm 4NZ`"kg %91ld2hH$UdZ'Wt2AL𤟓&JxlOjᶒتJxB`jjf. af&Ne'iLU6c* Ŭ=GLU3Y Azg"UPK!̳MF xl/styles.xmlk09^&v!In^e[vDa$7d;NB:NН˵JtbT ;FQUPKp,O?~ks&\"G&)8)TֆKR( ?I=a%Hj^:ȵܵ #+ zh~fw7xs.pD%(dIƥV΢\7A=^v+{4?+0I\ m@`SQTbC ʒJ.^9Iy+ cTi q̨l +xú2F sƙ64ΥgU V:Wkf9rVZQS!Lo T"ȝtEM}"$2=x5gN-Wa=GO(kp\%``K BwvW T`%m; _Xv">=Yh/XQcx=ۇ],"}b`9_olnw0 7cke R_t ?5ó3TYKt1(Uc ^46I@Wya_=ke;4tGA/&>3at{I#I)lU2ʦxd]&JQ>l*JoP:4y%dUјsN";H?h~vř_#NZS;zĸiPK!P:xl/theme/theme1.xmlYn6wtZ%l[hnebCH'5{a7v؞=)"cO tb 9wӔ:8e=qslFE}8:f 5?DS@'5\9I1̈́Qn7p큁[Hqr&""9M \;KaF_v ͊}j!xp$r/ؖC]nv3I,$ڛB›H] EG߄jŭ+6*hr`sV Q>Cw]8] gݫj9M49P9kMj5Xҭ ҺF Q[L1d+RR5.4O{#xߙ]Z9Al֕*Յ~'O@^Ԭگ v4Jg: I8[)⁒gv)J$BZ^7ZJI?-~PK !x@6@6docProps/thumbnail.jpegJFIFHHExifMM*>F(iNHH8Photoshop 3.08BIM8BIM%ُ B~ }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzCC ?|3 O?9Dҥit %Y,-I$,;K3I$@xWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@|)"ڀ7 ( ( ( ( ( ( (?|)"ڀ7-[xNm]u z^u垅%,? <2rNזJ-4_|s<j*׌M;׆d{"w]uo|1{? &ϧc3gx:+h~tZ93yF[K _ybçc Sal1*3}< y?1[@3}< y?1[@3}< x%!xDY14-miOxs*ɸ#2h>&ϧc3gx:+h>&ϧc3gx:+h/[غi]b5 1ӂ۝R&*Y"1ϲ(`g39>3,zsF%1l!IP oy?1[@3}< y?1[@3}< !^Z1lφuﵵ+mwtOHqI;*h|)"ڀ7! m]K:tn>>9RmsKx`tqo,S %H匲:u?x/ A]x/ A]x/ A]x/ A]x/ A]q__;O^(G|ޙ ɿUt*]rr0a`h7_ '7_ '7_ '7_ '7_ '7|#m\Ö>4E$+,nFꮎX(4K(4K(4K(4K wƞD#ŞI4A^ҙeTE[Up'W~2xpE42\r,zuItt`X7_ '7_ '7_ '7_ 'nj|#s[x×AK4K0I$;*G+;PX@|)"ڀ7|cep,y?;J)hXdg$n/ +KmAa?$n9?k&#Ş=PZBF'j"(誡FuZ_l?7@V@6 tei H?Z_l?7@7m7Nz3ae#ec^ 8+KmAa?$n/ +KmA|;8k 3he%I'$Y6 tei H?Z_l?7@V@NikLu:V #S.س7tVfkX 36jK11y$O't_Z_l?7@V@6 tei H?ra<5W7uo&6R0E*A%1Kc>%^c ~/X? }@wC?[4m&?J|rf;ƾ [5ȖX!1@=3u?c ~/X? }@wC?~;_EP?/"oyk&~֚`'Qu2Uxkh˶=ʇyR}1Kc>%^c ~/X? }@wC?[֞4ox=u lm QqcTj2[[ cz7}1Kc>%^c ~/X2?X2¯"G^91i.IRnːH7kT𥧍6`99M,q:ƒ̞8IdT¼ #`P ? }@wC?~;_EP?/"o񽧍~/k[/qm]O]GgHh&U1|)"ڀ7|-? hU,,n>(Rk+%XO?hҿ?d+7O?hҿ?d+7O?hҿ!vUW#"Q{W0^x_|xfC$S(Q '4i_| CF '4i_| CF '4i_q}i6~"m":uߪ_HGWa4' Wo7@,ѥt' Wo7@,ѥt' Wo7@> x.~ ͯ {^fiVK 'u=hO4nY>JO4nY>J/[]^Mzq۝UE@W¿m[OM2) i4rŧۤpTw Y>JO4nY>JO4n9@]|[ik=6{ +yFTQK|)"ڀ7-Z( (On( (:/SwtP@??(oLTP@Կj|-bZ }"'Rh|)"ڀ7-k}?=ϊYCh/g^M9-6*`@_#-=VjOxc9(mx&?[@#-=V1Wm5T'm^4_ഺ{k[/9HQ@:G<[ES{D+hsſQ5?'1?oMO G<[ES{7i#oB:h?N/U,{4{6GʪsſQ5?'1?oMO G<[ES{D+hsſQ5?'1<xoxFkj6KH-Bk VK6J,CHtx&?[@#-=VjOxc9(me~ZhRK:Ji)h&Ce!roO xrH|}&VrE7!Y%ӚY%!sĚsſQ5?'1?oMO G<[ES{D+h|٧w^פ/ė1&t[4k2Itl|)"ڀ7%m;LZ[xIW^(bU[ᯆkFn9E0]|[]|[]|[]|[]|[[/`n;nMto>;nMto>;nMto>;nMto>;n9oxIWCI?  i6_mse&9 C#kϗ3tkϗ3tkϗ3tkϗ3txHE#[?KLQ{IT_Q'GH|ʠO0x_pY4x7"-lbIђ IH\x|9̽ 2xG—Wn5_x.@[_o7ÒtFnf0:C|sz?e>O?^C|sz>xZ:L?+C+oR'ģyS#m]!>x|9̽ 2C'ß}7/@!>x|9̽sǂ#p5e˥Z8MɥidWlt 2C'ß}7/@!>x|9̽eE>94AR\xx [II@G(mm_ L7ˠ }xjIQ1$8E, 2C'ß}7/@!>x|9̽s>5|[p5zf ť]9C&0L˔E<2لr:|)"ڀ7/i4|]jN|PjҬ-.-lKn01 N~PyH l?m@&БڀM#_)BGSaj?7xGWqxwm?oY<]4fLo!d`Jq@BGSaj?7o7 :M-o:M֋u -' xƊ*nO',´?!GiCZ'P Nj?@+O :9=u<#ysE-߆4 M2O>k,B@Pj?@+O :V?u<@+Qx*W= $-/P7ZUVV#!<=A@|->ROq!OG!oUAgbUQ €o´?!GiCZ'P Nj?@ύ~:-":ͼJ){BREV 0|)"ڀ7.-_O+ƞ$۟aߺ?.8v6` D˟?D˟?D˟?D˟?D˟пi?)? GS?#vmS|Rgo7yWſP j?zj?zj?zj?zj?z0+w6o$C$^f߳~v1g*LehNWyy^wb|<3}ln /j?zj?zj?zj?z2drA:@v%M",Y8,XMVQHm:=Ue4\{ڀ# WByFC68Z_w]HR (R=;#u >Ĺ u2|VY) gA܀ǷQ&-Zc- pɲgЃU(G 1)?>` @(x c8NcC.̅sĝ! x_mT@o >yggȗ׾ upn{׊c*B4nc,4h{uߍ<_A/yZ&磗PK!y)*N{docProps/core.xml (]K0C}~Jہʮ n(ޅl>HiՊ ^&OyI:&c%J b\Kۮ% #FI( ,ZUW9U`x9%:8s-= 6ZA?=ք=4X#8;`G":#4=Q $Jׁׁ^8w';Nٌ>Z>۶ڬ'esW vEU95@2ՆS]PלB`  "$  !%Root Entry F*#Workbook>SummaryInformation(DocumentSummaryInformation8 p\pMicrosoft Office User Ba==|[.8X@"1Calibri1Calibri1Calibri1Calibri1Calibri1Calibri1*h8 Calibri Light1,8Calibri18Calibri18Calibri1Calibri1Calibri1<Calibri1>Calibri1?Calibri14Calibri14Calibri1 Calibri1 Calibri1Calibri1Calibri1 Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)#yyyy\-mm\-dd\ hh:mm:ss\ \U\T\C0.0000000000000000000                                                                       ff + ) , *     P  P        `            a>  "   ||@jX}-} T\C);_(*}-} T\C);_(*}-} T\C);_(*}-} T\C);_(*}-} T\C);_(*}-} T\C);_(*}-} T\C);_(*}-} T\C);_(*}-} T\C);_(*}-}  T\C);_(*}-}  T\C);_(*}-}  T\C);_(*}-}  T\C);_(*}-}  T\C);_(*}-} T\C);_(*}-} T\C);_(*}-}> T\C);_(*}-}? T\C);_(*}-}+ T\C);_(*}-}, T\C);_(*}-}- T\C);_(*}-}. T\C);_(*}-}: T\C);_(*}-}; T\C);_(*}A}1 T\C);_(*;_(@_) }A}2 T\C);_(*?;_(@_) }A}3 T\C);_(*23;_(@_) }-}4 T\C);_(*}A}0 aT\C);_(*;_(@_) }A}( T\C);_(*;_(@_) }A}7 WT\C);_(*;_(@_) }}5 ??vT\C);_(*̙;_(@_)   'ə  }}9 ???T\C);_(*;_(@_) ??? ??? ???'ə ??? }}) }T\C);_(*;_(@_)   'ə  }A}6 }T\C);_(*;_(@_) }}* T\C);_(*;_(@_) ??? ??? ???'ə ??? }-}= T\C);_(*}}8 T\C);_(*;_(@_)   'ə  }-}/ T\C);_(*}U}< T\C);_(*;_(@_)  }A}" T\C);_(*;_(@_) }A} T\C);_(*ef;_(@_) }A} T\C);_(*L;_(@_) }A} T\C);_(*23;_(@_) }A}# T\C);_(*;_(@_) }A} T\C);_(*ef;_(@_) }A} T\C);_(*L;_(@_) }A} T\C);_(*23;_(@_) }A}$ T\C);_(*;_(@_) }A} T\C);_(*ef;_(@_) }A} T\C);_(*L;_(@_) }A} T\C);_(*23;_(@_) }A}% T\C);_(*;_(@_) }A} T\C);_(*ef;_(@_) }A} T\C);_(*L;_(@_) }A} T\C);_(*23;_(@_) }A}& T\C);_(*;_(@_) }A} T\C);_(*ef;_(@_) }A} T\C);_(*L;_(@_) }A}  T\C);_(*23;_(@_) }A}' T\C);_(* ;_(@_) }A} T\C);_(*ef ;_(@_) }A} T\C);_(*L ;_(@_) }A}! T\C);_(*23 ;_(@_)  20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L渷 % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  Lմ % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23ږ % 60% - Accent3M( 60% - Accent3 23כ % 60% - Accent4M, 60% - Accent4 23 % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23 % "Accent1AAccent1 O % #Accent2A!Accent2 PM % $Accent3A%Accent3 Y % %Accent4A)Accent4 d % &Accent5A-Accent5 K % 'Accent6A1Accent6  F %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 I}%O2 Heading 2G Heading 2 I}%?3 Heading 3G Heading 3 I}%234 Heading 49 Heading 4 I}% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  W%3Normal % 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title I}% <TotalMTotal %OO= Warning Text? Warning Text %XTableStyleMedium9PivotStyleLight168dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\`e<Sheet1I a /  PK!pO[Content_Types].xmlj0Eжr(΢]yl#!MB;.n̨̽\A1&ҫ QWKvUbOX#&1`RT9<l#$>r `С-;c=1gN$BRvZH MNl4 p:̉ CbÝ V*ڒ! cyg$wS.QD[@o¶Vi'tJCFZe_(3xL!C8;kNLՈ\1,5'r!VO. L.fNIfaZ^^3ੵ9حw Wk՚.{vms[R?+N [+fqd;+NPhz  r%dٱ Z_SLyZ_r12h<#SB0cA b( \pQԶ_i~5x ʐPLuOAkP#b1N/o?}veI}Nq E|__| фH\ssXNbcHt{T!tU9f>\P=0>c03E=3?x9r c=W%£Y'*K=:)2VSًcéIB JPpɧ 7$#:v i!tLg ډs!tyN|*G8aՀ`EXLGqԟ)}2O[Ic`OLr#1"gͺ]QB+il.e h7ab}lB" M,KU'h8S8!$I=,kP [7i҅mUcM8m mͫSD 8ǐ~gB%\bp+m^ܚ3M.8fYsԷ:EYT1|n+ʕj\\*lOtBN\ ep5j]x i sVik}wN#$(,'*-AY=_zJ+2U1Wf1$l9pGspb(u&9 ry#Gdi{޸f~&bFX#]R gkӄMZkkF01 JXAMT~ ꈟ"la㇠iV iacm1iU6GGXxZλlm&eM;Ӌw  dMbP?_*+%,M d"d333333?333333?U } ?} }  ,>,,,,, >?bc@?wlcc@d >@ ggD   Oh+'0@HTt 'Microsoft Office UserMicrosoft Macintosh Excel@䞮@ ՜.+,0 PXd lt| ' Sheet1  WorksheetsCompObjp F$Microsoft Excel 97 - 2004 WorksheetBiff8Excel.Sheet.89qreadxl/tests/testthat/sheets/blanks.xlsx0000644000176200001440000005744513067126266020250 0ustar liggesusersPK! [ u[Content_Types].xml (̔N0M|f+`bapK%g[k!LDol_Oo8^6:YGeMY%` +r6}JoYA)5 ./ӕL`X̬C3+D1Aw kVP>I%uU΄sZ"(ogyg{ FХdUFqë>T;i'镄d"|x ޭeAhR m1ok:Bb 1k2=q18 / 1'ӏ$8 + x0r<~j{4!㻰:u$>(F:Rvh3R1G_PK!}T _rels/.rels (J0rߦl&R`66dFj=Nfv7ځa "m\+k,&pr(#UW K3>]JA: r`!2ƒE);~kjZ7g7G[XL!PpC& d/b\zk\(|$uҌgcBQ/#KDKMg;@/l.WN 3A}3.1PK!;xl/_rels/workbook.xml.rels (j0 }qne:A[&V'o?.]B/I~Hvյ5)Ȓқ w 3 H+no/jMdDTq2)iJ|.V*:1 uy5|2*d(LM|o&E?^nEOtM$^:wh{n7JY:*GB`"nU:m%eFeN|y>SeL&s|(Bv .{G ^DtbPK!{֩xl/theme/theme1.xmlYKo7 X%6",%mİ9R.crARu+cEӢP m6:$WE}E{ k)CDHʳVP\ B,nwK+ gf<#`Ldpm5 nR‚ 1yN2x7" nE ||SX-/fp l 4$Y]AĮfM !DzǬ:?C f~V15B3 ͚"{+%`jv;zpV*Foޞ,NYk Wvs25 {٘Ԗހ,9o7:eo@<]Y]nxJfڡ^ 9ᅯ|V(2Cy\ +!5zFp}ʙGz-$CAs >1dĔ߫߿zz᳣?=ztG!Jco^>U?|ϟAS^|gO^|=7T}nSƕ ( NuW%3M\P<|)Yf:-Y n*ؿUq;qmwC՜cNB1IF!SuK>T>EmL&ӁHS4}:lCm|Zo} G>a©ej[X%>!w"Rc8FDJV~C}S)9"7^'ifI܃h+|8{8>ܥ#4@(SSTjOv ؚ|)qX M<ʶ Vi&y.9$)cj-id Eԃ7S\94 \$d79u3Ų`Ks ylOr')f2llX1blBKY[zխTsV7RV >U ք.AV^] f$vs-zBkH#b]kVt!LXLF y`jdvDzeb:hfB!Lp46b8 Q{j.hjꏪ:4D*'s!&yUef6/6:ތ6P/ &u-Iή<1G PTB>RD&~'LB8 6ZԵ .>Id|+e0wVZ#(w~Utƿ)Ua?SEo0/E! t.T¡ {ΨLhTx Ƈ`_}a6Cc$(l'*lCY2w zX`d""̭OX_e]@jR;}AX(&ywwҟhT~e+X3'7Sβrbh؜Vpf7>߁ڊSAT_U "HH{5>Y-vA庐iTi첉rsr|.,غGSgn&sq(UnћpB?bKA-Lt x4..:=&e 'DZA0S666#ZI\B-KӉK 2Bd=ڙu3gWKuLvY3w:x.`2ux KfF é-*&dPK!$!rxl/worksheets/sheet2.xmlMo0 kͺ]PCue"$ͿmNb@nH=/R*na{A[,I9֮].>pt4`͏mMq@ @dDpaͻ\:2$؃HH[ߊ{xqs4Z΂ăL~/ڞ6:G(gV叭C/+C}?g駱j1`‰=߈A5u0<4k~+.b燆CxfQV_PӘ8C#D c@ fZ,0g O]ǎT-ȝOx"ȅ>n ('RFFY&J^#/w,Ԑ{G ʾL b՟X,ZTZQD+ *X27u>Kjf3?y&\_qVah]G4!1XUPK!zxl/worksheets/sheet3.xmlMo0 kiiPC"ӶI$%ih{vESz^T>[FW,I9֮-9 QZtPz8߆ 2"P.>" (Ӡ2R[zY#iAX?MQ,8A<>iVowBb/#3֡C}?gK1xZy Ąpb*m7F*jM 3M|*Fk85 nc] q&鳇{0@W4jx>}l#ܣMPC#w&>趋,5E#Rle2ʪx`4Ό*p9|Uw`Wi!T[9'Hf"ZQi`E˿,Ge9,^BYeJea/[,}]`k44u~&iBk1r_PK!wB%xl/worksheets/sheet1.xmlMo0 kɺIPC,˶K$%i(ɺurM˗Tu'+05-it 5#%>p Qzzۼ}Sm(e H0cd̋Qj3`y ['y~[{2t&rb 3ɉGe%8vghVM*-ʇ}?8S p,u7!_vRt5Mzɵ5N|x5U84d_ӻ\-D88`f$EO;C{ˆ;Ia uE^̰>k \666w23 xl/styles.xml_k0B,Y`B7^[vDHrld;Cž;~;)=J\O'!FLJ],1 XOغ`cBW$]3+6:PMElm-$g")W#d?ISS5u|wW҆zi~f+Vn8˒uҸYFOX=)Ke~ {KI+*Y`z#:/rowYƅQ^ޝj(N7+COb^\qgJcJy^{7 N+w3!~WcT#3CwEH;^xֱߍEQWA_GhpG,C q\NJpb +x#7]H w^7=ZF_Dl,2b Z7b~l(wGj_4yZY3hd-#7ڴQ^PK !rZ;99docProps/thumbnail.jpegJFIFHHExifMM*>F(iNHH8Photoshop 3.08BIM8BIM%ُ B~ }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzCC ?|3 O?9Dҥit %Y,-I$,;K3I$@xWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@|)"ڀ72=G@W~te}G@W~te}G@W~te}G@W~te}G@W~te}G@W~te}G@W~te}G@W~te}G@W~te}G@W~te}G@W~te}G@W~te}G@W~te}G@W~te}G@W~t|)"ڀ7 /c? O7|&:fw?3Ş ѭ}x|#K|'J2Lj~@xVu }?Jz?"P?Jz?"P?Jz?"P?Jz?"P?Jz?"P~<τ=Aɾ5>$Z=J '_SxNa ߆tB }T@< BW@< BW@< BW@< BW@< BW8 m􋛿 xfC:T>V4,4T\T|Pi?Jz?"P?Jz?"P?Jz?"P?Jz?"P?Jz?"P-ox.^nn|-.'46i$M,$#3#;bX@O +_M@ +_M@ +_M@ +_M@z<K|+ztx-%dtu +)ʐSžMDž7<ϠhM4didӭIeK$ؖfbI9 @< BW@< BW@< BW@< BW9#v uկ|1msm~@ҡxt!Y")dH]U|)"ڀ7|-kmV_]ɫ͏|NN=WNo[ZܤAwA8(e],K[?|ot gC׿.AlaZ%{WjrkZ0q{1OC a>6͐ .?źw/ =R\&]{e__}SHܹӤӴQ_@ ( Þw^qjZ>mn/v~uOίŧi6:ޑ=3ǟ7k .?,F̹P96cckUvP'&(lc+JVEad%ofxs}ٞ<E_@g?ow??]5xNx3u<1xFY]*W ⛅I# 1D.݌|)"ڀ7|'ydriZi ׊ ^L۾e6xcR@C H1|yB&Щ-oGǟ*xk [bh ? |gGa66Gě߉EW_.<kլzP><S_Z@?T<514hO kM><S_Z@_4߇-|uV*\'}ʡ ?|yB&Щ-oGǟ*xk [bh T_^|/oM4 e|rI${^HVuM(PhO kM><S_Z@?T<514j8:&$3GO_H]쑟F$e\C$a ]rY@*V <;, %i9$|:Y#bPK&7?T<514hO kM><S_Z@Ǎj rxg[75 JKx>g8_ v";/O-Z"P ^9CXJ?<k?Hk@'-x c(!%s 񭵯<#lk_ ҘtH̶jc d%$*A_sȔykB׎?O-Z"P ^9CXJqm.<;d2iwzq{IWt5TE]؀ $o@|=IL: jA!OB̖%E%]e$'-x c(!%Zе$5D_sȔƶ^ mP |-DfҮ\O%fr8;M|)"ڀ7% i/=W.^(v5:QV0\]E(V*Xӌ?“G??“G??“G??“G??“G[i7qxH)xJ `zsm47Hɠ)cgGG)4N)4N)4N)4N)4N/獼g">d:oMIy]rr2ʐX;xG M;xG M;xG M;xG M;xG M?<kx6J{ym#dXVHUԫ(`Bu?oIuoIuoIuoIue<4.^3ɥ~"I${IUo3 bp'Sž:E7nj+h<3C74Xd)c{xՑѕYYJb7?“G??“G??“G??“Gk,#cM#UEPO _'P _'P _'P _'Pfڼ2iFmtk⭆f*[߃1˙^k HgOF؝(@<@qu<@qu<@qu<@qus>5{/xK;O 6WX$iWR9oZ' "lYu*H`|)"ڀ7%W]&#()%|2_ w{ 6OmE;uk?P|]^&F(>./@#Zg _ֳE/bhit>)QFc,pMǃ$n 4k oSֳE/bhkY145Awx ?Mk?P|]^&8?bs[CVNƼAˉ06D@g _ֳE/bhkY145Awx ?Mr74~9Mr[% h-F[xZ7-*Dq(4nvMk?P|]^&F(>./@#Z sÚh÷|W*3E%rJLnbdrp6HP /7"xV&[g u,1O9 B!y*,Yg _ֳE/bhkY145Awx (5Xug>\Gmۅݜ Mm7{xKoO. 緁?_6MmDʻ$ Omh i_iSүoqFeۅom= %o'k@߉ ]~&o6t~"߶gνko mus-D'1oLщ6A|)"ڀ7%jVO-#Z!0|)|2u_i{UOmv;u?O]ڀIu'.m@$o]g7_P .D/m5h)SHd*xInEnj-mdg*O k5ͳCq(S .D/mY} 6K>w j?%x|͵?O]ڀ8GcCZ&VżuIx7!Gp]g7_P .D/mY} 6K>w j?%x|͵r ~Mqx[~ X.Q4E[V+x'M RnE%x|͵?O]ڀIu'.m@$o sz7W+K%灌q+ZJ "񜒔@w09$ |ͅ` 7xW \Cyu 8Pf In]g7_P .D/mY} 6K>w jş<#i=Τc@Sþ$iVh4!C ,.H>hݐPO 3SP 3SP 3SP 3SP^ ³hQje7L]%UGTA2ʊ9b&*W1yu!, |9YTInHE 723)7cxO~O&|Sj?cxO~O&|Sj?cxO~O&|Sj?cxO~O&|Sj|k ^x7Ŷ\M=׆uxU;HP>uaHc5|)"ڀ7ϼ 41yF'kȊqw_i?r?9@m6Po(UŸ- ?|pAg@om6Po(Mc}~`~[`¤K!@Fu{8.:O~s@m6Po(Mc}~`qnR<%Ah` <G~m?0i?r?9@m ~:tH%NS6^Gt@Aio ~T}~`>m?0i?r?9@n-ρ|h$ %BI:=$@|)"ڀ7|#_ jSÚt|u77>ypQofy B $uj? wGJ?? wGJ?? wGJ?? wGJ?? wGJ\i7r\xO3Ⱦ) h:TZІ{V"+{hb0vCQTDU? wGJ?? wGJ?? wGJ?? wGJ?? wGJx3~..)᫛Oqis5[|ڳUENUQ|)Ȕ|)Ȕ|)Ȕ|)Ȕ|)Ȕx^Wn|'ᛋ x~{*im&IfY-ZIeFgGfwv,ı&:@Bo?@Bo?@Bo?@Bo?2*-X?x^9# # bi4if]IYeNy$G/$;wbYbIo|)Ȕ|)Ȕ|)Ȕ|)Ȕ^_m'{ APWrE42jE,R*r#+e!4|)"ڀ7+k=RO]ͩxώPV}{LokaonwaGPIm?5O.IoFW7,15lé4$BK243+u*****qay &MWő-WuK,5DKIX #ThBFYr (| ڿѦtyY!M>Z JIq(P At x ڀAt x ڀAt x ڀAt x ڀ9x2.M_=5;-*EI X`)Pr+#@|)"ڀ7<-_IN-|PR3<@_ mNNq@_Gu%=G3J?<{Cgdx] (gҮT^yi j\ܬô%[2_+͔?Pt#?$#ǿ:FI@Gu%qI%[ypKO:cT73&>m?Pt#?$#ǿ:FI@Gu%sm'<#%kgƀxK Za{H!(ʣME/dx] (?Pt#?$#ǿ:FI@zuvZD/P2FZJ]OHaeʇIӌ0_ i^8 xqah:;A Gxam> ~kF#K[bjodx] (?Pt#?$#ǿ:FI@ύtGu*<3=ͼ~4Uњ? yc 7/}|)"ڀ7.-_O+ƞ$۟aߺ?.8v6` D˟?D˟?D˟?D˟?D˟пi?)? GS?#vmS|Rgo7yWſP j?zj?zj?zj?zj?z0+w6o$C$^f߳~v1g*LehNWyy^wb|<3}ln /j?zj?zj?zj?z2z*!Z:9m -> "MUdqJJ1qVe>ě8!qɄO@>'7PK!]jdocProps/app.xml (n0 f@v1zXIcJt,T =huv(ǯ.:Hb(" B~}VG@qY~6)fl5QM WM|L{橁@"ϿH8 车6vǖKm3ƙ1VhE^ɹL1Srt,s%G5Ú(+|Ik6%,UG ŔكF t ea}1=b @$ ε}*Sao0pq6:saq*HpNĨO歼4Z|0AMÑ SӅGmwJ3 xl/styles.xmlPK- !rZ;99docProps/thumbnail.jpegPK-!̋id`tDVdocProps/core.xmlPK-!]jXdocProps/app.xmlPK Q[readxl/tests/testthat/sheets/embedded-chartsheet.xlsx0000644000176200001440000015245613067126266022655 0ustar liggesusersPK!bd;r[Content_Types].xml (VN0#(qYjʁH{Dulc=7,BUh\$[dIaM#ߌE=r'#PEHq04ЉI)@=Osp;|(/W11eӤ i]ck<hl6! :5PvH v紁+PycPK!P|NL _rels/.rels (J1ޝmiz0&M&$Qooj13ov7IrLx ވ|p2yKxpbr)CHP|nQ$/V\@fqS3Y0j{u8w`N̋cOD!S8k'|8>Ut>D;a@^TH1b':zaU~auf3' yyDC(3 1<ɀ7O~P{)9+ %qJ1M`L:'O@G\S7PK!ۮxl/workbook.xmlTn0?+V/8^PEY4E[($(Iė͛Mo+W S2uPIT>uu2\I'jOӣ҇RIb!9ܨJxSZ` GGg& A3 1BJےhʱ&gPQ-̞RdKCڕw̰hejE^)Ϧ;Sk-u86v1KM਎M@]8 1Bs)5@[%t4܋\AdBkgfSxb2[sm.z4A0,qIJWijlVG6EfA6 Tw=aћ]X[@ЅgtPG Ks=tMrFGLJ=|R EKC7}t ^;Rn%I54u~5YeXq4&^#Ώ^XqѯKD61wsXѤpF=] ) ɰ)+}#5U ^<^ $e{jVmǙ`lS1$_-vw[ңF=M[Ώ\i+kz.ZEE4(:?w] 6?U.D]\a9:|lNA[7Ev, Ӡʫ"lx,^OUqTd=u{V.᪬y|?䢪⡼ݏ>U*ႼGqbU7npzP;ui=@km۾@KoOAGirt ,}l-~Cwb\1{t×ŊG,y5~/_mhs.oa"L: ڰos բh Hwo,|5yS2KS1^EpW:}w1tbSn1u[04tcV'%J'2ucVgIYY Ƭd^)AY5AgtXl:5TJ17W*Ki)sE#*Lֈ8K }0D2YJ1fI0%ECJ(ÛCؒbJH3b+ YQ()L`W4'SYQ@iR&)`pȊŠH"fY1 -O,2bJB hsAD(Zؤ-s}溒Q HS`ax#5 -f7.{!)) -`pЂ)ZpIAB hM) -Kbb8pV/&-di)JFЂ"2{tHo@>XQhuo67Ђb RZpE(1wa(ື\"fֺbFdZocwD B 8R{Pݭ2,)) -bE H EE|{F* BK9ňSRZĺX'ԈSRZĊ} cEE|->TVZĊlmn"08dEEia^*=-9-duB 8&"KQh-L EEh##ZLBDbeH皺Hh1’bJB[Z$ EEr-L0/RhgM0(K8=RKjD#0ZYuL溒Q(H5-(HuE3)E-1bj(Huo!+ -R}n4 RZza^jIՑY@ev]-)s/27e^B \?VVK u nT5z SRD NTOg8p1BtqSY]4ʟǰĽtktMVvw? <İG]FޟaPK!H՜k -xl/worksheets/sheet2.xmlZr"9}߈=14Fleha`'YRIݴ=Iڭr׻ׇ=enyvCGyl_oeY$~]s\Tr'Ku.k9hIl]E;Le*ju[jPn}gm/_^B|^osvk6_|*v:T6< ;y-38:/"ڝ3A]ߏ:OQ3<>/S~V~euSfIfW}V_ji"Dq%tK& XC%4/Oy`mx:&: o2GlbO1`6$`<!w: X93 Ym ;{fךS#S3PǟO :+" eM893s欚3gή9CfЧl"R$D!L4ge7!-w?kPOj.}Hؙ33 r&dvї0B_p:NeEbkN=wCg*=3LiADܡ?fnĨR3!`ׄޙQ;0Ў@=9k@Os c9-=/99mHُ?t»st4%N M>S2YLBJ^垳r!<O%O:Gbnh19sYu9{3m7O<Хb@]3j!{Q6g}6lB-Zڼgz7֮¹qA2vLReK#f%rE'@KSߠNmTz30<1K{!"Rը u%r6ȉjٌOi_᳙jSHωO^a!P%Yy7<PCgA|նS D C/"^ChL4qЇ?`FeoMb>33٭ i_pN<< \!S{3&7HhRpmh, {xbb$ƨ Ql4髃zʳuQ667rtخ^Gĉ1X:G/2GG,>]13k!~HTuD1}Z a>"QaPQ5h0l}m#jm!B( 9WRVc&OvuPJ72pX|F"^T+l M(P?yQ:PtM SAո5vi! \!4Hʬ1qk 8Kr ?+B3qUKs?ށ;< oR~ael@4HhCH^@=40o!0nǧPH i5cP_=V>:rheyhgPAmvckhJ4zMCt!z@֛ͣ`$8"Տٍ&?,ZTF)hjvdE%WR}c|' oqwz)~6E}(H#) QBBo3 ϸ*1zWlgt&'tLK(bs uALx%*Re)tWꤴ,3(Q^AAJZgЛ?i#$'BS}DAN Ӈe'+/*xE-Tp j$RP%>]1 ";}Z ͋$d8X@lkWHd*J"E|\ $h ˧S$ Rm-湲k$xJ}5HV^Laκ\~H{lc},c+m7C'hH!7#>_>zy@n.Aj("ފA _`5A.eX2;Bpӥܜ#? *K(Ѐ3Й>fO6up$/Mc70[~MPx }yho9|c9Z^eݼ~BO/l }{к_X^׻ckSJtpb#)l_ U]W[כo.八lKUy{{Yݷ}y}<+:iC{_r][ob`S,[i !_PK!p;xl/chartsheets/sheet1.xmlQN0#iUM{Az@Bj:ت m fxLQ}ѓ 6ѯͣVmnm 뫹xV"K=038ɖ r!%2Ro@`q)E3{l0h`Od>D0/d-nC+FLgLZ;qq-)H*qAqVlϖ  f;vȌ2yi$y]j!eA>B,+hݞ_PK!<+$xl/chartsheets/_rels/sheet1.xml.rels 0nz^D*dmoo.mgf?Q)R oi4'tGHL z4bOE8ЧvJiB>˗ SS;Rبɀ)NVC<D3v0t6K?,2cGIRȠJ}U_PK!D߼%#xl/drawings/_rels/drawing1.xml.rels 0nzЫXIFooӰ;7;E'r k\;^í 8mqr4,PMq c:a,Ų!FR@3tlr:fi hؓgAO_LQB ŧlu3l̀!& ) ,P_7PK!xl/charts/_rels/chart1.xml.relsJ0nAD6݃ U dLG s<}>%P`fOcȳ(..RF + FW[IPD5J KYk &'m3'W[YnF}GͿ0K}f`ޔk@.CWR LSyNAA Z*X2xh%JiCK $ᤲg=*rKN#- @QR9c+saON[xx^KfTޞGu;|I*0vmfۏ= %Zwp2yc @NIFJ0p' ۆ>@!2W샇J' IrPa@%e=:aU!P7J*{u0lCEWC$l*cs2*T4pN)Uߔh5{#T Ӫ$j%N<1HӤ+T'J` F:* ۧjAin)â$|VXQO4iЛHT4LI7Be=9eth6jy}P}PՇ}ȼmД ʜz(Jn!!>^t*#H"9+DCr9#aN @n(6B;D5*{r ^Bh ~>e~T _}W]|\nwWÏ$Qb( W<@N:0( >i(.=~l {+C3&TО PPgB%4J3j rzC @N{Kair<:+c.A`י]Il8bGqq1 4QxuG.Z+uaWNURe̮-/ ;`י]I8rg8sPW> î3fW`(A][qT'} Zx ./zKgKszVҶ 1#,d' Du#y@[GD6\2"}zzҶȈ.9XP=ञ\m' DcΈC|vdS}_߆|剟+ ?do4!H k$F3;$(]J\ov<zN'2.Fc|se;UkW\GX#RaJbijkd|Xs˚FcgDIy>#*JÈU.FN1LH'>7*ERVu"~ ,I #H lȑɎc`` #u}u ʍZ(I:|u ƶ:wQ.rAdbM5qn}y򉓀N6!dy\tHs@Y/^J 9q! OBInoIH¥TGřpe!A(UZ+ޢEcrW H4ѫq5CH٘R.6TWΥHEl\2eQ1.fF%Hh. D4CSI 7R16UkuJichBU6]y¯u?5HqQ+ S̷m߆1bPbRI*Sv \22(NBIXVpz:Eȥd8 @D'Pny 723dTkq^^rk5L쌼Jɚ$3Xuʈ*ٕ) qbLAIYO[G}Ԫ7F%9yN}.2tRe]lL5ViaN2^C1gRi&#Dg `D0U%9gT)sv^ MA Id)yp8d{p);'.E&cb@FFNj~jNY]LƁ;3CCMWlE.Y{1 :OOhDe7z jؕ) k\@cPtr='S_HפLvfR2m'U.E"&ol:{M s0ZN]256V_h);G^xN.E&kuVoK}e(XMt4yVAU@'wR gJtO98;QrH2BeZ'5 y!E2T(x[-/؂ =`vSr HJn@Yښ`jjglO#>Kk†Z1FN+݃SٛkTOj ,[ӣRQq}QOFOy~ t:PK!=,xl/charts/chart1.xmlo6 -ۨSRKڠi;`oD;\(R#_q[: [=du:;{j] UI1MNҢ"i(iiCDAtQ:$"\V$-P"$&WTv[W$PVTT%1pB[P^v NIg((  \,XNOd*0 E91}* bh:Z7ONҶ`v\3qC'P%@L _ ,Q*^U,+0n83w\0tϮ$̣bip%˕raAc{aۣvxdD;NNfgێu&$틻ΰo90é\n 뒓-PG/DS9 [z.47g*kMkB4oKW)Sڜm.&60{vPay0R}IZTD"&-"rF73uXͥHOAD{gbj>]C y鮒5/x)89є3X*d%guIg\yud<;ۻ*/~[][-ڝH-sWis)(y@vLcg(, .E| S`ۋzY 0XQDlp}‚r}/!+Hf?9_iwZ7D$[9!VֵT QfJ} {8b^Hʼn{ cF R{ޘʴ~A䓛ؾ{U"v=' ?tߧDѶT瘹OYK]D=X|/0a#]ª .ȉ ػC4hΨn4xZT/0{Z(JjJmBIu 4Ց ?zlHqR!Qp2 G!Qp2 G!Qp2.BGQ(tq8 ].BGQ(8 =BGQiL?a(cB Dk*њ B !DkJ͢BOk5i xZ<Ok5i xZCQU E bmXke$xHh?=zCMvR-5-?m:Lr_&ko3Ɋ9׮*t%o*ҝz0vha-} ~uWmS-H#G.ӷ6ϻ!> PK!Kr~xl/worksheets/sheet4.xml[7l,Vܲd&39󶶶g6Eh-2=q2P' w8>o뷏_>jÇ_~~|÷>/?___>|ZWo|{O}gS~ӻ_۟_?u7ͧw?ZKo~yO>wol4׿|Ӛ?>~>?w{4_}5fP7Oo_~Ay?|ϯ}p?zO#?(O/_ϯK7R?'?w>\>w{fۻǻiq_nU뿮nz7K~(+=a1OK7{ e|?FC<ǣx9OG U|c_aLø^n|7 IMZ߯;woO7\&h;wo~szg\=|w{(kl.y]@eMZ&F{oO?[oʽ<{٤?ɣS?$.O侜&~2Kto𠋱||7ٔtN)So:Sb+Λv?^@zr}֨ Šxp?s*w _)ꔙX2ܴnqeش;  qDk2d .8i Nr0h_Pn1VxacpralaܶCdZy |[|+k@Q_S/I3N~hV0{j;qpz{SCjqa]mxxK:Д.w~>C+ Oc 4j?ݝӨ ɴs-y7LtƮ06[|C`1Rnr?ޜ~h˃f!rv3ǫّv?32u ek}V+uϤΐJG s2T |1YaYиS0zg tn&z+S:”@GkxzJ -iK- ppx#e erS+: 3f ofޮՇ;֨7,Yvfl 3v=w;%7UZ$=~W+ɣ;"@1>^uƜNt[A;ߗ/&_!tG6|SƜZa ?V&6.Ж{> E)uU zְYW {@@/#ýE]}2u mx\<}+QSƜZaN iO}Hj tS+ ; gf?eȖ Θ t\[W GҾI-6MhPRQ(iO+@̃*_DΘx4/gvU@4>C9Ǯ13 ]|I۱%c69< oàͽOޙ "iX^+̉r0rk .ll}u. mj&+ˀVdBckbU(XV|G+[ hdLfA;MGT- \dT"S]{PZ*8E?Z&3]n뭖NM /zh)Hԏݬ<{ Lk[#BvAeB;"8$sÜՅ0 6uյ~}V,!*Wԑ!F6N#k%DIh)cr0' ~i iWX;e,ޮYse{oaiܲSZې(B74¶'1'F' @lO+ykTVxJu ,xԽ 4X#rQXɴݟҡBd |XY+ OB} o?-2f s? mM6Vmyɨ+SZaC>FvV|;䷏\!7d`rV(X^@SA vw|=d zEz8ђ$[~7ul% Ax3l# n IG17G3uW@}Bwl->d Lhr $u: c[A|!cXQN}V'me6 A0cJ~ҺEv}7\Po! $"mW֢AQ5'Ϗ.E˸m+cƂZ͂,jm '"^!tL?V.@Ci A@)c-p}>̧|nd.C)>e n6xZsRmdg L- qH?uL>̤BkX@d GjS`SFZ{ #On0Rf\ڬgnEnU9mbCC+9yNA,}hQO ަV\Ju27/ d9KWKTYgtE=@a@@}bhMmu%*=(N1NJ!ǩn9ʶv*1 IpQ2O^=u1.Y‡9/w7' ޱJ\.鸯ɛ+"lT֊OC_&3.O6t*ɂ^2ڳ{bc̯X'q5DK+pS 훭0/Q\$ME#TTI7y2EB bXP6FQ-ػ`jm}›Pbq/F)? + 0dMǰyՙ8 ;Sʼzkkڵ3 Eֈ,)PYO ('ll0CW}wᰙ[fd!ptSIa2J"lޯU -O4ڮ]YOPYsLz* F#+%>J|d)0'ͻ3& B|,I)S)Ey-XmX^T\v$;&7"Lq 5en8+Vʪ0lP`)hy]>Ju&$ Bb{7eκ̅ ]BC'n [:N ߔy#D+kȣlըORyg棾"H DHsL2n 餮B:t{0@S9Rҹz*lãU%% 6RRz[-=Qųkj %OMsl+ W&:h(+JRA`d̅D[J'.6(?E&,ы8en[z͹4e$4^Y;ᒲ~XC}FeCeI/>֪E$5e^ #}c`JvX)RxɆ27Bm>,~-:<the~{~Rpҥ;#%'MݜCerkOYʘ*qgHjAϋP6qN1BFK9EL3vaEUAnͽTlL-H2&7C[NAJ`8mⰿ3{ 2 JichbKs:KI)P'zppe}FYL u&bʒ$d .#LePRT!K iJdK5WLJD)(Fl\;Me'[#DXܕ\eIiA;)c[qR9';F ` l-SLP)/1G9^>ŠWRI o ,5,5XxKLqP#sN8+$DM N#Fe){NJz(uޕ2BeF_ 35*l ް쪦X@3Sb4çd@T%&qHPL$P0P)L5"'§J5tTFI.&snD!wiXM{=WggmJ"SY)̒eӪ/Ƞ YwI)8PTup ٰڧj 0 ݅5TNidRY{!j-P %)2U)(]¬8*#FlҵJh!-ţ*ʎ9T%+xJcu!r)ޗ`*s$T:!*sdL&*?yIT^ZTX0B)LjU-$z*f0-E2Sokʖ((%*1nTs1^m|V,T[(b\v dZ}) K7H8y}&[(]Rv蹸u, Ko,q[YBa&okz 7qWclͨT(P"^JBc^ij2EUUC@0`Ypbߴ ²!1$awQ0̛M,2[l}+hӅ5vm6T9ub5+MXeF[fbE0S`,#Z&%g{Ls+ _AmĸX޻< [6`de TׁUyKS[ʵMWe{E|du3~4H, aɒ>u/3@ [r/XUN0>XYtDAVCVcUjGuW$lٳ+ Y;e9պpܭ+಼ffdܬrv!.b}&BX ˱#s*QBwRV:W/pYz[ 5e#E岜6!:UdA(<_ףRbl3|+˶cHvUep˽!J4BV?ѠV? !KHo^ÎXpCt/$eĄ0/ev҈eyEk k2_p\ ڵi{׺}玂}I]vCvW <ē?sn%sK,^WjˀsQiԻMDl׃RRN ,㴨`0[ޝJ-8n_ Oqzו@ĊJ~mhԵnl+Mq>LRٝ|Xm2utg'>laO(Nr;N uLJ- ]aJeVFѧ1E*.cM Ѧ{bj \0_ځ>D\8(U*:PY3܎>H;m[Ӓ)k$=J`1_:+\{; gmZ4lXhwx\*ʰu ^>.i63P'V3 Z}Rc UJnD{zjԜjqu12 j,RknMm+=[ fţ=.{94řggk(_gqge IT3"'8hm%A~G ulkoLw 袑خo DId-KTyDG{k0̥3mbo*yl`gRiN SR'9XȲZ@){KPxӠo^VUM;?][R |hX.sk(ᣕ3/OQ.*?{-W$ZQ,3eB83Zm"R$qG򚎡3?&eFqj1Tח Fk`8^T$h@ḣD9cUJo=XIђdr3 FF7#{INdijƭJXVw5}4pFJV}8e;З2MygҘB [5ڶz b ${"u* ;=Ly]` ȼ#t Xhm`Lb*M$NnZR]!ً@ԠmyˈeD}(J%@_c}ٗ Ѹ jW*>=?+{*i >_j$lN(JBGѳ2W~ AA>l϶:~~x:+YFѮ1*7li_ cʆQ95&m6܄VS/,L`Tr˳_^R  F`1*pKnن+=|_<# R/; q&(˪j.; j LW82[eB!Grʁzt*Ih-Xf5n]rKoߘeMɍ!"GJS =z>w*jP#2)HM|rb9\)JJ|YA%ZS R&@W7*ˢ\e'K ei*Q"CQ6h\S $nfFjuSƫKPb̜H kml?ZqJFж^]|φ. lFY9TB+z@pȝDV*6q) gM>&GW&*i~Òŕ`.E*2HY`"JTi*BD݂h8b:)M# Fg?c*\]XV ه\S )낣kr]qI{x_m.=]ۥcu/,lWfu#vG#b%pdg?a,CjMnY' ]#]]d'j`QT ͆/:a7pV0l;tD!1}_z&TnjxA\|uہÂݣ-KaFbʑm~!΁i5UWFCr7Z<&k/Zn,/z*36-_De!"\c|3fc ǩ|RܙbI34(N_u:#keF',[o8tA*K,3hKǘ~қwcq!؊7\ J (~LJi^$~Bx[gސĂQ"+RDǩ/{8 nѴ_C%})GnV!Ke(iA_)+w#KVuJ$Yo'DW y% cDJ2.o+XcpY0 _#[mשn R_We*ہ}}Yx/ tXkIN ;Zm-D1*e[Ԗ 8Eҷݵ蝤lw%=6hI3DdM!ddp`6?Vq`+8^z+ Ѡ`ؽR0K"Zl&xҀ_cpNtpz6yG #مA~bXiaa#]S=&UxXoBpk50zZ5J0]x)ob HH:c+4 P,Q&x1*>tc*z8_Yfl붰`RRz[1s&L,rLIRta)*^2EMQ7SQ]`Zd)Oz>XݶZXSo5ND{ɧë޼՟aƚ߬zO ]/st]OFض@ 5AIEQ)*=Jj 59;J0'Cte:PM S ̨tw[[ɘiY%I75z(.I΂1SUJ3 QQ\dAMYk"pƿ,HJS<8`t>nJXm!Q<ɞ6*΅9e'm%3p U$w٭Ⱦ;!h@J7 <)E+b*KG(΂p-* N2nTkkFQk5jZlޫ\(4_&P4}h̽=fn6KwG6Rj}L<b4VN݊F昨D.Z^QăUv& f"SO2U;XM5U%H9RRz3떍$/P%[Tv cOAæ eUuVe@ВaSٜARN4@QPfc:N) +9/{eqm*{uv]׃R7Aa wIR,MbF (sR0x'ݞl[2;NDd%Raۭ e[ ZA`|Q @`).b%-MD V0bQo9Aޔ"5#Zx-aцD1np{NWΨ$"Bn џ,:)Tbv'b+Ru'!68cl"cl|Ĉ 2B1w^z26Uv ϻz2fҹ J opA֔bҌzGLѢT~dB5=unD&O)X)]M$lcq H'֣A5E*a̲5$C˜}z#5wWQ˯_ (6bj2_XsQc]/(^ ]b1u ,=)pqoJ&G`8l-Lyd]8Q&}")*ўp'|栃i߄Fxbbvr@$u(\kqƏES (VJs[ybNkʹ_HRt+~lAO&0^[')wڝl._W;ᦨneɎNnM 1arZb~@MY§/(k~8C ĕy gz u Q%\OA&B4*$̖%[ئXԈ\L)DX) 3E[wV E*v|'3]e]'^(XI&\з05$ yo2ąyf@g} AxXxK&,*Eaذ':Qfa6UZmзc-'ȱ84a"/!#ǕTXfDџpSre =@Fz'9;?Bv h`]- ru<VYnv2Õ%@DWIx'D;nGˡ`Kfl],0`YXr'* 4`%ҹrDXWq=Ǫ@jX5WbɢY`Тk&S%)Dm'gkK_GT_~߲p}M8bv9ޥJ)DW9Nz\ehů(\fJ2X4H&JL+R!6V&S wH!&"l plY}9{\) &W9CN첗 wVqT{ȋ(LM4Dx٭ "ܘ`l5 S VJoWTD}2-WEɔ I{!)DDDXR,[õwBw+~Ba(3  +硉A!߫$ϋEh:'x=M䇍zAUR`n`H¦J MY%⫤K (N_dE1l"1̼= gk _-~-Cؚ)bTaLMdMd(/m^ƪ1ks&i"Qc=e+C̖V5pEhۋ+CL)+7HRNK#`+I5R 6Uey䤁[mJJm| I܀8\IΚgAOi0JH&J 8א55M6àFJ {wH19KlRne(fg`Ҝ)V6j{0 8c{7r5ŕ!(saa{JԂQF)f'}%n-Iul:qIY^bX^b [Ƥif@9sv -2_1%%h׎Y(aEөm{DO>qfvm+}Y5\}NJ>(vԔwAEw QEݥgv=̈́Y_n6"Bo}砹+PFټcR,VGTy ,x*^t0S *QBҕ7{ \$NZYP\]XZ[q,?PR+h9M^5sI&exhN?bQ[d#,MѮ;Tߟ(pfˠ-Mrk.}^nhK0 JD处*,5SR[D}.™bɄg#Ta(\8_6ta׮,_3jdg:9SWxW/,uWafJ`)#>_9Tvxߣ HfJS]9DGKn(RT ѕ*2i:Ly]?.>Q0,%ehãb.35O+ۉ3&w6Vlx]뙉mڼrt͵`=>+s+dtENDz+}ݷ¼vl`̭2[.C$֍7{oRlli b@(jLX'*^sE{ Ls}4_ѼV\06H^fU{e(>a؇f$ysUJ5Atjef-t* JcB6J|0m՘ Ac6łQ"wҜVd_WU'o(&;EI*]O|>N͟`-g T%)PW) @.Y\cF4S>bSR:2s$F$kblm=&lm,K[@v9*7'*w .HЈ$8~ШSRfVpE子 ( _J84+a*-햻\qf ZD|S{NJiFe$W͒XjoZk&rN3"K |Dm.'`]3a](rfšcWNGZbPvhSdoj̥GkѺt-gG")< E-EI벞/{*( .(%򂷀vHJN7;0ΖP1hL|H>b @GgAR -vR.I~~9Kؘl8T;yNyR/de kZV7hC٭Gk_UHJ2liA k+~`а4lWb] `zyջ6IPa'f)LBI2zV(r*cSЯB,/G;-nٲhHƎ.8 `g-PQLһk2ru?q_rF05&EmHSR`ɂ%47^4z?Q_L4wK/_Xsidu +)\^'Q,OdY1^JWIfl.w@\^P Q=a(JX^3Zϕ˨69*x/> r| |f?ߣ[nSo9+ԘCUʗ0]CIAeHajMwP\lOߡ*`55YT2RlJt-)LW9I P`fqC2^63]^ : j/?/k/s%U_^e=lxql/J I!lC^#ľe¾bAΆ"%4u4gJXKsvCViڥY6NQfR,+M9ӻ=PϖezÀ9*,5[̮ͮVSWHmtPmttd[ۼNCuҥ͙$. 2Bx;@vBtDtY˃ ۛIY^{*L]\}B jr2kAE|n\ 5UBGx-9+=="l)H._*'HDry+wOLc7BrY{Mceh%NU@(WI2}ь?KC! =')BLB-?Xg&)4ByAǂ_Pʓ.reZi]USh/Bs dK>ҒZ^k$Q`M y}~V< q":JۣmD֔ܟYJs BXS{|sLHԏ O9nLr)-EU8<`VIܲhvA( `(+B 6Ld)gWqBO*'0`V Cϟ%pʳ!,VǟG3 LOS ەm^2odhYe,-SS`9ěpqf4 :گN-~/HhmMo&:oҨs}#Z0+M3P%`u-<VD8wlj¬4LīЯSWpQY'T#>S fϰ)y?Xzr"+]/I+v!JI7ŝoar5 g{Z) aˊE;e(-֔, CFX՛Z0+s#?֐+I͛WJdUbYm ؤw֨]%l"% V@ЋPBsWT+mk'I-|(鿜4y=5'S 1-g04EfF4ߨ態bMdYɱẙgw[,y*׶6ՈY ( ,D)]]|OzfӔأZ)XaH@7َfM}Pvm`h&ž͖w)#@DJիThE ҇SBц'xֵZan ^ 1 45DT䥩~w,kn9P/0ޣju23E%$Y`.R0BnQ¦aR@^`°n^q@g ,o `-opCeuᢜ-aiF\Crc~:<^)NwKeGgj14g<ȸY<3qpTzr߹EH*I( ;BQ?)ah*aώwg"lJj.n1¦`i25"rE]z{l=n@) Ϣ69T5Sp5VÝp @getQwCs&WJ&xj"H~zk8eTұŽ'\X]Wi  f7eǂutVڵ?D5npXu/#N6]=pFc4ߴ\apU&}ɸ8 x'~9``s#.>{Vc r ^"P. /`rC4Xd/O-F>gQ'@ry+9 .J鱴_S}y͒<L)8[()P`@TgM$$Lnd2N,0uQaz&.Wz[-- L]4oŅQr̶,/Q``M,TǬ[^9= Lr`쭜-N(Qkj3h_+V -,0YH0QBy*p"~YcGIƅg)Q^&xe68Mf˼xxCMq܇o~ CAzX:c9l5 V-.e4ߴBq~"0WJ%rl M݃W?.\du꜀M`rx;mHxYgRAj5rrq6JaW{`^m4 PXa<=}z{YV s0`!d5MM+T5xOqsXS6JYd=DQ6DGh9³K%^wq<;eUuN m 1{br~Cb*̳\Vj@WՁZT)^ՄKh6) w*1GNם/(D)*~Rn^9FB@l GBM`|opXrop7DqfSLE]dSeD34z!R.ygM%,H˵t 5ꅳPP89&I_*DuԂ|Yc cښX/dL= K4”__a_?i5SS~y B2s-.#g  b+VY2B~MD~٭u% wHm!lk9VxGHX% k<KA:k%[-Wҋ,e[9[/KeAJAOT|-04I.x_Ғ<>ՕS4XM-DXX"e7w[nd@GK -o/|$L'r&6h(_)_v;#[3앪aѾ2Y n "tοf앢Eaã-D ?}*/rso~FV׏N:65@g 2n ߈ԚWt\j,Xe->pt?Gi$&QD.wZo"#*ف[_@01F5O*3ޝSgP>o'&ɘ枳@8dښ*kނa@;}̜GQ|5 ]b->D_"^YbP8ܾG 珅jMq2G&k]O^J3)IbK,jµp^k1Bi<Zl ~܂{Y\걤% iM*%j65,xB*=X9Gqhҽ3u{aĸ7\&/w`ljza7;mz`^kxqh!f"n qO7rZ6+f⠅&-}"z}| LFOSG>ѹs[/+}L\vm^Tw.}BsU 5܆D 0l^)JkX-ܗ>L8h N yI^x*<6h_Vxr=jbI#Vjl,0!| /wT`k 5 9KG,igM?ś\Ge'@-Sįu& 2svJEPyN (v[ d1ɓ$Jޣ*B~́B @16ư\B%G[9_pewK[06lFG+k&Kтr"y1Y8y  UΗٽP\CqayHܻ_M-0D"8-yV&%Ils` NݣZ[Da7fVZBG-x$#+i -LDKrW+kQz 0`ŁEr7Mmh=_νQDOfs2XHc^AҾ|6S&>-L3pu5_ hE]XruȂU 7`Fc<0$5=u6_9j-L3rduiYVϥ.y`bοVʝ[D0+A_DV?kNut9Y"$ٙМSH&UI[!dk>5 fϾ|t%\7}J㇕P˄U -$H0LyQz" WVJ{흼 Z'"XaMծp`=c/-y!o# K?': W " i BJ"aWi/Xm&0 咾=#IG'mjaS/Xa&@JVa鞬-{irlֺ^dxnwnĬt<, dğbv:(qe%VmPbs@ŒַɟWĦ<;Ybb,D%6%f|86oyMą޲ą!q\J֫ʳk`]`:BDCvEdW$XbrSl0\9ǒdv"%,Пܢ?wɣMO`&= ?׋~6:ƈv:b-Z[PsF3GhYiy}G? O=zn0>7X0ꌃH3Gr.+:gh/X b3b%@Ẃ`j CzNjH]fnwFڧ8w46iLC/%;#qJM~lq!n)k'ƌ4l+͂"A<<_I_ř$z'=n0E;xE*[ 2+}MR;Tϡ7&PV,ƽNo`!NOdtPno C۬ifnj!v4cr5'Lz9Ӷ,wǀRg4bb ӃD] 7`WvcL3``&GqV3*bd] b,V\N8[W[X`[X9beVI=~eMF_Ȫ|W X gy>΁T+ rozre0%rJ~4j`yu^j-!YOծL^c3cb+Ys"jׁ3/X*Xj|81~5SI2l?0Hbtr 8]uM= ]2EZr:_|;D M]N-3NChEo`v[}vevG6G\iEIϺyJRA8| ](6~5% l2ԌSa4SGٯ~Mz,FHSʵ+bdnGqO^c:,\̱豹Ҍ1gLtEAc~nƬ4t5f>88`&eeihƐK-pI+e6/,93 +38ve` Wc1$>M|a+֌]-}pcsFqTl>39Hq?Sw)&˨# VKEtad_MAIܘ\ ܖ?Jn2( WlR֬E [H =CVrz*Dޓ>GӱS av5*t˹ V^7+f1siaĬ4-EΡ}8^ź1weQ"|uz%~mEb`i4/ dId-CoTfpE:%@a*E$&=/|lqr€GʧE^(>tnG0^Y;s=.^לڹ\yZf:`8/k UlkߦrmSʊz}#qOU'nJ=.k{QRM`鋰qtiA4gg|K2$gpa Wv Kt#hE0XKGV…YiFjCZ{gd5͇Ro/-\fCƶkA_.d{u*҂YX"E BRéծPOKfĉ?wbi0_g`w5[%XaHݔ%R㫮=k/Xax2+J?;yvm?#O~Ի -l֪٦E[ $YR48k)ꁋP4OX-/h0v{I»wBR̔4?40!``?cm0H֞Jwgx}1Ε'D Wm~uȋO۩}#E[E]'9L #_i!N >kL$GU\jo k@f+k>˅ T;S`uwBYig w0gKxC@>'`l\`K .Br&{*'jG Vc. y. dqNֻ8`VXC7׫]~i[KQ,N ƒ-ăᬼ>9ײ㵞1 ^E& >}lT[ΓJ^dR]Vb?4 vl-*ދ7_z/-8.[\Hބqjl%HlEqK l! o"dܝW8osL">Jqi@ 5{t}}JUh 0`C Q6^k501`FG,_%EX.tޕ _VѓD9])a5KO:;ӹt(iKr1*k] +{& 'zs~=i,DH] I{8}% 7_p~؛AYuK+DNt:H`aj h ީBI铴vKC G?쨜䠠HJB}aOCE+{3W@׺!k}T|} ȨaEu ?mJ\SYR&:ԺN Z/fiqqx(E\ՠ}ɴ k >.;0٦/F uفZv:`_j}$vdOc2ABRbPrT/}wa0Rʶp_KpM>: afb9YLlRZj}GYQkז6 uOc\>1.ص̴ ز~u"(;d0^$`u"Yca j$Ք-YB--fXX=.nVcv6({UR }{dD^Lt4˅ k v>9% Yx3!+;+LyJd/} 7ʺT VȥҌIL@y_79:,7y_X g} <-8*:YZ%`_83RĶe ^;e s}Y^&, V9-/l6H %{ )FMƀ_ _Oi~fK^] :(h12pm`2 Ҹ+2Z#}ac!{Ζ}-An5܅`UB 8cvwljGwn= `JK^\)ZD%^$D/dQi9LytkI j3ZE.z=aJ@e+.[ѻGjowzWv݅˿%3.lpe*: &V5<9H,촩ޣ&[KQ yrƵ; iZptC. %0[JuEZHR>-$SV{yi`s'KPtTxK͵eaS;]93Lot.Lⰻ6R.6_% 9^ F"t#Stu*"r-'"W@PcZte/o< @Vc!ADJzDr¦9ZHkeyHP[6iBAh>keh: 9GnӲ-8͹S=תt+CeyRXg}Ʌv׏7^¢SNIS9N'KEu*dm4|Ϗz>JwzxkG? m=K~tz!B6Q%-bf\H)ڐ͇p^)rS:g8 >CήAf~Zy\ύ s4QJɍoҚ$yT.,x:>Jx;XaPe*zJp[[.+M ;l.xUN"Cwk eGG)) 5|(~[(W`][.+ͱ QOm S}zr+Cbv:Dю;iM{RXjHn,_=yep5&Y>Gs*ثΓsw@C\sIuKШSed~<ĒCI*T>1 |'2n-8J8R63m`@N1 i-hZ,,.C-5=oѥ2X;-;츭/J0k  QNPQrQڂqq! /SM⍑%)vU:88.iKlpZ!hq->&7;(N9xXZ[|.+}o9Y,(!*%*]E^ UøkpϚͲ4dXtVDtjqBtV\\嶤泜ơ20`unmQ4#]r'rx]S]"lHZ[.+v4lE3mZ9E%Z- .s3y!܊Ie`^[V='!KTd㏕.c,X)J=2ɔ7r[Jsȝ-Do 4y&*CBsDsᘾdROZ:G4׬-2J29k(>Ql~U㻅Zi w%Wo'+udq'mV 5^Y5 @a5F¢5[Hm9>ї—}>!4 /=ۻRc|M!]uNjJceGjLy{X FaP9--T1k Fl5e7ldjj"pm14ߣ[霐@Qhd!zKBW&-g/払/KO*\Ml>Zk%.[| %mrX+iȥi7Kr_V$;. +>/XZ85p^@is^YI7{AIr˿Z fbڼ]P;B2$v^2́"knX^ۅ;娞oċx@[_R6lȺ[[P/+}Cꅤe5nz5FsQ}ma4='a2r?ztůrf(I [-pQc* laOD_\ bbX2-l.$?BqOU kNr>.I'k vpK[zeMhZØWøZ O';.Ø.IsaѦR+Z\\/8phkj F2 -d/XjԈT/Nr.j#a]94!߲x]R\0$e`Ljapxt9DW^ű۷aGo}V<1b=|S$8kߨ߷ c<==xvO~J NȕKJⵒh\AqBC5oؓΥ9_ĂU;7-n.ĥe=Mn׈LϚ7Sl[Appqᴇ\s $hX DDkKXH:~ Ե@]N.@>ԅtA< *Uq$';*k5Jd\)C-2d+KZ Bdn+ѕ8]+9]HѨz ʚ}@s;~-,.JqZ0ۂ vZK_S][-+MW={@ւ(N"]w2˽ZIVw$++ovE\^o'/*S'ZBcuʴek F agEam¸ Zk V<pvo65 s|iZl5Z0`{bkeor Otzl1Q[g1P[zJ`(x:{lr[Z- {HXH'i8.Nj`"SU>#VY[x+XxTvkwYk43rkjk0ޏ=3 f&wobmdm][B"8)ues\ȵh[kж.Lh["%nK7QBroa\\e'e%E&Ky`ѢqAY~rӼO >+bqdqTږ&lNvgB=Z~19\O=Hm۵|卵3(۫LZ /ǣb lKp.]hy蒵x[ӱR ='D 8D\Γc<[!Xv[ݙGe]YYW|yZ@\|Zimp]ȫ9:[Vp [P8ksoxkS_ZzM~&~kY̊8LlxJ_jo0  .o# =s Ap KaAe9n҅r0d$d [+![ة^lT7!}KS6\.TX;RZL^q-lN(OjmyvƜqELJ5H[XɔOV>aKWwl{^<ޤ~5ﹼԚ«^haFW.Zj.OJ"5e΂4;AG ELN"yK%y _7ot'+M2ROd@&8*A:-JV^SPsSOq V*y^۶JO<8Jii9JY2Pr6е>?Y8Wb(JB^EZ.+}ψ9Ē񱼈(0~-ܱ)] Iba=I2la+7~ka4GR&9@Qu&oeudԿ~v-lѼޣ8ɍTF/qc\VpːPwR^'Q*H:@vV#07Y: +|6͞~MR13Js~O옗Y{ҁ\I%&9Q.rZP.+}t 0s@r5ĜAF2UO>i ʵ b=?6)'UCd&*sׂrmrK,ƫ!"mkAtW7Mіw Q׫6JcE/Yz{YN'^ōwq՘{Un8"))\Bd#oo->z3eYS!k .Z.+}<:v$ 9M V`kѺ6ҺpvN1rs$s ݹRo-8f\OS7$5or7! -Tk#ˮ%4Z,)Go%+EH³k2(+z"tYix4aW9]|rJ/ᱠta6bއǫm`jJ١Tj8.\x)[?. 4&;-(]sc^j}s[goƁRe#z1¶r`V,Xi6)(P]^s 2¼ HƔC*#5[z=D!X*u)]mk#m IWa[:]rmZ,-X\5{6Vg rL^d(nEƅ5yt[cMlr1fw*ugj^lнo)zsM.ߢ㇟|k#|NqI`7[O-Ɇd##[Ao5h|qA>!ӛ7)Plw}+bomzd 5 鞆780^$yU-6M }+kݯWlW j kj P..N=ZT'\Jglى%\ ;4F]uW[e2Ÿh]F\,jweopLaiѵ6ҵҵ,@ݏ ۉm^GYĪr#m^E&ld ؒƛ+c^k#^ O. {DӨjzܶ<["^}S":m;uhtZu%aQݺnu0`j6&l!|^8˵A5Nkmk5T_  G2Y&W)Pt o|\݃b՘q#U \d- rʆU-^k#^OuВٰɁ*Ւ58RFN Q7\IVZ/USv|bo褬[V޶k]b~`[@nm.)EM+seࡻRnѵh[[ж,ߛN:N_(ϯRTGaWe--31.NɀۼNkeUq W@n8t%\#J^:[V?|F>kz*ΕzH[I[~|KIQin]9^"5l[5Vn+I0([:(<0-wo7e,S_0"% ^9z?n6d0%śɓ+Mf0sM~8ο|Zn[ ŵe8 |E˕7?\k#KT ")^K5#pU˽k#0r,8YZIOz5?/D[ح-[؁ȅC"[eY [[7@eGmʊNT O14[>5Y\?j.YY5bsa4zRE2Z,,.azcO+82zM\,A ŵ2oP L4I,E="'D!oZ*5ש򸧮d,I'8ħwMSr]Dߪ:L e'}$#[@ksΚ{c5֪AڂomoTvgLP^+%ࣅڈ޲uBV6A9;mtC-̌{~)}zk#z GwVyw? ^CڴzbghVc}U ׀߿8.+{r'%^ >m1jqbsZڜv继x=0Bjjk3a~c"jPXxSTOduJ:ܪ촳 g Kk7͝,ZlJڋT(j t 0٦XDCQ?@EnCBuN')o~?|F_1?~LG/}/???~;xl~q4_PK!!OG%xl/theme/theme1.xmlYs84~o А)M6q"[I$忿d@ IWyH~jW~JD5H/[ U*2Vt8!JC$+7NtAKJpN`Z'*eP/EM+|72?$!ݒZX J$q>g)%SC29]s|2 )74 vXlhZ A>o:!e?8i6qgob?;fC80mO:W.n< = 4EM,>=\@.Qxюp78vvǭ^0[wwh U TpV-vơIC} . ?FqoQ 2,bBN`4^t)Fʙd` [JΒET*YəYA|wZP9"wt&cZ v@#ǺVc!rg]~ d)R狢 BQ\^ɖUg.>6{qeEgb^q4䴢wbAiD/vdJ5X$S6JwDb:\~&CcZ hE~Jy`ƷPHNA1!oV2 4z:\qF(Q_u%_!Rj|BsPQYU?Cȕ13<ό~|by 6@̛-a>2XBW{U3,{Vΰb~ۇVsXVWʞAU~?_m%"lWmMpѶv.ٌu_&3"⦀ƶbrՐi.qޣm$u vC[> ;vZ3:21k;-TmEE1Pm2pW5\XZCm43vw-HGF]ֱvkK&o#$a7!)ԃd~-k2o;R-]?6\òA Ucf}.\G hеt>ةR*ʛ"#3׀7dLm+y!cm*,MW2ց4֤:F䤵nQ٭rOWŦ3Lsx7)|$BB` N$^ځт oHIosMk5ˉdxBRzeFH򆐍(O\U;g򩩁=s'Pդ)w?&firK槶;p-^}(G>Smw'bh|}Q[= 1c2SqkF xS ]ya]0Raigot7|1K}7Y.wO3vc~15&5z?Wt9^Z/V޺ᮽ1sӿPK!Ug3\I xl/styles.xmlK0#Mqd ۲zmmޑB C4yhA ʌZx: 1bWM`uTUThR|dg?$sʦx\$Ė{&)84ĶKR( ?Ia)Hj^6(l{F\>6JZ07oF[] k^Q$&@ʒZ+gQ;V/JP?*KOJhdI64E<^dٚ ^5\u}EG;!?$>qp q-Q"KDBqazF w%6tϥ('UV;fW[/sP,8m§2@S2!þ7CT'sC"DHdްk~7[>¾ NW?gDqY.% 8}q^i'|Uꙿj#R|;ܓu.LPv:O&*X!h4 ,Z>PU_ @F=$,ϛߎƊ| eQJ]>GE. u{G@E4;fQI37eq3R#J̊ƷO; U90fk*1){\87]#Q*N]`mcPK!-1%xl/charts/style1.xmlZmo8+@h)j*u[tV&qRo-7< 3܆jN#K8TZCW$X]$4BX_"EӐs'~YP> "RaXku!䤘#a0KO0ȣQ`Rtw /T};b+ᅗuoE1e&$qLB]W0\HXI'f/fmW`T{A8JgR1r᳠|;S e2cXy.a)*(]>nu>@VJYOnMHzuHeÝNm_k KH5tm/[ ўd(GxSd,  P$@P*I,qr[ɥ.Pox|w ḾMfOxu6i/8_V6j9kkDR59(K(nr\\%x>VGy;%mk"a,!$PuܜRИR,7? , @hH2NRq'x47o,M:xNHǎU]HŒ߁9@lM2!<:OK9-uL'0|SlZ\>TG^RDRNնQg6Mi490ϱm%Tצ`ecɜ9aKj7OU,wo:}PTcK4f@-ԣy7[J>@qo@]gTZeIWJMo>uzs^玥l"[PK!]docProps/app.xml (Sn0 ?7rtYna$ΪLBl/׏Qiݍ"(uu.LgHې;g *xP\*"9!PIn}8n}lK>?ޱTSGbMzmԎ`Ew"}4&k->U57;8b75;VBwwxl!xZӤZތK2&-:뷐?.t0P=SIN翨PK!1PfdocProps/core.xml (|QK0C{m=9P| lD{vsq%PW+QZHv ()* GGhY\_e\x6$޹bljf#P^,258&cHD'#4UC5(gq2qw|GضmԦ} ?oǗj(U+s~qnw\Jwb-V.x*K!Z04zha |*:t8+f7!IC23J4}rzߥ.SanȜvgJ<|ًQ|PK-!bd;r[Content_Types].xmlPK-!P|NL _rels/.relsPK-!yG xl/_rels/workbook.xml.relsPK-!ۮf xl/workbook.xmlPK-! !A xl/worksheets/sheet3.xmlPK-!H՜k -+xl/worksheets/sheet2.xmlPK-!p;xl/chartsheets/sheet1.xmlPK-!<+$!xl/chartsheets/_rels/sheet1.xml.relsPK-!D߼%# xl/drawings/_rels/drawing1.xml.relsPK-!xl/charts/_rels/chart1.xml.relsPK-!V2[r, xl/worksheets/sheet1.xmlPK-!n1xl/charts/colors1.xmlPK-!=,2xl/charts/chart1.xmlPK-!Kr~:xl/worksheets/sheet4.xmlPK-!!OG%xl/theme/theme1.xmlPK-!Ug3\I xl/styles.xmlPK-! m;bxl/sharedStrings.xmlPK-!&%Muxl/drawings/drawing1.xmlPK-!-1%Fxl/charts/style1.xmlPK-!]docProps/app.xmlPK-!1PfdocProps/core.xmlPKreadxl/tests/testthat/sheets/big-texty-numbers-xls.xls0000644000176200001440000017200013336631200022744 0ustar liggesusersࡱ> #x  !"&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwRoot Entry F9M$Workbook:ASummaryInformation(%XDocumentSummaryInformation8 o\pMicrosoft Office User Ba==Q,8@"1Calibri1Calibri1Calibri1Calibri1Calibri1*h6 Calibri Light1,6Calibri16Calibri16Calibri1Calibri1Calibri1<Calibri1>Calibri1?Calibri14Calibri14Calibri1 Calibri1 Calibri1Calibri1Calibri1 Calibri1Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)                                                                       ff + ) , *     P  P        `            a>  1      ||AQw}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-} 00\);_(*}-} 00\);_(*}A} 00\);_(*ef;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*ef ;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*L ;_(@_) }A} 00\);_(*23;_(@_) }A} 00\);_(*23;_(@_) }A} 00\);_(*23;_(@_) }A} 00\);_(*23;_(@_) }A}  00\);_(*23;_(@_) }A}! 00\);_(*23 ;_(@_) }A}" 00\);_(*;_(@_) }A}# 00\);_(*;_(@_) }A}$ 00\);_(*;_(@_) }A}% 00\);_(*;_(@_) }A}& 00\);_(*;_(@_) }A}' 00\);_(* ;_(@_) }A}( 00\);_(*;_(@_) }}) }00\);_(*;_(@_)   'S P}}* 00\);_(*;_(@_) ??? ??? ???'S ???P}-}+ 00\);_(*}-}, 00\);_(*}-}- 00\);_(*}-}. 00\);_(*}-}/ 00\);_(*}A}0 a00\);_(*;_(@_) }A}1 00\);_(*;_(@_) }A}2 00\);_(*?;_(@_) }A}3 00\);_(*23;_(@_) }-}4 00\);_(*}}5 ??v00\);_(*̙;_(@_)   'S P}A}6 }00\);_(*;_(@_) }A}7 W00\);_(*;_(@_) }}8 00\);_(*;_(@_)   'S P}}9 ???00\);_(*;_(@_) ??? ??? ???'S ???P}-}: 00\);_(*}-}; 00\);_(*}U}< 00\);_(*;_(@_)  }-}= 00\);_(*}-}> 00\);_(*}-}? 00\);_(*}-}@ 00\);_(* 20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L˭ % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  L % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23 % 60% - Accent3M( 60% - Accent3 23 % 60% - Accent4M, 60% - Accent4 23f % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23Ў % "Accent1AAccent1 Dr % #Accent2A!Accent2 }1 % $Accent3A%Accent3  % %Accent4A)Accent4  % &Accent5A-Accent5 [ % 'Accent6A1Accent6  pG %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 DTj%Dr2 Heading 2G Heading 2 DTj%?3 Heading 3G Heading 3 DTj%234 Heading 49 Heading 4 DTj% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  W%3Normal % 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title DTj% <TotalMTotal %DrDr= Warning Text? Warning Text %XTableStyleMedium9PivotStyleMedium78dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\`<Sheet1I numbernumber as textnotes blah blah!this row forces column to be text x = 2^31 - 1x + 1x + 2 -1 * (x + 1) -1 * (x + 2)/ %0}+ PK!pO[Content_Types].xmlj0Eжr(΢]yl#!MB;.n̨̽\A1&ҫ QWKvUbOX#&1`RT9<l#$>r `С-;c=1g;#=\;S8MklX(*|C:]g.Gp m2:ȍc _nLkjt>.&< :bo~PS4J3.F-r-{^j5_ e`B exw[ݞ_2|oT:=aW|]z^m1zl|oШ7(3},@)$qjghU"J)qN<[q*J˟TFFLΐIJ~ ^] |1I>rbXd[廿뷟߿>tu|' J>4vw?~_XwR4#c<ė,+fEӁWp]{؀Ga.|1e5'r.-£e2O.u.ls(1R_.@Zeac8‘9Ɩ='Ĉp5$#26 ictLbFRmeԶ0pc j!?Z \PL"HWDL1eN9&D@0A0 blah blah ?)A@@&D@0A0 2147483647 ?A D&D@0A0 2147483648  A D&D@0A0 2147483649 -@D@&D@0A0 -2147483648 ?- @D@&D@0A0 -2147483649 @ Px*Vvll{>@ggD  ՜.+,0 PXd lt| ' Sheet1  Worksheets@d8M F$Microsoft Excel 97 - 2004 WorksheetBiff8Excel.Sheet.89q Oh+'0(HPp 'Microsoft Office UserMicrosoft Office UserMicrosoft Macintosh Excel@ML@@d8MGLlP  EMFD@   Q  QQxPQP(x Q(Q fffyy\͑fґppyy\͑fAy.\pAןA\\\..\O\.\yO.f͘\f\.A\\p\fA\p\OA\pOA\\ܽp\fA\p\OA\ApܫpOAA\\O.Af.pAO\\.ҥpApґ.f.O..AOAO\.ҥ\꽂yyfȑpܥ͑yܫppppȑpܥ͑yܫp.ҘOAO\.yyy.fp\ܫfpAfAAOffAȑyAffAO͑AfOO.\\O.A\f.AO\.OOȘ\O.A\f.AO\\OO\OA.y\yyAfOO..A˜OyȑpO͑O彂\ܟyfןf\\\fpOyfןf\\\±Ay.y\AAןO.fOyO\ȉ.O\ұן½ȷ½ͷ½ȷ½ͷҷҷͷȱfffyy\͑fґppyy\͑fAy.\pAןA\\\..\O\.\yO.f͘\f.\.OyA\\p\fA\p\OA\pOA\\ܽp\fA\p\OA\ApܫpOAA\\O.Af.pAO\\.ҥpApґ.f.O..AOAO\.A.fyyyfȑpܥ͑yܫppppȑpܥ͑yܫp.ҘOAO\.yyy.fp\ܫfpAfAAOffAȑy\pfOO.\\O.A\f.AO\.OOȘ\O.A\f.AO\\OO\OA.y\yyAfOO..A˜OyȑOAͫO\ܥ彂\ܟyfןf\\\fpOyfןf\\\±Ay.y\AAןO.fOyO\ȉ.OfܽOȂ½ȷ½ͷ½ȷ½ͷҷҷͷҷfffyy\͑fґppyy\͑fAy.\pAןA\\\..\O\.\yO.f͘\fAA\\p\fA\p\OA\pOA\\ܽp\fA\p\OA\ApܫpOAA\\O.Af.pAO\\.ҥpApґ.f.O..AOAO\.ҥ..yyfȑpܥ͑yܫppppȑpܥ͑yܫp.ҘOAO\.yyy.fp\ܫfpAfAAOffAȑyyy.fOO.\\O.A\f.AO\.OOȘ\O.A\f.AO\\OO\OA.y\yyAfOO..A˜OyȑOy彂\ܟyfןf\\\fpOyfןf\\\±Ay.y\AAןO.fOyO\ȉ.AןA½ȷ½ͷ½ȷ½ͷҷҷͷҽ.f.fy.‚fA\\y.fy.\OO.pAfy.\OO.pAy\A.p.Oy\Ȃ꽂AyOȉyA.A.pȂAfypOf«O.f.OfypOf«O.f.O‰pyyy.\Afȉ‘OAfܥAfȉy..y\͉OܥpO\pAffןAAܥpO\pAffןAAfffyy.fȂןp\.\A.A͟fȉy\AO.\f‰O.\AA...AO\pAOOffO.\A..y.AO\pAOOffO.\A..y\AOAfyOyffO\A..Ap.‰ypȑpȑpȑyyȑ͘ȘȘȘȘpAffpȉ꽂\.y.f.fy.A\yp꽂A\yyOAȉ꽂\.yfy..Ofױ꽂.Oy\ȂyfA.ypAA\.O‰pAȂ‘pOȂyOA‘OAfȂA‘pOȂfy޷\Aͷȑ.\AfȉfO.AfןAAȉyOȂܥpf.fOyfܥAf..y\ҘןpO.pȂAܥpf.fOyܥpO\A.ͱ.y\Ҙ\.fȂA.OA.OAAy‰yOȂ...Af\A.A\\\A.A͟fO\\pffOAҟf..Op.pȂA...Af\A.A\\.AO\fffOpAO\.OyffO\A\OAp\.AO\l}uȑA.ȘCompObjpreadxl/tests/testthat/sheets/list_type.xls0000644000176200001440000005000013172305601020563 0ustar liggesusersࡱ> #&  !"%Root Entry F7$Workbook@SummaryInformation(DocumentSummaryInformation8 #i\pMicrosoft Office User Ba==@=t'8X@"1Calibri1Calibri1Calibri1Calibri1Calibri1h8Cambria1,8Calibri18Calibri18Calibri1Calibri1Calibri1<Calibri1>Calibri1?Calibri14Calibri14Calibri1 Calibri1 Calibri1Calibri1Calibri1 Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)                                                                       ff + ) , *     P  P        `            a>    ||?E%}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-} 00\);_(*}-} 00\);_(*}-}> 00\);_(*}-}+ 00\);_(*}-}, 00\);_(*}-}- 00\);_(*}-}. 00\);_(*}-}: 00\);_(*}-}; 00\);_(*}A}1 00\);_(*;_(@_) }A}2 00\);_(*?;_(@_) }A}3 00\);_(*23;_(@_) }-}4 00\);_(*}A}0 a00\);_(*;_(@_) }A}( 00\);_(*;_(@_) }A}7 e00\);_(*;_(@_) }}5 ??v00\);_(*̙;_(@_)   \{P| |c}}9 ???00\);_(*;_(@_) ??? ??? ???\{P| ???|c}}) }00\);_(*;_(@_)   \{P| |c}A}6 }00\);_(*;_(@_) }}* 00\);_(*;_(@_) ??? ??? ???\{P| ???|c}-}= 00\);_(*}}8 00\);_(*;_(@_)   \{P| |c}-}/ 00\);_(*}U}< 00\);_(*;_(@_)  }A}" 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}# 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}$ 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}% 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}& 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A}  00\);_(*23;_(@_) }A}' 00\);_(* ;_(@_) }A} 00\);_(*ef ;_(@_) }A} 00\);_(*L ;_(@_) }A}! 00\);_(*23 ;_(@_)  20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L渷 % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  Lմ % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23ږ % 60% - Accent3M( 60% - Accent3 23כ % 60% - Accent4M, 60% - Accent4 23 % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23 % "Accent1AAccent1 O % #Accent2A!Accent2 PM % $Accent3A%Accent3 Y % %Accent4A)Accent4 d % &Accent5A-Accent5 K % 'Accent6A1Accent6  F %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 I}%O2 Heading 2G Heading 2 I}%?3 Heading 3G Heading 3 I}%234 Heading 49 Heading 4 I}% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  e%3Normal % 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title I}% <TotalMTotal %OO= Warning Text? Warning Text %XTableStyleMedium2PivotStyleLight168dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\`f;Sheet1=Sheet2>Sheet38var1aabc / # PK!pO[Content_Types].xmlj0Eжr(΢]yl#!MB;.n̨̽\A1&ҫ QWKvUbOX#&1`RT9<l#$>r `С-;c=1gހbFӳ Z't4ʥ9g4r PVV1ZWk ~Ȱ)RˌqUTP \@c1jl_2ZZ=%ؙgBYҖ  np(VV7;_xztF_PK4*o}/|o?/ԅOhB$zL.)O92711fd׈B\%fu=-u q,h~'s6.'“E+ wy>N*l5xf0*(3Bj=ԋ1 |szֆdB^!&3RqVHh j/NDNp܀a9^ LGq4)<௓G6lHY#̹~;ib?gPpU?~gƺt?KD(5iU Bp~K6İ 0G M_b_5׋2rC&߇e/:ܿxh*s~$폤I{]/>U[Փ[9elI[&F0c*)nY u' l TgoZH$sёD7õ5N ʞObCbugvxKR*2Bіp]e[r(kjiL3i+]!6'yy ф-Dy. j8aFf:6GEZLn3E23H]Q$#[ yEm-]'IuE>$KE.#Kd)f;@!κ1 R/1*T–l|NM/q8@&`0`dlCXoˁ6[;P G?d>'rǜJB1ghCu?3*0~ =m'k4e1Vhn<9oni[r-+z=[@#)݀ s` nF6;ZR^CQ/ȹo{0moNiHł%S}WkkrAsef͞s&JݰINw缃1Yw>)͆ib=Xv^#j*9KA'o4KeǛ8bc,7D-D/~ ܊- x Mvp ';hIͷN:jb};R`kˮܜ^`bmֆ2{Eah^dLbwk_|=/LISL>Խ?PK! ѐ'theme/theme/_rels/themeManager.xml.relsM 0wooӺ&݈Э5 6?$Q ,.aic21h:qm@RN;d`o7gK(M&$R(.1r'JЊT8V"AȻHu}|$b{P8g/]QAsم(#L[PK-!pO[Content_Types].xmlPK-!֧6 -_rels/.relsPK-!kytheme/theme/themeManager.xmlPK-!theme/theme/theme1.xmlPK-! ѐ' theme/theme/_rels/themeManager.xml.relsPK] #i "<=  dMbP?_*+%,",D3333333?333333?X/U } D,,,,,, ~ ? ~ >@ d>@ggD #i B>  dMbP?_*+%,",333333?333333?X/U } >@ggD #i ?  dMbP?_*+%,",333333?333333?X/U } >@ggD   Oh+'0@Hh 'Greg D Freedman EllisMicrosoft Office UserMicrosoft Macintosh Excel@W=Sԃ@7 ՜.+,0 PXx  'University of Minnesota Sheet1Sheet2Sheet3  Worksheets F$Microsoft Excel 97 - 2004 WorksheetBiff8Excel.Sheet.89qCompObj preadxl/tests/testthat/sheets/geometry.xls0000644000176200001440000017000013172305601020405 0ustar liggesusersࡱ> $v  !"#'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuRoot Entry F9%WorkbookBSummaryInformation(&XDocumentSummaryInformation8$ #i\pMicrosoft Office User Ba==:t,*8@"1Calibri1Calibri1Calibri1Calibri1Calibri1*h6 Calibri Light1,6Calibri16Calibri16Calibri1Calibri1Calibri1<Calibri1>Calibri1?Calibri14Calibri14Calibri1 Calibri1 Calibri1Calibri1Calibri1 Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)                                                                       ff + ) , *     P  P       `            a  ||>]}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-} 00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-}  00\);_(*}-} 00\);_(*}-} 00\);_(*}-}+ 00\);_(*}-}, 00\);_(*}-}- 00\);_(*}-}. 00\);_(*}-}: 00\);_(*}-}; 00\);_(*}A}1 00\);_(*;_(@_) }A}2 00\);_(*?;_(@_) }A}3 00\);_(*23;_(@_) }-}4 00\);_(*}A}0 a00\);_(*;_(@_) }A}( 00\);_(*;_(@_) }A}7 e00\);_(*;_(@_) }}5 ??v00\);_(*̙;_(@_)   \{b bc}}9 ???00\);_(*;_(@_) ??? ??? ???\{b ???bc}}) }00\);_(*;_(@_)   \{b bc}A}6 }00\);_(*;_(@_) }}* 00\);_(*;_(@_) ??? ??? ???\{b ???bc}-}= 00\);_(*}}8 00\);_(*;_(@_)   \{b bc}-}/ 00\);_(*}U}< 00\);_(*;_(@_)  }A}" 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}# 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}$ 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}% 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A} 00\);_(*23;_(@_) }A}& 00\);_(*;_(@_) }A} 00\);_(*ef;_(@_) }A} 00\);_(*L;_(@_) }A}  00\);_(*23;_(@_) }A}' 00\);_(* ;_(@_) }A} 00\);_(*ef ;_(@_) }A} 00\);_(*L ;_(@_) }A}! 00\);_(*23 ;_(@_)  20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L˭ % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  L % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23 % 60% - Accent3M( 60% - Accent3 23 % 60% - Accent4M, 60% - Accent4 23f % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23Ў % "Accent1AAccent1 [ % #Accent2A!Accent2 }1 % $Accent3A%Accent3  % %Accent4A)Accent4  % &Accent5A-Accent5 Dr % 'Accent6A1Accent6  pG %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 DTj%[2 Heading 2G Heading 2 DTj%?3 Heading 3G Heading 3 DTj%234 Heading 49 Heading 4 DTj% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  e%3Normal % 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title DTj% <TotalMTotal %[[= Warning Text? Warning Text %XTableStyleMedium9PivotStyleMedium78dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\`;Sheet1= warning_B6? warning_AT6]A warning_AKE6IP var1var2var3aaddggbbeehhccffiiwtf/ 0/:- PK!pO[Content_Types].xmlj0Eжr(΢]yl#!MB;.n̨̽\A1&ҫ QWKvUbOX#&1`RT9<l#$>r `С-;c=1g;#=\;S8MklX(*|C:]g.Gp m2:ȍc _nLkjt>.&< :bo~PS4J3.OC^Wx}sǗ?@o?E@{^z^2|oT:=a($9AWW[@f[-4j .9Ō%b_K@IZ@qJS2(a+ʠR#tf-y3$8|h_WW<_:GLDdϪ(qo&skM݄o7uĘ;Ű8 8(Bİ@Ct6\㞥06uKA,3Df،Wb1Dg½b;Wk&$Lu zPI=C,$E¢)ݯSYM[{`F((APb~*8%^ThN ,lS[)]ElE򎢋yWR^QgE |P-$y#eՃjtӢkdvݫd4LCUd״1ú lvM^c1h3ޖZ Etk4f2d+RQwx4 Mۭ=: ުvlTV@ggD #i >)?  dMbP?_*+%@"@333333?333333?8=U @@@@ ~ H@~ R@  <>@ggD #i Q@@  dMbP?_*+%@"@333333?333333?8=U -.-.@-.@-.@-.@ -~ -H@~ -R@ - <>@ggD #i B1B  dMbP?_*+%@"@333333?333333?8=U >@,,.ggD  ՜.+,0 PXd lt| ' Sheet1 warning_B6 warning_AT6 warning_AKE6  Worksheets F$Microsoft Excel 97 - 2004 WorksheetBiff8Excel.Sheet.89q Oh+'0(HPp 'Microsoft Office UserMicrosoft Office UserMicrosoft Macintosh Excel@gy@.9GLlM  EMFD@   N  NQxMNP(x N(N ypypͫyy¥ȷ½ȥԽ׽yyȫ׽ȥpܽypye‰yyyȘyұϥҥױ«\yХyyͫO\yfܷyձyyyҥ·Ϸĥͺҥ˜ȥܽCompObjpreadxl/tests/testthat/sheets/vietnamese-utf8.xlsx0000644000176200001440000002100013067126266021774 0ustar liggesusersPK! yk [Content_Types].xml (n0 USa& 9nHc%.H(6 ~i hBQ}q&d+-ٰ tJyɾfo#ːU8 %f4x,f[,YM8GYC#plܩ\h0^ȅ tRN^KC:~0Ȳ.eLxoU|K(bfZ{6%;y4A+Ȧ"лh 6DžŷsHKWUZrr 55HkmwS0 l=_>[H2'Hxvȵ>)ɸ|ľ1NP6;QiI_qt;@˖K$\dz<]f_PK!^e _rels/.rels (N0 HCn ]&*`QA$F؟?)8|h*r)j6|)WR`ϖPK!>xl/_rels/workbook.xml.rels (J0nӮ""Ej}Lm2㟾ۅef2k&WP%&w ޚ[= &$W4KH"xR㣔dNҨ9ɨAw(7ey/O ނhm| }Dg"$4FY.2#59鳔Y]bd @%s"ݚ0tB)[ȓPK!'Kxl/workbook.xmlMO0 H(wTk'!@삐94-M$ۿmU>nco֛s'8/i<(]!1ﻧ\ 9jw0D}NlƘ/kh +q #bIXå#!sa%8h{wK cxLޜH]ś*$A>J%aACMʈJ&M;4Be tY>c~4$ &^ L1bma]ut(gZ[Wvr2u{`M,EF,2nQ%[NJeD >֗f}{7vtd%|JYw2Oڡ~J=L8-o|(<4 ժX}.@'d}.Fbo\C\ҼMT0 zSώt--g.—~?~xY'y92h!ы/ɋ>%mGEFD[t3q%'#qSgv 9feqwW@(^wdbh a8g.J pC*Xx8rbV`|XƻcǵYU3 Jݐ8b3+(QuK>QELKM2#'vi~ vlwu8+zHHJ:) ~L\E\O*t@G1lm~C*uG.R(:-ys^Di7QR8,b?SQ*q7C;+}ݧ;4pDZ_^'܉M01UJS#]flmʒgD^< dB[_WE)*k;ZxO(c5g4 h܇A:I~KBxԙ \ YWQB@^4@.hKik<ʞ6b+jΎ9#U`δuM֯DAaVB[͈f-WY؜j0[:X ~;Qㅋt >z/fʒ"Z x Zp;+e{/eP;,.&'Qk5q&pT(KLb} Sd›L17 jpaS! 35'+ZzQ TIIvt]K&⫢ #v5-|#4b3q:TA1pa*~9mm34銗bg1KB[Y&[)H V*Q Ua?SE'p>vX`3qBU( 8W0 Aw 9Kä5$ PeD)jeI2b!aC]zoPnIZ diͩdks|l2Rn6 Mf\ļ=XvYEEĢͪgY [A+M[XK52`%p7!?ڊ&aQ}6HH;8`ҤiI[-۬/0,>eE;ck;ٓ) C cc?f}p|61%M0*<ҭPK!1ǭH xl/styles.xmlU]k0}?vkB K {UlӇ'ɭ+ɉB *W~=Qm)QY:ŏ#c, WxO >~HsQj@H❵2L3P TJ budMIi%Y_D0RoDhIDC,2ca$m-&[vsR^B+*{p*VЗU.EHYR)i *T+-̪? ='1DA֝Fn08?"d td98 "a'd?G"0KJ@p%V լ޹U |o0,)$p7rq^`wȅ-S rC8Ho81Z~7,S|@}R1=rTS0!h2n<f #pĂÄXWJdBd}Hx:G qjj|qQ$ֆ,iG +pu{8Vc3|ʞ);' uHst]ZGpSAEֿd;ũ/ lO_2z>Zxhp`4w/7lr.'|֓j,3ZbXa~f l¥tQf8K S⃲C9dPK! Vxl/worksheets/sheet1.xmlMo0 4IvÀaֳ,˶K4$ߏcX|!JKQ=Mǎy 6ipJ&pQJt`U/n[9oM{*#|R3)tM{D5BIЖԵ(ĩN ߷W7#?bg; 'Rw/)gFn^ N}NB^hCᠷ5?Ə19YڙSuηf"V'3CQNITKd@v7^*UC?ME2YF@I(39$9_,9+ǝ0#ǘY(2'F ݾx%<"#\ҏ \̂N`:ςNb"gJσY \΃Y \̓  Zӷ&45X Ә[ s04.\g?4f(b|lEW$5^ kQdӍ}ؾgNy)PK!uX%docProps/app.xml (Ao0  9]Q bH7bvgNc$Ovڍ{xDI:W_zjx}, b5G$q?~P"&HET9$bȲJR۴i`:,VX_?bJ\u01k%Fg p~& _sQe-dK%pGym&ҪUC*kO p*C9c k+LJf4˹w^ 4H.wfA 3|Iסq{ JWzp^նu~~䆐u ~0͢T͔<iPK!WCgdocProps/core.xml (_K0C{s:Cہʞ6(n 6HݾiՎc9K^7X'*Q(4j["y8yu}U0Cl(#̔h!;I]*m%hPI4xl/_rels/workbook.xml.relsPK-!'K xl/workbook.xmlPK-! 5) xl/sharedStrings.xmlPK-!bm xl/theme/theme1.xmlPK-!1ǭH xl/styles.xmlPK-! VZxl/worksheets/sheet1.xmlPK-!uX%docProps/app.xmlPK-!WCggdocProps/core.xmlPK-!^ydocProps/custom.xmlPK )readxl/tests/testthat/sheets/types.xlsx0000644000176200001440000010255113172305601020114 0ustar liggesusersPK!xGt[Content_Types].xml (̖QO0MK_ +1 PDmmڂ! @^lפwJ4:#MO[$iѐ%x2\^'K >l3R`(XɍXWWP@vr !g3~^`:IF}UFJrQ3ρ{Zlѵ~Ř⾔_irU]Z +1sUN~70f/msA>Ro0KP4iŤ^3=K u}QHnC8qۆpqO{*]JA: r`!2ƒE);~kjZ7g7G[XL!PpC& d/b\zk\(|$uҌgcBQ/#KDKMg;@/l.WN 3A}3.1PK!v h1xl/_rels/workbook.xml.rels (j0 }q61u8J'2PK !>ɻwېO6$)-MQ=% ]hGSuhǩ{dIp@Mil+{?6L.Bߣ}~[c3s%i??~~*4_Y[O2 US ;;0{djMqi*J( ̤3L{8n])*mO)䛊&{֏M%j2#=ATo9Fى~_Q F2jg/ "_(u w =*e0UbA7e8TS*WbKIB*j K%-x^V  4)ޚkl+Ѽѭ`w*i+# k+lQW Ưfc\@`C/?d>s|<^{dx q=¾< e{zGo.o t0: 9=#?E5v.=ǹ|  PWC}[3 _fikQq9 `Q4ZC,ac3YMY:AZdAG2JGA\],Y$ }yN 6J5<ۍ{AR>BPBj'W* l* <<]Y4}J&vQӅ&f9ûAۙNQPK!) xl/worksheets/sheet4.xmlVMs0wѩ=ĀıI=L;I,5D%N}w!ۉ$}~ow%ֻyMkˤ";pŲPD<[iqqM,iDd'oL'o'Z3-`ȔOZ3VᚥT D2BTRlKFGibN)H0p8!&e.I$K՚jϖХTlP9P,y[AJ4=2!2_1 >JztvaS{jSE*[>ugs؁W4g;zK!^0 b[vǒ'HckEiל<֒*v'´qE+ζEG%aNLٶYVnۅ1Η h9zn/4ګqHR 5z/q'G+xP/7)3u㎙M,rr3e%,.HW3Ee)4&O3c 9Y6PK!Wxl/worksheets/sheet2.xmln0%m Ia7h˙(0aIڎ߾C6&(3Tu9%YA0:ip#jz7UGp;? ]g`fC7:tH|VfЉr0%[{-L N(0?J4ͯiv{{A[DRpJPJ4_=k~*)xג;Ї qKw]J>|u[%1j̏=$6`:mIdܕ7U'Q,q\q>QJq$Ņt %xt\o#')?Le^l@]}P@'zW? 9g[o՝s%-  @ gYrO6{׸a<4e0Y.[xPizNpEco*ɱ,=9Yl_LyݲA|an%TKJT"A-: G|/2\9-s%4PK!i. xl/worksheets/sheet3.xmlV]o0}/LUIR:PH U{dQ8vnO rιڇ_3T,F]׶HeZFm1%hAFaEJ'&[P:$ǬKKR@$U9V+KrdHFbQ %RN宲4._?g|F_t)-.Ƅw18+j ޾_~,rCH0}yq6͖ -r :+ɬi?&v6,ZtH hd{;@ =l=6DR$nN=64inyX rX͏#ἍHzFKUpq[|+ Yd*4wІ 5yUP%l>ln>U;=C>7ᅧ*pzԍyO`̑J(afA_'ʂЎ}3 X3 "aD =(̹EÛփ4I AdG7NQFHdk3m $ ? QnX=w݄ד=mheaaiuT!GTN1'_(h`iauT)@Iw+SCMW7UG%p* v^+CMLWsS0l MLXKu'1*f֯5Vi$rGWjsb9\曷51 P7/b n?PK !*yXMXMdocProps/thumbnail.jpegJFIFHHExifMM*>F(iNHH8Photoshop 3.08BIM8BIM%ُ B~ }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzCC ?<1 OO?9Ceit %Y,-I$-$䳻ı$hs/ еibD+BׇM? ^6(K¿-xw/ еibD+BׇM? ^6(K¿-xw/ еibD+BׇM? ^6(K¿-xw/ еibD+BׇM? ^6(K¿-xw/ еibD+BׇM? ^6(K¿-xw/ еibD+BׇM? ^6(K¿-xw/ еibD+BׇM? ^6(K¿-xw/ еibD+BׇM? ^6(<'"_ѿm@&G΀ ΀ ΀ ΀ ΀ ΀ ΀ ΀ ΀ ΀ ΀ ΀ ΀ ΀ ΀?<'"_ѿm@~O?uσ/犼7Vx>爴xƚß?? |3cY'?|<=5Z;)~k3x/_>D,?v/ٿ?uT׼5/~|K]犬4N'olh׵;K:'o 7.*^>Kźv0x1>2j? |1nߎ'^ռw'~C~@?U' ^oGJ?' ^oGJ?' ^oGJCih cĞt*M:Ꮙ?jv/i>%׼McxJZ%,"F| |g GW>G- $D~M cx#n4<㿀]#CQ.I3Xx7G^o~ɡj:} &_!m?@>'luχ:ς~?onhxu jjl6x 7%x 7%~U|g/> |!O|Ÿ>2mox_~{0U9>  [NFm_^d9),^(|O>C&fg5oxπe~Y}zڵߏ4]w'\fU ew W<#(j? >BX|a\^7 _kL@ mxuFXh:eiw O%ޏȔO%ޏȔO%ޏȔ?|8v[^8ލٛRnMc~_>+|&Xx4|7.B:?]+Lկt< o(߁Kx?U?a4;GmgxKM3WDZ^J<ojxvK2k:u#i~ß |C'|/#YwLOOø-/=~4i>t'þ'tZVxX85x~px7ٿ:iៃ~ ㏇k@&?Nn90A^& { 54X54ο<7xbdO<4>+?٫^<~)u/|Ɲe5.K:%č Z>< ,1K_͎97ChBwl7ؓ͌1ɱ7j' +_M@ +_M@<Ox>.-- *I;U)VH䍕YH` <'"_ѿm@x<%g.|Klx:wK X5Ib 9'pU5߷fL5s՝nqy gC׿.AlaZ%- >7^?Yk@cy,k^-G_r Nq|UywAVibV7yeI $ٗ⶷k>u_mi)=ΛMb( pr[?~!%~ m_\Ӛ_aIK=Mko?/K4Ik/o> <,vk|? ?,[Y s9vzKy/ֵ". gC׿.>LMco|F[Z<ҵ? ~ f{FҴxC4W[FxIkXYY<u|!1|;-7Gt'-ط=Oz:ΗhxR|ߍ~a[ {/Z_wc|/> ߴO=#TgM>ux |_:̳xhSi' 9>K=c|U 8w4}/_~Y>[{ ;?ڟM>ejz54kסY.vZſInC_xö. <k¯>|@]h]CLրsB׼?|B'9/ >CƟ?#֮>/7XFup>6~msd.b^mnab=TvǀTa|Aefbx1f=KNI&;Txؔ;뤫meܧ_)̹;YBC#x j*okeX2ʰ `Yk@/ǥ|w4k/.OGJ[1KS{65]ѵ[ⶆ;+#O {ڣOO CG4 n>#5ȱh] |A׭t {MMm{yj4xɬxs"o^xP4>-CmE"/ xwĶ.`"[i_Łm5>2e/F>I:ԵmGpGğ5 |KwN>9?֫oxv=xW><+Wx{Koae'_^h6 uT՟Zn#5>\W^w [ƿ|AľE[t]a4{<}o/G}/xV}ψ!ľŖ/~!|Su=?lG4n/t͵K8?ٞ<E_@ |}2C$>kxH1ZuHx~&[zC4V,wҟO]e8oeoڗP^Ū|n>7:?!>xO4V|@5 B7Wֽ9:ݭ^ޑgO _~1 +x^=#mR_5o- Kt;z <`tӥOQ|:n;Zw총\e= Ro[Mǿ S/"}5|Fht|I|nonG5i/W}t^4xR-^$ { x?iO70\𕅠+|7?g?mCx@{$&xƛ⦷kŨگfkZ\,?w>9~zƁ~ɩ|B富u+?xZk;ͬ3x.i47ri~լl4x_c7/~%:Z+~?ƫHo%/; f/f:o|1}?d.5[5yK +,QIx'hiL`|csrc5<'+^];tVqiGsuNki&;(>%/_+xCŚc??['=_:ƙD}m {cN|&ψ|Qq`cx_ o>#<_?{-Kx{gSx)4w?:>!Kj:m5 5G|&k|J|qPMc|E⿊~k04~!x6<66[gGǟ*xk [bhψY@ட?c=ž9}:֋ecs ^ⶕx;W^PæXxI=z _ߌbw]GBπᗇ?jγ>%%Sn 'D5]x=Oϊdo ⾡7>Լ7q-kQ:īɼ3|4)5oBmRt>բjK > hxoŸ<)o~B|2_$>#t|]s:5?x>'/߉C]< AWKX񏉤izo'|q}ψ^ ğ"a9/4_x<ᴴ߇-LC<.Ta_],,y-vs@?T<514hO kM><S_Z@5Gu}3Ba7? t-/Q>"4+]O|xW>'tO^S/,d./JKx>n$2 q#3D<'"_ѿm@xU)}8[ZݪF̸7S ^9CXJ?<k?Hk@'-x c(!%Zе$5DO>4L'@wŲg,yj%OwC:K t`g'-x c(!%Zе$5D_sȔykB׎?9_xof ڭŴ;4sD̮2!%Zе$5D_sȔykB׎?O-Z"PZx3Ö͠xs <-I43l*άvZе$5D_sȔykB׎?O-Z"PMCVazxwZ\3 PFrI<x x>>hpm+o)LC$Ir IRA:?O-Z"P ^9CXJ?<k?Hk@'-x c(-Uk k -DfҮ\Ije4aU&?<'"_ѿm@y'[M'=W.,f5:UYvAqu;xG M;xG M;xG M;xG M;xG M?kn_{i]/>C'qr]^#ysݲ$rduv|8l/xJkJNMoG<&Hdt$sFN\+(S z~w_|N:5jS5ƹ> Fo|@1[jZ3QM6gĂH,io3|> .y՟~<4kOaqྑs|omsI񷆾9|WZz+iV|j~W?GjĚ]|7nL>C4[y kگ+Lt#VZw~x+|U"xcHog x0i5οA<. e%KyVE#;OC:OC:OC:OC:>{êxc_;Vuo z=*2TFn]Y☯ifp*񧆾?k9׼E~z~oR sÿ 3/nwGMk=Joroq NՅu@?ɺo O|Po|!eiaö?ew\]ׇnE6~&M:WԵo ]5M]n|/oB]w^EHO|7G~z᧏'(Xֵ~? |1&{G#3uĺ/OAޏJA/O^ k}֧+_޻<k=փKy!>~-\_OIᯋ?;15ֽ_ OĿx'_߇fυ&Wм:lg#hKP2_ _ `SShgj0:}֧{_ Ꮔqk ~",^q[HJy^6?>~"-GD~ _Ř<%"i:5F{}Se=׍,4W-}[ºrxcW֠Y7]|0|yF \-񞉯xk^4]/"|jҾ7ĺf|Iy7h'f?>73;~5ռ@wů~߈G^h}6n/76v%ǂ4]Y>!glOhg|h~|HoU׃h?|_uC׼rs@@(L״<'"_ѿm@x߆<iUi\]?\WTw'h_ _'P _'P _'P _'PK I2Z\}l `px=?xB>Ҥy|9\LVc,e0HV4 djBiKsiKsiKsiKsx3ז\Zxc^Ă9Үr^oDV"60T<'"_ѿm@y']J]&#gxRKd#U,cS,26[ֳE/bhkY145Awx ?Mk?P|]^&9V@2GZ/ɂM[D3y.q0|Y(-pD5Awx ?Mk?P|]^&F(>./@#ZSզW(_% u{ ]B颌n.gIdr@_#Zg _ֳE/bhkY145Awx h xQɦBkmiෂK~&A ? xqK%ŧV If|mt̠#[\A8F&+<'"_ѿm@x߆S'V:՗~洸6s9@N߉ ]~&o6tm= %o'k@߉ ]r~ _GR0A.o?oG1\yF6ŹHZ@@f߉ ]~&o6tm= %o'k@߉ ]r_xSR,Y=][mr WbX1SvvchUo'k@߉ ]~&o6tm= %o'k@! ِ]mr#c0ܬEƪ~߉ ]~&o6tm= %o'k@/_o|ɼ ~m{~%m\@_x[(Z9}\[fZ"sfLj_q@:=緁?_6Mm7{xKoO.9/OC<]|l׾-mrmleh-IZ1&@<'"_ѿm@y'J-#Z!yR;g'U*L ڪ6d[ .D/mY} 6K>w j?%x|͵?O]ڀ9V@1]΂K|[Jbyo1򼦚)YsK>w j?%x|͵?O]ڀIu'.m@$oS աW(/ս߂ K b.-)Hp@_$o]g7_P .D/mY} 6K>w jk 1x#ǦBumwംp ~%}Chc .D/mY} 6K>w j?%x|͵T)5'?Z>)5'?Z>)5'?Z>)5'?Z>)5r,KKEgG: #$i2C* "a1R u_'?Z>)5'?Z>)5'?Z>)5'?Z>)5'?Z>)5qy/rQY!U#vk}*hd{??O)??O)??O)??O)? Ic{je xAf6 @If1 Gֳ\BkohpLþ$閱XtU ,; 2h??O)??O)??O)??O)|1yZ[M=׆5h=HJ0O*]if8yPP<'"_ѿm@p D ׋~VV^?m?0i?r8[HiS   #Am?0i?r?9@m6P| ¤xgD (Mc}~`>m?0i?r?9@Gku'O d@G/,oo(Mc}~`>m?0RԮm +jO^G>2 & #6Po(Mc}~`}qn7FDI'GI9<'"_ѿm@y7)}SOzv9b^\2.i-䔅 `vH?ЛO'tD?ЛO'tD?ЛO'tD?ЛO'tD?ЛO'tDG }րe𧆮%|^l4Ux#%7E)CDQh&S (&S (&S (&S (&S ('w \xOW77Ѧ}JyY$1,1%'4|)Ȕ|)Ȕ|)Ȕ|)Ȕ|)Ȕ=g᫛ xjm.BҧW%K-I#ߏ&S (&S (&S (&S (_/*w,+\R-AA<`P?<۟R^ SO<,M.j,j^Idv/$Kf$h&S (&S (&S (&S (ςk][xO66h:T3<:MܑM ڬK:R@<'"_ѿm@y|-eͩx,S{LuYpVXe-ܜ _ oiNJm@ oiNJm@ oiNJm@ oiNJm@ oiNJm@|au_Vlm[xĶmn~cAo<$3+u*****reׂ'ry;xĶX@aS"RpDk@Eu*****qaw ܾ؞m2h|aK[t$[q qF]7^4_]7^4_]7^4_]7^4_ ӒƱ&)ir_)t%asFJapr cx;z}DŽ<+pi7Mo4eM!%-8U ?5O.}l-nFɻo#8ݜdgFs@tWCѴBio?#|my_R^odٻo""""dx5ϲliHhYMi?QyOy^l~fݞbgrPK!ñoxl/worksheets/sheet1.xmlUn0}_iUKUZ)Vml$V1fmi~&PJR`p朙a^ia`.+g3M)Hi 3 *-3,KJ13RVet)CV"9I8%*QĢfS8XG,Q\ʚI/ MO? (RIMd%~uF(m=%)grtV-K08Pe78giosmH<g&PO{V[e(6s]jIԝF^rDd8GB> &B",Rh:c e¯A @)z'HKL# hPQX5!€hQ!5o?HsCy zQu7}-Xԍ?nl,w?FEʡ#SqXWdz\! _Uh*^"X_⚱Vxq\  T6t>çu<X|+ Է?ygF0 5r}? bI}Vhon-ws*֜w5ןD/~Aap/kzUo mR ^@Sp-Y*0 ;9mCaEC1ԘPK!=*xl/sharedStrings.xmlTn0 ?hyUukQ-= Il30$z~ dmGGRO78oKj&`CÝ5B){!}){|s^+:fOS@U׳kR44 FͯgYTW.W:Fij vwwb& 1jágf8qZgrԹ85X裡B \z@/^['G.p,tv;#'?њ$n xXcw.b]ː߾?Y\evNF׵-u6%vO^'ڂ5NFyb&lgn&2WS3 6tty=.X$E\nq,đyZ@_o ]PK!{֩xl/theme/theme1.xmlYKo7 X%6",%mİ9R.crARu+cEӢP m6:$WE}E{ k)CDHʳVP\ B,nwK+ gf<#`Ldpm5 nR‚ 1yN2x7" nE ||SX-/fp l 4$Y]AĮfM !DzǬ:?C f~V15B3 ͚"{+%`jv;zpV*Foޞ,NYk Wvs25 {٘Ԗހ,9o7:eo@<]Y]nxJfڡ^ 9ᅯ|V(2Cy\ +!5zFp}ʙGz-$CAs >1dĔ߫߿zz᳣?=ztG!Jco^>U?|ϟAS^|gO^|=7T}nSƕ ( NuW%3M\P<|)Yf:-Y n*ؿUq;qmwC՜cNB1IF!SuK>T>EmL&ӁHS4}:lCm|Zo} G>a©ej[X%>!w"Rc8FDJV~C}S)9"7^'ifI܃h+|8{8>ܥ#4@(SSTjOv ؚ|)qX M<ʶ Vi&y.9$)cj-id Eԃ7S\94 \$d79u3Ų`Ks ylOr')f2llX1blBKY[zխTsV7RV >U ք.AV^] f$vs-zBkH#b]kVt!LXLF y`jdvDzeb:hfB!Lp46b8 Q{j.hjꏪ:4D*'s!&yUef6/6:ތ6P/ &u-Iή<1G PTB>RD&~'LB8 6ZԵ .>Id|+e0wVZ#(w~Utƿ)Ua?SEo0/E! t.T¡ {ΨLhTx Ƈ`_}a6Cc$(l'*lCY2w zX`d""̭OX_e]@jR;}AX(&ywwҟhT~e+X3'7Sβrbh؜Vpf7>߁ڊSAT_U "HH{5>Y-vA庐iTi첉rsr|.,غGSgn&sq(UnћpB?bKA-Lt x4..:=&e 'DZA0S666#ZI\B-KӉK 2Bd=ڙu3gWKuLvY3w:x.`2ux KfF é-*&dPK!һ+Ixl/worksheets/sheet5.xmlK0,G /EEEcm%X1׿5 ѨJ'^=$G0V6qQ-וhw9c:VLrzKϟV'mp i\ (fA_jms85vXHpEP1ҁ{ $s6#M{p{Zu(C)Q<{ݵڰRb8e|dx%V.@\82\H*V@u4,V?1vZ*,HqqA)؟z`x%mA )-5 B5;H]5&hw".ԯõD(މ>Kh!;_`Vx%`Vソԁ 0NJ'j18m ]c.`ѡc#Bԕ7y狽G6~F,Feo=OΆv6k42M@_sc9<SZk7N?zPK!"Axl/worksheets/sheet6.xmlK0,G FDQgQXs+6FJn>{|p|VXیAD \3aMu--d>?'mp h\ (fAo*ms85uh;d8P1ҁ[ $s6#M[p{Zu(C)Q}Q7"o>)/[үõD(^>Kh!;&>*(J:{e'j18u `.`ѡcL#񇨉77Iuwfe8x]ރbx{Ͻh9_\o}ug@zh7 5}OjL-ZK$T}VQ^|Whaq5xT) p*8_tPK!tz xl/styles.xmlUO0~Zv-UD)!Ii-#29NT ^}wvtZ 6LBT2_#c WxM >M>~]sz"&+kilE1GV `e`JMIn&A0=TdD?Te/S$-gv`a$R*M!6؍ ^L+ {p* ,'$$H5(SP+9L1Ih|Kas5bjtv^ / %wO-Sc9$2Op $z+9CA0η9 G7DPmKL@~]B6~QgCL9qS]O%d5[ߪ e-Z,$ܕt Z9f+He+ dr~|+QU@[:!zpDh{ b(vDʒo*:m>FN}f2U?;kd{tdc 5[F)u3x]_%]*e魦7v:t'έ̐@b|Γw L Lԛ[ȺimH!.x7ne61ލ׉<핁&?4d~zp6 ?Qo2{l>O' PK!rkuxl/worksheets/sheet7.xmlK0,7PZRUqv 6'h$83d|PX(D_?WO_(}K?MllJ;s$ -/@1 J(h֡ a/b aba<oa=l'UTHk(%O֥6,!N?hs .l8HO3ēŘi]rZo- $p8ax+HAC<2l'nwCRfU?"sb2VzĺpEdKp-D ?MXDv#`Jx%|kV':ԆQdͧF zۊA'[1}AgX|8 w6?~5ӊb܊FK9İw-,v=w4&7J5xD Q-w[ӳ̆h ̪gc6![ǣA'1'Í-u.7mظN?Lx-%Ι%ԚӼ[7f֢DB^ ,ivJ/AnөoK8t PK!S(docProps/app.xml (Oo0  ݟbH7bǂX,"c$6qV(gI]mux4i_ٷ8"Wx_?e-6Hp5s;O56@3( :Ue4^{iqr_2˳00&;ߡ=VsUx[T%ǃ޶h`W݂6=яFM &G`q!+*96 B%@xޡf"2dq=pw 86mC3ՈL*ܗc6˽ASc?`0l~WK7oV`7":! O[w1Ԡ@{$?^V?:T(^{'/n.Fȟ[W5TSnyc'&j8D+ɷrܓ5Ex%A8S襪$h1<5:" YYecL3 )>Wm:8]dD1%G<.?)PK-!xGt[Content_Types].xmlPK-!}T _rels/.relsPK-!v h1xl/_rels/workbook.xml.relsPK-!! Ws xl/workbook.xmlPK-!)  xl/worksheets/sheet4.xmlPK-!Wxl/worksheets/sheet2.xmlPK-!i. )xl/worksheets/sheet3.xmlPK- !*yXMXMdocProps/thumbnail.jpegPK-!ñocxl/worksheets/sheet1.xmlPK-!=*fxl/sharedStrings.xmlPK-!{֩whxl/theme/theme1.xmlPK-!һ+Ioxl/worksheets/sheet5.xmlPK-!"Aqxl/worksheets/sheet6.xmlPK-!tz Atxl/styles.xmlPK-!rkuSwxl/worksheets/sheet7.xmlPK-!S(ydocProps/app.xmlPK-!S389}xl/calcChain.xmlPK-! ^t~docProps/core.xmlPKreadxl/tests/testthat/sheets/unnamed-duplicated-columns.xlsx0000644000176200001440000005516713067126266024216 0ustar liggesusersPK!;H@i[Content_Types].xml (N0EHC-Jܲ@5*Q>ē/y=VTĊsǓl %#T))eFaBɶl6,0l%kcwcՂX8" FD Zht+g#ؘNM'Pㆶw$βݹΪd{* wQޛ@@_t7YAI[o/eR^AI"gao4taܲ.յ@jekBb .Zy?FAHwxdbjs=snEM~jqн瑦..;$!*8 He;8Ȟv Ǜ7hPK!}T _rels/.rels (J0rߦl&R`66dFj=Nfv7ځa "m\+k,&pr(#UW K3>]JA: r`!2ƒE);~kjZ7g7G[XL!PpC& d/b\zk\(|$uҌgcBQ/#KDKMg;@/l.WN 3A}3.1PK!nxl/_rels/workbook.xml.rels (j0 }qҍ1F^Ơ-{c+qhbKɠMt\ 'g&WP%&w >׻'[= &$շ774OH"xR㳔dNҨ9ɨAw(7e(3O ރhm| sD"$4DSOUNh9.)k0՚0!!iɹS]٬ `2K9Gyvq/PK!zx7xl/workbook.xmlT]o0}xHU-4U>; ^lMm//6{εwf,*E{LQ]ru/`{U3e^ʹ:CҊIb/tAhֆV9)P)+@[0)[kHb ۊvD-p5@܃!{e8a ZrjwPh ^"Ł v7DdE mJX)^|0M}pQ:Vx@1c+[^U nطw  ^Wyn-ԇ2:[cUġ,z.ym_Kh' OIE׻w~]\pc SwKW3>~rpi#)s? Þг|CŢ=[Z7]XJ#Q"? G1 vrOZѺb3stM4 zqgAZoy2YNf?܈98_ ]iIrd(Mi:+/&d'Al'2لN'Q(WQ'#Uپ$e- vko+:z"XE PK! xl/sharedStrings.xmldA 0EwE$ b;fR3S[q#v9'5\9I1̈́Qn7p큁[Hqr&""9M \;KaF_v ͊}j!xp$r/ؖC]nv3I,$ڛB›H] EG߄jŭ+6*hr`sV Q>Cw]8] gݫj9M49P9kMj5Xҭ ҺF Q[L1d+RR5.4O{#xߙ]Z9Al֕*Յ~'O@=Yh/XQcx=ۇ],"}b`9_olnw0 7cke R_t ~Hn\ ".]̘ hAX=m\gCVlLs!`r#Z?XPܣ~ΝдNsv7! ? hԭP8k=k)q±Qۙ=C,)%NЯXR,[ޝ(J~1_膂 /wRH&<͒;XGAJ%T|wn<ŕCN%(%XLs,fO]:ߕ(FQ6fKN„P8s Y&T$$yBI,>vQxss:L'"L:g# ;Ÿ́c5|嶖# ;Jh~`M;~xod [e?8<PK !Rs$:$:docProps/thumbnail.jpegJFIFHHExifMM*>F(iNHH8Photoshop 3.08BIM8BIM%ُ B~ }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzCC ?|3 O?9Dҥit %Y,-I$,;K3I$@xWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@"^k&ӿxWN%_?m;PZ 1@|)"ڀ7 ( ( ( ( ( ( (?|)"ڀ7%? jW^^(F4m:ނgI $m +_M@ +_M@ +_M@ +_M@ +_M@9G~jv^$eu1t9tũOx'B-fk&8 ?jo;feq6}w! g)m+W_<=Z| p--}37%Gk54S[W\<ω_><ω_>V |X*4mOK? ~7^+?>O*x H.*xmI+]?Eӵ];x,}51h0eZZƑ(y?1[@3}< y?1[@o<#iC7w\R=xMr aUω_><ω_><ω_5?-ңnt;9K㏈3ץ,mS^1]>w~[5 F-En?1[@3}< ]_δ@.1jGIwiK)ld@|,m|mtŜo=96d7ω_><ω_>|jσ|Z/-|g:\{ʻͺKO8qdtI4|)"ڀ7! m]K:t8.Ƙ-|'\~8x?XϗBƍrƟb!o^)[7ǒ ڗğx[_ 5=B=KM^Z=<'(4K(4K(4K(4K(4K+ߋ'i"3[!7Λ]w#+TnF 2 vx/ A]x/ A]x/ A]|kX^k)u._-xcDtj*~/<~ ~ xO5|JI|:MGǫMKOw-F^&%sG폤G_-TkVeGw hzl-<{?t:%^9w. sLtM6&/wź`.Et=vo'ſ£YO!|(,]ew7*Fھ8_ ƒI?8_ ƒI?8_ ƒI|i4Mb8Y$J5)ݭ&UDU,@UPI'q@|'/Ao A77 4SC.,Rǧ[$IWF  N<C.N<C.N<C.N<C.9x7> }|9qqqAkdO4MqC Q4K#qU|)"ڀ7|cep,y?;J)hXdg$n/ +KmAaw|;>OßGOxc\+ B\xOk O W^& !|@9Ap_> xxcAǃD/ńީjzoiZi@iO;$xVxӼ;{3Ϗ<Kj/(XMEơzFOOKkWx]nS>0_7m׊N#+jou__~.rj_<5z*x;Tk?MiuyyGp$n/ +KmA'_4е]:YtD HYAGAҀ)CL_~wYú+35M%Ia<5W7uo&6R0E*A%1Kc>%^c ~/X? }@c⟀ύ|)' }⟁o%^c ~/X? }@wC?~;_EPM!5 nNs-Reƫ||x/m{Qcz7}1Kc>%^y>xS➷|N7O$|>/&u_k2xCU5 >{ joY5ׇt+,FQs|+o~'PѢ񗃴jZ-3¾'O?_5}WU֬KmSR 觺pRrs g|1Ҽk?| (Rk+%XO?hҿ?d+7O?hҿ?d+7O?hҿ!vUW#"Q{W0^x_|xfC$S(Q '4i_| CF '4i_| CF '4i_q}i6~"m":uߪ_HGWa4' Wo7@,ѥt' Wo7@,ѥt' Wo7@> x.~ ͯ {^fiVK 'u=hO4nY>JO4nY>J/[]^Mzq۝UE@W¿m[OM2) i4rŧۤpTw Y>JO4nY>JO4n9@]|[ik=6{ +yFTQK|)"ڀ7-Z( (On( (:/SwtP@??(oLTP@Կj|-bZ }"'Rh|)"ڀ7-k}?=ϊYCh/g^M9-6*`@_#-=VjOxc9(mx&?[@#-=V1Wm5T'm^4_ഺ{k[/9HQ@:G<[ES{D+hsſQ5?'1?oMO G<[ES{7i#oB:h?N/U,{4{6GʪsſQ5?'1?oMO G<[ES{D+hsſQ5?'1<xoxFkj6KH-Bk VK6J,CHtx&?[@#-=VjOxc9(me~ZhRK:Ji)h&Ce!roO xrH|}&VrE7!Y%ӚY%!sĚsſQ5?'1?oMO G<[ES{D+h|٧w^פ/ė1&t[4k2Itl|)"ڀ7%m;LZ[xIW^(bU[ᯆkFn9E0]|[]|[]|[]|[]|[[/`n;nMto>;nMto>;nMto>;nMto>;n9oxIWCI?  i6_mse&9 C#kϗ3tkϗ3tkϗ3tkϗ3txHE#[?KLQ{IT_Q'GH|ʠO0x_pY4x7"-lbIђ IH\x|9̽ 2xG—Wn5_x.@[_o7ÒtFnf0:C|sz?e>O?^C|sz>xZ:L?+C+oR'ģyS#m]!>x|9̽ 2C'ß}7/@!>x|9̽sǂ#p5e˥Z8MɥidWlt 2C'ß}7/@!>x|9̽eE>94AR\xx [II@G(mm_ L7ˠ }xjIQ1$8E, 2C'ß}7/@!>x|9̽s>5|[p5zf ť]9C&0L˔E<2لr:|)"ڀ7/i4|]jN|PjҬ-.-lKn01 N~PyH l?m@&БڀM#_)BGSaj?7xGWqxwm?oY<]4fLo!d`Jq@BGSaj?7o7 :M-o:M֋u -' xƊ*nO',´?!GiCZ'P Nj?@+O :9=u<#ysE-߆4 M2O>k,B@Pj?@+O :V?u<@+Qx*W= $-/P7ZUVV#!<=A@|->ROq!OG!oUAgbUQ €o´?!GiCZ'P Nj?@ύ~:-":ͼJ){BREV 0|)"ڀ7.-_O+ƞ$۟aߺ?.8v6` D˟?D˟?D˟?D˟?D˟пi?)? GS?#vmS|Rgo7yWſP j?zj?zj?zj?zj?z0+w6o$C$^f߳~v1g*LehNWyy^wb|<3}ln /j?zj?zj?zj?z2pF 7`HGuC (p6ׁ^9q6Mt{|GضmN!_}XnWP N-[tǪG͚9 $_CR_lxDҡQyݯHz,& %c>\44$ (s|]/PK!}VFdocProps/app.xml (Mo0  9: bH7bvgNc$Wvڍ/^>+zLdrQ J<~\|1\X#?M ["[xDWRiZϝ&8i/CX7Φ"Tj7ɐljH.FHTL.񰸩/l:YP@hsNWJik1A`dG\Z@FĐ!:b:c7t=k7B93P`?qtl4ϞK$%mȾe^p%k̷ڳv%)Ƶ1u[G+j]!GfЁg_CGӸF~u_Ȼ.^2>P'd蚓%O9l҂9K}U'PKKe8JAxl/workbook.xml͎0 _%RX !Ԗ Z^ƥ]YI@9ٞGASi a\a;Yº.o.'J$t1+򀔜71ehtz^ #˜stxwlu]y9VEc@=MZ}mp *`ob]:7RpD#ڿ!YPKKe8JvdIxl/_rels/workbook.xml.relsJ0@%枦]ADEdm0z-aO!ރi4@bPj h;G;!0\3XyY]p }IJ2&MULʤ8\dM]?Hd5⸳ g5}Xz*2ZG~0i EL^F}7/3<@>uɏ#WPKKe8J?xl/sharedStrings.xmlEK0 O]X t4b Ă̓qKQr(y׊!/.Ggw\=VKm"2U"o8,E3ڋg~xJ]Y)YjBiX$E8[&8+-ړPKKe8J#Rz xl/styles.xmlEA BnAho~@})k!c/ެa `Ziwu~zcS_}!Y*wtTÁsjZI;?KZ1}O-ˢx)=n!kV++neeV'v]TiWxSr8(:+KI#N@/ !vyi. 1>P_T̅Jw1'4="͛ēNR4i[m5Xfrpw+VXejQ1n;Fyws PKKe8JfdocProps/core.xmlm_K0ſJ{&n=9( 6HmuM=s87܎OyitH0]^]Aۺ  .HdӞB,~>3íЃ<&(%!yNYATjpv M~!|6Փx0N` oyx^.q;Tmpԉ ١d$Pl))nK|3ޏ0sqOvq'6Zz@v@I{Z_KI2*|\;ñŽ u,ށgJ[Y;sfp`T~(*tTSv`F8$0y5c\ ,r]3h<8kĨ_Q4Qr̅љ=[)z,~[0ȿ~_9eƛG"<})PKKe8Jf _rels/.relsN0 _%䞦B.nƑc{{".ЩHv<9j)J08}hkv|6zTwƼCcR-dtQfcjj݉'kpTPĐ7g $n,,f%S|7Z[Zϣ$NDCyqR:{{rYJhq^#[L(AnbA_^+^㭵p ]BPKKe8J'\+U[Content_Types].xmlPKKe8JA\xl/workbook.xmlPKKe8JvdIOxl/_rels/workbook.xml.relsPKKe8J?exl/sharedStrings.xmlPKKe8J#Rz .xl/styles.xmlPKKe8Ju$xl/worksheets/sheet1.xmlPKKe8Jf-docProps/core.xmlPKKe8JزNndocProps/app.xmlPKKe8Jf _rels/.relsPK ? readxl/tests/testthat/sheets/dates-leap-year-1900-xls.xls0000644000176200001440000017100013067126266022736 0ustar liggesusersࡱ> &v  !"#$%w)*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuRoot Entry F@R'@WorkbookGSummaryInformation((DocumentSummaryInformation8 #i\pMicrosoft Office User Ba==@8?8@"1Calibri1Calibri1Calibri1Calibri1Calibri1*h6 Calibri Light1,6Calibri16Calibri16Calibri1Calibri1Calibri1<Calibri1>Calibri1?Calibri14Calibri14Calibri1 Calibri1 Calibri1Calibri1Calibri1 Calibri"$"#,##0_);\("$"#,##0\)!"$"#,##0_);[Red]\("$"#,##0\)""$"#,##0.00_);\("$"#,##0.00\)'""$"#,##0.00_);[Red]\("$"#,##0.00\)7*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_).))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)?,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)6+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)% [$-F800]dddd\,\ mmmm\ dd\,\ yyyy$[$-1009]dddd\,\ mmmm\ d\,\ yyyy                                                                       ff + ) , *     P  P       `            a      ||@}-} yyyyy_(*}-} yyyyy_(*}-} yyyyy_(*}-} yyyyy_(*}-} yyyyy_(*}-} yyyyy_(*}-} yyyyy_(*}-} yyyyy_(*}-} yyyyy_(*}-}  yyyyy_(*}-}  yyyyy_(*}-}  yyyyy_(*}-}  yyyyy_(*}-}  yyyyy_(*}-} yyyyy_(*}-} yyyyy_(*}-}> yyyyy_(*}-}? yyyyy_(*}-}+ yyyyy_(*}-}, yyyyy_(*}-}- yyyyy_(*}-}. yyyyy_(*}-}: yyyyy_(*}-}; yyyyy_(*}A}1 yyyyy_(*;_(@_) }A}2 yyyyy_(*?;_(@_) }A}3 yyyyy_(*23;_(@_) }-}4 yyyyy_(*}A}0 ayyyyy_(*;_(@_) }A}( yyyyy_(*;_(@_) }A}7 eyyyyy_(*;_(@_) }}5 ??vyyyyy_(*̙;_(@_)   \{P c}}9 ???yyyyy_(*;_(@_) ??? ??? ???\{P ???c}}) }yyyyy_(*;_(@_)   \{P c}A}6 }yyyyy_(*;_(@_) }}* yyyyy_(*;_(@_) ??? ??? ???\{P ???c}-}= yyyyy_(*}}8 yyyyy_(*;_(@_)   \{P c}-}/ yyyyy_(*}U}< yyyyy_(*;_(@_)  }A}" yyyyy_(*;_(@_) }A} yyyyy_(*ef;_(@_) }A} yyyyy_(*L;_(@_) }A} yyyyy_(*23;_(@_) }A}# yyyyy_(*;_(@_) }A} yyyyy_(*ef;_(@_) }A} yyyyy_(*L;_(@_) }A} yyyyy_(*23;_(@_) }A}$ yyyyy_(*;_(@_) }A} yyyyy_(*ef;_(@_) }A} yyyyy_(*L;_(@_) }A} yyyyy_(*23;_(@_) }A}% yyyyy_(*;_(@_) }A} yyyyy_(*ef;_(@_) }A} yyyyy_(*L;_(@_) }A} yyyyy_(*23;_(@_) }A}& yyyyy_(*;_(@_) }A} yyyyy_(*ef;_(@_) }A} yyyyy_(*L;_(@_) }A}  yyyyy_(*23;_(@_) }A}' yyyyy_(* ;_(@_) }A} yyyyy_(*ef ;_(@_) }A} yyyyy_(*L ;_(@_) }A}! yyyyy_(*23 ;_(@_)  20% - Accent1M 20% - Accent1 ef % 20% - Accent2M" 20% - Accent2 ef % 20% - Accent3M& 20% - Accent3 ef % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5M. 20% - Accent5 ef % 20% - Accent6M2 20% - Accent6  ef % 40% - Accent1M 40% - Accent1 L % 40% - Accent2M# 40% - Accent2 L˭ % 40% - Accent3M' 40% - Accent3 L % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6M3 40% - Accent6  L % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2M$ 60% - Accent2 23 % 60% - Accent3M( 60% - Accent3 23 % 60% - Accent4M, 60% - Accent4 23f % 60% - Accent5M0 60% - Accent5 23 %! 60% - Accent6M4 60% - Accent6  23Ў % "Accent1AAccent1 [ % #Accent2A!Accent2 }1 % $Accent3A%Accent3  % %Accent4A)Accent4  % &Accent5A-Accent5 Dr % 'Accent6A1Accent6  pG %(Bad9Bad  %) Calculation Calculation  }% * Check Cell Check Cell  %????????? ???+ Comma,( Comma [0]-&Currency.. Currency [0]/Explanatory TextG5Explanatory Text % 0Good;Good  a%1 Heading 1G Heading 1 DTj%[2 Heading 2G Heading 2 DTj%?3 Heading 3G Heading 3 DTj%234 Heading 49 Heading 4 DTj% 5InputuInput ̙ ??v% 6 Linked CellK Linked Cell }% 7NeutralANeutral  e%3Normal % 8Noteb Note   9OutputwOutput  ???%????????? ???:$Percent ;Title1Title DTj% <TotalMTotal %[[= Warning Text? Warning Text %XTableStyleMedium9PivotStyleMedium78dq:Fc-2NWgFSWc-2NWgFSW̙̙3f3fff3f3f33333f33333\`f< for_testingpAfor_human_eyesIp dttm dttm_string1899-12-29 08:00:001899-12-30 08:00:001899-12-31 08:00:00expect_success / - PK!pO[Content_Types].xmlj0Eжr(΢]yl#!MB;.n̨̽\A1&ҫ QWKvUbOX#&1`RT9<l#$>r `С-;c=1g;#=\;S8MklX(*|C:]g.Gp m2:ȍc _nLkjt>.&< :bo~PS4J3.OC^Wx}sǗ?@o?E@{^z^2|oT:=a($9AWW[@f[-4j .9Ō%b_K@IZ@qJS2(a+ʠR#tf-y3$8|h_WW<_:GLDdϪ(qo&skM݄o7uĘ;Ű8 8(Bİ@Ct6\㞥06uKA,3Df،Wb1Dg½b;Wk&$Lu zPI=C,$E¢)ݯSYM[{`F((APb~*8%^ThN ,lS[)]ElE򎢋yWR^QgE |P-$y#eՃjtӢkdvݫd4LCUd״1ú lvM^c1h3ޖZ Etk4f2d+RQwx4 Mۭ=: ުvlTV} @@@@@@@@ ?  >UUUUUU?U(Lyyyy-mm-dd hh:mm:ssA01900-01-01 08:00:00>@1900-01-02 08:00:00>M@1900-02-28 08:00:00>*N@1900-02-29 08:00:00>N@1900-03-01 08:00:00>UUUUUՖ@U1903-12-31 08:00:00>UUUUUٖ@4UDyyyy-mm-dd hh:mm:ssA01904-01-01 08:00:00p*WWWWW  >@ggD #i  NBDG  dMbP?_*+%@M d"d333333?333333?U } >}  @@@@@@@@@ @ @ ?   >4Dyyyy-mm-dd hh:mm:ssA01899-12-29 08:00:00 >( Lyyyy-mm-dd hh:mm:ssA01899-12-30 08:00:00 >1899-12-31 08:00:00>UUUUUU?U1900-01-01 08:00:00>@1900-01-02 08:00:00>M@1900-02-28 08:00:00>*N@1900-02-29 08:00:00>N@ 1900-03-01 08:00:00 >UUUUUՖ@ U1903-12-31 08:00:00  >UUUUUٖ@4 UD yyyy-mm-dd hh:mm:ssA01904-01-01 08:00:00 *lSWWWWWW   >@  ggD  ՜.+,D՜.+,H `ht  '  for_testingfor_human_eyes  WorksheetsP :B_PID_LINKBASE'A F$Microsoft Excel 97 - 2004 Worksh Oh+'0x hp|  $'Microsoft Office UserMicrosoft Office UserMicrosoft Macintosh Excel@hρ@ARGLlK  EMFD@   L  LQxKLP(x L(L ܽͱͷʱұ±׷ұҽ׷±ҷͷҷҷܷpfŸθy˜ҫppȫpyͿҫͫȥҫʸݿҫҚyyཟ«ȿyyͽ¥ʽOf‘ĿͫfȑȑұĿƫͥ«ȫͫyyy巂ɽȷͷͷ«ͥͷҥĮҫҥϱͫҥȟpܱͷϱ«½ͫұȫ÷yy±ypyͷ׽yyͥҥȫͼ¥ȫͼ¥ȫȘұfʸμұҟܷ«ͱױױױȫȫȫȫ˱ҽ׽Ϳ«ұ±ұҽұҽ׷ȱ±ҷͷҷҷرy¥pfͱܷ½ȥȫpyͿ¥ȫpyͿҫȥҫʸݿҫҚyyཟ«ͥȱȷŘOOOͽҷyy‘Ŀͫ‘ĿұұĿƫͥ«ȫȷȫͷͷȷͱͷϱͽұҽ׷«ҷͷҷҷͷ«շpyҽȷͷܷ¥ȫʸ¥ȫpyͿҫȫҫʸݿҫҚͫȫy͟ұ·ͽ˽«‘Ŀͫ‘Ŀұ«Ŀƫ׷ܫyͫұܽȫ«·ȉf«ffҥұҥͱȟpfϱ«½ͫұȫyy˥ȷyyͥå½׷ͫ\yҥyȫʸ¥ȫͼױͫ\yҥyұfʸμұҟܷ«ȱȱױұױܽͫȱȫȫȫȫ˱ҽ׽ȱܽ«ͱʽұ±ͽұҽ׷ͽҷͷҷҷ׽y«ypfܱ¥ܷʸ¥ȫpyͿҫͫȥܷҫʸݿҫҚyyཟ«꽉ȉO·yy¥ͽȟĿͫ‘ĿұȑϱȟĿƫͥ«ͷfpȘp\ßyyľy\fy巂ͷҥұҥͱܷͷϱ«½ͫұ׽ť·ҽť˜¿±ȫʸ¥ȫͼױͥȥұfʸμұҟܷ«ҷͷױױܽͫױܽȫȫȫȫ˱ҽ׽Ƚҷȱ·ҷ±ҷͫp«ppȷҷīȷy͘yʘy׷y͘pfyyypyͷw͘ͷyCompObjpeetBiff8Excel.Sheet.89qreadxl/tests/testthat/sheets/iris-excel-xls.xls0000644000176200001440000004200013336631200021417 0ustar liggesusersࡱ;   Root Entry  \pCalc Ba==@ 8@"1Arial1Arial1Arial1Arial GENERAL                + ) , *   8 ` irisTZR3  @@  n Sepal.Length Sepal.Width Petal.Length Petal.WidthSpeciessetosa versicolor virginica V cc   d-C6?_%;*+&?'?(?)?"d,, ` `? ` `?U } ;;;;;;;;; ; ; ; ; ;;;;;;;;;;;;;;;;;;;     ffffff@{3S @3S [ S ffffff@[S 3S s ffffff@S3433333? S[S  @ 3S  @ [+  s[S  SS  3+ ?~ +  S ~ @[ s  ffffff@{3433333? 433333? ffffff@[433333? sSS ffffff@[ ffffff@S ffffff@+ SS S S #{[S #S3S [S S  ;!;";#;$;%;&;';(;);*;+;,;-;.;/;0;1;2;3;4;5;6;7;8;9;:;;;<;=;>;?; sS[ ~ !#!ffffff@![+ !"3S "#@#[S #$S $%{ S %&@&3+ &'@' S '(ffffff@(S[S (){ )433333? )~ * *ffffff@~ * *433333? *+@+ S +,{,433333? ,-ffffff@- -.3.433333? ./ffffff@/S /0ffffff@03S 01K[S 12+3S 23[3 34  [ 45 5@~ 5[ 5~ 66ffffff@6  67+ c7ffffff@~ 7[ 78c   89 +[ 9:@:+ :;S ;ffffff@~ ;  ;<#;3 <= { =>; [ >~ ??@? ?@;A;B;C;D;E;F;G;H;I;J;K;L;M;N;O;P;Q;R;S;T;U;V;W;X;Y;Z;[;\;];^;_;@ [3 @A  AB{ B@~ B3 BC [ CD ;Dffffff@~ D D~ E E@E [ EFF? FG;  GH c  HI I@~ I[ IJ c[ JK   KLS L@~ L3 LM c3 MN{  NO [ OP{ PQQ? QR RS ; ST;Tffffff@~ T TUs [ UVS  VW{ [[ W~ X Xffffff@X@~ X  XYYffffff@~ Y  YZ  Z[[@~ [ [\ \ffffff@~ \3 \]  ]~ ^^ffffff@^+ ^_;  _`;a;b;c;d;e;f;g;h;i;j;k;l;m;n;o;p;q;r;s;t;u;v;w;x;y;z;{;|;};~;;` `a  ab   bcffffff@cc? cdcdffffff@~ d  de + ef ;fffffff@~ f fg ; K gh  hi+  i@ ij S K jk@k  klk   lm{   mnC   no+ offffff@~ o op ;K pq K qr  rs csffffff@~ s st Ktffffff@ tu+  uv { v@ vw  wffffff@ w~ xx@x[ xy yffffff@ yzcz@~ z z{ c{   {| ;|@~ | |}{ +K }~C  ~ c ;;;;;;;;;;;;;;;;;;;;;;; @~   cK C    c  [     c@  cffffff@~ [  3   ffffff@  S     sK {   ffffff@ffffff@  ;ffffff@~   ; ffffff@ { + { #ffffff@   + #   Ssffffff@ ; ffffff@~  PH0(  >@gg   FMicrosoft Excel 97-TabelleBiff8Oh+'0 px Hadley Wickham0@@@Ge@Ge՜.+,D՜.+,\H AppVersion DocSecurityHyperlinksChangedLinksUpToDate ScaleCrop ShareDoc12.0000 Root EntryFWorkbook;3CompObjIOle SummaryInformation(DDocumentSummaryInformation8 dreadxl/tests/testthat/sheets/biff5-label-records.xls0000644000176200001440000004400013172305601022261 0ustar liggesusersࡱ> "! aH\pMicrosoft Office User B=Oq8X@"18Arial18Arial18Arial18Arial18Arial18Arial1Calibri1 Calibri1Calibri14Calibri1 Calibri1Calibri1Calibri1,6Calibri16Calibri16Calibri1>Calibri14Calibri1<Calibri1?Calibri1h6 Calibri Light1Calibri1 Calibri"$"#,##0_);\("$"#,##0\)"$"#,##0_);[Red]\("$"#,##0\) "$"#,##0.00_);\("$"#,##0.00\)%""$"#,##0.00_);[Red]\("$"#,##0.00\)5*2_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_),))_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)=,:_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)4+1_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)dd\.mm\.yyyy\ hh:mmhh:mm                                          A.I.     @c @Y X  A.I.  i  A,I,  A~I~  cb   20% - Accent1A 20% - Accent1 % 20% - Accent2A" 20% - Accent2 % 20% - Accent3A& 20% - Accent3 % 20% - Accent4M* 20% - Accent4 ef % 20% - Accent5A. 20% - Accent5 % 20% - Accent6A2 20% - Accent6 % 40% - Accent1M 40% - Accent1 L % 40% - Accent2A# 40% - Accent2 % 40% - Accent3A' 40% - Accent3 % 40% - Accent4M+ 40% - Accent4 L % 40% - Accent5M/ 40% - Accent5 L % 40% - Accent6A3 40% - Accent6 % 60% - Accent1M 60% - Accent1 23 % 60% - Accent2A$ 60% - Accent2 % 60% - Accent3M( 60% - Accent3 23 % 60% - Accent4M, 60% - Accent4 23f % 60% - Accent5A0 60% - Accent5 %! 60% - Accent6A4 60% - Accent6 % "Accent1AAccent1 [ % #Accent25!Accent2 % $Accent3A%Accent3  % %Accent45)Accent4 % &Accent55-Accent5 % 'Accent651Accent6 %(Bad-Bad %) Calculationi Calculation%  * Check Cell Check Cell  %????????? ???+Explanatory TextG5Explanatory Text %,Good/Good a% - Heading 1; Heading 1%[ . Heading 2; Heading 2%? / Heading 3; Heading 3%23 0 Heading 4( Heading 41InputiInput ??v% 2 Linked Cell, Linked Cell 3NeutralANeutral  W%"Normal4Noteb Note   5OutputkOutput ???%????????? ???6Title Title7TotalMTotal %[[8 Warning Text? Warning Text %83ffff̙3f3fff3f3f33333f33333 worksheet1 aH E  dMbP?_*+%&?'?(?)?"dXX??U      (9 Table for Time Range: 21/01/20179 Initial Data(99999999999999999 9Date 9Time)9!AUBURN SW AQS CO 1h average [ppm]*9"AUBURN SW AQS HUMID 1h average [%]"99999999999999 21/01/2017 01:003?NbX9K@ 21/01/2017 02:00E ;?|?5J@ 21/01/2017 03:009x&4I?bX9M@ 21/01/2017 04:00$+?jtL@ 21/01/2017 05:00?&M?PnM@ 21/01/2017 06:00V-?d;O'M@  21/01/2017 07:00 :7m?~ @  21/01/2017 08:00 /4'/2? MbXiJ@  21/01/2017 09:00 .9? ZdI@  21/01/2017 10:00  ? |?5G@  21/01/2017 11:00 ܘ? CF@ 21/01/2017 12:00p%;6?npF@ 21/01/2017 13:00{,G?~ ٱ@ 21/01/2017 14:00 --+F@&s@,DKKKKKKGKKKKKG=Oq8X>  Oh+'08@P ` lxeag873eag873@@ ՜.+,00 8@ H _  worksheet1  Worksheets  Root EntryFBook  SummaryInformation(DocumentSummaryInformation8readxl/tests/testthat/test-trim-ws.R0000644000176200001440000000526013406366260017246 0ustar liggesuserscontext("Trim whitespace") test_that("trim_ws is default and it works", { ## because trimws() skip_if(getRversion() < 3.2) ## data xls <- read_excel(test_sheet("whitespace-xls.xls"), col_names = FALSE) xlsx <- read_excel(test_sheet("whitespace-xlsx.xlsx"), col_names = FALSE) expect_identical(xls[[1]], trimws(xls[[1]])) expect_identical(xlsx[[1]], trimws(xlsx[[1]])) ## the 4th cell is "\t \t" ## xls reports this but xlsx does not ## does xlsx return "" for cells containing only whitespace? expect_identical(xls[[1]], xlsx[[1]]) ## column names xls <- read_excel(test_sheet("whitespace-xls.xls")) xlsx <- read_excel(test_sheet("whitespace-xlsx.xlsx")) expect_identical(names(xls), trimws(names(xls))) expect_identical(names(xlsx), trimws(names(xlsx))) expect_identical(names(xls), names(xlsx)) }) test_that("trim_ws = FALSE preserves whitespace", { ## because trimws() skip_if(getRversion() < 3.2) ## data xls <- read_excel( test_sheet("whitespace-xls.xls"), col_names = FALSE, trim_ws = FALSE ) xlsx <- read_excel( test_sheet("whitespace-xlsx.xlsx"), col_names = FALSE, trim_ws = FALSE ) expect_false(identical(xls[[1]], trimws(xls[[1]]))) expect_false(identical(xlsx[[1]], trimws(xlsx[[1]]))) ## I have a whitespace-only cell with contents: "\t \t" ## which survives import from xls, but not from xlsx ws_only <- grepl("^\\s*$", xls[[1]]) expect_identical(xls[[1]][!ws_only], xlsx[[1]][!ws_only]) ## column names xls <- read_excel(test_sheet("whitespace-xls.xls"), trim_ws = FALSE) xlsx <- read_excel(test_sheet("whitespace-xlsx.xlsx"), trim_ws = FALSE) expect_false(identical(names(xls), trimws(names(xls)))) expect_false(identical(names(xlsx), trimws(names(xlsx)))) expect_identical(names(xls), names(xlsx)) }) test_that("whitespace-flanked na strings match when trim_ws = TRUE", { xls <- read_excel( test_sheet("whitespace-xls.xls"), sheet = "logical_and_NA", na = ":-)" ) xlsx <- read_excel( test_sheet("whitespace-xlsx.xlsx"), sheet = "logical_and_NA", na = ":-)" ) expect_is(xls$numeric, "numeric") expect_is(xlsx$numeric, "numeric") expect_true(is.na(xls[[2, 1]])) expect_true(is.na(xlsx[[2, 1]])) }) test_that("whitespace-flanked na strings do not match when trim_ws = FALSE", { xls <- read_excel( test_sheet("whitespace-xls.xls"), sheet = "logical_and_NA", na = ":-)", trim_ws = FALSE ) xlsx <- read_excel( test_sheet("whitespace-xlsx.xlsx"), sheet = "logical_and_NA", na = ":-)", trim_ws = FALSE ) expect_is(xls$numeric, "character") expect_is(xlsx$numeric, "character") expect_identical(xls[[2, 1]], " :-) ") expect_identical(xlsx[[2, 1]], " :-) ") }) readxl/tests/testthat/test-compatibility.R0000644000176200001440000000515113406366260020514 0ustar liggesuserscontext("Compatibility") test_that("can read document from google doc", { iris_1 <- read_excel(test_sheet("iris-excel-xlsx.xlsx")) iris_2 <- read_excel(test_sheet("iris-google-doc.xlsx")) expect_equal(iris_1, iris_2) }) ## #180, #152, #99 ## Some 3rd-party s/w writes xls where lastcol is 0-indexed, like lastrow ## Changed an inequality in xls_cell() in xls.c to accomodate this ## WriteXLS is (or, rather, wraps) such s/w, so it's good source of such xls. ## WriteXLS::WriteXLS(head(mtcars), file.path("tests", "testthat", "sheets", "mtcars.xls")) test_that("can tolerate xls that underreports number of columns", { df <- read_excel(test_sheet("mtcars.xls")) expect_identical(ncol(df), ncol(mtcars)) }) ## #80 ## The infamous Ekaterinburg sheet is written by an unspecified BI tool. ## Tricky for several reasons: ## * Worksheet target paths demand full lookup (#233) ## * Worksheet target paths are prefixed with `/xl/` (#294) ## * Nonstandard XML namespace prefixes (#295) test_that("we can finally read Ekaterinburg", { ek <- read_excel(test_sheet("Ekaterinburg_IP_9.xlsx"), skip = 2) expect_identical(ek[[1, 2]], "27.05.2004") }) ## #309 ## A BIFF5 xls from an unspecified 3rd party tool, that uses a very antiquated ## practice of storing text strings in LABEL records. ## Exposed the fact that the libxls patch in #293 is beneficial for indexing ## the shared string table, but causes difficulty when parsing LABEL records. ## We have a small patch now in libxls for that. test_that("we can read the BIFF5, LABEL record sheet", { df <- read_excel( test_sheet("biff5-label-records.xls"), skip = 2, na = c("", "--") ) expect_identical(dim(df), c(14L, 4L)) expect_identical(df$Date[c(1, 14)], c("21/01/2017", "21/01/2017")) expect_identical(df$Time[c(1, 14)], c("01:00", "14:00")) }) ## https://github.com/tidyverse/readxl/pull/429 ## A2 + B2 test_that("formula cell with no v node does not cause crash", { df <- read_excel(test_sheet("missing-v-node-xlsx.xlsx")) expect_identical(df$`A + B`, NA) }) ## https://github.com/tidyverse/readxl/issues/435 ## https://source.opennews.org/articles/how-we-found-new-patterns-la-homeless-arrest/ ## LAPD uses a tool to produce xlsx that implements the minimal SpreadsheetML ## package structure described on pp65-66 of ECMA 5th edition test_that("we can read LAPD arrest sheets", { expect_error_free( lapd <- read_excel(test_sheet("los-angeles-arrests-xlsx.xlsx"), skip = 2) ) expect_identical(dim(lapd), c(193L, 36L)) expect_match(lapd$ARR_LOC[9], "HOLLYWOOD") expect_identical(lapd$CHG_DESC[27], "EX CON W/ A GUN") }) readxl/tests/testthat/test-n-max.R0000644000176200001440000001032513336631200016651 0ustar liggesuserscontext("n_max") test_that("simple use of n_max works and does not affect col name reading", { ## xlsx df <- read_excel(test_sheet("iris-excel-xlsx.xlsx"), n_max = 1) expect_identical(nrow(df), 1L) df <- read_excel(test_sheet("iris-excel-xlsx.xlsx"), n_max = 0) expect_identical(nrow(df), 0L) expect_identical(ncol(df), 5L) expect_identical(names(df), names(iris)) ## xls df <- read_excel(test_sheet("iris-excel-xls.xls"), n_max = 1) expect_identical(nrow(df), 1L) df <- read_excel(test_sheet("iris-excel-xls.xls"), n_max = 0) expect_identical(nrow(df), 0L) expect_identical(ncol(df), 5L) expect_identical(names(df), names(iris)) }) test_that("n_max = 0 and col_names = FALSE gives empty tibble", { ## xlsx df <- read_excel( test_sheet("skipping.xlsx"), sheet = "two_occupied_rows", n_max = 0, col_names = FALSE ) expect_identical(df, tibble::tibble()) ## xls df <- read_excel( test_sheet("skipping.xls"), sheet = "two_occupied_rows", n_max = 0, col_names = FALSE ) expect_identical(df, tibble::tibble()) }) test_that("n_max is upper bound on nrows, if it causes trailing blank row", { ## xlsx df <- read_excel( test_sheet("skipping.xlsx"), sheet = "two_occupied_rows", n_max = 3 ) expect_identical(nrow(df), 2L) ## xls df <- read_excel( test_sheet("skipping.xls"), sheet = "two_occupied_rows", n_max = 3 ) expect_identical(nrow(df), 2L) }) test_that("n_max can affect ncols, if prevents read of data in a col [xlsx]", { ## xlsx df <- read_excel( test_sheet("skipping.xlsx"), sheet = "two_occupied_rows", n_max = 0 ) expect_identical(nrow(df), 0L) expect_identical(ncol(df), 1L) df <- read_excel( test_sheet("skipping.xlsx"), sheet = "two_occupied_rows", skip = 1, n_max = 0 ) expect_identical(nrow(df), 0L) expect_identical(ncol(df), 1L) }) test_that("n_max can affect ncols, if prevents read of data in a col [xls]", { ## xls df <- read_excel( test_sheet("skipping.xls"), sheet = "two_occupied_rows", n_max = 0 ) expect_identical(nrow(df), 0L) expect_identical(ncol(df), 1L) df <- read_excel( test_sheet("skipping.xls"), sheet = "two_occupied_rows", skip = 1, n_max = 0 ) expect_identical(nrow(df), 0L) expect_identical(ncol(df), 1L) }) test_that("n_max = nrows in dense sheet when col_names = FALSE", { ## xlsx df <- read_excel(test_sheet("iris-excel-xlsx.xlsx"), n_max = 18, col_names = FALSE) expect_identical(nrow(df), 18L) ## xls df <- read_excel(test_sheet("iris-excel-xls.xls"), n_max = 18, col_names = FALSE) expect_identical(nrow(df), 18L) }) test_that("n_max directive survives implicit skipping of empty rows [xlsx]", { ## col_names = TRUE explicit <- read_excel(test_sheet("geometry.xlsx"), skip = 2, n_max = 1) implicit_skip_all <- read_excel(test_sheet("geometry.xlsx"), n_max = 1) mixed_skip <- read_excel(test_sheet("geometry.xlsx"), skip = 1, n_max = 1) expect_identical(explicit, implicit_skip_all) expect_identical(explicit, mixed_skip) ## col_names = FALSE explicit <- read_excel(test_sheet("geometry.xlsx"), skip = 2, n_max = 1, col_names = FALSE) implicit_skip_all <- read_excel(test_sheet("geometry.xlsx"), n_max = 1, col_names = FALSE) mixed_skip <- read_excel(test_sheet("geometry.xlsx"), skip = 1, n_max = 1, col_names = FALSE) expect_identical(explicit, implicit_skip_all) expect_identical(explicit, mixed_skip) }) test_that("n_max directive survives implicit skipping of empty rows [xls]", { ## col_names = TRUE explicit <- read_excel(test_sheet("geometry.xls"), skip = 2, n_max = 1) implicit_skip_all <- read_excel(test_sheet("geometry.xls"), n_max = 1) mixed_skip <- read_excel(test_sheet("geometry.xls"), skip = 1, n_max = 1) expect_identical(explicit, implicit_skip_all) expect_identical(explicit, mixed_skip) ## col_names = FALSE explicit <- read_excel(test_sheet("geometry.xls"), skip = 2, n_max = 1, col_names = FALSE) implicit_skip_all <- read_excel(test_sheet("geometry.xls"), n_max = 1, col_names = FALSE) mixed_skip <- read_excel(test_sheet("geometry.xls"), skip = 1, n_max = 1, col_names = FALSE) expect_identical(explicit, implicit_skip_all) expect_identical(explicit, mixed_skip) }) readxl/tests/testthat/test-return.R0000644000176200001440000000076413336631200017156 0ustar liggesuserscontext("Return type") test_that("return type for xlsx files", { types <- read_excel(test_sheet("missing-values-xlsx.xlsx")) expect_is(types, "tbl_df") expect_is(types, "tbl") expect_is(types, "data.frame") expect_false(tibble::has_rownames(types)) }) test_that("return type for xls files", { types <- read_excel(test_sheet("missing-values-xls.xls")) expect_is(types, "tbl_df") expect_is(types, "tbl") expect_is(types, "data.frame") expect_false(tibble::has_rownames(types)) }) readxl/tests/testthat/helper.R0000644000176200001440000000057513404317563016152 0ustar liggesusers## usage: ## test_sheet("blanks.xls") test_sheet <- function(fname) rprojroot::find_testthat_root_file("sheets", fname) ## once https://github.com/hadley/testthat/commit/c83aba9 is on CRAN ## can use testthat::test_path() for this, i.e., # test_sheet <- function(fname) testthat::test_path("sheets", fname) expect_error_free <- function(...) { expect_error(..., regexp = NA) } readxl/tests/testthat/test-geometry.R0000644000176200001440000001752213336631200017472 0ustar liggesuserscontext("Sheet geometry") ## testing of the unexported standardise_limits() --------------------- limitize <- function(x) { stopifnot(length(x) == 4) setNames(x, c("min_row", "max_row", "min_col", "max_col")) } test_that("we can say 'read nothing' via n_max and col_names", { ## n_max = 0 and col_names is not TRUE --> read nothing l <- standardise_limits(range = NULL, skip = 0, n_max = 0, has_col_names = FALSE) expect_identical(l, limitize(c(-2, -1, -1, -1))) ## min_row max_row min_col max_col ## -2 -1 -1 -1 ## it should not matter what skip is l2 <- standardise_limits( range = NULL, skip = sample(1:100, 1), n_max = 0, has_col_names = FALSE ) expect_identical(l, l2) }) test_that("we can request exactly 1 row for col_names via n_max and col_names", { my_skip <- sample(0:100, 1) l <- standardise_limits(range = NULL, skip = my_skip, n_max = 0, has_col_names = TRUE) expect_identical(l, limitize(c(my_skip, my_skip, -1, -1))) }) test_that("we can request n rows for data via n_max and skip doesn't matter", { my_skip <- sample(0:100, 1) n <- sample(1:100, 1) l <- standardise_limits(range = NULL, skip = my_skip, n_max = n, has_col_names = TRUE) expect_identical(l, limitize(c(my_skip, my_skip + n, -1, -1))) my_skip <- sample(0:100, 1) n <- sample(1:100, 1) l <- standardise_limits(range = NULL, skip = my_skip, n_max = n, has_col_names = FALSE) expect_identical(l, limitize(c(my_skip, my_skip + n - 1, -1, -1))) }) ## testing via read_excel() ------------------------------------------- test_that("geometry sheet is identical in xls and xlsx and shrink wraps by default", { ref <- tibble::tibble( var1 = c("aa", "dd", "gg"), var2 = c("bb", "ee", "hh"), var3 = c("cc", "ff", "ii") ) xls <- read_excel(test_sheet("geometry.xls")) xlsx <- read_excel(test_sheet("geometry.xls")) expect_identical(xls, xlsx) expect_identical(xls, ref) }) ## at time of writing, clippy/geometry.key contains useful sketches ## for choosing test cases ## they are not comprehensive, but cover a very large number of scenarios test_that("exact range request for data rectangle works", { ref <- tibble::tibble( var1 = c("aa", "dd", "gg"), var2 = c("bb", "ee", "hh"), var3 = c("cc", "ff", "ii") ) xls <- read_excel(test_sheet("geometry.xls"), range = "B3:D6") xlsx <- read_excel(test_sheet("geometry.xlsx"), range = "B3:D6") expect_identical(xls, xlsx) expect_identical(xls, ref) }) test_that("range request for proper subset of data rectangle works", { ref <- tibble::tibble( var1 = c("aa"), var2 = c("bb") ) xls <- read_excel(test_sheet("geometry.xls"), range = "B3:C4") xlsx <- read_excel(test_sheet("geometry.xlsx"), range = "B3:C4") expect_identical(xls, xlsx) expect_identical(xls, ref) }) test_that("range requests that run off one or more edges of data rectangle work", { ## all four edges xls <- read_excel(test_sheet("geometry.xls"), range = "A2:E7") xlsx <- read_excel(test_sheet("geometry.xlsx"), range = "A2:E7") expect_identical(xls, xlsx) expect_identical(dim(xls), c(5L, 5L)) ## top edge only, partial xls <- read_excel(test_sheet("geometry.xls"), range = "B2:C3") xlsx <- read_excel(test_sheet("geometry.xlsx"), range = "B2:C3") expect_identical(xls, xlsx) expect_identical(dim(xls), c(1L, 2L)) ## top and right, partial xls <- read_excel(test_sheet("geometry.xls"), range = "D2:E3") xlsx <- read_excel(test_sheet("geometry.xlsx"), range = "D2:E3") expect_identical(xls, xlsx) expect_identical(dim(xls), c(1L, 2L)) ## right edge only, partial xls <- read_excel(test_sheet("geometry.xls"), range = "C4:E5") xlsx <- read_excel(test_sheet("geometry.xlsx"), range = "C4:E5") expect_identical(xls, xlsx) expect_identical(dim(xls), c(1L, 3L)) ## left and right edges, partial xls <- read_excel(test_sheet("geometry.xls"), range = "A4:E5") xlsx <- read_excel(test_sheet("geometry.xlsx"), range = "A4:E5") expect_identical(xls, xlsx) expect_identical(dim(xls), c(1L, 5L)) ## left and bottom edges, partial xls <- read_excel(test_sheet("geometry.xls"), range = "A6:B7") xlsx <- read_excel(test_sheet("geometry.xlsx"), range = "A6:B7") expect_identical(xls, xlsx) expect_identical(dim(xls), c(1L, 2L)) }) test_that("requests that use cell_rows() only work", { ## rows are within the data xls <- read_excel(test_sheet("geometry.xls"), range = cell_rows(2:3)) xlsx <- read_excel(test_sheet("geometry.xlsx"), range = cell_rows(2:3)) expect_identical(xls, xlsx) expect_identical(dim(xls), c(1L, 3L)) ## rows run past the data xls <- read_excel(test_sheet("geometry.xls"), range = cell_rows(3:7)) xlsx <- read_excel(test_sheet("geometry.xlsx"), range = cell_rows(3:7)) expect_identical(xls, xlsx) expect_identical(dim(xls), c(4L, 3L)) ## rows start before the data xls <- read_excel(test_sheet("geometry.xls"), range = cell_rows(1:4)) xlsx <- read_excel(test_sheet("geometry.xlsx"), range = cell_rows(1:4)) expect_identical(xls, xlsx) expect_identical(dim(xls), c(3L, 3L)) ## rows start before and run past the data xls <- read_excel(test_sheet("geometry.xls"), range = cell_rows(1:7)) xlsx <- read_excel(test_sheet("geometry.xlsx"), range = cell_rows(1:7)) expect_identical(xls, xlsx) expect_identical(dim(xls), c(6L, 3L)) ## unspecified upper row bound xls <- read_excel(test_sheet("geometry.xls"), range = cell_rows(c(3, NA))) xlsx <- read_excel(test_sheet("geometry.xlsx"), range = cell_rows(c(3, NA))) expect_identical(xls, xlsx) expect_identical(dim(xls), c(3L, 3L)) ## unspecified lower bound not relevant because cellranger handles }) test_that("requests that use cell_cols() only work", { ## cols are within the data xls <- read_excel(test_sheet("geometry.xls"), range = cell_cols(2:3)) xlsx <- read_excel(test_sheet("geometry.xlsx"), range = cell_cols(2:3)) expect_identical(xls, xlsx) expect_identical(dim(xls), c(3L, 2L)) ## cols run past the data xls <- read_excel(test_sheet("geometry.xls"), range = cell_cols(2:5)) xlsx <- read_excel(test_sheet("geometry.xlsx"), range = cell_cols(2:5)) expect_identical(xls, xlsx) expect_identical(dim(xls), c(3L, 4L)) ## cols start before the data xls <- read_excel(test_sheet("geometry.xls"), range = cell_cols(1:3)) xlsx <- read_excel(test_sheet("geometry.xlsx"), range = cell_cols(1:3)) expect_identical(xls, xlsx) expect_identical(dim(xls), c(3L, 3L)) ## cols start before and run past the data xls <- read_excel(test_sheet("geometry.xls"), range = cell_cols(1:5)) xlsx <- read_excel(test_sheet("geometry.xlsx"), range = cell_cols(1:5)) expect_identical(xls, xlsx) expect_identical(dim(xls), c(3L, 5L)) ## unspecified upper col bound xls <- read_excel(test_sheet("geometry.xls"), range = cell_cols(c(3, NA))) xlsx <- read_excel(test_sheet("geometry.xlsx"), range = cell_cols(c(3, NA))) expect_identical(xls, xlsx) expect_identical(dim(xls), c(3L, 2L)) ## unspecified lower bound not relevant because cellranger handles }) test_that("open rectangles work", { ## only worth testing openness on right and bottom ## cellranger handles openness on left and top ## open on bottom lims <- cell_limits(c(5, 3), c(NA, 5)) xls <- read_excel(test_sheet("geometry.xls"), range = lims) xlsx <- read_excel(test_sheet("geometry.xlsx"), range = lims) expect_identical(xls, xlsx) expect_identical(dim(xls), c(1L, 3L)) ## open on right lims <- cell_limits(c(3, 3), c(5, NA)) xls <- read_excel(test_sheet("geometry.xls"), range = lims) xlsx <- read_excel(test_sheet("geometry.xlsx"), range = lims) expect_identical(xls, xlsx) expect_identical(dim(xls), c(2L, 2L)) ## open on bottom and right lims <- cell_limits(c(4, 3), c(NA, NA)) xls <- read_excel(test_sheet("geometry.xls"), range = lims) xlsx <- read_excel(test_sheet("geometry.xlsx"), range = lims) expect_identical(xls, xlsx) expect_identical(dim(xls), c(2L, 2L)) }) readxl/tests/testthat/test-richtext.R0000644000176200001440000000167413336631200017472 0ustar liggesuserscontext("Richtext") test_that("rich text strings are handled in stringtable", { rt <- read_excel(test_sheet("richtext-coloured.xlsx"), col_names = FALSE) for (i in 1:4) expect_equal(rt[[1, i]], "abcd") expect_equal(rt[[2, 1]], "tvalrval1rval2") for (i in 2:4) expect_equal(rt[[2, i]], "rval1rval2") }) test_that("rich text inside inlineStr", { # Original source: http://our.componentone.com/wp-content/uploads/2011/12/TestExcel.xlsx # Modified to have Excel-safe mixed use of and x <- read_excel(test_sheet("inlineStr2.xlsx")) expect_equal(x$ID, "RQ11610") expect_equal(names(x)[1], "NNNN") expect_equal(names(x)[2], "BeforeHierarchy") }) test_that("strings containing escaped hexcodes are read", { df <- read_excel(test_sheet("new_line_errors.xlsx")) expect_false(grepl("_x000D_", df[1, 1])) expect_equal(substring(df[1, 1], 20, 21), "\u000d\r") expect_equal(substring(df[2, 1], 11, 19), "\"_x000D_\"") }) readxl/tests/testthat/test-col-names.R0000644000176200001440000001420513442217110017506 0ustar liggesuserscontext("Column names") test_that("col_names = FALSE mimics missing column names [xlsx]", { df1 <- read_excel( test_sheet("no-yes-col-names.xlsx"), sheet = "no-col-names", col_names = FALSE ) df2 <- read_excel( test_sheet("no-yes-col-names.xlsx"), sheet = "yes-col-names", skip = 1, col_names = c("", "") ) df3 <- read_excel( test_sheet("no-yes-col-names.xlsx"), ## A1 and B1 aren't truly empty -- contain invisible single quotes, so we ## don't skip over them sheet = "empty-col-names" ) expect_identical(df1, df2) expect_identical(df2, df3) }) test_that("col_names = FALSE mimics missing column names [xls]", { df1 <- read_excel( test_sheet("no-yes-col-names.xls"), sheet = "no-col-names", col_names = FALSE ) df2 <- read_excel( test_sheet("no-yes-col-names.xls"), sheet = "yes-col-names", skip = 1, col_names = c("", "") ) df3 <- read_excel( test_sheet("no-yes-col-names.xls"), ## A1 and B1 aren't truly empty -- contain invisible single quotes, so we ## don't skip over them sheet = "empty-col-names" ) expect_identical(df1, df2) expect_identical(df2, df3) }) test_that("missing column names are populated", { tibble_version <- utils::packageVersion("tibble") nms <- if (tibble_version > "2.0.1") { c("...1", "...3") } else if (tibble_version > "1.4.2") { c("..1", "..3") } else { c("X__1", "X__2") } df <- read_excel(test_sheet("unnamed-duplicated-columns.xlsx")) expect_identical(names(df)[c(1, 3)], nms) df <- read_excel(test_sheet("unnamed-duplicated-columns.xls")) expect_identical(names(df)[c(1, 3)], nms) }) test_that("column names are de-duplicated", { tibble_version <- utils::packageVersion("tibble") nm <- if (tibble_version > "2.0.1") { "var2...4" } else if (tibble_version > "1.4.2") { "var2..4" } else { "var2__1" } df <- read_excel(test_sheet("unnamed-duplicated-columns.xlsx")) expect_identical(names(df)[4], nm) df <- read_excel(test_sheet("unnamed-duplicated-columns.xls")) expect_identical(names(df)[4], nm) }) test_that("wrong length column names are rejected", { err_msg <- "Sheet 1 has 5 columns (5 unskipped), but `col_names` has length 3." expect_error( read_excel(test_sheet("iris-excel-xlsx.xlsx"), col_names = LETTERS[1:3]), err_msg, fixed = TRUE ) expect_error( read_excel(test_sheet("iris-excel-xls.xls"), col_names = LETTERS[1:3]), err_msg, fixed = TRUE ) }) test_that("column_names can anticipate skipping", { ## xlsx df <- read_excel( test_sheet("iris-excel-xlsx.xlsx"), col_names = c("one", "two", "three"), skip = 1, col_types = c("numeric", "numeric", "skip", "skip", "text") ) expect_identical(dim(df), c(150L, 3L)) expect_identical(names(df), c("one", "two", "three")) ## xls df <- read_excel( test_sheet("iris-excel-xls.xls"), col_names = c("one", "two", "three"), skip = 1, col_types = c("numeric", "numeric", "skip", "skip", "text") ) expect_identical(dim(df), c(150L, 3L)) expect_identical(names(df), c("one", "two", "three")) }) test_that(".name_repair is passed through to tibble", { tibble_version <- utils::packageVersion("tibble") skip_if(tibble_version <= "1.4.2") expect_colnames <- function(df, expected) { expect_identical(colnames(df), expected) } ## default is "unique" nms <- if (tibble_version > "2.0.1") { c("a b...1", "a b...2","...3", "c%&$") } else { c("a b..1", "a b..2","..3", "c%&$") } xlsx <- read_excel(test_sheet("names-need-repair-xlsx.xlsx")) expect_colnames(xlsx, nms) xls <- read_excel(test_sheet("names-need-repair-xls.xls")) expect_colnames(xls, nms) ## "universal" names are available nms <- if (tibble_version > "2.0.1") { c("a.b...1", "a.b...2","...3", "c...") } else { c("a.b..1", "a.b..2","...3", "c...") } xlsx <- read_excel(test_sheet("names-need-repair-xlsx.xlsx"), .name_repair = "universal") expect_colnames(xlsx, nms) xls <- read_excel(test_sheet("names-need-repair-xls.xls"), .name_repair = "universal") expect_colnames(xls, nms) ## "minimal" names are available nms <- c("", "var2","", "var2") xlsx <- read_excel(test_sheet("unnamed-duplicated-columns.xlsx"), .name_repair = "minimal") expect_colnames(xlsx, nms) xls <- read_excel(test_sheet("unnamed-duplicated-columns.xls"), .name_repair = "minimal") expect_colnames(xls, nms) ## specify name repair as a built-in function nms <- c("SEPAL.LENGTH", "SEPAL.WIDTH", "PETAL.LENGTH", "PETAL.WIDTH", "SPECIES") xlsx <- read_excel(test_sheet("iris-excel-xlsx.xlsx"), .name_repair = toupper) expect_colnames(xlsx, nms) xls <- read_excel(test_sheet("iris-excel-xls.xls"), .name_repair = toupper) expect_colnames(xls, nms) ## specify name repair as a custom function nms <- c("sepal_length", "sepal_width", "petal_length", "petal_width", "species") custom_name_repair <- function(nms) tolower(gsub("[.]", "_", nms)) xlsx <- read_excel(test_sheet("iris-excel-xlsx.xlsx"), .name_repair = custom_name_repair) expect_colnames(xlsx, nms) xls <- read_excel(test_sheet("iris-excel-xls.xls"), .name_repair = custom_name_repair) expect_colnames(xls, nms) ## specify name repair as an anonymous function nms <- c("wei", "fee") xlsx <- read_excel( readxl_example("datasets.xlsx"), sheet = "chickwts", .name_repair = ~ substr(.x, start = 1, stop = 3) ) expect_colnames(xlsx, nms) xls <- read_excel( readxl_example("datasets.xls"), sheet = "chickwts", .name_repair = ~ substr(.x, start = 1, stop = 3) ) expect_colnames(xls, nms) }) test_that("use of .name_repair is caught and handled with old tibble", { tibble_version <- utils::packageVersion("tibble") skip_if(tibble_version > "1.4.2") expect_colnames <- function(df, expected) { expect_identical(colnames(df), expected) } nms <- c("a b", "a b__1","X__1", "c%&$") expect_message( xlsx <- read_excel(test_sheet("names-need-repair-xlsx.xlsx"), .name_repair = "universal"), "Ignoring" ) expect_colnames(xlsx, nms) expect_message( xls <- read_excel(test_sheet("names-need-repair-xls.xls"), .name_repair = "universal"), "Ignoring" ) expect_colnames(xls, nms) }) readxl/tests/testthat/test-problems.R0000644000176200001440000000206413336631200017455 0ustar liggesuserscontext("Problems") test_that("coercion warnings report correct address", { ## xlsx expect_warning( read_excel( test_sheet("geometry.xlsx"), sheet = "warning_B6", col_types = "numeric" ), "Expecting numeric in B6 / R6C2", fixed = TRUE ) expect_warning( read_excel( test_sheet("geometry.xlsx"), sheet = "warning_AT6", col_types = "numeric" ), "Expecting numeric in AT6 / R6C46", fixed = TRUE ) expect_warning( read_excel( test_sheet("geometry.xlsx"), sheet = "warning_AKE6", col_types = "numeric" ), "Expecting numeric in AKE6 / R6C967", fixed = TRUE ) ## xls expect_warning( read_excel( test_sheet("geometry.xls"), sheet = "warning_B6", col_types = "numeric" ), "Expecting numeric in B6 / R6C2", fixed = TRUE ) expect_warning( read_excel( test_sheet("geometry.xls"), sheet = "warning_AT6", col_types = "numeric" ), "Expecting numeric in AT6 / R6C46", fixed = TRUE ) ## xls column max is 256, so we're done }) readxl/tests/BIFF5-LABEL-record-string-read-mac-10-11.supp0000644000176200001440000001612613172305601022104 0ustar liggesusers{ Memcheck:Cond fun:bcmp fun:_ZN16ImageLoaderMachO18validateFirstPagesEPK21linkedit_data_commandiPKhmxRKN11ImageLoader11LinkContextE fun:_ZN26ImageLoaderMachOCompressed19instantiateFromFileEPKciPKhmyyRK4statjjPK21linkedit_data_commandPK23encryption_info_commandRKN11ImageLoader11LinkContextE fun:_ZN16ImageLoaderMachO19instantiateFromFileEPKciPKhyyRK4statRKN11ImageLoader11LinkContextE fun:_ZN4dyldL10loadPhase6EiRK4statPKcRKNS_11LoadContextE fun:_ZN4dyldL10loadPhase5EPKcS1_RKNS_11LoadContextEPNSt3__16vectorIS1_NS5_9allocatorIS1_EEEE fun:_ZN4dyldL10loadPhase4EPKcS1_RKNS_11LoadContextEPNSt3__16vectorIS1_NS5_9allocatorIS1_EEEE fun:_ZN4dyldL10loadPhase3EPKcS1_RKNS_11LoadContextEPNSt3__16vectorIS1_NS5_9allocatorIS1_EEEE fun:_ZN4dyldL10loadPhase1EPKcS1_RKNS_11LoadContextEPNSt3__16vectorIS1_NS5_9allocatorIS1_EEEE fun:_ZN4dyldL10loadPhase0EPKcS1_RKNS_11LoadContextEPNSt3__16vectorIS1_NS5_9allocatorIS1_EEEE fun:_ZN4dyld4loadEPKcRKNS_11LoadContextE fun:_ZN4dyldL14libraryLocatorEPKcbS1_PKN11ImageLoader10RPathChainE } { Memcheck:Value8 fun:bcmp fun:_ZN16ImageLoaderMachO18validateFirstPagesEPK21linkedit_data_commandiPKhmxRKN11ImageLoader11LinkContextE fun:_ZN26ImageLoaderMachOCompressed19instantiateFromFileEPKciPKhmyyRK4statjjPK21linkedit_data_commandPK23encryption_info_commandRKN11ImageLoader11LinkContextE fun:_ZN16ImageLoaderMachO19instantiateFromFileEPKciPKhyyRK4statRKN11ImageLoader11LinkContextE fun:_ZN4dyldL10loadPhase6EiRK4statPKcRKNS_11LoadContextE fun:_ZN4dyldL10loadPhase5EPKcS1_RKNS_11LoadContextEPNSt3__16vectorIS1_NS5_9allocatorIS1_EEEE fun:_ZN4dyldL10loadPhase4EPKcS1_RKNS_11LoadContextEPNSt3__16vectorIS1_NS5_9allocatorIS1_EEEE fun:_ZN4dyldL10loadPhase3EPKcS1_RKNS_11LoadContextEPNSt3__16vectorIS1_NS5_9allocatorIS1_EEEE fun:_ZN4dyldL10loadPhase1EPKcS1_RKNS_11LoadContextEPNSt3__16vectorIS1_NS5_9allocatorIS1_EEEE fun:_ZN4dyldL10loadPhase0EPKcS1_RKNS_11LoadContextEPNSt3__16vectorIS1_NS5_9allocatorIS1_EEEE fun:_ZN4dyld4loadEPKcRKNS_11LoadContextE fun:_ZN4dyldL14libraryLocatorEPKcbS1_PKN11ImageLoader10RPathChainE } { Memcheck:Cond fun:_ZN16ImageLoaderMachO18validateFirstPagesEPK21linkedit_data_commandiPKhmxRKN11ImageLoader11LinkContextE fun:_ZN26ImageLoaderMachOCompressed19instantiateFromFileEPKciPKhmyyRK4statjjPK21linkedit_data_commandPK23encryption_info_commandRKN11ImageLoader11LinkContextE fun:_ZN16ImageLoaderMachO19instantiateFromFileEPKciPKhyyRK4statRKN11ImageLoader11LinkContextE fun:_ZN4dyldL10loadPhase6EiRK4statPKcRKNS_11LoadContextE fun:_ZN4dyldL10loadPhase5EPKcS1_RKNS_11LoadContextEPNSt3__16vectorIS1_NS5_9allocatorIS1_EEEE fun:_ZN4dyldL10loadPhase4EPKcS1_RKNS_11LoadContextEPNSt3__16vectorIS1_NS5_9allocatorIS1_EEEE fun:_ZN4dyldL10loadPhase3EPKcS1_RKNS_11LoadContextEPNSt3__16vectorIS1_NS5_9allocatorIS1_EEEE fun:_ZN4dyldL10loadPhase1EPKcS1_RKNS_11LoadContextEPNSt3__16vectorIS1_NS5_9allocatorIS1_EEEE fun:_ZN4dyldL10loadPhase0EPKcS1_RKNS_11LoadContextEPNSt3__16vectorIS1_NS5_9allocatorIS1_EEEE fun:_ZN4dyld4loadEPKcRKNS_11LoadContextE fun:_ZN4dyldL14libraryLocatorEPKcbS1_PKN11ImageLoader10RPathChainE fun:_ZN11ImageLoader22recursiveLoadLibrariesERKNS_11LinkContextEbRKNS_10RPathChainE } { Memcheck:Cond fun:strnlen fun:__vfprintf fun:__v2printf fun:_vasprintf fun:asprintf fun:xls_getfcell fun:xls_addCell fun:xls_parseWorkSheet fun:_ZN12XlsWorkSheetC2E11XlsWorkBookiN4Rcpp6VectorILi13ENS1_15PreserveStorageEEEb fun:_ZN12XlsWorkSheetC1E11XlsWorkBookiN4Rcpp6VectorILi13ENS1_15PreserveStorageEEEb fun:_Z9read_xls_NSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEiN4Rcpp12RObject_ImplINS6_15PreserveStorageEEES9_S9_S9_NS_6vectorIS5_NS3_IS5_EEEEi fun:readxl_read_xls_ } { Memcheck:Cond fun:__vfprintf fun:__v2printf fun:_vasprintf fun:asprintf fun:xls_getfcell fun:xls_addCell fun:xls_parseWorkSheet fun:_ZN12XlsWorkSheetC2E11XlsWorkBookiN4Rcpp6VectorILi13ENS1_15PreserveStorageEEEb fun:_ZN12XlsWorkSheetC1E11XlsWorkBookiN4Rcpp6VectorILi13ENS1_15PreserveStorageEEEb fun:_Z9read_xls_NSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEiN4Rcpp12RObject_ImplINS6_15PreserveStorageEEES9_S9_S9_NS_6vectorIS5_NS3_IS5_EEEEi fun:readxl_read_xls_ fun:R_doDotCall } { Memcheck:Cond fun:__sfvwrite fun:__vfprintf fun:__v2printf fun:_vasprintf fun:asprintf fun:xls_getfcell fun:xls_addCell fun:xls_parseWorkSheet fun:_ZN12XlsWorkSheetC2E11XlsWorkBookiN4Rcpp6VectorILi13ENS1_15PreserveStorageEEEb fun:_ZN12XlsWorkSheetC1E11XlsWorkBookiN4Rcpp6VectorILi13ENS1_15PreserveStorageEEEb fun:_Z9read_xls_NSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEiN4Rcpp12RObject_ImplINS6_15PreserveStorageEEES9_S9_S9_NS_6vectorIS5_NS3_IS5_EEEEi fun:readxl_read_xls_ } { Memcheck:Cond fun:_platform_memmove$VARIANT$Haswell fun:__sfvwrite fun:__vfprintf fun:__v2printf fun:_vasprintf fun:asprintf fun:xls_getfcell fun:xls_addCell fun:xls_parseWorkSheet fun:_ZN12XlsWorkSheetC2E11XlsWorkBookiN4Rcpp6VectorILi13ENS1_15PreserveStorageEEEb fun:_ZN12XlsWorkSheetC1E11XlsWorkBookiN4Rcpp6VectorILi13ENS1_15PreserveStorageEEEb fun:_Z9read_xls_NSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEiN4Rcpp12RObject_ImplINS6_15PreserveStorageEEES9_S9_S9_NS_6vectorIS5_NS3_IS5_EEEEi } { Memcheck:Value8 fun:_platform_memmove$VARIANT$Haswell fun:__sfvwrite fun:__vfprintf fun:__v2printf fun:_vasprintf fun:asprintf fun:xls_getfcell fun:xls_addCell fun:xls_parseWorkSheet fun:_ZN12XlsWorkSheetC2E11XlsWorkBookiN4Rcpp6VectorILi13ENS1_15PreserveStorageEEEb fun:_ZN12XlsWorkSheetC1E11XlsWorkBookiN4Rcpp6VectorILi13ENS1_15PreserveStorageEEEb fun:_Z9read_xls_NSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEiN4Rcpp12RObject_ImplINS6_15PreserveStorageEEES9_S9_S9_NS_6vectorIS5_NS3_IS5_EEEEi } { Memcheck:Cond fun:_vasprintf fun:asprintf fun:xls_getfcell fun:xls_addCell fun:xls_parseWorkSheet fun:_ZN12XlsWorkSheetC2E11XlsWorkBookiN4Rcpp6VectorILi13ENS1_15PreserveStorageEEEb fun:_ZN12XlsWorkSheetC1E11XlsWorkBookiN4Rcpp6VectorILi13ENS1_15PreserveStorageEEEb fun:_Z9read_xls_NSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEiN4Rcpp12RObject_ImplINS6_15PreserveStorageEEES9_S9_S9_NS_6vectorIS5_NS3_IS5_EEEEi fun:readxl_read_xls_ fun:R_doDotCall fun:do_dotcall fun:Rf_eval } { Memcheck:Value8 fun:_vasprintf fun:asprintf fun:xls_getfcell fun:xls_addCell fun:xls_parseWorkSheet fun:_ZN12XlsWorkSheetC2E11XlsWorkBookiN4Rcpp6VectorILi13ENS1_15PreserveStorageEEEb fun:_ZN12XlsWorkSheetC1E11XlsWorkBookiN4Rcpp6VectorILi13ENS1_15PreserveStorageEEEb fun:_Z9read_xls_NSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEiN4Rcpp12RObject_ImplINS6_15PreserveStorageEEES9_S9_S9_NS_6vectorIS5_NS3_IS5_EEEEi fun:readxl_read_xls_ fun:R_doDotCall fun:do_dotcall fun:Rf_eval } readxl/src/0000755000176200001440000000000013442224523012321 5ustar liggesusersreadxl/src/zip.cpp0000644000176200001440000000233413442224523013631 0ustar liggesusers#include #include "zip.h" #include "rapidxml_print.h" using namespace Rcpp; Function readxl(const std::string& fun){ Environment env = Environment::namespace_env("readxl"); return env[fun]; } std::string zip_buffer(const std::string& zip_path, const std::string& file_path) { Rcpp::Function zip_buffer = readxl("zip_buffer"); Rcpp::RawVector xml = Rcpp::as(zip_buffer(zip_path, file_path)); std::string buffer(RAW(xml), RAW(xml) + xml.size()); buffer.push_back('\0'); return buffer; } bool zip_has_file(const std::string& zip_path, const std::string& file_path) { Rcpp::Function zip_has_file = readxl("zip_has_file"); LogicalVector res = wrap(zip_has_file(zip_path, file_path)); return res[0]; } std::string xml_print(std::string xml) { rapidxml::xml_document<> doc; xml.push_back('\0'); doc.parse(&xml[0]); std::string s; rapidxml::print(std::back_inserter(s), doc, 0); return s; } // [[Rcpp::export]] void zip_xml(const std::string& zip_path, const std::string& file_path) { std::string buffer = zip_buffer(zip_path, file_path); Rcout << xml_print(buffer); } readxl/src/Makevars0000644000176200001440000000017213442224523014015 0ustar liggesusersPKG_CPPFLAGS = -Iunix -I. -DRCPP_DEFAULT_INCLUDE_CALL=false PKG_CFLAGS = $(C_VISIBILITY) PKG_CXXFLAGS = $(CXX_VISIBILITY) readxl/src/ole.c0000644000176200001440000006242313442224523013253 0ustar liggesusers/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright 2004 Komarov Valery * Copyright 2006 Christophe Leitienne * Copyright 2008-2017 David Hoerl * Copyright 2013 Bob Colbert * Copyright 2013-2018 Evan Miller * * This file is part of libxls -- A multiplatform, C/C++ library for parsing * Excel(TM) files. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "config.h" #include #include #include #include #include #include "libxls/ole.h" #include "libxls/xlstool.h" #include "libxls/endian.h" /* Mask illegal functions for CMD check */ #include "cran.h" extern int xls_debug; //#define OLE_DEBUG //static const DWORD MSATSECT = 0xFFFFFFFC; // -4 //static const DWORD FATSECT = 0xFFFFFFFD; // -3 static const DWORD ENDOFCHAIN = 0xFFFFFFFE; // -2 static const DWORD FREESECT = 0xFFFFFFFF; // -1 static size_t sector_pos(OLE2* ole2, DWORD sid); static ssize_t sector_read(OLE2* ole2, void *buffer, size_t buffer_len, DWORD sid); static ssize_t read_MSAT(OLE2* ole2, OLE2Header *oleh); static void *ole_malloc(size_t len); static void *ole_realloc(void *ptr, size_t len); static void *ole_malloc(size_t len) { if (len > (1<<24) || len == 0) { return NULL; } return malloc(len); } static void *ole_realloc(void *ptr, size_t len) { if (len > (1<<24) || len == 0) { free(ptr); return NULL; } return realloc(ptr, len); } static int ole2_validate_sector_chain(DWORD *chain, DWORD chain_count, DWORD chain_start) { DWORD count = 0; DWORD sector = chain_start; while (sector != ENDOFCHAIN) { if (sector >= chain_count) return 0; if (++count >= chain_count) return 0; sector = xlsIntVal(chain[sector]); } return 1; } static int ole2_validate_sector(DWORD sector, OLE2 *ole) { if (sector >= ole->SecIDCount) { if (xls_debug) fprintf(stderr, "Error: fatpos %d out-of-bounds for SecID[%d]\n", (int)sector, ole->SecIDCount); return 0; } if (sector == xlsIntVal(ole->SecID[sector])) { if (xls_debug) fprintf(stderr, "Error: Sector loop detected, SecID[%d] = %d\n", (int)sector, (int)sector); return 0; } return 1; } // Read next sector of stream static int ole2_bufread(OLE2Stream* olest) { BYTE *ptr; if (olest == NULL || olest->ole == NULL) return -1; if ((DWORD)olest->fatpos!=ENDOFCHAIN) { if(olest->sfat) { if (olest->ole->SSAT == NULL || olest->buf == NULL || olest->ole->SSecID == NULL) return -1; if (olest->fatpos*olest->ole->lssector + olest->bufsize > olest->ole->SSATCount) { if (xls_debug) fprintf(stderr, "Error: fatpos %d out-of-bounds for SSAT\n", (int)olest->fatpos); return -1; } ptr = olest->ole->SSAT + olest->fatpos*olest->ole->lssector; memcpy(olest->buf, ptr, olest->bufsize); if (olest->fatpos >= olest->ole->SSecIDCount) { if (xls_debug) fprintf(stderr, "Error: fatpos %d out-of-bounds for SSecID[%d]\n", (int)olest->fatpos, olest->ole->SSecIDCount); return -1; } olest->fatpos=xlsIntVal(olest->ole->SSecID[olest->fatpos]); olest->pos=0; olest->cfat++; } else { if ((int)olest->fatpos < 0 || sector_read(olest->ole, olest->buf, olest->bufsize, olest->fatpos) == -1) { if (xls_debug) fprintf(stderr, "Error: Unable to read sector #%d\n", (int)olest->fatpos); return -1; } if (!ole2_validate_sector(olest->fatpos, olest->ole)) { return -1; } olest->fatpos = xlsIntVal(olest->ole->SecID[olest->fatpos]); olest->pos=0; olest->cfat++; } } // else printf("ENDOFCHAIN!!!\n"); return 0; } // Read part of stream ssize_t ole2_read(void* buf, size_t size, size_t count, OLE2Stream* olest) { size_t didReadCount=0; size_t totalReadCount; totalReadCount=size*count; // olest->size inited to -1 // printf("===== ole2_read(%ld bytes)\n", totalReadCount); if ((long)olest->size>=0 && !olest->sfat) // directory is -1 { size_t rem; rem = olest->size - (olest->cfat*olest->ole->lsector+olest->pos); totalReadCount = remeof=1; // printf(" rem=%ld olest->size=%d - subfunc=%d\n", rem, olest->size, (olest->cfat*olest->ole->lsector+olest->pos) ); //printf(" totalReadCount=%d (rem=%d size*count=%ld)\n", totalReadCount, rem, size*count); } while ((!olest->eof) && (didReadCount < totalReadCount)) { unsigned long remainingBytes; size_t needToReadCount; needToReadCount = totalReadCount - didReadCount; remainingBytes = olest->bufsize - olest->pos; if (needToReadCount < remainingBytes) { // does the current sector contain all the data I need? memcpy((BYTE*)buf + didReadCount, olest->buf + olest->pos, needToReadCount); olest->pos += needToReadCount; didReadCount += needToReadCount; } else { memcpy((BYTE*)buf + didReadCount, olest->buf + olest->pos, remainingBytes); olest->pos += remainingBytes; didReadCount += remainingBytes; if (ole2_bufread(olest) == -1) return -1; } if (((DWORD)olest->fatpos == ENDOFCHAIN) && (olest->pos >= olest->bufsize)) { olest->eof=1; } } if (didReadCount > totalReadCount) return -1; // printf(" didReadCount=%ld EOF=%d\n", didReadCount, olest->eof); // printf("=====\n"); #ifdef OLE_DEBUG fprintf(stderr, "----------------------------------------------\n"); fprintf(stderr, "ole2_read (end)\n"); fprintf(stderr, "start: %d \n",olest->start); fprintf(stderr, "pos: %d \n",(int)olest->pos); fprintf(stderr, "cfat: %d \n",(int)olest->cfat); fprintf(stderr, "size: %d \n",(int)olest->size); fprintf(stderr, "fatpos: %d \n",(int)olest->fatpos); fprintf(stderr, "bufsize: %d \n",(int)olest->bufsize); fprintf(stderr, "eof: %d \n",olest->eof); #endif return didReadCount; } // Open stream in logical ole file OLE2Stream* ole2_sopen(OLE2* ole,DWORD start, size_t size) { OLE2Stream* olest=NULL; int success = 1; #ifdef OLE_DEBUG fprintf(stderr, "----------------------------------------------\n"); fprintf(stderr, "ole2_sopen start=%Xh\n", start); #endif olest = calloc(1, sizeof(OLE2Stream)); olest->ole=ole; olest->size=size; olest->fatpos=start; olest->start=start; olest->cfat=-1; if((long)size > 0 && size < (size_t)ole->sectorcutoff) { olest->bufsize=ole->lssector; olest->sfat = 1; } else { olest->bufsize=ole->lsector; } if ((olest->buf = ole_malloc(olest->bufsize)) == NULL) { success = 0; goto cleanup; } if (olest->sfat) { if (!ole2_validate_sector_chain(ole->SSecID, ole->SSecIDCount, start)) { success = 0; goto cleanup; } } else { if (!ole2_validate_sector_chain(ole->SecID, ole->SecIDCount, start)) { success = 0; goto cleanup; } } if (ole2_bufread(olest) == -1) { success = 0; goto cleanup; } cleanup: if (!success) { ole2_fclose(olest); olest = NULL; } // if(xls_debug) printf("sopen: sector=%d next=%d\n", start, olest->fatpos); return olest; } // Move in stream int ole2_seek(OLE2Stream* olest,DWORD ofs) { #ifdef OLE_DEBUG fprintf(stderr, "SEEK %x\n", ofs); #endif if(olest->sfat) { ldiv_t div_rez=ldiv(ofs,olest->ole->lssector); int i; olest->fatpos=olest->start; if (div_rez.quot!=0) { for (i=0;ifatpos >= olest->ole->SSecIDCount) return -1; olest->fatpos=xlsIntVal(olest->ole->SSecID[olest->fatpos]); } } if (ole2_bufread(olest) == -1) return -1; olest->pos=div_rez.rem; olest->eof=0; olest->cfat=div_rez.quot; //printf("%i=%i %i\n",ofs,div_rez.quot,div_rez.rem); } else { ldiv_t div_rez=ldiv(ofs,olest->ole->lsector); int i; #ifdef OLE_DEBUG fprintf(stderr, "seeking fatpos%lu start %u\n", olest->fatpos, olest->start); #endif olest->fatpos=olest->start; if (div_rez.quot!=0) { for (i=0;ifatpos, olest->ole)) return -1; olest->fatpos=xlsIntVal(olest->ole->SecID[olest->fatpos]); } } if (ole2_bufread(olest) == -1) return -1; olest->pos=div_rez.rem; olest->eof=0; olest->cfat=div_rez.quot; //printf("%i=%i %i\n",ofs,div_rez.quot,div_rez.rem); } return 0; } // Open logical file contained in physical OLE file OLE2Stream* ole2_fopen(OLE2* ole, const char *file) { int i; #ifdef OLE_DEBUG fprintf(stderr, "----------------------------------------------\n"); fprintf(stderr, "ole2_fopen %s\n", file); #endif for (i=0;ifiles.count;i++) { char *str = ole->files.file[i].name; #ifdef OLE_DEBUG fprintf(stderr, "----------------------------------------------\n"); fprintf(stderr, "ole2_fopen found %s\n", str); #endif if (str && strcmp(str,file)==0) // newer versions of Excel don't write the "Root Entry" string for the first set of data { return ole2_sopen(ole,ole->files.file[i].start,ole->files.file[i].size); } } return NULL; } static int ole2_fseek(OLE2 *ole2, size_t pos) { if (ole2->file) return fseek(ole2->file, pos, SEEK_SET); if (pos > ole2->buffer_len) return -1; ole2->buffer_pos = pos; return 0; } static size_t ole2_fread(OLE2 *ole2, void *buffer, size_t buffer_len, size_t size) { if (size > buffer_len) return 0; if (ole2->file) return fread(buffer, size, 1, ole2->file); if (ole2->buffer_pos + size > ole2->buffer_len) return 0; memcpy(buffer, (const char *)ole2->buffer + ole2->buffer_pos, size); ole2->buffer_pos += size; return 1; } // read header and check magic numbers static ssize_t ole2_read_header(OLE2 *ole) { ssize_t bytes_read = 0, total_bytes_read = 0; OLE2Header *oleh = malloc(sizeof(OLE2Header)); if (ole2_fread(ole, oleh, sizeof(OLE2Header), sizeof(OLE2Header)) != 1) { total_bytes_read = -1; goto cleanup; } total_bytes_read += sizeof(OLE2Header); xlsConvertHeader(oleh); // make sure the file looks good. Note: this code only works on Little Endian machines if(oleh->id[0] != 0xE011CFD0 || oleh->id[1] != 0xE11AB1A1 || oleh->byteorder != 0xFFFE) { if (xls_debug) fprintf(stderr, "Not an excel file\n"); total_bytes_read = -1; goto cleanup; } //ole->lsector=(WORD)pow(2,oleh->lsector); //ole->lssector=(WORD)pow(2,oleh->lssector); ole->lsector=512; ole->lssector=64; if (oleh->lsectorB != 9 || oleh->lssectorB != 6) { // 2**9 == 512, 2**6 == 64 if (xls_debug) fprintf(stderr, "Unexpected sector size\n"); total_bytes_read = -1; goto cleanup; } ole->cfat=oleh->cfat; ole->dirstart=oleh->dirstart; ole->sectorcutoff=oleh->sectorcutoff; ole->sfatstart=oleh->sfatstart; ole->csfat=oleh->csfat; ole->difstart=oleh->difstart; ole->cdif=oleh->cdif; ole->files.count=0; #ifdef OLE_DEBUG fprintf(stderr, "==== OLE HEADER ====\n"); //printf ("Header Size: %i \n", sizeof(OLE2Header)); //printf ("id[0]-id[1]: %X-%X \n", oleh->id[0], oleh->id[1]); fprintf(stderr, "verminor: %X \n",oleh->verminor); fprintf(stderr, "verdll: %X \n",oleh->verdll); //printf ("Byte order: %X \n",oleh->byteorder); fprintf(stderr, "sect len: %X (%i)\n",ole->lsector,ole->lsector); // ole fprintf(stderr, "mini len: %X (%i)\n",ole->lssector,ole->lssector); // ole fprintf(stderr, "Fat sect.: %i \n",oleh->cfat); fprintf(stderr, "Dir Start: %i \n",oleh->dirstart); fprintf(stderr, "Mini Cutoff: %i \n",oleh->sectorcutoff); fprintf(stderr, "MiniFat Start: %X \n",oleh->sfatstart); fprintf(stderr, "Count MFat: %i \n",oleh->csfat); fprintf(stderr, "Dif start: %X \n",oleh->difstart); fprintf(stderr, "Count Dif: %i \n",oleh->cdif); fprintf(stderr, "Fat Size: %u (0x%X) \n",oleh->cfat*ole->lsector,oleh->cfat*ole->lsector); #endif // read directory entries if ((bytes_read = read_MSAT(ole, oleh)) == -1) { total_bytes_read = -1; goto cleanup; } total_bytes_read += bytes_read; cleanup: free(oleh); return total_bytes_read; } static ssize_t ole2_read_body(OLE2 *ole) { // reuse this buffer PSS *pss = NULL; OLE2Stream *olest = NULL; char* name = NULL; ssize_t bytes_read = 0, total_bytes_read = 0; if ((olest = ole2_sopen(ole,ole->dirstart, -1)) == NULL) { total_bytes_read = -1; goto cleanup; } pss = malloc(sizeof(PSS)); do { if ((bytes_read = ole2_read(pss,1,sizeof(PSS),olest)) == -1) { total_bytes_read = -1; goto cleanup; } total_bytes_read += bytes_read; xlsConvertPss(pss); if (pss->bsize > sizeof(pss->name)) { total_bytes_read = -1; goto cleanup; } name=unicode_decode(pss->name, pss->bsize, 0, "UTF-8"); #ifdef OLE_DEBUG fprintf(stderr, "OLE NAME: %s count=%d\n", name, (int)ole->files.count); #endif if (pss->type == PS_USER_ROOT || pss->type == PS_USER_STREAM) // (name!=NULL) // { #ifdef OLE_DEBUG fprintf(stderr, "OLE TYPE: %s file=%d \n", pss->type == PS_USER_ROOT ? "root" : "user", (int)ole->files.count); #endif ole->files.file = realloc(ole->files.file,(ole->files.count+1)*sizeof(struct st_olefiles_data)); ole->files.file[ole->files.count].name=name; ole->files.file[ole->files.count].start=pss->sstart; ole->files.file[ole->files.count].size=pss->size; ole->files.count++; if(pss->sstart == ENDOFCHAIN) { if (xls_debug) verbose("END OF CHAIN\n"); } else if(pss->type == PS_USER_STREAM) { #ifdef OLE_DEBUG fprintf(stderr, "----------------------------------------------\n"); fprintf(stderr, "name: %s (size=%d [c=%c])\n", name, pss->bsize, name ? name[0]:' '); fprintf(stderr, "bsize %i\n",pss->bsize); fprintf(stderr, "type %i\n",pss->type); fprintf(stderr, "flag %i\n",pss->flag); fprintf(stderr, "left %X\n",pss->left); fprintf(stderr, "right %X\n",pss->right); fprintf(stderr, "child %X\n",pss->child); fprintf(stderr, "guid %.4X-%.4X-%.4X-%.4X %.4X-%.4X-%.4X-%.4X\n", pss->guid[0],pss->guid[1],pss->guid[2],pss->guid[3], pss->guid[4],pss->guid[5],pss->guid[6],pss->guid[7]); fprintf(stderr, "user flag %.4X\n",pss->userflags); fprintf(stderr, "sstart %.4d\n",pss->sstart); fprintf(stderr, "size %.4d\n",pss->size); #endif } else if(pss->type == PS_USER_ROOT) { DWORD sector, k, blocks; BYTE *wptr; size_t bytes_left; blocks = (pss->size + (ole->lsector - 1)) / ole->lsector; // count partial if ((ole->SSAT = ole_realloc(ole->SSAT, blocks*ole->lsector)) == NULL) { total_bytes_read = -1; goto cleanup; } ole->SSATCount = blocks*ole->lsector; // printf("blocks %d\n", blocks); sector = pss->sstart; wptr = (BYTE*)ole->SSAT; bytes_left = blocks*ole->lsector; for(k=0; klsector; wptr += ole->lsector; bytes_left -= ole->lsector; sector = xlsIntVal(ole->SecID[sector]); } } } else { free(name); } } while (!olest->eof); cleanup: if (olest) ole2_fclose(olest); if (pss) free(pss); return total_bytes_read; } OLE2 *ole2_read_header_and_body(OLE2 *ole) { if (ole2_read_header(ole) == -1) { ole2_close(ole); return NULL; } if (ole2_read_body(ole) == -1) { ole2_close(ole); return NULL; } return ole; } // Open in-memory buffer OLE2 *ole2_open_buffer(const void *buffer, size_t len) { OLE2 *ole = calloc(1, sizeof(OLE2)); ole->buffer = buffer; ole->buffer_len = len; return ole2_read_header_and_body(ole); } // Open physical file OLE2* ole2_open_file(const char *file) { OLE2* ole = NULL; #ifdef OLE_DEBUG fprintf(stderr, "----------------------------------------------\n"); fprintf(stderr, "ole2_open_file %s\n", file); #endif if(xls_debug) printf("ole2_open: %s\n", file); ole = calloc(1, sizeof(OLE2)); if (!(ole->file=fopen(file, "rb"))) { if(xls_debug) fprintf(stderr, "File not found\n"); free(ole); return NULL; } return ole2_read_header_and_body(ole); } void ole2_close(OLE2* ole2) { int i; if (ole2->file) fclose(ole2->file); for(i=0; ifiles.count; ++i) { free(ole2->files.file[i].name); } free(ole2->files.file); free(ole2->SecID); free(ole2->SSecID); free(ole2->SSAT); free(ole2); } void ole2_fclose(OLE2Stream* ole2st) { free(ole2st->buf); free(ole2st); } // Return offset in bytes of a sector from its sid static size_t sector_pos(OLE2* ole2, DWORD sid) { return 512 + sid * ole2->lsector; } // Read one sector from its sid static ssize_t sector_read(OLE2* ole2, void *buffer, size_t buffer_len, DWORD sid) { size_t num; size_t seeked; if ((seeked = ole2_fseek(ole2, sector_pos(ole2, sid))) != 0) { if (xls_debug) fprintf(stderr, "Error: wanted to seek to sector %u (0x%x) loc=%u\n", sid, sid, (unsigned int)sector_pos(ole2, sid)); return -1; } if ((num = ole2_fread(ole2, buffer, buffer_len, ole2->lsector)) != 1) { if (xls_debug) fprintf(stderr, "Error: fread wanted 1 got %lu loc=%u\n", (unsigned long)num, (unsigned int)sector_pos(ole2, sid)); return -1; } return ole2->lsector; } // read first 109 sectors of MSAT from header static ssize_t read_MSAT_header(OLE2* ole2, OLE2Header* oleh, DWORD sectorCount) { BYTE *sector = (BYTE*)ole2->SecID; ssize_t bytes_read = 0, total_bytes_read = 0; size_t bytes_left = ole2->SecIDCount * sizeof(DWORD); DWORD sectorNum; for (sectorNum = 0; sectorNum < sectorCount && sectorNum < 109; sectorNum++) { if ((bytes_read = sector_read(ole2, sector, bytes_left, oleh->MSAT[sectorNum])) == -1) { if (xls_debug) fprintf(stderr, "Error: Unable to read sector #%d\n", oleh->MSAT[sectorNum]); return -1; } sector += ole2->lsector; bytes_left -= ole2->lsector; total_bytes_read += bytes_read; } return total_bytes_read; } // Add additional sectors of the MSAT static ssize_t read_MSAT_body(OLE2 *ole2, DWORD sectorOffset, DWORD sectorCount) { DWORD sid = ole2->difstart; ssize_t bytes_read = 0, total_bytes_read = 0; DWORD sectorNum = sectorOffset; DWORD *sector = ole_malloc(ole2->lsector); //printf("sid=%u (0x%x) sector=%u\n", sid, sid, ole2->lsector); while (sid != ENDOFCHAIN && sid != FREESECT) // FREESECT only here due to an actual file that requires it (old Apple Numbers bug) { int posInSector; // read MSAT sector if ((bytes_read = sector_read(ole2, sector, ole2->lsector, sid)) == -1) { total_bytes_read = -1; if (xls_debug) fprintf(stderr, "Error: Unable to read sector #%d\n", sid); goto cleanup; } total_bytes_read += bytes_read; // read content for (posInSector = 0; posInSector < (ole2->lsector-4)/4; posInSector++) { DWORD s = sector[posInSector]; //printf(" s[%d]=%d (0x%x)\n", posInSector, s, s); if (s != ENDOFCHAIN && s != FREESECT) // see patch in Bug 31. For very large files { if (sectorNum == sectorCount) { if (xls_debug) fprintf(stderr, "Error: Unable to seek to sector #%d\n", s); total_bytes_read = -1; goto cleanup; } if ((bytes_read = sector_read(ole2, (BYTE*)(ole2->SecID)+sectorNum*ole2->lsector, (ole2->SecIDCount * sizeof(DWORD) - sectorNum*ole2->lsector), s)) == -1) { if (xls_debug) fprintf(stderr, "Error: Unable to read sector #%d\n", s); total_bytes_read = -1; goto cleanup; } total_bytes_read += bytes_read; sectorNum++; } } sid = sector[posInSector]; //printf(" s[%d]=%d (0x%x)\n", posInSector, sid, sid); } #ifdef OLE_DEBUG if(xls_debug) { //printf("==== READ IN SECTORS FOR MSAT TABLE====\n"); int i; for(i=0; i<512/4; ++i) { // just the first block if(ole2->SecID[i] != FREESECT) printf("SecID[%d]=%d\n", i, ole2->SecID[i]); } } //exit(0); #endif cleanup: free(sector); return total_bytes_read; } // read in short table static ssize_t read_MSAT_trailer(OLE2 *ole2) { ssize_t total_bytes_read = 0; DWORD sector, k; BYTE *wptr; size_t bytes_left; if(ole2->sfatstart == ENDOFCHAIN) return 0; if ((ole2->SSecID = ole_malloc(ole2->csfat*(size_t)ole2->lsector)) == NULL) { return -1; } ole2->SSecIDCount = ole2->csfat*(size_t)ole2->lsector/4; sector = ole2->sfatstart; wptr=(BYTE*)ole2->SSecID; bytes_left = ole2->SSecIDCount * sizeof(DWORD); for(k=0; kcsfat; ++k) { if (sector == ENDOFCHAIN || sector_read(ole2, wptr, bytes_left, sector) == -1) { total_bytes_read = -1; goto cleanup; } if (!ole2_validate_sector(sector, ole2)) { total_bytes_read = -1; goto cleanup; } wptr += ole2->lsector; bytes_left -= ole2->lsector; total_bytes_read += ole2->lsector; sector = xlsIntVal(ole2->SecID[sector]); } #ifdef OLE_DEBUG if(xls_debug) { int i; for(i=0; icsfat; ++i) { if(ole2->SSecID[i] != FREESECT) fprintf(stderr, "SSecID[%d]=%d\n", i, ole2->SSecID[i]); } } #endif cleanup: return total_bytes_read; } // Read MSAT static ssize_t read_MSAT(OLE2* ole2, OLE2Header* oleh) { // reconstitution of the MSAT DWORD count = ole2->cfat; if(count == 0 || count > (1 << 24)) { if (xls_debug) fprintf(stderr, "Error: MSAT count %u out-of-bounds\n", count); return -1; } ssize_t total_bytes_read = 0; ssize_t bytes_read = 0; ole2->SecIDCount = count*ole2->lsector/4; if ((ole2->SecID = ole_malloc(ole2->SecIDCount * sizeof(DWORD))) == NULL) { total_bytes_read = -1; goto cleanup; } if ((bytes_read = read_MSAT_header(ole2, oleh, count)) == -1) { total_bytes_read = -1; goto cleanup; } total_bytes_read += bytes_read; if ((bytes_read = read_MSAT_body(ole2, total_bytes_read / ole2->lsector, count)) == -1) { total_bytes_read = -1; goto cleanup; } total_bytes_read += bytes_read; if ((bytes_read = read_MSAT_trailer(ole2)) == -1) { total_bytes_read = -1; goto cleanup; } total_bytes_read += bytes_read; cleanup: if (total_bytes_read == -1) { if (ole2->SecID) { free(ole2->SecID); ole2->SecID = NULL; } if (ole2->SSecID) { free(ole2->SSecID); ole2->SSecID = NULL; } } return total_bytes_read; } readxl/src/rapidxml_print.h0000755000176200001440000004054613442224523015542 0ustar liggesusers#ifndef RAPIDXML_PRINT_HPP_INCLUDED #define RAPIDXML_PRINT_HPP_INCLUDED // Copyright (C) 2006, 2009 Marcin Kalicinski // Version 1.13 // Revision $DateTime: 2009/05/13 01:46:17 $ //! \file rapidxml_print.hpp This file contains rapidxml printer implementation #include "rapidxml.h" // Only include streams if not disabled #ifndef RAPIDXML_NO_STREAMS #include #include #endif namespace rapidxml { /////////////////////////////////////////////////////////////////////// // Printing flags const int print_no_indenting = 0x1; //!< Printer flag instructing the printer to suppress indenting of XML. See print() function. /////////////////////////////////////////////////////////////////////// // Internal //! \cond internal namespace internal { /////////////////////////////////////////////////////////////////////////// // Internal character operations // Copy characters from given range to given output iterator template inline OutIt copy_chars(const Ch *begin, const Ch *end, OutIt out) { while (begin != end) *out++ = *begin++; return out; } // Copy characters from given range to given output iterator and expand // characters into references (< > ' " &) template inline OutIt copy_and_expand_chars(const Ch *begin, const Ch *end, Ch noexpand, OutIt out) { while (begin != end) { if (*begin == noexpand) { *out++ = *begin; // No expansion, copy character } else { switch (*begin) { case Ch('<'): *out++ = Ch('&'); *out++ = Ch('l'); *out++ = Ch('t'); *out++ = Ch(';'); break; case Ch('>'): *out++ = Ch('&'); *out++ = Ch('g'); *out++ = Ch('t'); *out++ = Ch(';'); break; case Ch('\''): *out++ = Ch('&'); *out++ = Ch('a'); *out++ = Ch('p'); *out++ = Ch('o'); *out++ = Ch('s'); *out++ = Ch(';'); break; case Ch('"'): *out++ = Ch('&'); *out++ = Ch('q'); *out++ = Ch('u'); *out++ = Ch('o'); *out++ = Ch('t'); *out++ = Ch(';'); break; case Ch('&'): *out++ = Ch('&'); *out++ = Ch('a'); *out++ = Ch('m'); *out++ = Ch('p'); *out++ = Ch(';'); break; default: *out++ = *begin; // No expansion, copy character } } ++begin; // Step to next character } return out; } // Fill given output iterator with repetitions of the same character template inline OutIt fill_chars(OutIt out, int n, Ch ch) { for (int i = 0; i < n; ++i) *out++ = ch; return out; } // Find character template inline bool find_char(const Ch *begin, const Ch *end) { while (begin != end) if (*begin++ == ch) return true; return false; } /////////////////////////////////////////////////////////////////////////// // Internal printing operations // ===================================== // fix for clang for this bug in gcc and others: http://sourceforge.net/p/rapidxml/bugs/16/ template inline OutIt print_children(OutIt out, const xml_node *node, int flags, int indent); template inline OutIt print_element_node(OutIt out, const xml_node *node, int flags, int indent); template inline OutIt print_data_node(OutIt out, const xml_node *node, int flags, int indent); template inline OutIt print_cdata_node(OutIt out, const xml_node *node, int flags, int indent); template inline OutIt print_declaration_node(OutIt out, const xml_node *node, int flags, int indent); template inline OutIt print_comment_node(OutIt out, const xml_node *node, int flags, int indent); template inline OutIt print_doctype_node(OutIt out, const xml_node *node, int flags, int indent); template inline OutIt print_pi_node(OutIt out, const xml_node *node, int flags, int indent); // Print node template inline OutIt print_node(OutIt out, const xml_node *node, int flags, int indent) { // Print proper node type switch (node->type()) { // Document case node_document: out = print_children(out, node, flags, indent); break; // Element case node_element: out = print_element_node(out, node, flags, indent); break; // Data case node_data: out = print_data_node(out, node, flags, indent); break; // CDATA case node_cdata: out = print_cdata_node(out, node, flags, indent); break; // Declaration case node_declaration: out = print_declaration_node(out, node, flags, indent); break; // Comment case node_comment: out = print_comment_node(out, node, flags, indent); break; // Doctype case node_doctype: out = print_doctype_node(out, node, flags, indent); break; // Pi case node_pi: out = print_pi_node(out, node, flags, indent); break; // Unknown default: assert(0); break; } // If indenting not disabled, add line break after node if (!(flags & print_no_indenting)) *out = Ch('\n'), ++out; // Return modified iterator return out; } // Print children of the node template inline OutIt print_children(OutIt out, const xml_node *node, int flags, int indent) { for (xml_node *child = node->first_node(); child; child = child->next_sibling()) out = print_node(out, child, flags, indent); return out; } // Print attributes of the node template inline OutIt print_attributes(OutIt out, const xml_node *node, int flags) { for (xml_attribute *attribute = node->first_attribute(); attribute; attribute = attribute->next_attribute()) { if (attribute->name() && attribute->value()) { // Print attribute name *out = Ch(' '), ++out; out = copy_chars(attribute->name(), attribute->name() + attribute->name_size(), out); *out = Ch('='), ++out; // Print attribute value using appropriate quote type if (find_char(attribute->value(), attribute->value() + attribute->value_size())) { *out = Ch('\''), ++out; out = copy_and_expand_chars(attribute->value(), attribute->value() + attribute->value_size(), Ch('"'), out); *out = Ch('\''), ++out; } else { *out = Ch('"'), ++out; out = copy_and_expand_chars(attribute->value(), attribute->value() + attribute->value_size(), Ch('\''), out); *out = Ch('"'), ++out; } } } return out; } // Print data node template inline OutIt print_data_node(OutIt out, const xml_node *node, int flags, int indent) { assert(node->type() == node_data); if (!(flags & print_no_indenting)) out = fill_chars(out, indent * 2, Ch(' ')); out = copy_and_expand_chars(node->value(), node->value() + node->value_size(), Ch(0), out); return out; } // Print data node template inline OutIt print_cdata_node(OutIt out, const xml_node *node, int flags, int indent) { assert(node->type() == node_cdata); if (!(flags & print_no_indenting)) out = fill_chars(out, indent * 2, Ch(' ')); *out = Ch('<'); ++out; *out = Ch('!'); ++out; *out = Ch('['); ++out; *out = Ch('C'); ++out; *out = Ch('D'); ++out; *out = Ch('A'); ++out; *out = Ch('T'); ++out; *out = Ch('A'); ++out; *out = Ch('['); ++out; out = copy_chars(node->value(), node->value() + node->value_size(), out); *out = Ch(']'); ++out; *out = Ch(']'); ++out; *out = Ch('>'); ++out; return out; } // Print element node template inline OutIt print_element_node(OutIt out, const xml_node *node, int flags, int indent) { assert(node->type() == node_element); // Print element name and attributes, if any if (!(flags & print_no_indenting)) out = fill_chars(out, indent * 2, Ch(' ')); *out = Ch('<'), ++out; out = copy_chars(node->name(), node->name() + node->name_size(), out); out = print_attributes(out, node, flags); // If node is childless if (node->value_size() == 0 && !node->first_node()) { // Print childless node tag ending *out = Ch('/'), ++out; *out = Ch('>'), ++out; } else { // Print normal node tag ending *out = Ch('>'), ++out; // Test if node contains a single data node only (and no other nodes) xml_node *child = node->first_node(); if (!child) { // If node has no children, only print its value without indenting out = copy_and_expand_chars(node->value(), node->value() + node->value_size(), Ch(0), out); } else if (child->next_sibling() == 0 && child->type() == node_data) { // If node has a sole data child, only print its value without indenting out = copy_and_expand_chars(child->value(), child->value() + child->value_size(), Ch(0), out); } else { // Print all children with full indenting if (!(flags & print_no_indenting)) *out = Ch('\n'), ++out; out = print_children(out, node, flags, indent + 1); if (!(flags & print_no_indenting)) out = fill_chars(out, indent * 2, Ch(' ')); } // Print node end *out = Ch('<'), ++out; *out = Ch('/'), ++out; out = copy_chars(node->name(), node->name() + node->name_size(), out); *out = Ch('>'), ++out; } return out; } // Print declaration node template inline OutIt print_declaration_node(OutIt out, const xml_node *node, int flags, int indent) { // Print declaration start if (!(flags & print_no_indenting)) out = fill_chars(out, indent * 2, Ch(' ')); *out = Ch('<'), ++out; *out = Ch('?'), ++out; *out = Ch('x'), ++out; *out = Ch('m'), ++out; *out = Ch('l'), ++out; // Print attributes out = print_attributes(out, node, flags); // Print declaration end *out = Ch('?'), ++out; *out = Ch('>'), ++out; return out; } // Print comment node template inline OutIt print_comment_node(OutIt out, const xml_node *node, int flags, int indent) { assert(node->type() == node_comment); if (!(flags & print_no_indenting)) out = fill_chars(out, indent * 2, Ch(' ')); *out = Ch('<'), ++out; *out = Ch('!'), ++out; *out = Ch('-'), ++out; *out = Ch('-'), ++out; out = copy_chars(node->value(), node->value() + node->value_size(), out); *out = Ch('-'), ++out; *out = Ch('-'), ++out; *out = Ch('>'), ++out; return out; } // Print doctype node template inline OutIt print_doctype_node(OutIt out, const xml_node *node, int flags, int indent) { assert(node->type() == node_doctype); if (!(flags & print_no_indenting)) out = fill_chars(out, indent * 2, Ch(' ')); *out = Ch('<'), ++out; *out = Ch('!'), ++out; *out = Ch('D'), ++out; *out = Ch('O'), ++out; *out = Ch('C'), ++out; *out = Ch('T'), ++out; *out = Ch('Y'), ++out; *out = Ch('P'), ++out; *out = Ch('E'), ++out; *out = Ch(' '), ++out; out = copy_chars(node->value(), node->value() + node->value_size(), out); *out = Ch('>'), ++out; return out; } // Print pi node template inline OutIt print_pi_node(OutIt out, const xml_node *node, int flags, int indent) { assert(node->type() == node_pi); if (!(flags & print_no_indenting)) out = fill_chars(out, indent * 2, Ch(' ')); *out = Ch('<'), ++out; *out = Ch('?'), ++out; out = copy_chars(node->name(), node->name() + node->name_size(), out); *out = Ch(' '), ++out; out = copy_chars(node->value(), node->value() + node->value_size(), out); *out = Ch('?'), ++out; *out = Ch('>'), ++out; return out; } } //! \endcond /////////////////////////////////////////////////////////////////////////// // Printing //! Prints XML to given output iterator. //! \param out Output iterator to print to. //! \param node Node to be printed. Pass xml_document to print entire document. //! \param flags Flags controlling how XML is printed. //! \return Output iterator pointing to position immediately after last character of printed text. template inline OutIt print(OutIt out, const xml_node &node, int flags = 0) { return internal::print_node(out, &node, flags, 0); } #ifndef RAPIDXML_NO_STREAMS //! Prints XML to given output stream. //! \param out Output stream to print to. //! \param node Node to be printed. Pass xml_document to print entire document. //! \param flags Flags controlling how XML is printed. //! \return Output stream. template inline std::basic_ostream &print(std::basic_ostream &out, const xml_node &node, int flags = 0) { print(std::ostream_iterator(out), node, flags); return out; } //! Prints formatted XML to given output stream. Uses default printing flags. Use print() function to customize printing process. //! \param out Output stream to print to. //! \param node Node to be printed. //! \return Output stream. template inline std::basic_ostream &operator <<(std::basic_ostream &out, const xml_node &node) { return print(out, node); } #endif } #endif readxl/src/XlsxWorkSheet.cpp0000644000176200001440000000431413442224523015621 0ustar liggesusers#include #include "ColSpec.h" #include "XlsxWorkSheet.h" #include "utils.h" using namespace Rcpp; // [[Rcpp::export]] IntegerVector parse_ref(std::string ref) { std::pair parsed = parseRef(ref.c_str()); return IntegerVector::create(parsed.first, parsed.second); } // [[Rcpp::export]] List read_xlsx_(std::string path, int sheet_i, IntegerVector limits, bool shim, RObject col_names, RObject col_types, std::vector na, bool trim_ws, int guess_max = 1000, bool progress = true) { // Construct worksheet ---------------------------------------------- XlsxWorkSheet ws(path, sheet_i, limits, shim, progress); // catches empty sheets and sheets where requested rectangle contains no data if (ws.nrow() == 0 && ws.ncol() == 0) { return Rcpp::List(0); } // Get column names ------------------------------------------------- CharacterVector colNames; bool has_col_names = false; switch(TYPEOF(col_names)) { case STRSXP: colNames = as(col_names); break; case LGLSXP: has_col_names = as(col_names); colNames = has_col_names ? ws.colNames(na, trim_ws) : CharacterVector(ws.ncol(), ""); break; default: Rcpp::stop("`col_names` must be a logical or character vector"); } // Get column types -------------------------------------------------- if (TYPEOF(col_types) != STRSXP) { Rcpp::stop("`col_types` must be a character vector"); } std::vector colTypes = colTypeStrings(as(col_types)); colTypes = recycleTypes(colTypes, ws.ncol()); if ((int) colTypes.size() != ws.ncol()) { Rcpp::stop("Sheet %d has %d columns, but `col_types` has length %d.", sheet_i + 1, ws.ncol(), colTypes.size()); } if (requiresGuess(colTypes)) { colTypes = ws.colTypes(colTypes, na, trim_ws, guess_max, has_col_names); } colTypes = finalizeTypes(colTypes); // Reconcile column names and types ---------------------------------- colNames = reconcileNames(colNames, colTypes, sheet_i); // Get data ---------------------------------------------------------- return ws.readCols(colNames, colTypes, na, trim_ws, has_col_names); } readxl/src/cran.h0000644000176200001440000000061713442224523013421 0ustar liggesusers#ifndef __READ_XLS_CRAN_H #define __READ_XLS_CRAN_H /* Mask printf and fprintf for CMD check */ #include #define printf Rprintf #ifdef __cplusplus extern "C" { #endif void Rprintf2(FILE * stream, const char *format, ...); #ifdef __cplusplus } #endif #define fprintf Rprintf2 #undef stderr #define stderr NULL #undef assert #define assert(X) if (X) {} #define exit assert #endif readxl/src/XlsxCell.h0000644000176200001440000002300113442224523014224 0ustar liggesusers#ifndef READXL_XLSXCELL_ #define READXL_XLSXCELL_ #include #include "rapidxml.h" #include "ColSpec.h" #include "XlsxString.h" #include "utils.h" // Key reference for understanding the structure of the XML is // ECMA-376 (http://www.ecma-international.org/publications/standards/Ecma-376.htm) // Section and page numbers below refer to the 5th edition October 2016 // 18.3.1.4 c (Cell) [p1593] // 18.3.1.96 v (Cell Value) [p1707] // 18.18.11 ST_CellType (Cell Type) [p2451] class XlsxCell { rapidxml::xml_node<>* cell_; std::pair location_; CellType type_; public: // if possible, provide guess at row and column based on position within xml XlsxCell(rapidxml::xml_node<>* cell, int row = -1, int col = -1): cell_(cell) { rapidxml::xml_attribute<>* ref = cell_->first_attribute("r"); if (ref == NULL) { location_ = std::make_pair(row, col); } else { location_ = parseRef(ref->value()); } type_ = CELL_UNKNOWN; } XlsxCell(std::pair loc) { cell_ = NULL; location_ = loc; type_ = CELL_BLANK; } int row() const { return location_.first; } int col() const { return location_.second; } CellType type() const { return type_; } void inferType(const StringSet& na, const bool trimWs, const std::vector& stringTable, const std::set& dateFormats) { // 1. Review of Excel's declared cell types, then // 2. Summary of how Excel's cell types map to our CellType enum // // this table refers to the value of the t attribute of a cell // 18.18.11 ST_CellType (Cell Type) [p2451] // This simple type is restricted to the values listed in the following table: // ------------------------------------------------------------------------- // Enumeration Value Description // ------------------------------------------------------------------------- // b (Boolean) Cell containing a boolean. // d (Date) Cell contains a date in the ISO 8601 format. // e (Error) Cell containing an error. // inlineStr (Inline String) Cell containing an (inline) rich string, i.e., // one not in the shared string table. If this // cell type is used, then the cell value is in // the is element rather than the v element in // the cell (c element). // n (Number) Cell containing a number. // s (Shared String) Cell containing a shared string. // str (String) Cell containing a formula string. // // We map Excel's cell types to the CellType enum based on declared type // and contents. // // CELL_BLANK // inlineStr cell and (string is na or string can't be found) // cell has no v node and is not an inlineStr cell // v->value() is na // error cell // shared string cell and string is na // // CELL_LOGICAL // Boolean cell and its value (TRUE or FALSE) is not in na // // CELL_DATE // numeric cell (t attr is "n" or does not exist) with a date format // // CELL_NUMERIC // numeric cell (t attr is "n" or does not exist) with no format or a // non-date format // // CELL_TEXT // inlineStr cell and string is found and string is not na // ISO 8601 date cell (t attr is "d") <- we're not sure this exists IRL // shared string cell and string is not na // formula string cell and string is not na // anything that is not explicitly addressed elsewhere if (type_ != CELL_UNKNOWN) { return; } rapidxml::xml_attribute<>* t = cell_->first_attribute("t"); rapidxml::xml_node<>* v = cell_->first_node("v"); // inlineStr (Inline String) Cell containing an (inline) rich string if (t != NULL && strncmp(t->value(), "inlineStr", 9) == 0) { // must do this first, because inlineStr cells do not have a v node // and the check just below would otherwise make them all CELL_BLANK rapidxml::xml_node<>* is = cell_->first_node("is"); std::string inline_string; if (parseString(is, &inline_string)) { type_ = na.contains(inline_string, trimWs) ? CELL_BLANK : CELL_TEXT; } else { type_ = CELL_BLANK; } return; } // s (Shared String) Cell containing a shared string. if (t != NULL && strncmp(t->value(), "s", 5) == 0) { int id = atoi(v->value()); const std::string& string = stringTable.at(id); type_ = na.contains(string, trimWs) ? CELL_BLANK : CELL_TEXT; return; } if (v == NULL || na.contains(v->value(), trimWs)) { type_ = CELL_BLANK; return; } // from here on, no need for explicit NA check // n (Number) Cell containing a number. if (t == NULL || strncmp(t->value(), "n", 5) == 0) { rapidxml::xml_attribute<>* s = cell_->first_attribute("s"); int format = (s == NULL) ? -1 : atoi(s->value()); type_ = (dateFormats.count(format) > 0) ? CELL_DATE : CELL_NUMERIC; return; } // b (Boolean) Cell containing a boolean. if (strncmp(t->value(), "b", 5) == 0) { type_ = CELL_LOGICAL; return; } // d (Date) Cell contains a date in the ISO 8601 format. if (strncmp(t->value(), "d", 5) == 0) { // Hadley: // Does excel use this? Regardless, don't have cross-platform ISO8601 // parser (yet) so need to return as text // Jenny: // Not entirely sure what this is about. I've never seen one IRL. type_ = CELL_TEXT; return; } // e (Error) Cell containing an error. if (strncmp(t->value(), "e", 5) == 0) { type_ = CELL_BLANK; return; } // str (String) Cell containing a formula string. if (strncmp(t->value(), "str", 5) == 0) { type_ = CELL_TEXT; return; } Rcpp::warning("Unrecognized cell type at %s: '%s'", cellPosition(row(), col()), t->value()); } std::string asStdString(const std::vector& stringTable, const bool trimWs) const { if (cell_ == NULL) { return ""; } rapidxml::xml_node<>* v = cell_->first_node("v"); rapidxml::xml_attribute<>* t = cell_->first_attribute("t"); switch(type_) { case CELL_UNKNOWN: case CELL_BLANK: return ""; case CELL_LOGICAL: return atoi(v->value()) ? "TRUE" : "FALSE"; case CELL_DATE: // not ideal for a date but will have to do ... one day: asDateString()? case CELL_NUMERIC: return std::string(v->value()); case CELL_TEXT: { std::string out_string; // inlineStr rapidxml::xml_node<>* is = cell_->first_node("is"); if (is != NULL) { if (parseString(is, &out_string)) { return trimWs ? trim(out_string) : out_string; } else { return "NA"; } } // shared string if (strncmp(t->value(), "s", 5) == 0) { out_string = stringFromTable(v->value(), stringTable); return trimWs ? trim(out_string) : out_string; } // formula string cell or // the mythical ISO 8601 date cell out_string = std::string(v->value()); return trimWs ? trim(out_string) : out_string; } default: Rcpp::warning("Unrecognized cell type at %s", cellPosition(row(), col())); return ""; } } Rcpp::RObject asCharSxp(const std::vector& stringTable, const bool trimWs) const { std::string out_string = asStdString(stringTable, trimWs); return out_string.empty() ? NA_STRING : Rf_mkCharCE(out_string.c_str(), CE_UTF8); } int asLogical() const { switch(type_) { case CELL_UNKNOWN: case CELL_BLANK: case CELL_DATE: case CELL_TEXT: return NA_LOGICAL; case CELL_LOGICAL: case CELL_NUMERIC: { rapidxml::xml_node<>* v = cell_->first_node("v"); return atoi(v->value()) != 0; } default: Rcpp::warning("Unrecognized cell type at %s", cellPosition(row(), col())); return NA_LOGICAL; } } double asDouble() const { switch(type_) { case CELL_UNKNOWN: case CELL_BLANK: case CELL_TEXT: return NA_REAL; case CELL_LOGICAL: case CELL_DATE: case CELL_NUMERIC: { rapidxml::xml_node<>* v = cell_->first_node("v"); return atof(v->value()); } default: Rcpp::warning("Unrecognized cell type at %s", cellPosition(row(), col())); return NA_REAL; } } double asDate(bool is1904) const { switch(type_) { case CELL_UNKNOWN: case CELL_BLANK: case CELL_LOGICAL: case CELL_TEXT: return NA_REAL; case CELL_DATE: case CELL_NUMERIC: { rapidxml::xml_node<>* v = cell_->first_node("v"); return POSIXctFromSerial(atof(v->value()), is1904); } default: Rcpp::warning("Unrecognized cell type at %s", cellPosition(row(), col())); return NA_REAL; } } private: std::string stringFromTable(const char* val, const std::vector& stringTable) const { int id = atoi(val); if (id < 0 || id >= (int) stringTable.size()) { Rcpp::warning("Invalid string id at %s: %i", cellPosition(row(), col()), id); return ""; } const std::string& string = stringTable.at(id); return string; } }; #endif readxl/src/XlsWorkBook.h0000644000176200001440000000464013442224523014722 0ustar liggesusers#ifndef READXL_XLSWORKBOOK_ #define READXL_XLSWORKBOOK_ #include #include #include "ColSpec.h" #include "utils.h" class XlsWorkBook { // common to Xls[x]WorkBook std::string path_; bool is1904_; std::set dateFormats_; // kept as data + accessor in XlsWorkBook vs. member function in XlsxWorkBook int n_sheets_; Rcpp::CharacterVector sheets_; public: XlsWorkBook(const std::string& path) { path_ = path; xls::xls_error_t error = xls::LIBXLS_OK; xls::xlsWorkBook* pWB_ = xls::xls_open_file(path_.c_str(), "UTF-8", &error); if (!pWB_) { Rcpp::stop( "\n filepath: %s\n libxls error: %s", path_, xls::xls_getError(error) ); } n_sheets_ = pWB_->sheets.count; sheets_ = Rcpp::CharacterVector(n_sheets()); for (int i = 0; i < n_sheets_; ++i) { sheets_[i] = Rf_mkCharCE((char*) pWB_->sheets.sheet[i].name, CE_UTF8); } is1904_ = pWB_->is1904; cacheDateFormats(pWB_); xls::xls_close_WB(pWB_); } const std::string& path() const{ return path_; } int n_sheets() const { return n_sheets_; } Rcpp::CharacterVector sheets() const { return sheets_; } bool is1904() const { return is1904_; } const std::set& dateFormats() const { return dateFormats_; } private: void cacheDateFormats(xls::xlsWorkBook* pWB) { // Figure out which custom formats are dates // [MS-XLS] 2.4.126 Format p301 std::set customDateFormats; int n_formats = pWB->formats.count; if (n_formats > 0) { for (int i = 0; i < n_formats; ++i) { const xls::st_format::st_format_data format = pWB->formats.format[i]; // format.value = format string // in xlsx, this is formatCode std::string code((char*) format.value); if (isDateFormat(code)) { // format.index = identifier used by other records // in xlsx, this is numFormatId customDateFormats.insert(format.index); } } } // Cache 0-based indices of the XF records that refer to a // number format that is a date format int n_xfs = pWB->xfs.count; if (n_xfs == 0) { return; } for (int i = 0; i < n_xfs; ++i) { const xls::st_xf::st_xf_data xf = pWB->xfs.xf[i]; int formatId = xf.format; if (isDateTime(formatId, customDateFormats)) { dateFormats_.insert(i); } } } }; #endif readxl/src/XlsWorkBook.cpp0000644000176200001440000000045213442224523015252 0ustar liggesusers#include #include "XlsWorkBook.h" using namespace Rcpp; // [[Rcpp::export]] CharacterVector xls_sheets(std::string path) { XlsWorkBook wb(path); return wb.sheets(); } // [[Rcpp::export]] std::set xls_date_formats(std::string path) { return XlsWorkBook(path).dateFormats(); } readxl/src/XlsWorkSheet.cpp0000644000176200001440000000402513442224523015430 0ustar liggesusers#include #include "ColSpec.h" #include "XlsWorkSheet.h" #include using namespace Rcpp; // [[Rcpp::export]] List read_xls_(std::string path, int sheet_i, IntegerVector limits, bool shim, RObject col_names, RObject col_types, std::vector na, bool trim_ws, int guess_max = 1000, bool progress = true) { // Construct worksheet ---------------------------------------------- XlsWorkSheet ws(path, sheet_i, limits, shim, progress); // catches empty sheets and sheets where requested rectangle contains no data if (ws.nrow() == 0 && ws.ncol() == 0) { return Rcpp::List(0); } // Get column names ------------------------------------------------- CharacterVector colNames; bool has_col_names = false; switch(TYPEOF(col_names)) { case STRSXP: colNames = as(col_names); break; case LGLSXP: has_col_names = as(col_names); colNames = has_col_names ? ws.colNames(na, trim_ws) : CharacterVector(ws.ncol(), ""); break; default: Rcpp::stop("`col_names` must be a logical or character vector"); } // Get column types -------------------------------------------------- if (TYPEOF(col_types) != STRSXP) { Rcpp::stop("`col_types` must be a character vector"); } std::vector colTypes = colTypeStrings(as(col_types)); colTypes = recycleTypes(colTypes, ws.ncol()); if ((int) colTypes.size() != ws.ncol()) { Rcpp::stop("Sheet %d has %d columns, but `col_types` has length %d.", sheet_i + 1, ws.ncol(), colTypes.size()); } if (requiresGuess(colTypes)) { colTypes = ws.colTypes(colTypes, na, trim_ws, guess_max, has_col_names); } colTypes = finalizeTypes(colTypes); // Reconcile column names and types ---------------------------------- colNames = reconcileNames(colNames, colTypes, sheet_i); // Get data ---------------------------------------------------------- return ws.readCols(colNames, colTypes, na, trim_ws, has_col_names); } readxl/src/ColSpec.h0000644000176200001440000001716113442224523014030 0ustar liggesusers#ifndef READXL_COLSPEC_ #define READXL_COLSPEC_ #include #include #include "StringSet.h" enum CellType { CELL_UNKNOWN, CELL_BLANK, CELL_LOGICAL, CELL_DATE, CELL_NUMERIC, CELL_TEXT }; enum ColType { COL_UNKNOWN, // implies column type needs to be guessed COL_BLANK, // occurs when col_types = NULL and observe only CELL_BLANKs COL_LOGICAL, COL_DATE, COL_NUMERIC, COL_TEXT, COL_LIST, // occurs only as user-specified column type COL_SKIP // occurs only as user-specified column type }; // ColType enum is ordered such that a simple cast is sufficient to convert // from CellType (user-specified column types come after cell types) ColType inline as_ColType(CellType celltype) { return (ColType) celltype; } inline std::string cellTypeDesc(CellType type) { switch(type) { case CELL_UNKNOWN: return "unknown"; case CELL_BLANK: return "blank"; case CELL_LOGICAL: return "logical"; case CELL_DATE: return "date"; case CELL_NUMERIC: return "numeric"; case CELL_TEXT: return "text"; } return "???"; } inline std::string colTypeDesc(ColType type) { switch(type) { case COL_UNKNOWN: return "unknown"; case COL_BLANK: return "blank"; case COL_LOGICAL: return "logical"; case COL_DATE: return "date"; case COL_NUMERIC: return "numeric"; case COL_TEXT: return "text"; case COL_LIST: return "list"; case COL_SKIP: return "skip"; } return "???"; } inline Rcpp::CharacterVector colTypeDescs(std::vector types) { Rcpp::CharacterVector out(types.size()); for (size_t i = 0; i < types.size(); ++i) { out[i] = colTypeDesc(types[i]); } return out; } inline std::vector colTypeStrings(Rcpp::CharacterVector x) { std::vector types; types.reserve(x.size()); for (int i = 0; i < x.size(); ++i) { std::string type(x[i]); if (type == "guess") { types.push_back(COL_UNKNOWN); } else if (type == "blank") { types.push_back(COL_BLANK); } else if (type == "logical") { types.push_back(COL_LOGICAL); } else if (type == "date") { types.push_back(COL_DATE); } else if (type == "numeric") { types.push_back(COL_NUMERIC); } else if (type == "text") { types.push_back(COL_TEXT); } else if (type == "list") { types.push_back(COL_LIST); } else if (type == "skip") { types.push_back(COL_SKIP); } else { Rcpp::stop("Unknown column type '%s' at position %i", type, i + 1); } } return types; } bool inline requiresGuess(std::vector types) { std::vector::iterator iter; iter = find(types.begin(), types.end(), COL_UNKNOWN); return iter != types.end(); } bool inline isDateTime(int id, const std::set custom) { // Page and section numbers below refer to // ECMA-376 (version, date, and download URL given in XlsxCell.h) // // Example from L.2.7.4.4 p4698 for hypothetical cell D2 // Cell D2 contains the text "Q1" and is defined in the cell table of sheet1 // as: // // // 0 // // // On this cell, the attribute value s="7" indicates that the 7th (zero-based) // definition of holds the formatting information for the cell. // The 7th of is defined as: // // // // The number formatting information cannot be found in a definition // because it is a built-in format; instead, it is implicitly understood to be // the 0th built-in number format. // // This function stores knowledge about these built-in number formats. // // 18.8.30 numFmt (Number Format) p1786 // Date times: 14-22, 27-36, 45-47, 50-58, 71-81 (inclusive) if ((id >= 14 && id <= 22) || (id >= 27 && id <= 36) || (id >= 45 && id <= 47) || (id >= 50 && id <= 58) || (id >= 71 && id <= 81)) return true; // Built-in format that's not a date if (id < 164) return false; return custom.count(id) > 0; } inline bool isDateFormat(std::string x) { // TO FIX? So far no bug reports due to this. // Logic below is too simple. For example, it deems this format string a date: // "$"#,##0_);[Red]\("$"#,##0\) // because of the `d` in `[Red]` // // Ideally this can wait until we are using something like // https://github.com/WizardMac/TimeFormatStrings // which presumably offers fancier ways to analyze format codes. for (size_t i = 0; i < x.size(); ++i) { switch (x[i]) { case 'd': case 'D': case 'm': // 'mm' for minutes case 'M': case 'y': case 'Y': case 'h': // 'hh' case 'H': case 's': // 'ss' case 'S': return true; default: break; } } return false; } inline std::vector recycleTypes(std::vector types, int ncol) { if (types.size() == 1) { types.resize(ncol); std::fill(types.begin(), types.end(), types[0]); } return types; } inline std::vector finalizeTypes(std::vector types) { // convert blank columns to a default type: logical // can only happen when col_type = guess AND // * all cells in column are empty or // * all cells match one of the na strings or // * there is no cell data at all for (size_t i = 0; i < types.size(); i++) { if (types[i] == COL_BLANK || types[i] == COL_UNKNOWN) { types[i] = COL_LOGICAL; } } return types; } inline Rcpp::CharacterVector reconcileNames(Rcpp::CharacterVector names, const std::vector& types, int sheet_i) { size_t ncol_names = names.size(); size_t ncol_types = types.size(); if (ncol_names == ncol_types) { return names; } size_t ncol_noskip = 0; for (size_t i = 0; i < types.size(); i++) { if (types[i] != COL_SKIP) { ncol_noskip++; } } if (ncol_names != ncol_noskip) { Rcpp::stop("Sheet %d has %d columns (%d unskipped), but `col_names` has length %d.", sheet_i + 1, ncol_types, ncol_noskip, ncol_names); } Rcpp::CharacterVector newNames(ncol_types, ""); size_t j_short = 0; for (size_t j_long = 0; j_long < ncol_types; ++j_long) { if (types[j_long] == COL_SKIP) { continue; } newNames[j_long] = names[j_short]; j_short++; } return newNames; } inline Rcpp::RObject makeCol(ColType type, int n) { switch(type) { case COL_UNKNOWN: case COL_BLANK: case COL_SKIP: return R_NilValue; case COL_LOGICAL: return Rcpp::LogicalVector(n, NA_LOGICAL); case COL_DATE: { Rcpp::RObject col = Rcpp::NumericVector(n, NA_REAL); col.attr("class") = Rcpp::CharacterVector::create("POSIXct", "POSIXt"); col.attr("tzone") = "UTC"; return col; } case COL_NUMERIC: return Rcpp::NumericVector(n, NA_REAL); case COL_TEXT: return Rcpp::CharacterVector(n, NA_STRING); case COL_LIST: return Rcpp::List(n, Rcpp::LogicalVector(1, NA_LOGICAL)); } return R_NilValue; } inline Rcpp::List removeSkippedColumns(Rcpp::List cols, Rcpp::CharacterVector names, std::vector types) { int p = cols.size(); int p_out = 0; for (int j = 0; j < p; ++j) { if (types[j] != COL_SKIP) p_out++; } Rcpp::List out(p_out); Rcpp::CharacterVector names_out(p_out); int j_out = 0; for (int j = 0; j < p; ++j) { if (types[j] == COL_SKIP) { continue; } out[j_out] = cols[j]; names_out[j_out] = names[j]; j_out++; } // Turn list into a data frame out.attr("names") = names_out; return out; } #endif readxl/src/Spinner.h0000644000176200001440000000076313442224523014116 0ustar liggesusers#ifndef READXL_SPINNER_ #define READXL_SPINNER_ #include class Spinner { bool progress_; RProgress::RProgress pb_; public: Spinner(bool progress = true): progress_(progress) { if (progress_) { pb_ = RProgress::RProgress(":spin"); pb_.set_total(1); pb_.set_show_after(2); } } void spin() { if (progress_) pb_.update(0.5); } void finish() { if (progress_) pb_.update(1); } ~Spinner() { if (this->progress_) this->finish(); } }; #endif readxl/src/XlsxWorkBook.h0000644000176200001440000002540113442224523015110 0ustar liggesusers#ifndef READXL_XLSXWORKBOOK_ #define READXL_XLSXWORKBOOK_ #include #include "rapidxml.h" #include "ColSpec.h" #include "XlsxString.h" #include "utils.h" #include "zip.h" class XlsxWorkBook { // holds objects related to package parts, such as file paths, but also // worksheet position, name, and id class PackageRelations { // non-worksheet package parts std::map part_; // worksheets int n_; Rcpp::CharacterVector names_; Rcpp::CharacterVector id_; std::map target_; // populate workbook element of part_ void parse_package_rels(const std::string& path) { std::string rels_xml_file = zip_buffer(path, "_rels/.rels"); rapidxml::xml_document<> rels_xml; rels_xml.parse(&rels_xml_file[0]); rapidxml::xml_node<>* relationships = rels_xml.first_node("Relationships"); if (relationships == NULL) { Rcpp::stop("Spreadsheet has no package-level relationships"); } std::map scratch; for (rapidxml::xml_node<>* relationship = relationships->first_node(); relationship; relationship = relationship->next_sibling()) { rapidxml::xml_attribute<>* type = relationship->first_attribute("Type"); rapidxml::xml_attribute<>* target = relationship->first_attribute("Target"); if (type != NULL && target != NULL) { // keys are derived by abbreviating Type // in XML: http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument // key is just the last part: officeDocument scratch[baseName(type->value())] = target->value(); } } // identify and store the workbook part = the main part // ECMA-376 Part 1 section 8.5 SpreadsheetML std::map::iterator m = scratch.find("officeDocument"); if (m == scratch.end()) { Rcpp::stop("No workbook part found"); } // store 'xl/workbook.xml', not '/xl/workbook.xml' (rare, but have seen) part_["officeDocument"] = removeLeadingSlashes(m->second); } // populates n_, names_, id_ void parse_workbook(const std::string& path) { std::string workbookXml = zip_buffer(path, part_["officeDocument"]); rapidxml::xml_document<> workbook; workbook.parse(&workbookXml[0]); rapidxml::xml_node<>* root = workbook.first_node("workbook"); if (root == NULL) { return; } rapidxml::xml_node<>* sheets = root->first_node("sheets"); if (sheets == NULL) { return; } int i = 0; for (rapidxml::xml_node<>* sheet = sheets->first_node(); sheet; sheet = sheet->next_sibling()) { if (i >= n_) { n_ *= 2; names_ = Rf_lengthgets(names_, n_); id_ = Rf_lengthgets(id_, n_); } rapidxml::xml_attribute<>* name = sheet->first_attribute("name"); names_[i] = (name != NULL) ? Rf_mkCharCE(name->value(), CE_UTF8) : NA_STRING; rapidxml::xml_attribute<>* id = sheet->first_attribute("id"); id_[i] = (id != NULL) ? Rf_mkCharCE(id->value(), CE_UTF8) : NA_STRING; i++; } if (i != n_) { names_ = Rf_lengthgets(names_, i); id_ = Rf_lengthgets(id_, i); n_ = i; } } // populates target_ void parse_workbook_rels(const std::string& path) { const std::string workbook_path = part_["officeDocument"]; const std::string workbook_dir = dirName(workbook_path); std::string rels_xml_path = workbook_dir + "/_rels/" + baseName(workbook_path) + ".rels"; rels_xml_path = removeLeadingSlashes(rels_xml_path); std::string rels_xml_file = zip_buffer(path, rels_xml_path); rapidxml::xml_document<> rels_xml; rels_xml.parse(&rels_xml_file[0]); rapidxml::xml_node<>* relationships = rels_xml.first_node("Relationships"); if (relationships == NULL) { return; } for (rapidxml::xml_node<>* relationship = relationships->first_node(); relationship; relationship = relationship->next_sibling()) { rapidxml::xml_attribute<>* id = relationship->first_attribute("Id"); rapidxml::xml_attribute<>* type = relationship->first_attribute("Type"); rapidxml::xml_attribute<>* target = relationship->first_attribute("Target"); if (id != NULL && type != NULL && target != NULL) { // store 'xl/blah' instead of '/xl/blah' (rare, but we've seen) std::string target_value = removeLeadingSlashes(target->value()); // abbreviate Type // in XML: http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings // whereas we only want: sharedStrings std::string type_value = baseName(type->value()); // prepend workbook_dir iff needed; yes, we've seen both forms // xl/blah --> xl/blah // blah --> xl/blah if (target_value.substr(0, workbook_dir.size()) != workbook_dir) { target_value = workbook_dir + "/" + target_value; } if (type_value.compare("worksheet") == 0) { // worksheet target_[id->value()] = target_value; } else { // not a worksheet, e.g. styles or sharedStrings part_[type_value] = target_value; } } } } public: PackageRelations(const std::string& path) : n_(100), names_(n_), id_(n_) { parse_package_rels(path); parse_workbook(path); parse_workbook_rels(path); } Rcpp::CharacterVector names() const { return names_; } int n_sheets() const { return n_; } std::string target(int sheet_i) const { std::string id = Rcpp::as(id_[sheet_i]); std::map::const_iterator it = target_.find(id); if (it == target_.end()) { Rcpp::stop("`%s` not found", id); } return it->second; } std::string part(std::string type) const { std::map::const_iterator it = part_.find(type); if (it == part_.end()) { // e.g., sharedStrings may not be present // downstream functions should handle non-existent path return ""; } return it->second; } }; // end of class PackageRelations // common to Xls[x]WorkBook std::string path_; bool is1904_; std::set dateFormats_; // specific to XlsxWorkBook PackageRelations rel_; std::vector stringTable_; public: XlsxWorkBook(const std::string& path): path_(path), rel_(path) { is1904_ = uses1904(); cacheStringTable(); cacheDateFormats(); } const std::string& path() const{ return path_; } int n_sheets() const { return rel_.n_sheets(); } Rcpp::CharacterVector sheets() const { return rel_.names(); } bool is1904() const { return is1904_; } const std::set& dateFormats() const { return dateFormats_; } std::string sheetPath(int sheet_i) const { return rel_.target(sheet_i); } const std::vector& stringTable() const { return stringTable_; } private: void cacheStringTable() { if (!zip_has_file(path_, rel_.part("sharedStrings"))) { return; } std::string sharedStringsXml = zip_buffer(path_, rel_.part("sharedStrings")); rapidxml::xml_document<> sharedStrings; sharedStrings.parse(&sharedStringsXml[0]); rapidxml::xml_node<>* sst = sharedStrings.first_node("sst"); if (sst == NULL) { return; } rapidxml::xml_attribute<>* count = sst->first_attribute("count"); if (count != NULL) { int n = atoi(count->value()); stringTable_.reserve(n); } // 18.4.8 si (String Item) [p1725] for (rapidxml::xml_node<>* string = sst->first_node(); string; string = string->next_sibling()) { std::string out; if (parseString(string, &out)) { stringTable_.push_back(out); } } } void cacheDateFormats() { if (!zip_has_file(path_, rel_.part("styles"))) { return; } std::string stylesXml = zip_buffer(path_, rel_.part("styles")); rapidxml::xml_document<> styles; styles.parse(&stylesXml[0]); rapidxml::xml_node<>* styleSheet = styles.first_node("styleSheet"); if (styleSheet == NULL) { return; } // Figure out which custom formats are dates // 18.8.31 numFmts (Number Formats) p1793 5th ed std::set customDateFormats; rapidxml::xml_node<>* numFmts = styleSheet->first_node("numFmts"); if (numFmts != NULL) { // Example with just one custom format (non date, in this case) // // // for (rapidxml::xml_node<>* numFmt = numFmts->first_node(); numFmt; numFmt = numFmt->next_sibling()) { // formatCode: The number format code for this number format. std::string code(numFmt->first_attribute("formatCode")->value()); // numFmtId: Id used by the master style records (xf's) to reference // this number format. int id = atoi(numFmt->first_attribute("numFmtId")->value()); if (isDateFormat(code)) { customDateFormats.insert(id); } } } // Cache 0-based indices of the master cell style records that refer to a // number format that is a date format rapidxml::xml_node<>* cellXfs = styleSheet->first_node("cellXfs"); if (cellXfs == NULL) { return; } // inspecting i-th child of cellXfs = i-th cell style record = an int i = 0; for (rapidxml::xml_node<>* cellXf = cellXfs->first_node(); cellXf; cellXf = cellXf->next_sibling()) { if (cellXf->first_attribute("numFmtId") == NULL) { ++i; continue; } int formatId = atoi(cellXf->first_attribute("numFmtId")->value()); if (isDateTime(formatId, customDateFormats)) dateFormats_.insert(i); ++i; } } bool uses1904() { std::string workbookXml = zip_buffer(path_, rel_.part("officeDocument")); rapidxml::xml_document<> workbook; workbook.parse(&workbookXml[0]); rapidxml::xml_node<>* root = workbook.first_node("workbook"); if (root == NULL) { return false; } rapidxml::xml_node<>* workbookPr = root->first_node("workbookPr"); if (workbookPr == NULL) { return false; } rapidxml::xml_attribute<>* date1904 = workbookPr->first_attribute("date1904"); if (date1904 == NULL) { return false; } return atoi(date1904->value()) == 1; } }; #endif readxl/src/libxls/0000755000176200001440000000000013430703667013626 5ustar liggesusersreadxl/src/libxls/brdb.h0000644000176200001440000000406113442224523014701 0ustar liggesusers/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright 2004 Komarov Valery * Copyright 2006 Christophe Leitienne * Copyright 2008-2017 David Hoerl * Copyright 2013 Bob Colbert * Copyright 2013-2018 Evan Miller * * This file is part of libxls -- A multiplatform, C/C++ library for parsing * Excel(TM) files. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ struct str_brdb { WORD opcode; char * name; /* printable name */ char * desc; /* printable description */ }; typedef struct str_brdb record_brdb; record_brdb brdb[] = { #include }; static int get_brbdnum(int id) { int i; i=0; do { if (brdb[i].opcode==id) return i; i++; } while (brdb[i].opcode!=0xFFF); return 0; } readxl/src/libxls/xlsstruct.h0000644000176200001440000002416013442224523016045 0ustar liggesusers/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright 2004 Komarov Valery * Copyright 2006 Christophe Leitienne * Copyright 2008-2017 David Hoerl * Copyright 2013 Bob Colbert * Copyright 2013-2018 Evan Miller * * This file is part of libxls -- A multiplatform, C/C++ library for parsing * Excel(TM) files. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef XLS_STRUCT_INC #define XLS_STRUCT_INC #include "libxls/ole.h" #define XLS_RECORD_EOF 0x000A #define XLS_RECORD_DEFINEDNAME 0x0018 #define XLS_RECORD_NOTE 0x001C #define XLS_RECORD_1904 0x0022 #define XLS_RECORD_CONTINUE 0x003C #define XLS_RECORD_WINDOW1 0x003D #define XLS_RECORD_CODEPAGE 0x0042 #define XLS_RECORD_OBJ 0x005D #define XLS_RECORD_MERGEDCELLS 0x00E5 #define XLS_RECORD_DEFCOLWIDTH 0x0055 #define XLS_RECORD_COLINFO 0x007D #define XLS_RECORD_BOUNDSHEET 0x0085 #define XLS_RECORD_PALETTE 0x0092 #define XLS_RECORD_MULRK 0x00BD #define XLS_RECORD_MULBLANK 0x00BE #define XLS_RECORD_DBCELL 0x00D7 #define XLS_RECORD_XF 0x00E0 #define XLS_RECORD_MSODRAWINGGROUP 0x00EB #define XLS_RECORD_MSODRAWING 0x00EC #define XLS_RECORD_SST 0x00FC #define XLS_RECORD_LABELSST 0x00FD #define XLS_RECORD_EXTSST 0x00FF #define XLS_RECORD_TXO 0x01B6 #define XLS_RECORD_HYPERREF 0x01B8 #define XLS_RECORD_BLANK 0x0201 #define XLS_RECORD_NUMBER 0x0203 #define XLS_RECORD_LABEL 0x0204 #define XLS_RECORD_BOOLERR 0x0205 #define XLS_RECORD_STRING 0x0207 // only follows a formula #define XLS_RECORD_ROW 0x0208 #define XLS_RECORD_INDEX 0x020B #define XLS_RECORD_ARRAY 0x0221 // Array-entered formula #define XLS_RECORD_DEFAULTROWHEIGHT 0x0225 #define XLS_RECORD_FONT 0x0031 // spec says 0x0231 but Excel expects 0x0031 #define XLS_RECORD_FONT_ALT 0x0231 #define XLS_RECORD_WINDOW2 0x023E #define XLS_RECORD_RK 0x027E #define XLS_RECORD_STYLE 0x0293 #define XLS_RECORD_FORMULA 0x0006 #define XLS_RECORD_FORMULA_ALT 0x0406 // Apple Numbers bug #define XLS_RECORD_FORMAT 0x041E #define XLS_RECORD_BOF 0x0809 #define BLANK_CELL XLS_RECORD_BLANK // compat #if defined(_AIX) || defined(__sun) #pragma pack(1) #else #pragma pack(push, 1) #endif typedef struct BOF { WORD id; WORD size; } BOF; typedef struct BIFF { WORD ver; WORD type; WORD id_make; WORD year; DWORD flags; DWORD min_ver; } BIFF; typedef struct WIND1 { WORD xWn; WORD yWn; WORD dxWn; WORD dyWn; WORD grbit; WORD itabCur; WORD itabFirst; WORD ctabSel; WORD wTabRatio; } WIND1; typedef struct BOUNDSHEET { DWORD filepos; BYTE type; BYTE visible; char name[1]; } BOUNDSHEET; typedef struct ROW { WORD index; WORD fcell; WORD lcell; WORD height; WORD notused; WORD notused2; //used only for BIFF3-4 WORD flags; WORD xf; } ROW; typedef struct COL { WORD row; WORD col; WORD xf; } COL; typedef struct FORMULA // BIFF8 { WORD row; WORD col; WORD xf; // next 8 bytes either a IEEE double, or encoded on a byte basis BYTE resid; BYTE resdata[5]; WORD res; WORD flags; BYTE chn[4]; // BIFF8 WORD len; BYTE value[1]; //var } FORMULA; typedef struct FARRAY // BIFF8 { WORD row1; WORD row2; BYTE col1; BYTE col2; WORD flags; BYTE chn[4]; // BIFF8 WORD len; BYTE value[1]; //var } FARRAY; typedef struct RK { WORD row; WORD col; WORD xf; DWORD value; } RK; typedef struct MULRK { WORD row; WORD col; struct { WORD xf; DWORD value; } rk[1]; //WORD last_col; } MULRK; typedef struct MULBLANK { WORD row; WORD col; WORD xf[1]; //WORD last_col; } MULBLANK; typedef struct BLANK { WORD row; WORD col; WORD xf; } BLANK; typedef struct LABEL { WORD row; WORD col; WORD xf; BYTE value[1]; // var } LABEL; typedef LABEL LABELSST; typedef struct BOOLERR { WORD row; WORD col; WORD xf; BYTE value; BYTE iserror; } BOOLERR; typedef struct SST { DWORD num; DWORD numofstr; BYTE strings[1]; } SST; typedef struct XF5 { WORD font; WORD format; WORD type; WORD align; WORD color; WORD fill; WORD border; WORD linestyle; } XF5; typedef struct XF8 { WORD font; WORD format; WORD type; BYTE align; BYTE rotation; BYTE ident; BYTE usedattr; DWORD linestyle; DWORD linecolor; WORD groundcolor; } XF8; typedef struct BR_NUMBER { WORD row; WORD col; WORD xf; double value; } BR_NUMBER; typedef struct COLINFO { WORD first; WORD last; WORD width; WORD xf; WORD flags; /* There should be an unused WORD field at the end here. However, some files in * the wild report it as a BYTE, which results in a boundary-check parse error. * Since the value is ignored anyway, we'll just pretend it was never there. * * See issue https://github.com/evanmiller/libxls/issues/27 */ } COLINFO; typedef struct MERGEDCELLS { WORD rowf; WORD rowl; WORD colf; WORD coll; } MERGEDCELLS; typedef struct FONT { WORD height; WORD flag; WORD color; WORD bold; WORD escapement; BYTE underline; BYTE family; BYTE charset; BYTE notused; char name[1]; } FONT; typedef struct FORMAT { WORD index; char value[1]; } FORMAT; #pragma pack(pop) //--------------------------------------------------------- typedef struct st_sheet { DWORD count; // Count of sheets struct st_sheet_data { DWORD filepos; BYTE visibility; BYTE type; char * name; } * sheet; } st_sheet; typedef struct st_font { DWORD count; // Count of FONT's struct st_font_data { WORD height; WORD flag; WORD color; WORD bold; WORD escapement; BYTE underline; BYTE family; BYTE charset; char * name; } * font; } st_font; typedef struct st_format { DWORD count; // Count of FORMAT's struct st_format_data { WORD index; char *value; } * format; } st_format; typedef struct st_xf { DWORD count; // Count of XF // XF** xf; struct st_xf_data { WORD font; WORD format; WORD type; BYTE align; BYTE rotation; BYTE ident; BYTE usedattr; DWORD linestyle; DWORD linecolor; WORD groundcolor; } * xf; } st_xf; typedef struct st_sst { DWORD count; DWORD lastid; DWORD continued; DWORD lastln; DWORD lastrt; DWORD lastsz; struct str_sst_string { char * str; } * string; } st_sst; typedef struct st_cell { DWORD count; struct st_cell_data { WORD id; WORD row; WORD col; WORD xf; char * str; // String value; double d; int32_t l; WORD width; // Width of col WORD colspan; WORD rowspan; BYTE isHidden; // Is cell hidden } * cell; } st_cell; typedef struct st_row { // DWORD count; WORD lastcol; // numCols - 1 WORD lastrow; // numRows - 1 struct st_row_data { WORD index; WORD fcell; WORD lcell; WORD height; WORD flags; WORD xf; BYTE xfflags; st_cell cells; } * row; } st_row; typedef struct st_colinfo { DWORD count; // Count of COLINFO struct st_colinfo_data { WORD first; WORD last; WORD width; WORD xf; WORD flags; } * col; } st_colinfo; typedef struct xlsWorkBook { //FILE* file; OLE2Stream* olestr; int32_t filepos; // position in file //From Header (BIFF) BYTE is5ver; BYTE is1904; WORD type; WORD activeSheetIdx; // index of the active sheet //Other data WORD codepage; // Charset codepage char* charset; st_sheet sheets; st_sst sst; // SST table st_xf xfs; // XF table st_font fonts; st_format formats; // FORMAT table char *summary; // ole file char *docSummary; // ole file } xlsWorkBook; typedef struct xlsWorkSheet { DWORD filepos; WORD defcolwidth; st_row rows; xlsWorkBook *workbook; st_colinfo colinfo; } xlsWorkSheet; #ifdef __cplusplus typedef struct st_cell::st_cell_data xlsCell; typedef struct st_row::st_row_data xlsRow; #else typedef struct st_cell_data xlsCell; typedef struct st_row_data xlsRow; #endif typedef struct xls_summaryInfo { BYTE *title; BYTE *subject; BYTE *author; BYTE *keywords; BYTE *comment; BYTE *lastAuthor; BYTE *appName; BYTE *category; BYTE *manager; BYTE *company; } xlsSummaryInfo; typedef void (*xls_formula_handler)(WORD bof, WORD len, BYTE *formula); #endif readxl/src/libxls/endian.h0000644000176200001440000000453713442224523015236 0ustar liggesusers/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright 2013 Bob Colbert * * This file is part of libxls -- A multiplatform, C/C++ library for parsing * Excel(TM) files. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include int xls_is_bigendian(void); DWORD xlsIntVal (DWORD i); unsigned short xlsShortVal (short s); void xlsConvertHeader(OLE2Header *h); void xlsConvertPss(PSS* pss); void xlsConvertDouble(BYTE *d); void xlsConvertBof(BOF *b); void xlsConvertBiff(BIFF *b); void xlsConvertWindow(WIND1 *w); void xlsConvertSst(SST *s); void xlsConvertXf5(XF5 *x); void xlsConvertXf8(XF8 *x); void xlsConvertFont(FONT *f); void xlsConvertFormat(FORMAT *f); void xlsConvertBoundsheet(BOUNDSHEET *b); void xlsConvertColinfo(COLINFO *c); void xlsConvertRow(ROW *r); void xlsConvertMergedcells(MERGEDCELLS *m); void xlsConvertCol(COL *c); void xlsConvertFormula(FORMULA *f); void xlsConvertFormulaArray(FARRAY *f); void xlsConvertHeader(OLE2Header *h); void xlsConvertPss(PSS* pss); #define W_ENDIAN(a) a=xlsShortVal(a) #define D_ENDIAN(a) a=xlsIntVal(a) readxl/src/libxls/xls.h0000644000176200001440000000612013442224523014574 0ustar liggesusers/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright 2004 Komarov Valery * Copyright 2006 Christophe Leitienne * Copyright 2008-2017 David Hoerl * Copyright 2013-2018 Evan Miller * * This file is part of libxls -- A multiplatform, C/C++ library for parsing * Excel(TM) files. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY Evan Miller ''AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO * EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef XLS_INCLUDE #define XLS_INCLUDE #ifdef __cplusplus namespace xls { extern "C" { #endif #include "libxls/xlstypes.h" #include "libxls/xlsstruct.h" #include "libxls/xlstool.h" typedef enum { LIBXLS_OK, LIBXLS_ERROR_OPEN, LIBXLS_ERROR_SEEK, LIBXLS_ERROR_READ, LIBXLS_ERROR_PARSE, LIBXLS_ERROR_MALLOC } xls_error_t; const char* xls_getVersion(void); const char* xls_getError(xls_error_t code); int xls(int debug); // Set debug. Force library to load? void xls_set_formula_hander(xls_formula_handler handler); xls_error_t xls_parseWorkBook(xlsWorkBook* pWB); xls_error_t xls_parseWorkSheet(xlsWorkSheet* pWS); // Preferred API // charset - convert 16bit strings within the spread sheet to this 8-bit encoding (UTF-8 default) xlsWorkBook *xls_open_file(const char *file, const char *charset, xls_error_t *outError); xlsWorkBook *xls_open_buffer(const unsigned char *data, size_t data_len, const char *charset, xls_error_t *outError); void xls_close_WB(xlsWorkBook* pWB); // Historical API xlsWorkBook* xls_open(const char *file,const char *charset); #define xls_close xls_close_WB xlsWorkSheet * xls_getWorkSheet(xlsWorkBook* pWB,int num); void xls_close_WS(xlsWorkSheet* pWS); xlsSummaryInfo *xls_summaryInfo(xlsWorkBook* pWB); void xls_close_summaryInfo(xlsSummaryInfo *pSI); // utility function xlsRow *xls_row(xlsWorkSheet* pWS, WORD cellRow); xlsCell *xls_cell(xlsWorkSheet* pWS, WORD cellRow, WORD cellCol); #ifdef __cplusplus } // extern c block } // namespace #endif #endif readxl/src/libxls/brdb.c.h0000644000176200001440000002430313442224523015123 0ustar liggesusers/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright 2004 Komarov Valery * Copyright 2006 Christophe Leitienne * Copyright 2008-2017 David Hoerl * Copyright 2013 Bob Colbert * Copyright 2013-2018 Evan Miller * * This file is part of libxls -- A multiplatform, C/C++ library for parsing * Excel(TM) files. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ { 0x00, "Unknown", ""}, { 0x06, "FORMULA", "Cell Formula" }, { 0x09, "BOF-BIFF2", "Beginning of File" }, { 0x0A, "EOF", "End of File" }, { 0x0C, "CALCCOUNT", "Iteration Count" }, { 0x0D, "CALCMODE", "Calculation Mode" }, { 0x0E, "PRECISION", "Precision" }, { 0x0F, "REFMODE", "Reference Mode" }, { 0x10, "DELTA", "Iteration Increment" }, { 0x11, "ITERATION", "Iteration Mode" }, { 0x12, "PROTECT", "Protection Flag" }, { 0x13, "PASSWORD", "Protection Password" }, { 0x14, "HEADER", "Print Header on Each Page" }, { 0x15, "FOOTER", "Print Footer on Each Page" }, { 0x16, "EXTERNCOUNT", "Number of External References" }, { 0x17, "EXTERNSHEET", "External Reference" }, { 0x18, "DEFINEDNAME", "User Defined Formulas (and others)" }, { 0x19, "?WINDOWPROTECT", " (biffview guessed)" }, { 0x1A, "VERTICALPAGEBREAKS", "Explicit Column Page Breaks" }, { 0x1B, "HORIZONTALPAGEBREAKS", "Explicit Row Page Breaks" }, { 0x1C, "NOTE", "Comment Associated with a Cell" }, { 0x1D, "SELECTION", "Current Selection" }, { 0x22, "DATEMODE", "1904 Date System" }, { 0x26, "LEFTMARGIN", "Left Margin Measurement" }, { 0x27, "RIGHTMARGIN", "Right Margin Measurement" }, { 0x28, "TOPMARGIN", "Top Margin Measurement" }, { 0x29, "BOTTOMMARGIN", "Bottom Margin Measurement" }, { 0x2A, "PRINTHEADERS", "Print Row/Column Labels" }, { 0x2B, "PRINTGRIDLINES", "Print Gridlines Flag" }, { 0x2F, "FILEPASS", "File Is Password-Protected" }, { 0x31, "FONT", "Font Description" }, { 0x3C, "CONTINUE", "Continues Long Records" }, { 0x3D, "WINDOW1", "Window Information" }, { 0x40, "BACKUP", "Save Backup Version of the File" }, { 0x41, "PANE", "Number of Panes and Their Position" }, { 0x42, "CODEPAGE", "Default Code Page" }, { 0x4D, "PLS", "Environment-Specific Print Record" }, { 0x50, "DCON", "Data Consolidation Information" }, { 0x51, "DCONREF", "Data Consolidation References" }, { 0x52, "DCONNAME", "Data Consolidation Named References" }, { 0x55, "DEFCOLWIDTH", "Default Width for Columns" }, { 0x59, "XCT", "CRN Record Count" }, { 0x5A, "CRN", "Nonresident Operands" }, { 0x5B, "FILESHARING", "File-Sharing Information" }, { 0x5C, "WRITEACCESS", "Write Access User Name" }, { 0x5D, "OBJ", "Describes a Graphic Object" }, { 0x5E, "UNCALCED", "Recalculation Status" }, { 0x5F, "SAVERECALC", "Recalculate Before Save" }, { 0x60, "TEMPLATE", "Workbook Is a Template" }, { 0x63, "OBJPROTECT", "Objects Are Protected" }, { 0x7D, "COLINFO", "Column Formatting Information" }, { 0x7F, "IMDATA", "Image Data" }, { 0x80, "GUTS", "Size of Row and Column Gutters" }, { 0x81, "WSBOOL", "Additional Workspace Information" }, { 0x82, "GRIDSET", "State Change of Gridlines Option" }, { 0x83, "HCENTER", "Center Between Horizontal Margins" }, { 0x84, "VCENTER", "Center Between Vertical Margins" }, { 0x85, "BOUNDSHEET", "Sheet Information" }, { 0x86, "WRITEPROT", "Workbook Is Write-Protected" }, { 0x87, "ADDIN", "Workbook Is an Add-in Macro" }, { 0x88, "EDG", "Edition Globals" }, { 0x89, "PUB", "Publisher" }, { 0x8C, "COUNTRY", "Default Country and WIN.INI Country" }, { 0x8D, "HIDEOBJ", "Object Display Options" }, { 0x90, "SORT", "Sorting Options" }, { 0x91, "SUB", "Subscriber" }, { 0x92, "PALETTE", "Color Palette Definition" }, { 0x94, "LHRECORD", ".WK? File Conversion Information" }, { 0x95, "LHNGRAPH", "Named Graph Information" }, { 0x96, "SOUND", "Sound Note" }, { 0x99, "STANDARDWIDTH", "Standard Column Width" }, { 0x98, "LPR", "Sheet Was Printed Using LINE.PRINT" }, { 0x9A, "FNGROUPNAME", "Function Group Name" }, { 0x9B, "FILTERMODE", "Sheet Contains Filtered List" }, { 0x9C, "FNGROUPCOUNT", "Built-in Function Group Count" }, { 0x9D, "AUTOFILTERINFO", "Drop-Down Arrow Count" }, { 0x9E, "AUTOFILTER", "AutoFilter Data" }, { 0xA0, "SCL", "Window Zoom Magnification" }, { 0xA1, "SETUP", "Page Setup" }, { 0xA9, "COORDLIST", "Polygon Object Vertex Coordinates" }, { 0xAB, "GCW", "Global Column-Width Flags" }, { 0xAE, "SCENMAN", "Scenario Output Data" }, { 0xAF, "SCENARIO", "Scenario Data" }, { 0xB0, "SXVIEW", "View Definition" }, { 0xB1, "SXVD", "View Fields" }, { 0xB2, "SXVI", "View Item" }, { 0xB4, "SXIVD", "Row/Column Field IDs" }, { 0xB5, "SXLI", "Line Item Array" }, { 0xB6, "SXPI", "Page Item" }, { 0xB8, "DOCROUTE", "Routing Slip Information" }, { 0xB9, "RECIPNAME", "Recipient Name" }, { 0xBC, "SHRFMLA", "Shared Formula" }, { 0xBD, "MULRK", "Multiple RK Cells" }, { 0xBE, "MULBLANK", "Multiple Blank Cells" }, { 0xC1, "MMS", "ADDMENU/DELMENU Record Group Count" }, { 0xC2, "ADDMENU", "Menu Addition" }, { 0xC3, "DELMENU", "Menu Deletion" }, { 0xC5, "SXDI", "Data Item" }, { 0xC6, "SXDB", "PivotTable Cache Data" }, { 0xCD, "SXSTRING", "String" }, { 0xD0, "SXTBL", "Multiple Consolidation Source Info" }, { 0xD1, "SXTBRGIITM", "Page Item Name Count" }, { 0xD2, "SXTBPG", "Page Item Indexes" }, { 0xD3, "OBPROJ", "Visual Basic Project" }, { 0xD5, "SXIDSTM", "Stream ID" }, { 0xD6, "RSTRING", "Cell with Character Formatting" }, { 0xD7, "DBCELL", "Stream Offsets" }, { 0xDA, "BOOKBOOL", "Workbook Option Flag" }, { 0xDC, "PARAMQRY-SXEXT", "Query Parameters-External Source Information" }, { 0xDD, "SCENPROTECT", "Scenario Protection" }, { 0xDE, "OLESIZE", "Size of OLE Object" }, { 0xDF, "UDDESC", "Description String for Chart Autoformat" }, { 0xE0, "XF", "Extended Format" }, { 0xE1, "INTERFACEHDR", "Beginning of User Interface Records" }, { 0xE2, "INTERFACEEND", "End of User Interface Records" }, { 0xE3, "SXVS", "View Source" }, { 0xE5, "CSPAN", "Cells span" }, { 0xEA, "TABIDCONF", "Sheet Tab ID of Conflict History" }, { 0xEB, "MSODRAWINGGROUP", "Microsoft Office Drawing Group" }, { 0xEC, "MSODRAWING", "Microsoft Office Drawing" }, { 0xED, "MSODRAWINGSELECTION", "Microsoft Office Drawing Selection" }, { 0xEF, "PHONETIC-INFO", "Specifies the default format for phonetic strings " }, { 0xF0, "SXRULE", "PivotTable Rule Data" }, { 0xF1, "SXEX", "PivotTable View Extended Information" }, { 0xF2, "SXFILT", "PivotTable Rule Filter" }, { 0xF6, "SXNAME", "PivotTable Name" }, { 0xF7, "SXSELECT", "PivotTable Selection Information" }, { 0xF8, "SXPAIR", "PivotTable Name Pair" }, { 0xF9, "SXFMLA", "PivotTable Parsed Expression" }, { 0xFB, "SXFORMAT", "PivotTable Format Record" }, { 0xFC, "SST", "Shared String Table" }, { 0xFD, "LABELSST", "Cell Value, String Constant/SST" }, { 0xFF, "EXTSST", "Extended Shared String Table" }, { 0x100, "SXVDEX", "Extended PivotTable View Fields" }, { 0x103, "SXFORMULA", "PivotTable Formula Record" }, { 0x122, "SXDBEX", "PivotTable Cache Data" }, { 0x13D, "TABID", "Sheet Tab Index Array" }, { 0x160, "USESELFS", "Natural Language Formulas Flag" }, { 0x161, "DSF", "Double Stream File" }, { 0x162, "XL5MODIFY", "Flag for DSF" }, { 0x1A5, "FILESHARING2", "File-Sharing Information for Shared Lists" }, { 0x1A9, "USERBVIEW", "Workbook Custom View Settings" }, { 0x1AA, "USERSVIEWBEGIN", "Custom View Settings" }, { 0x1AB, "USERSVIEWEND", "End of Custom View Records" }, { 0x1AD, "QSI", "External Data Range" }, { 0x1AE, "SUPBOOK", "Supporting Workbook" }, { 0x1AF, "PROT4REV", "Shared Workbook Protection Flag" }, { 0x1B0, "CONDFMT", "Conditional Formatting Range Information" }, { 0x1B1, "CF", "Conditional Formatting Conditions" }, { 0x1B2, "DVAL", "Data Validation Information" }, { 0x1B5, "DCONBIN", "Data Consolidation Information" }, { 0x1B6, "TXO", "Text Object" }, { 0x1B7, "REFRESHALL", "Refresh Flag" }, { 0x1B8, "HLINK", "Hyperlink" }, { 0x1BA, "CODENAME", "Name of a workbook object," }, { 0x1BB, "SXFDBTYPE", "SQL Datatype Identifier" }, { 0x1BC, "PROT4REVPASS", "Shared Workbook Protection Password" }, { 0x1BE, "DV", "Data Validation Criteria" }, { 0x1C1, "RECALC_ID", "identifier of the recalculation engine" }, { 0x200, "DIMENSIONS", "Cell Table Size" }, { 0x201, "BLANK", "Cell Value, Blank Cell" }, { 0x203, "NUMBER", "Cell Value, Floating-Point Number" }, { 0x204, "LABEL", "Cell Value, String Constant" }, { 0x205, "BOOLERR", "Cell Value, Boolean or Error" }, { 0x207, "STRING", "String Value of a Formula" }, { 0x208, "ROW", "Describes a Row" }, { 0x209, "BOF-BIFF3", "Beginning of File" }, { 0x20B, "INDEX", "Index Record" }, { 0x218, "NAME", "Defined Name" }, { 0x221, "ARRAY", "Array-Entered Formula" }, { 0x223, "EXTERNNAME", "Externally Referenced Name" }, { 0x225, "DEFAULTROWHEIGHT", "Default Row Height" }, { 0x236, "TABLE", "Data Table" }, { 0x23E, "WINDOW2", "Sheet Window Information" }, { 0x27E, "RK", "Cell Value, RK Number" }, { 0x293, "STYLE", "Style Information" }, { 0x409, "BOF-BIFF4", "Beginning of File" }, { 0x41E, "FORMAT", "Number Format" }, { 0x4BC, "?FORMULA-RELATED=?(BC=SHRFMLA))", "Formula related, always before there are 0x06 (FORMULA)" }, { 0x809, "BOF-BIFF5/7/8", "Beginning of File" }, { 0x863, "BOOKEXT", "Specifies properties of a workbook file." }, { 0xFFF, "", "" }, readxl/src/libxls/ole.h0000644000176200001440000001075613442224523014557 0ustar liggesusers/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright 2004 Komarov Valery * Copyright 2006 Christophe Leitienne * Copyright 2008-2017 David Hoerl * Copyright 2013 Bob Colbert * Copyright 2013-2018 Evan Miller * * This file is part of libxls -- A multiplatform, C/C++ library for parsing * Excel(TM) files. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef OLE_INCLUDE #define OLE_INCLUDE #include // FILE * #include "libxls/xlstypes.h" #if defined(_AIX) || defined(__sun) #pragma pack(1) #else #pragma pack(push, 1) #endif typedef struct TIME_T { DWORD LowDate; DWORD HighDate; } TIME_T; typedef struct OLE2Header { DWORD id[2]; //D0CF11E0 A1B11AE1 DWORD clid[4]; WORD verminor; //0x3e WORD verdll; //0x03 WORD byteorder; WORD lsectorB; WORD lssectorB; WORD reserved1; DWORD reserved2; DWORD reserved3; DWORD cfat; // count full sectors DWORD dirstart; DWORD reserved4; DWORD sectorcutoff; // min size of a standard stream ; if less than this then it uses short-streams DWORD sfatstart; // first short-sector or EOC DWORD csfat; // count short sectors DWORD difstart; // first sector master sector table or EOC DWORD cdif; // total count DWORD MSAT[109]; // First 109 MSAT } OLE2Header; #pragma pack(pop) //----------------------------------------------------------------------------------- typedef struct st_olefiles { long count; struct st_olefiles_data { char* name; DWORD start; DWORD size; } * file; } st_olefiles; typedef struct OLE2 { FILE* file; const void *buffer; size_t buffer_len; size_t buffer_pos; WORD lsector; WORD lssector; DWORD cfat; DWORD dirstart; DWORD sectorcutoff; DWORD sfatstart; DWORD csfat; DWORD difstart; DWORD cdif; DWORD* SecID; // regular sector data DWORD SecIDCount; DWORD* SSecID; // short sector data DWORD SSecIDCount; BYTE* SSAT; // directory of short sectors DWORD SSATCount; st_olefiles files; } OLE2; typedef struct OLE2Stream { OLE2* ole; DWORD start; size_t pos; size_t cfat; size_t size; size_t fatpos; BYTE* buf; DWORD bufsize; BYTE eof; BYTE sfat; // short } OLE2Stream; #if defined(_AIX) || defined(__sun) #pragma pack(1) #else #pragma pack(push, 1) #endif typedef struct PSS { char name[64]; WORD bsize; BYTE type; //STGTY #define PS_EMPTY 00 #define PS_USER_STORAGE 01 #define PS_USER_STREAM 02 #define PS_USER_ROOT 05 BYTE flag; //COLOR #define BLACK 1 DWORD left; DWORD right; DWORD child; WORD guid[8]; DWORD userflags; TIME_T time[2]; DWORD sstart; DWORD size; DWORD proptype; } PSS; #pragma pack(pop) ssize_t ole2_read(void* buf,size_t size,size_t count,OLE2Stream* olest); OLE2Stream* ole2_sopen(OLE2* ole,DWORD start, size_t size); int ole2_seek(OLE2Stream* olest,DWORD ofs); OLE2Stream* ole2_fopen(OLE2* ole, const char *file); void ole2_fclose(OLE2Stream* ole2st); OLE2* ole2_open_file(const char *file); OLE2* ole2_open_buffer(const void *buffer, size_t len); void ole2_close(OLE2* ole2); #endif readxl/src/libxls/xlstypes.h0000644000176200001440000000364613442224523015673 0ustar liggesusers/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright 2004 Komarov Valery * Copyright 2006 Christophe Leitienne * Copyright 2008-2017 David Hoerl * Copyright 2013 Bob Colbert * Copyright 2013-2018 Evan Miller * * This file is part of libxls -- A multiplatform, C/C++ library for parsing * Excel(TM) files. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef XLS_TYPES_INC #define XLS_TYPES_INC #include #include typedef unsigned char BYTE; typedef uint16_t WORD; typedef uint32_t DWORD; #ifdef _WIN32 typedef unsigned __int64 unsigned64_t; #else typedef uint64_t unsigned64_t; #endif #endif readxl/src/libxls/xlstool.h0000644000176200001440000000474213442224523015502 0ustar liggesusers/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright 2004 Komarov Valery * Copyright 2006 Christophe Leitienne * Copyright 2008-2017 David Hoerl * Copyright 2013 Bob Colbert * Copyright 2013-2018 Evan Miller * * This file is part of libxls -- A multiplatform, C/C++ library for parsing * Excel(TM) files. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "libxls/xlsstruct.h" /* Mask illegal functions for CMD check */ #include "cran.h" void verbose(char* str); char *utf8_decode(const char *str, DWORD len, char *encoding); char *unicode_decode(const char *s, size_t len, size_t *newlen, const char* encoding); char *get_string(const char *s, size_t len, BYTE is2, BYTE isUnicode, char *charset); DWORD xls_getColor(const WORD color,WORD def); void xls_showBookInfo(xlsWorkBook* pWB); void xls_showROW(struct st_row_data* row); void xls_showColinfo(struct st_colinfo_data* col); void xls_showCell(struct st_cell_data* cell); void xls_showFont(struct st_font_data* font); void xls_showXF(XF8* xf); void xls_showFormat(struct st_format_data* format); char* xls_getfcell(xlsWorkBook* pWB, struct st_cell_data* cell, BYTE *label); char* xls_getCSS(xlsWorkBook* pWB); void xls_showBOF(BOF* bof); readxl/src/StringSet.h0000644000176200001440000000160713442224523014420 0ustar liggesusers#ifndef READXL_STRINGSET_ #define READXL_STRINGSET_ #include #include "utils.h" class StringSet { std::set set_; public: StringSet(const char *s = "") { if (strlen(s) > 0) set_.insert(s); } StringSet(const std::vector &s) { for (std::vector::const_iterator i = s.begin(); i != s.end(); ++i) set_.insert(*i); } StringSet(const Rcpp::CharacterVector &s) { for (Rcpp::CharacterVector::const_iterator i = s.begin(); i != s.end(); ++i) set_.insert(Rcpp::as(*i)); } bool contains(const std::string &s) const { return set_.find(s) != set_.end(); } bool contains(const std::string &s, const bool trimWs) const { return trimWs ? contains(trim(s)) : contains(s); } bool contains(const double d) const { std::ostringstream str; str << d; return contains(str.str()); } }; #endif readxl/src/windows/0000755000176200001440000000000013430703667014023 5ustar liggesusersreadxl/src/windows/config.h0000644000176200001440000000556013442224523015437 0ustar liggesusers/* config.h. Generated from config.h.in by configure. */ /* config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if you have the header file. */ /* #undef HAVE_DLFCN_H */ /* Define if you have the iconv() function and it works. */ #define HAVE_ICONV 1 /* Define to 1 if you have the header file. */ #define HAVE_INTTYPES_H 1 /* Define to 1 if your system has a GNU libc compatible `malloc' function, and to 0 otherwise. */ #define HAVE_MALLOC 1 /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 /* Define to 1 if your system has a GNU libc compatible `realloc' function, and to 0 otherwise. */ #define HAVE_REALLOC 1 /* Define to 1 if you have the header file. */ #define HAVE_STDINT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the `strdup' function. */ #define HAVE_STRDUP 1 /* Define to 1 if you have the header file. */ #define HAVE_STRINGS_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ #define HAVE_UNISTD_H 1 /* Define to 1 if you have the header file. */ #define HAVE_WCHAR_H 1 /* Define as const if the declaration of iconv() needs const. */ #define ICONV_CONST const /* Major version */ #define LIBXLS_MAJOR_VERSION 1 /* Micro version */ #define LIBXLS_MICRO_VERSION 0 /* Minor version */ #define LIBXLS_MINOR_VERSION 5 /* Define to the sub-directory where libtool stores uninstalled libraries. */ #define LT_OBJDIR ".libs/" /* Name of package */ #define PACKAGE "libxls" /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "emmiller@gmail.com" /* Define to the full name of this package. */ #define PACKAGE_NAME "libxls" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "libxls 1.5.0" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "libxls" /* Define to the home page for this package. */ #define PACKAGE_URL "https://github.com/libxls/libxls" /* Define to the version of this package. */ #define PACKAGE_VERSION "1.5.0" /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Version number of package */ #define VERSION "1.5.0" /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */ /* Define to rpl_malloc if the replacement function should be used. */ /* #undef malloc */ /* Define to rpl_realloc if the replacement function should be used. */ /* #undef realloc */ /* Define to `unsigned int' if does not define. */ /* #undef size_t */ readxl/src/CellLimits.h0000644000176200001440000000445213442224523014540 0ustar liggesusers#ifndef READXL_CELLLIMITS_ #define READXL_CELLLIMITS_ #include #include "XlsCell.h" class CellLimits { int minRow_, maxRow_, minCol_, maxCol_; public: CellLimits() { minRow_ = -1; maxRow_ = -1; minCol_ = -1; maxCol_ = -1; } CellLimits(Rcpp::IntegerVector limits) { minRow_ = limits[0]; maxRow_ = limits[1]; minCol_ = limits[2]; maxCol_ = limits[3]; } int minRow() const { return minRow_; } int maxRow() const { return maxRow_; } int minCol() const { return minCol_; } int maxCol() const { return maxCol_; } void update(const XlsCell cell) { update(cell.row(), cell.col()); } void update(const int row, const int col) { if (minRow_ < 0 || row < minRow_) { minRow_ = row; } if (row > maxRow_) { maxRow_ = row; } if (minCol_ < 0 || col < minCol_) { minCol_ = col; } if (col > maxCol_) { maxCol_ = col; } } void update(const int minRow, const int maxRow, const int minCol, const int maxCol) { minRow_ = minRow; maxRow_ = maxRow; minCol_ = minCol; maxCol_ = maxCol; } bool contains(const XlsCell cell) const { return contains(cell.row(), cell.col()); } bool contains(const int i, const int j) const { return contains(minRow_, maxRow_, i) && contains(minCol_, maxCol_, j); } bool contains(const int i) const { return contains(minRow_, maxRow_, i); } void print() { Rcpp::Rcout << "row min, max: " << minRow_ << ", " << maxRow_ << "\t" << "col min, max: " << minCol_<< ", " << maxCol_ << std::endl; } private: bool contains(int min, int max, int val) const { if (min < 0) { if (max < 0) { // min = max = -1 is our convention for 'no limits specified' return true; } else { // min < 0, max >= 0 should never happen, because cellranger should // always turn (-inf, max] into [0, max], but it's harmless to handle return val <= max; } } else { if (max < 0) { // min >= 0, max < 0 is our convention for [min, +inf) return val >= min; } else { // min >= 0, max >= 0 is the straightforward case: [min, max] return val >= min && val <= max; } } } }; #endif readxl/src/rapidxml.h0000755000176200001440000035305613442224523014331 0ustar liggesusers#ifndef RAPIDXML_HPP_INCLUDED #define RAPIDXML_HPP_INCLUDED // Copyright (C) 2006, 2009 Marcin Kalicinski // Version 1.13 // Revision $DateTime: 2009/05/13 01:46:17 $ //! \file rapidxml.hpp This file contains rapidxml parser and DOM implementation // If standard library is disabled, user must provide implementations of required functions and typedefs #if !defined(RAPIDXML_NO_STDLIB) #include // For std::size_t #include // For assert #include // For placement new #endif // On MSVC, disable "conditional expression is constant" warning (level 4). // This warning is almost impossible to avoid with certain types of templated code #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable:4127) // Conditional expression is constant #endif /////////////////////////////////////////////////////////////////////////// // RAPIDXML_PARSE_ERROR #if defined(RAPIDXML_NO_EXCEPTIONS) #define RAPIDXML_PARSE_ERROR(what, where) { parse_error_handler(what, where); assert(0); } namespace rapidxml { //! When exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, //! this function is called to notify user about the error. //! It must be defined by the user. //!

//! This function cannot return. If it does, the results are undefined. //!

//! A very simple definition might look like that: //!

    //! void %rapidxml::%parse_error_handler(const char *what, void *where)
    //! {
    //!     std::cout << "Parse error: " << what << "\n";
    //!     std::abort();
    //! }
    //! 
//! \param what Human readable description of the error. //! \param where Pointer to character data where error was detected. void parse_error_handler(const char *what, void *where); } #else #include // For std::exception #define RAPIDXML_PARSE_ERROR(what, where) throw parse_error(what, where) namespace rapidxml { //! Parse error exception. //! This exception is thrown by the parser when an error occurs. //! Use what() function to get human-readable error message. //! Use where() function to get a pointer to position within source text where error was detected. //!

//! If throwing exceptions by the parser is undesirable, //! it can be disabled by defining RAPIDXML_NO_EXCEPTIONS macro before rapidxml.hpp is included. //! This will cause the parser to call rapidxml::parse_error_handler() function instead of throwing an exception. //! This function must be defined by the user. //!

//! This class derives from std::exception class. class parse_error: public std::exception { public: //! Constructs parse error parse_error(const char *what, void *where) : m_what(what) , m_where(where) { } //! Gets human readable description of error. //! \return Pointer to null terminated description of the error. virtual const char *what() const throw() { return m_what; } //! Gets pointer to character data where error happened. //! Ch should be the same as char type of xml_document that produced the error. //! \return Pointer to location within the parsed string where error occured. template Ch *where() const { return reinterpret_cast(m_where); } private: const char *m_what; void *m_where; }; } #endif /////////////////////////////////////////////////////////////////////////// // Pool sizes #ifndef RAPIDXML_STATIC_POOL_SIZE // Size of static memory block of memory_pool. // Define RAPIDXML_STATIC_POOL_SIZE before including rapidxml.hpp if you want to override the default value. // No dynamic memory allocations are performed by memory_pool until static memory is exhausted. #define RAPIDXML_STATIC_POOL_SIZE (64 * 1024) #endif #ifndef RAPIDXML_DYNAMIC_POOL_SIZE // Size of dynamic memory block of memory_pool. // Define RAPIDXML_DYNAMIC_POOL_SIZE before including rapidxml.hpp if you want to override the default value. // After the static block is exhausted, dynamic blocks with approximately this size are allocated by memory_pool. #define RAPIDXML_DYNAMIC_POOL_SIZE (64 * 1024) #endif #ifndef RAPIDXML_ALIGNMENT // Memory allocation alignment. // Define RAPIDXML_ALIGNMENT before including rapidxml.hpp if you want to override the default value, which is the size of pointer. // All memory allocations for nodes, attributes and strings will be aligned to this value. // This must be a power of 2 and at least 1, otherwise memory_pool will not work. #define RAPIDXML_ALIGNMENT sizeof(void *) #endif namespace rapidxml { // Forward declarations template class xml_node; template class xml_attribute; template class xml_document; //! Enumeration listing all node types produced by the parser. //! Use xml_node::type() function to query node type. enum node_type { node_document, //!< A document node. Name and value are empty. node_element, //!< An element node. Name contains element name. Value contains text of first data node. node_data, //!< A data node. Name is empty. Value contains data text. node_cdata, //!< A CDATA node. Name is empty. Value contains data text. node_comment, //!< A comment node. Name is empty. Value contains comment text. node_declaration, //!< A declaration node. Name and value are empty. Declaration parameters (version, encoding and standalone) are in node attributes. node_doctype, //!< A DOCTYPE node. Name is empty. Value contains DOCTYPE text. node_pi //!< A PI node. Name contains target. Value contains instructions. }; /////////////////////////////////////////////////////////////////////// // Parsing flags //! Parse flag instructing the parser to not create data nodes. //! Text of first data node will still be placed in value of parent element, unless rapidxml::parse_no_element_values flag is also specified. //! Can be combined with other flags by use of | operator. //!

//! See xml_document::parse() function. const int parse_no_data_nodes = 0x1; //! Parse flag instructing the parser to not use text of first data node as a value of parent element. //! Can be combined with other flags by use of | operator. //! Note that child data nodes of element node take precendence over its value when printing. //! That is, if element has one or more child data nodes and a value, the value will be ignored. //! Use rapidxml::parse_no_data_nodes flag to prevent creation of data nodes if you want to manipulate data using values of elements. //!

//! See xml_document::parse() function. const int parse_no_element_values = 0x2; //! Parse flag instructing the parser to not place zero terminators after strings in the source text. //! By default zero terminators are placed, modifying source text. //! Can be combined with other flags by use of | operator. //!

//! See xml_document::parse() function. const int parse_no_string_terminators = 0x4; //! Parse flag instructing the parser to not translate entities in the source text. //! By default entities are translated, modifying source text. //! Can be combined with other flags by use of | operator. //!

//! See xml_document::parse() function. const int parse_no_entity_translation = 0x8; //! Parse flag instructing the parser to disable UTF-8 handling and assume plain 8 bit characters. //! By default, UTF-8 handling is enabled. //! Can be combined with other flags by use of | operator. //!

//! See xml_document::parse() function. const int parse_no_utf8 = 0x10; //! Parse flag instructing the parser to create XML declaration node. //! By default, declaration node is not created. //! Can be combined with other flags by use of | operator. //!

//! See xml_document::parse() function. const int parse_declaration_node = 0x20; //! Parse flag instructing the parser to create comments nodes. //! By default, comment nodes are not created. //! Can be combined with other flags by use of | operator. //!

//! See xml_document::parse() function. const int parse_comment_nodes = 0x40; //! Parse flag instructing the parser to create DOCTYPE node. //! By default, doctype node is not created. //! Although W3C specification allows at most one DOCTYPE node, RapidXml will silently accept documents with more than one. //! Can be combined with other flags by use of | operator. //!

//! See xml_document::parse() function. const int parse_doctype_node = 0x80; //! Parse flag instructing the parser to create PI nodes. //! By default, PI nodes are not created. //! Can be combined with other flags by use of | operator. //!

//! See xml_document::parse() function. const int parse_pi_nodes = 0x100; //! Parse flag instructing the parser to validate closing tag names. //! If not set, name inside closing tag is irrelevant to the parser. //! By default, closing tags are not validated. //! Can be combined with other flags by use of | operator. //!

//! See xml_document::parse() function. const int parse_validate_closing_tags = 0x200; //! Parse flag instructing the parser to trim all leading and trailing whitespace of data nodes. //! By default, whitespace is not trimmed. //! This flag does not cause the parser to modify source text. //! Can be combined with other flags by use of | operator. //!

//! See xml_document::parse() function. const int parse_trim_whitespace = 0x400; //! Parse flag instructing the parser to condense all whitespace runs of data nodes to a single space character. //! Trimming of leading and trailing whitespace of data is controlled by rapidxml::parse_trim_whitespace flag. //! By default, whitespace is not normalized. //! If this flag is specified, source text will be modified. //! Can be combined with other flags by use of | operator. //!

//! See xml_document::parse() function. const int parse_normalize_whitespace = 0x800; // part of the readxl namespace-prefix-stripping patch //! Parse flag instructing the parser to strip any XML namespace identifiers from element names and attributes. //! Turning this flag on will remove the namespace prefix and colon from all tags and attributes. //! By default, XML namespace identifiers are left as part of the names of tags and attributes. //! This flag does not cause the parser to modify source text. //! Can be combined with other flags by use of | operator. //!

//! See xml_document::parse() function. const int parse_strip_xml_namespaces = 0x1000; // Compound flags //! Parse flags which represent default behaviour of the parser. //! This is always equal to 0, so that all other flags can be simply ored together. //! Normally there is no need to inconveniently disable flags by anding with their negated (~) values. //! This also means that meaning of each flag is a negation of the default setting. //! For example, if flag name is rapidxml::parse_no_utf8, it means that utf-8 is enabled by default, //! and using the flag will disable it. //!

//! See xml_document::parse() function. const int parse_default = 0; //! A combination of parse flags that forbids any modifications of the source text. //! This also results in faster parsing. However, note that the following will occur: //!
    //!
  • names and values of nodes will not be zero terminated, you have to use xml_base::name_size() and xml_base::value_size() functions to determine where name and value ends
  • //!
  • entities will not be translated
  • //!
  • whitespace will not be normalized
  • //!
//! See xml_document::parse() function. const int parse_non_destructive = parse_no_string_terminators | parse_no_entity_translation; //! A combination of parse flags resulting in fastest possible parsing, without sacrificing important data. //!

//! See xml_document::parse() function. const int parse_fastest = parse_non_destructive | parse_no_data_nodes; //! A combination of parse flags resulting in largest amount of data being extracted. //! This usually results in slowest parsing. //!

//! See xml_document::parse() function. const int parse_full = parse_declaration_node | parse_comment_nodes | parse_doctype_node | parse_pi_nodes | parse_validate_closing_tags; /////////////////////////////////////////////////////////////////////// // Internals //! \cond internal namespace internal { // Struct that contains lookup tables for the parser // It must be a template to allow correct linking (because it has static data members, which are defined in a header file). template struct lookup_tables { static const unsigned char lookup_whitespace[256]; // Whitespace table static const unsigned char lookup_node_name[256]; // Node name table static const unsigned char lookup_text[256]; // Text table static const unsigned char lookup_text_pure_no_ws[256]; // Text table static const unsigned char lookup_text_pure_with_ws[256]; // Text table static const unsigned char lookup_attribute_name[256]; // Attribute name table static const unsigned char lookup_attribute_data_1[256]; // Attribute data table with single quote static const unsigned char lookup_attribute_data_1_pure[256]; // Attribute data table with single quote static const unsigned char lookup_attribute_data_2[256]; // Attribute data table with double quotes static const unsigned char lookup_attribute_data_2_pure[256]; // Attribute data table with double quotes static const unsigned char lookup_digits[256]; // Digits static const unsigned char lookup_upcase[256]; // To uppercase conversion table for ASCII characters }; // Find length of the string template inline std::size_t measure(const Ch *p) { const Ch *tmp = p; while (*tmp) ++tmp; return tmp - p; } // Compare strings for equality template inline bool compare(const Ch *p1, std::size_t size1, const Ch *p2, std::size_t size2, bool case_sensitive) { if (size1 != size2) return false; if (case_sensitive) { for (const Ch *end = p1 + size1; p1 < end; ++p1, ++p2) if (*p1 != *p2) return false; } else { for (const Ch *end = p1 + size1; p1 < end; ++p1, ++p2) if (lookup_tables<0>::lookup_upcase[static_cast(*p1)] != lookup_tables<0>::lookup_upcase[static_cast(*p2)]) return false; } return true; } } //! \endcond /////////////////////////////////////////////////////////////////////// // Memory pool //! This class is used by the parser to create new nodes and attributes, without overheads of dynamic memory allocation. //! In most cases, you will not need to use this class directly. //! However, if you need to create nodes manually or modify names/values of nodes, //! you are encouraged to use memory_pool of relevant xml_document to allocate the memory. //! Not only is this faster than allocating them by using new operator, //! but also their lifetime will be tied to the lifetime of document, //! possibly simplyfing memory management. //!

//! Call allocate_node() or allocate_attribute() functions to obtain new nodes or attributes from the pool. //! You can also call allocate_string() function to allocate strings. //! Such strings can then be used as names or values of nodes without worrying about their lifetime. //! Note that there is no free() function -- all allocations are freed at once when clear() function is called, //! or when the pool is destroyed. //!

//! It is also possible to create a standalone memory_pool, and use it //! to allocate nodes, whose lifetime will not be tied to any document. //!

//! Pool maintains RAPIDXML_STATIC_POOL_SIZE bytes of statically allocated memory. //! Until static memory is exhausted, no dynamic memory allocations are done. //! When static memory is exhausted, pool allocates additional blocks of memory of size RAPIDXML_DYNAMIC_POOL_SIZE each, //! by using global new[] and delete[] operators. //! This behaviour can be changed by setting custom allocation routines. //! Use set_allocator() function to set them. //!

//! Allocations for nodes, attributes and strings are aligned at RAPIDXML_ALIGNMENT bytes. //! This value defaults to the size of pointer on target architecture. //!

//! To obtain absolutely top performance from the parser, //! it is important that all nodes are allocated from a single, contiguous block of memory. //! Otherwise, cache misses when jumping between two (or more) disjoint blocks of memory can slow down parsing quite considerably. //! If required, you can tweak RAPIDXML_STATIC_POOL_SIZE, RAPIDXML_DYNAMIC_POOL_SIZE and RAPIDXML_ALIGNMENT //! to obtain best wasted memory to performance compromise. //! To do it, define their values before rapidxml.hpp file is included. //! \param Ch Character type of created nodes. template class memory_pool { public: //! \cond internal typedef void *(alloc_func)(std::size_t); // Type of user-defined function used to allocate memory typedef void (free_func)(void *); // Type of user-defined function used to free memory //! \endcond //! Constructs empty pool with default allocator functions. memory_pool() : m_alloc_func(0) , m_free_func(0) { init(); } //! Destroys pool and frees all the memory. //! This causes memory occupied by nodes allocated by the pool to be freed. //! Nodes allocated from the pool are no longer valid. ~memory_pool() { clear(); } //! Allocates a new node from the pool, and optionally assigns name and value to it. //! If the allocation request cannot be accomodated, this function will throw std::bad_alloc. //! If exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, this function //! will call rapidxml::parse_error_handler() function. //! \param type Type of node to create. //! \param name Name to assign to the node, or 0 to assign no name. //! \param value Value to assign to the node, or 0 to assign no value. //! \param name_size Size of name to assign, or 0 to automatically calculate size from name string. //! \param value_size Size of value to assign, or 0 to automatically calculate size from value string. //! \return Pointer to allocated node. This pointer will never be NULL. xml_node *allocate_node(node_type type, const Ch *name = 0, const Ch *value = 0, std::size_t name_size = 0, std::size_t value_size = 0) { void *memory = allocate_aligned(sizeof(xml_node)); xml_node *node = new(memory) xml_node(type); if (name) { if (name_size > 0) node->name(name, name_size); else node->name(name); } if (value) { if (value_size > 0) node->value(value, value_size); else node->value(value); } return node; } //! Allocates a new attribute from the pool, and optionally assigns name and value to it. //! If the allocation request cannot be accomodated, this function will throw std::bad_alloc. //! If exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, this function //! will call rapidxml::parse_error_handler() function. //! \param name Name to assign to the attribute, or 0 to assign no name. //! \param value Value to assign to the attribute, or 0 to assign no value. //! \param name_size Size of name to assign, or 0 to automatically calculate size from name string. //! \param value_size Size of value to assign, or 0 to automatically calculate size from value string. //! \return Pointer to allocated attribute. This pointer will never be NULL. xml_attribute *allocate_attribute(const Ch *name = 0, const Ch *value = 0, std::size_t name_size = 0, std::size_t value_size = 0) { void *memory = allocate_aligned(sizeof(xml_attribute)); xml_attribute *attribute = new(memory) xml_attribute; if (name) { if (name_size > 0) attribute->name(name, name_size); else attribute->name(name); } if (value) { if (value_size > 0) attribute->value(value, value_size); else attribute->value(value); } return attribute; } //! Allocates a char array of given size from the pool, and optionally copies a given string to it. //! If the allocation request cannot be accomodated, this function will throw std::bad_alloc. //! If exceptions are disabled by defining RAPIDXML_NO_EXCEPTIONS, this function //! will call rapidxml::parse_error_handler() function. //! \param source String to initialize the allocated memory with, or 0 to not initialize it. //! \param size Number of characters to allocate, or zero to calculate it automatically from source string length; if size is 0, source string must be specified and null terminated. //! \return Pointer to allocated char array. This pointer will never be NULL. Ch *allocate_string(const Ch *source = 0, std::size_t size = 0) { assert(source || size); // Either source or size (or both) must be specified if (size == 0) size = internal::measure(source) + 1; Ch *result = static_cast(allocate_aligned(size * sizeof(Ch))); if (source) for (std::size_t i = 0; i < size; ++i) result[i] = source[i]; return result; } //! Clones an xml_node and its hierarchy of child nodes and attributes. //! Nodes and attributes are allocated from this memory pool. //! Names and values are not cloned, they are shared between the clone and the source. //! Result node can be optionally specified as a second parameter, //! in which case its contents will be replaced with cloned source node. //! This is useful when you want to clone entire document. //! \param source Node to clone. //! \param result Node to put results in, or 0 to automatically allocate result node //! \return Pointer to cloned node. This pointer will never be NULL. xml_node *clone_node(const xml_node *source, xml_node *result = 0) { // Prepare result node if (result) { result->remove_all_attributes(); result->remove_all_nodes(); result->type(source->type()); } else result = allocate_node(source->type()); // Clone name and value result->name(source->name(), source->name_size()); result->value(source->value(), source->value_size()); // Clone child nodes and attributes for (xml_node *child = source->first_node(); child; child = child->next_sibling()) result->append_node(clone_node(child)); for (xml_attribute *attr = source->first_attribute(); attr; attr = attr->next_attribute()) result->append_attribute(allocate_attribute(attr->name(), attr->value(), attr->name_size(), attr->value_size())); return result; } //! Clears the pool. //! This causes memory occupied by nodes allocated by the pool to be freed. //! Any nodes or strings allocated from the pool will no longer be valid. void clear() { while (m_begin != m_static_memory) { char *previous_begin = reinterpret_cast
(align(m_begin))->previous_begin; if (m_free_func) m_free_func(m_begin); else delete[] m_begin; m_begin = previous_begin; } init(); } //! Sets or resets the user-defined memory allocation functions for the pool. //! This can only be called when no memory is allocated from the pool yet, otherwise results are undefined. //! Allocation function must not return invalid pointer on failure. It should either throw, //! stop the program, or use longjmp() function to pass control to other place of program. //! If it returns invalid pointer, results are undefined. //!

//! User defined allocation functions must have the following forms: //!
//!
void *allocate(std::size_t size); //!
void free(void *pointer); //!

//! \param af Allocation function, or 0 to restore default function //! \param ff Free function, or 0 to restore default function void set_allocator(alloc_func *af, free_func *ff) { assert(m_begin == m_static_memory && m_ptr == align(m_begin)); // Verify that no memory is allocated yet m_alloc_func = af; m_free_func = ff; } private: struct header { char *previous_begin; }; void init() { m_begin = m_static_memory; m_ptr = align(m_begin); m_end = m_static_memory + sizeof(m_static_memory); } char *align(char *ptr) { std::size_t alignment = ((RAPIDXML_ALIGNMENT - (std::size_t(ptr) & (RAPIDXML_ALIGNMENT - 1))) & (RAPIDXML_ALIGNMENT - 1)); return ptr + alignment; } char *allocate_raw(std::size_t size) { // Allocate void *memory; if (m_alloc_func) // Allocate memory using either user-specified allocation function or global operator new[] { memory = m_alloc_func(size); assert(memory); // Allocator is not allowed to return 0, on failure it must either throw, stop the program or use longjmp } else { memory = new char[size]; #ifdef RAPIDXML_NO_EXCEPTIONS if (!memory) // If exceptions are disabled, verify memory allocation, because new will not be able to throw bad_alloc RAPIDXML_PARSE_ERROR("out of memory", 0); #endif } return static_cast(memory); } void *allocate_aligned(std::size_t size) { // Calculate aligned pointer char *result = align(m_ptr); // If not enough memory left in current pool, allocate a new pool if (result + size > m_end) { // Calculate required pool size (may be bigger than RAPIDXML_DYNAMIC_POOL_SIZE) std::size_t pool_size = RAPIDXML_DYNAMIC_POOL_SIZE; if (pool_size < size) pool_size = size; // Allocate std::size_t alloc_size = sizeof(header) + (2 * RAPIDXML_ALIGNMENT - 2) + pool_size; // 2 alignments required in worst case: one for header, one for actual allocation char *raw_memory = allocate_raw(alloc_size); // Setup new pool in allocated memory char *pool = align(raw_memory); header *new_header = reinterpret_cast
(pool); new_header->previous_begin = m_begin; m_begin = raw_memory; m_ptr = pool + sizeof(header); m_end = raw_memory + alloc_size; // Calculate aligned pointer again using new pool result = align(m_ptr); } // Update pool and return aligned pointer m_ptr = result + size; return result; } char *m_begin; // Start of raw memory making up current pool char *m_ptr; // First free byte in current pool char *m_end; // One past last available byte in current pool char m_static_memory[RAPIDXML_STATIC_POOL_SIZE]; // Static raw memory alloc_func *m_alloc_func; // Allocator function, or 0 if default is to be used free_func *m_free_func; // Free function, or 0 if default is to be used }; /////////////////////////////////////////////////////////////////////////// // XML base //! Base class for xml_node and xml_attribute implementing common functions: //! name(), name_size(), value(), value_size() and parent(). //! \param Ch Character type to use template class xml_base { public: /////////////////////////////////////////////////////////////////////////// // Construction & destruction // Construct a base with empty name, value and parent xml_base() : m_name(0) , m_value(0) , m_parent(0) { } /////////////////////////////////////////////////////////////////////////// // Node data access //! Gets name of the node. //! Interpretation of name depends on type of node. //! Note that name will not be zero-terminated if rapidxml::parse_no_string_terminators option was selected during parse. //!

//! Use name_size() function to determine length of the name. //! \return Name of node, or empty string if node has no name. Ch *name() const { return m_name ? m_name : nullstr(); } //! Gets size of node name, not including terminator character. //! This function works correctly irrespective of whether name is or is not zero terminated. //! \return Size of node name, in characters. std::size_t name_size() const { return m_name ? m_name_size : 0; } //! Gets value of node. //! Interpretation of value depends on type of node. //! Note that value will not be zero-terminated if rapidxml::parse_no_string_terminators option was selected during parse. //!

//! Use value_size() function to determine length of the value. //! \return Value of node, or empty string if node has no value. Ch *value() const { return m_value ? m_value : nullstr(); } //! Gets size of node value, not including terminator character. //! This function works correctly irrespective of whether value is or is not zero terminated. //! \return Size of node value, in characters. std::size_t value_size() const { return m_value ? m_value_size : 0; } /////////////////////////////////////////////////////////////////////////// // Node modification //! Sets name of node to a non zero-terminated string. //! See \ref ownership_of_strings. //!

//! Note that node does not own its name or value, it only stores a pointer to it. //! It will not delete or otherwise free the pointer on destruction. //! It is reponsibility of the user to properly manage lifetime of the string. //! The easiest way to achieve it is to use memory_pool of the document to allocate the string - //! on destruction of the document the string will be automatically freed. //!

//! Size of name must be specified separately, because name does not have to be zero terminated. //! Use name(const Ch *) function to have the length automatically calculated (string must be zero terminated). //! \param name Name of node to set. Does not have to be zero terminated. //! \param size Size of name, in characters. This does not include zero terminator, if one is present. void name(const Ch *name, std::size_t size) { m_name = const_cast(name); m_name_size = size; } //! Sets name of node to a zero-terminated string. //! See also \ref ownership_of_strings and xml_node::name(const Ch *, std::size_t). //! \param name Name of node to set. Must be zero terminated. void name(const Ch *name) { this->name(name, internal::measure(name)); } //! Sets value of node to a non zero-terminated string. //! See \ref ownership_of_strings. //!

//! Note that node does not own its name or value, it only stores a pointer to it. //! It will not delete or otherwise free the pointer on destruction. //! It is reponsibility of the user to properly manage lifetime of the string. //! The easiest way to achieve it is to use memory_pool of the document to allocate the string - //! on destruction of the document the string will be automatically freed. //!

//! Size of value must be specified separately, because it does not have to be zero terminated. //! Use value(const Ch *) function to have the length automatically calculated (string must be zero terminated). //!

//! If an element has a child node of type node_data, it will take precedence over element value when printing. //! If you want to manipulate data of elements using values, use parser flag rapidxml::parse_no_data_nodes to prevent creation of data nodes by the parser. //! \param value value of node to set. Does not have to be zero terminated. //! \param size Size of value, in characters. This does not include zero terminator, if one is present. void value(const Ch *value, std::size_t size) { m_value = const_cast(value); m_value_size = size; } //! Sets value of node to a zero-terminated string. //! See also \ref ownership_of_strings and xml_node::value(const Ch *, std::size_t). //! \param value Vame of node to set. Must be zero terminated. void value(const Ch *value) { this->value(value, internal::measure(value)); } /////////////////////////////////////////////////////////////////////////// // Related nodes access //! Gets node parent. //! \return Pointer to parent node, or 0 if there is no parent. xml_node *parent() const { return m_parent; } protected: // Return empty string static Ch *nullstr() { static Ch zero = Ch('\0'); return &zero; } Ch *m_name; // Name of node, or 0 if no name Ch *m_value; // Value of node, or 0 if no value std::size_t m_name_size; // Length of node name, or undefined of no name std::size_t m_value_size; // Length of node value, or undefined if no value xml_node *m_parent; // Pointer to parent node, or 0 if none }; //! Class representing attribute node of XML document. //! Each attribute has name and value strings, which are available through name() and value() functions (inherited from xml_base). //! Note that after parse, both name and value of attribute will point to interior of source text used for parsing. //! Thus, this text must persist in memory for the lifetime of attribute. //! \param Ch Character type to use. template class xml_attribute: public xml_base { friend class xml_node; public: /////////////////////////////////////////////////////////////////////////// // Construction & destruction //! Constructs an empty attribute with the specified type. //! Consider using memory_pool of appropriate xml_document if allocating attributes manually. xml_attribute() { } /////////////////////////////////////////////////////////////////////////// // Related nodes access //! Gets document of which attribute is a child. //! \return Pointer to document that contains this attribute, or 0 if there is no parent document. xml_document *document() const { if (xml_node *node = this->parent()) { while (node->parent()) node = node->parent(); return node->type() == node_document ? static_cast *>(node) : 0; } else return 0; } //! Gets previous attribute, optionally matching attribute name. //! \param name Name of attribute to find, or 0 to return previous attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters //! \return Pointer to found attribute, or 0 if not found. xml_attribute *previous_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const { if (name) { if (name_size == 0) name_size = internal::measure(name); for (xml_attribute *attribute = m_prev_attribute; attribute; attribute = attribute->m_prev_attribute) if (internal::compare(attribute->name(), attribute->name_size(), name, name_size, case_sensitive)) return attribute; return 0; } else return this->m_parent ? m_prev_attribute : 0; } //! Gets next attribute, optionally matching attribute name. //! \param name Name of attribute to find, or 0 to return next attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters //! \return Pointer to found attribute, or 0 if not found. xml_attribute *next_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const { if (name) { if (name_size == 0) name_size = internal::measure(name); for (xml_attribute *attribute = m_next_attribute; attribute; attribute = attribute->m_next_attribute) if (internal::compare(attribute->name(), attribute->name_size(), name, name_size, case_sensitive)) return attribute; return 0; } else return this->m_parent ? m_next_attribute : 0; } private: xml_attribute *m_prev_attribute; // Pointer to previous sibling of attribute, or 0 if none; only valid if parent is non-zero xml_attribute *m_next_attribute; // Pointer to next sibling of attribute, or 0 if none; only valid if parent is non-zero }; /////////////////////////////////////////////////////////////////////////// // XML node //! Class representing a node of XML document. //! Each node may have associated name and value strings, which are available through name() and value() functions. //! Interpretation of name and value depends on type of the node. //! Type of node can be determined by using type() function. //!

//! Note that after parse, both name and value of node, if any, will point interior of source text used for parsing. //! Thus, this text must persist in the memory for the lifetime of node. //! \param Ch Character type to use. template class xml_node: public xml_base { public: /////////////////////////////////////////////////////////////////////////// // Construction & destruction //! Constructs an empty node with the specified type. //! Consider using memory_pool of appropriate document to allocate nodes manually. //! \param type Type of node to construct. xml_node(node_type type) : m_type(type) , m_first_node(0) , m_first_attribute(0) { } /////////////////////////////////////////////////////////////////////////// // Node data access //! Gets type of node. //! \return Type of node. node_type type() const { return m_type; } /////////////////////////////////////////////////////////////////////////// // Related nodes access //! Gets document of which node is a child. //! \return Pointer to document that contains this node, or 0 if there is no parent document. xml_document *document() const { xml_node *node = const_cast *>(this); while (node->parent()) node = node->parent(); return node->type() == node_document ? static_cast *>(node) : 0; } //! Gets first child node, optionally matching node name. //! \param name Name of child to find, or 0 to return first child regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters //! \return Pointer to found child, or 0 if not found. xml_node *first_node(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const { if (name) { if (name_size == 0) name_size = internal::measure(name); for (xml_node *child = m_first_node; child; child = child->next_sibling()) if (internal::compare(child->name(), child->name_size(), name, name_size, case_sensitive)) return child; return 0; } else return m_first_node; } //! Gets last child node, optionally matching node name. //! Behaviour is undefined if node has no children. //! Use first_node() to test if node has children. //! \param name Name of child to find, or 0 to return last child regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters //! \return Pointer to found child, or 0 if not found. xml_node *last_node(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const { assert(m_first_node); // Cannot query for last child if node has no children if (name) { if (name_size == 0) name_size = internal::measure(name); for (xml_node *child = m_last_node; child; child = child->previous_sibling()) if (internal::compare(child->name(), child->name_size(), name, name_size, case_sensitive)) return child; return 0; } else return m_last_node; } //! Gets previous sibling node, optionally matching node name. //! Behaviour is undefined if node has no parent. //! Use parent() to test if node has a parent. //! \param name Name of sibling to find, or 0 to return previous sibling regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters //! \return Pointer to found sibling, or 0 if not found. xml_node *previous_sibling(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const { assert(this->m_parent); // Cannot query for siblings if node has no parent if (name) { if (name_size == 0) name_size = internal::measure(name); for (xml_node *sibling = m_prev_sibling; sibling; sibling = sibling->m_prev_sibling) if (internal::compare(sibling->name(), sibling->name_size(), name, name_size, case_sensitive)) return sibling; return 0; } else return m_prev_sibling; } //! Gets next sibling node, optionally matching node name. //! Behaviour is undefined if node has no parent. //! Use parent() to test if node has a parent. //! \param name Name of sibling to find, or 0 to return next sibling regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters //! \return Pointer to found sibling, or 0 if not found. xml_node *next_sibling(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const { assert(this->m_parent); // Cannot query for siblings if node has no parent if (name) { if (name_size == 0) name_size = internal::measure(name); for (xml_node *sibling = m_next_sibling; sibling; sibling = sibling->m_next_sibling) if (internal::compare(sibling->name(), sibling->name_size(), name, name_size, case_sensitive)) return sibling; return 0; } else return m_next_sibling; } //! Gets first attribute of node, optionally matching attribute name. //! \param name Name of attribute to find, or 0 to return first attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters //! \return Pointer to found attribute, or 0 if not found. xml_attribute *first_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const { if (name) { if (name_size == 0) name_size = internal::measure(name); for (xml_attribute *attribute = m_first_attribute; attribute; attribute = attribute->m_next_attribute) if (internal::compare(attribute->name(), attribute->name_size(), name, name_size, case_sensitive)) return attribute; return 0; } else return m_first_attribute; } //! Gets last attribute of node, optionally matching attribute name. //! \param name Name of attribute to find, or 0 to return last attribute regardless of its name; this string doesn't have to be zero-terminated if name_size is non-zero //! \param name_size Size of name, in characters, or 0 to have size calculated automatically from string //! \param case_sensitive Should name comparison be case-sensitive; non case-sensitive comparison works properly only for ASCII characters //! \return Pointer to found attribute, or 0 if not found. xml_attribute *last_attribute(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const { if (name) { if (name_size == 0) name_size = internal::measure(name); for (xml_attribute *attribute = m_last_attribute; attribute; attribute = attribute->m_prev_attribute) if (internal::compare(attribute->name(), attribute->name_size(), name, name_size, case_sensitive)) return attribute; return 0; } else return m_first_attribute ? m_last_attribute : 0; } /////////////////////////////////////////////////////////////////////////// // Node modification //! Sets type of node. //! \param type Type of node to set. void type(node_type type) { m_type = type; } /////////////////////////////////////////////////////////////////////////// // Node manipulation //! Prepends a new child node. //! The prepended child becomes the first child, and all existing children are moved one position back. //! \param child Node to prepend. void prepend_node(xml_node *child) { assert(child && !child->parent() && child->type() != node_document); if (first_node()) { child->m_next_sibling = m_first_node; m_first_node->m_prev_sibling = child; } else { child->m_next_sibling = 0; m_last_node = child; } m_first_node = child; child->m_parent = this; child->m_prev_sibling = 0; } //! Appends a new child node. //! The appended child becomes the last child. //! \param child Node to append. void append_node(xml_node *child) { assert(child && !child->parent() && child->type() != node_document); if (first_node()) { child->m_prev_sibling = m_last_node; m_last_node->m_next_sibling = child; } else { child->m_prev_sibling = 0; m_first_node = child; } m_last_node = child; child->m_parent = this; child->m_next_sibling = 0; } //! Inserts a new child node at specified place inside the node. //! All children after and including the specified node are moved one position back. //! \param where Place where to insert the child, or 0 to insert at the back. //! \param child Node to insert. void insert_node(xml_node *where, xml_node *child) { assert(!where || where->parent() == this); assert(child && !child->parent() && child->type() != node_document); if (where == m_first_node) prepend_node(child); else if (where == 0) append_node(child); else { child->m_prev_sibling = where->m_prev_sibling; child->m_next_sibling = where; where->m_prev_sibling->m_next_sibling = child; where->m_prev_sibling = child; child->m_parent = this; } } //! Removes first child node. //! If node has no children, behaviour is undefined. //! Use first_node() to test if node has children. void remove_first_node() { assert(first_node()); xml_node *child = m_first_node; m_first_node = child->m_next_sibling; if (child->m_next_sibling) child->m_next_sibling->m_prev_sibling = 0; else m_last_node = 0; child->m_parent = 0; } //! Removes last child of the node. //! If node has no children, behaviour is undefined. //! Use first_node() to test if node has children. void remove_last_node() { assert(first_node()); xml_node *child = m_last_node; if (child->m_prev_sibling) { m_last_node = child->m_prev_sibling; child->m_prev_sibling->m_next_sibling = 0; } else m_first_node = 0; child->m_parent = 0; } //! Removes specified child from the node // \param where Pointer to child to be removed. void remove_node(xml_node *where) { assert(where && where->parent() == this); assert(first_node()); if (where == m_first_node) remove_first_node(); else if (where == m_last_node) remove_last_node(); else { where->m_prev_sibling->m_next_sibling = where->m_next_sibling; where->m_next_sibling->m_prev_sibling = where->m_prev_sibling; where->m_parent = 0; } } //! Removes all child nodes (but not attributes). void remove_all_nodes() { for (xml_node *node = first_node(); node; node = node->m_next_sibling) node->m_parent = 0; m_first_node = 0; } //! Prepends a new attribute to the node. //! \param attribute Attribute to prepend. void prepend_attribute(xml_attribute *attribute) { assert(attribute && !attribute->parent()); if (first_attribute()) { attribute->m_next_attribute = m_first_attribute; m_first_attribute->m_prev_attribute = attribute; } else { attribute->m_next_attribute = 0; m_last_attribute = attribute; } m_first_attribute = attribute; attribute->m_parent = this; attribute->m_prev_attribute = 0; } //! Appends a new attribute to the node. //! \param attribute Attribute to append. void append_attribute(xml_attribute *attribute) { assert(attribute && !attribute->parent()); if (first_attribute()) { attribute->m_prev_attribute = m_last_attribute; m_last_attribute->m_next_attribute = attribute; } else { attribute->m_prev_attribute = 0; m_first_attribute = attribute; } m_last_attribute = attribute; attribute->m_parent = this; attribute->m_next_attribute = 0; } //! Inserts a new attribute at specified place inside the node. //! All attributes after and including the specified attribute are moved one position back. //! \param where Place where to insert the attribute, or 0 to insert at the back. //! \param attribute Attribute to insert. void insert_attribute(xml_attribute *where, xml_attribute *attribute) { assert(!where || where->parent() == this); assert(attribute && !attribute->parent()); if (where == m_first_attribute) prepend_attribute(attribute); else if (where == 0) append_attribute(attribute); else { attribute->m_prev_attribute = where->m_prev_attribute; attribute->m_next_attribute = where; where->m_prev_attribute->m_next_attribute = attribute; where->m_prev_attribute = attribute; attribute->m_parent = this; } } //! Removes first attribute of the node. //! If node has no attributes, behaviour is undefined. //! Use first_attribute() to test if node has attributes. void remove_first_attribute() { assert(first_attribute()); xml_attribute *attribute = m_first_attribute; if (attribute->m_next_attribute) { attribute->m_next_attribute->m_prev_attribute = 0; } else m_last_attribute = 0; attribute->m_parent = 0; m_first_attribute = attribute->m_next_attribute; } //! Removes last attribute of the node. //! If node has no attributes, behaviour is undefined. //! Use first_attribute() to test if node has attributes. void remove_last_attribute() { assert(first_attribute()); xml_attribute *attribute = m_last_attribute; if (attribute->m_prev_attribute) { attribute->m_prev_attribute->m_next_attribute = 0; m_last_attribute = attribute->m_prev_attribute; } else m_first_attribute = 0; attribute->m_parent = 0; } //! Removes specified attribute from node. //! \param where Pointer to attribute to be removed. void remove_attribute(xml_attribute *where) { assert(first_attribute() && where->parent() == this); if (where == m_first_attribute) remove_first_attribute(); else if (where == m_last_attribute) remove_last_attribute(); else { where->m_prev_attribute->m_next_attribute = where->m_next_attribute; where->m_next_attribute->m_prev_attribute = where->m_prev_attribute; where->m_parent = 0; } } //! Removes all attributes of node. void remove_all_attributes() { for (xml_attribute *attribute = first_attribute(); attribute; attribute = attribute->m_next_attribute) attribute->m_parent = 0; m_first_attribute = 0; } private: /////////////////////////////////////////////////////////////////////////// // Restrictions // No copying xml_node(const xml_node &); void operator =(const xml_node &); /////////////////////////////////////////////////////////////////////////// // Data members // Note that some of the pointers below have UNDEFINED values if certain other pointers are 0. // This is required for maximum performance, as it allows the parser to omit initialization of // unneded/redundant values. // // The rules are as follows: // 1. first_node and first_attribute contain valid pointers, or 0 if node has no children/attributes respectively // 2. last_node and last_attribute are valid only if node has at least one child/attribute respectively, otherwise they contain garbage // 3. prev_sibling and next_sibling are valid only if node has a parent, otherwise they contain garbage node_type m_type; // Type of node; always valid xml_node *m_first_node; // Pointer to first child node, or 0 if none; always valid xml_node *m_last_node; // Pointer to last child node, or 0 if none; this value is only valid if m_first_node is non-zero xml_attribute *m_first_attribute; // Pointer to first attribute of node, or 0 if none; always valid xml_attribute *m_last_attribute; // Pointer to last attribute of node, or 0 if none; this value is only valid if m_first_attribute is non-zero xml_node *m_prev_sibling; // Pointer to previous sibling of node, or 0 if none; this value is only valid if m_parent is non-zero xml_node *m_next_sibling; // Pointer to next sibling of node, or 0 if none; this value is only valid if m_parent is non-zero }; /////////////////////////////////////////////////////////////////////////// // XML document //! This class represents root of the DOM hierarchy. //! It is also an xml_node and a memory_pool through public inheritance. //! Use parse() function to build a DOM tree from a zero-terminated XML text string. //! parse() function allocates memory for nodes and attributes by using functions of xml_document, //! which are inherited from memory_pool. //! To access root node of the document, use the document itself, as if it was an xml_node. //! \param Ch Character type to use. template class xml_document: public xml_node, public memory_pool { public: //! Constructs empty XML document xml_document() : xml_node(node_document) { } //! Parses zero-terminated XML string according to given flags. //! Passed string will be modified by the parser, unless rapidxml::parse_non_destructive flag is used. //! The string must persist for the lifetime of the document. //! In case of error, rapidxml::parse_error exception will be thrown. //!

//! If you want to parse contents of a file, you must first load the file into the memory, and pass pointer to its beginning. //! Make sure that data is zero-terminated. //!

//! Document can be parsed into multiple times. //! Each new call to parse removes previous nodes and attributes (if any), but does not clear memory pool. //! \param text XML data to parse; pointer is non-const to denote fact that this data may be modified by the parser. template void parse(Ch *text) { assert(text); // Remove current contents this->remove_all_nodes(); this->remove_all_attributes(); // Parse BOM, if any parse_bom(text); // Parse children while (1) { // Skip whitespace before node skip(text); if (*text == 0) break; // Parse and append new child if (*text == Ch('<')) { ++text; // Skip '<' if (xml_node *node = parse_node(text)) this->append_node(node); } else RAPIDXML_PARSE_ERROR("expected <", text); } } //! Clears the document by deleting all nodes and clearing the memory pool. //! All nodes owned by document pool are destroyed. void clear() { this->remove_all_nodes(); this->remove_all_attributes(); memory_pool::clear(); } private: /////////////////////////////////////////////////////////////////////// // Internal character utility functions // Detect whitespace character struct whitespace_pred { static unsigned char test(Ch ch) { return internal::lookup_tables<0>::lookup_whitespace[static_cast(ch)]; } }; // Detect node name character struct node_name_pred { static unsigned char test(Ch ch) { return internal::lookup_tables<0>::lookup_node_name[static_cast(ch)]; } }; // Detect attribute name character struct attribute_name_pred { static unsigned char test(Ch ch) { return internal::lookup_tables<0>::lookup_attribute_name[static_cast(ch)]; } }; // Detect text character (PCDATA) struct text_pred { static unsigned char test(Ch ch) { return internal::lookup_tables<0>::lookup_text[static_cast(ch)]; } }; // Detect text character (PCDATA) that does not require processing struct text_pure_no_ws_pred { static unsigned char test(Ch ch) { return internal::lookup_tables<0>::lookup_text_pure_no_ws[static_cast(ch)]; } }; // Detect text character (PCDATA) that does not require processing struct text_pure_with_ws_pred { static unsigned char test(Ch ch) { return internal::lookup_tables<0>::lookup_text_pure_with_ws[static_cast(ch)]; } }; // Detect attribute value character template struct attribute_value_pred { static unsigned char test(Ch ch) { if (Quote == Ch('\'')) return internal::lookup_tables<0>::lookup_attribute_data_1[static_cast(ch)]; if (Quote == Ch('\"')) return internal::lookup_tables<0>::lookup_attribute_data_2[static_cast(ch)]; return 0; // Should never be executed, to avoid warnings on Comeau } }; // Detect attribute value character template struct attribute_value_pure_pred { static unsigned char test(Ch ch) { if (Quote == Ch('\'')) return internal::lookup_tables<0>::lookup_attribute_data_1_pure[static_cast(ch)]; if (Quote == Ch('\"')) return internal::lookup_tables<0>::lookup_attribute_data_2_pure[static_cast(ch)]; return 0; // Should never be executed, to avoid warnings on Comeau } }; // part of the readxl namespace-prefix-stripping patch // Detect element XML namespace prefix character struct element_namespace_prefix_pred { static unsigned char test(Ch ch) { return ch != ':' && internal::lookup_tables<0>::lookup_node_name[static_cast(ch)]; } }; // part of the readxl namespace-prefix-stripping patch // Detect attribute XML namespace prefix character struct attribute_namespace_prefix_pred { static unsigned char test(Ch ch) { return ch != ':' && internal::lookup_tables<0>::lookup_attribute_name[static_cast(ch)]; } }; // Insert coded character, using UTF8 or 8-bit ASCII template static void insert_coded_character(Ch *&text, unsigned long code) { if (Flags & parse_no_utf8) { // Insert 8-bit ASCII character // Todo: possibly verify that code is less than 256 and use replacement char otherwise? text[0] = static_cast(code); text += 1; } else { // Insert UTF8 sequence if (code < 0x80) // 1 byte sequence { text[0] = static_cast(code); text += 1; } else if (code < 0x800) // 2 byte sequence { text[1] = static_cast((code | 0x80) & 0xBF); code >>= 6; text[0] = static_cast(code | 0xC0); text += 2; } else if (code < 0x10000) // 3 byte sequence { text[2] = static_cast((code | 0x80) & 0xBF); code >>= 6; text[1] = static_cast((code | 0x80) & 0xBF); code >>= 6; text[0] = static_cast(code | 0xE0); text += 3; } else if (code < 0x110000) // 4 byte sequence { text[3] = static_cast((code | 0x80) & 0xBF); code >>= 6; text[2] = static_cast((code | 0x80) & 0xBF); code >>= 6; text[1] = static_cast((code | 0x80) & 0xBF); code >>= 6; text[0] = static_cast(code | 0xF0); text += 4; } else // Invalid, only codes up to 0x10FFFF are allowed in Unicode { RAPIDXML_PARSE_ERROR("invalid numeric character entity", text); } } } // Skip characters until predicate evaluates to true template static void skip(Ch *&text) { Ch *tmp = text; while (StopPred::test(*tmp)) ++tmp; text = tmp; } // Skip characters until predicate evaluates to true while doing the following: // - replacing XML character entity references with proper characters (' & " < > &#...;) // - condensing whitespace sequences to single space character template static Ch *skip_and_expand_character_refs(Ch *&text) { // If entity translation, whitespace condense and whitespace trimming is disabled, use plain skip if (Flags & parse_no_entity_translation && !(Flags & parse_normalize_whitespace) && !(Flags & parse_trim_whitespace)) { skip(text); return text; } // Use simple skip until first modification is detected skip(text); // Use translation skip Ch *src = text; Ch *dest = src; while (StopPred::test(*src)) { // If entity translation is enabled if (!(Flags & parse_no_entity_translation)) { // Test if replacement is needed if (src[0] == Ch('&')) { switch (src[1]) { // & ' case Ch('a'): if (src[2] == Ch('m') && src[3] == Ch('p') && src[4] == Ch(';')) { *dest = Ch('&'); ++dest; src += 5; continue; } if (src[2] == Ch('p') && src[3] == Ch('o') && src[4] == Ch('s') && src[5] == Ch(';')) { *dest = Ch('\''); ++dest; src += 6; continue; } break; // " case Ch('q'): if (src[2] == Ch('u') && src[3] == Ch('o') && src[4] == Ch('t') && src[5] == Ch(';')) { *dest = Ch('"'); ++dest; src += 6; continue; } break; // > case Ch('g'): if (src[2] == Ch('t') && src[3] == Ch(';')) { *dest = Ch('>'); ++dest; src += 4; continue; } break; // < case Ch('l'): if (src[2] == Ch('t') && src[3] == Ch(';')) { *dest = Ch('<'); ++dest; src += 4; continue; } break; // &#...; - assumes ASCII case Ch('#'): if (src[2] == Ch('x')) { unsigned long code = 0; src += 3; // Skip &#x while (1) { unsigned char digit = internal::lookup_tables<0>::lookup_digits[static_cast(*src)]; if (digit == 0xFF) break; code = code * 16 + digit; ++src; } insert_coded_character(dest, code); // Put character in output } else { unsigned long code = 0; src += 2; // Skip &# while (1) { unsigned char digit = internal::lookup_tables<0>::lookup_digits[static_cast(*src)]; if (digit == 0xFF) break; code = code * 10 + digit; ++src; } insert_coded_character(dest, code); // Put character in output } if (*src == Ch(';')) ++src; else RAPIDXML_PARSE_ERROR("expected ;", src); continue; // Something else default: // Ignore, just copy '&' verbatim break; } } } // If whitespace condensing is enabled if (Flags & parse_normalize_whitespace) { // Test if condensing is needed if (whitespace_pred::test(*src)) { *dest = Ch(' '); ++dest; // Put single space in dest ++src; // Skip first whitespace char // Skip remaining whitespace chars while (whitespace_pred::test(*src)) ++src; continue; } } // No replacement, only copy character *dest++ = *src++; } // Return new end text = src; return dest; } /////////////////////////////////////////////////////////////////////// // Internal parsing functions // Parse BOM, if any template void parse_bom(Ch *&text) { // UTF-8? if (static_cast(text[0]) == 0xEF && static_cast(text[1]) == 0xBB && static_cast(text[2]) == 0xBF) { text += 3; // Skup utf-8 bom } } // Parse XML declaration ( xml_node *parse_xml_declaration(Ch *&text) { // If parsing of declaration is disabled if (!(Flags & parse_declaration_node)) { // Skip until end of declaration while (text[0] != Ch('?') || text[1] != Ch('>')) { if (!text[0]) RAPIDXML_PARSE_ERROR("unexpected end of data", text); ++text; } text += 2; // Skip '?>' return 0; } // Create declaration xml_node *declaration = this->allocate_node(node_declaration); // Skip whitespace before attributes or ?> skip(text); // Parse declaration attributes parse_node_attributes(text, declaration); // Skip ?> if (text[0] != Ch('?') || text[1] != Ch('>')) RAPIDXML_PARSE_ERROR("expected ?>", text); text += 2; return declaration; } // Parse XML comment (' return 0; // Do not produce comment node } // Remember value start Ch *value = text; // Skip until end of comment while (text[0] != Ch('-') || text[1] != Ch('-') || text[2] != Ch('>')) { if (!text[0]) RAPIDXML_PARSE_ERROR("unexpected end of data", text); ++text; } // Create comment node xml_node *comment = this->allocate_node(node_comment); comment->value(value, text - value); // Place zero terminator after comment value if (!(Flags & parse_no_string_terminators)) *text = Ch('\0'); text += 3; // Skip '-->' return comment; } // Parse DOCTYPE template xml_node *parse_doctype(Ch *&text) { // Remember value start Ch *value = text; // Skip to > while (*text != Ch('>')) { // Determine character type switch (*text) { // If '[' encountered, scan for matching ending ']' using naive algorithm with depth // This works for all W3C test files except for 2 most wicked case Ch('['): { ++text; // Skip '[' int depth = 1; while (depth > 0) { switch (*text) { case Ch('['): ++depth; break; case Ch(']'): --depth; break; case 0: RAPIDXML_PARSE_ERROR("unexpected end of data", text); } ++text; } break; } // Error on end of text case Ch('\0'): RAPIDXML_PARSE_ERROR("unexpected end of data", text); // Other character, skip it default: ++text; } } // If DOCTYPE nodes enabled if (Flags & parse_doctype_node) { // Create a new doctype node xml_node *doctype = this->allocate_node(node_doctype); doctype->value(value, text - value); // Place zero terminator after value if (!(Flags & parse_no_string_terminators)) *text = Ch('\0'); text += 1; // skip '>' return doctype; } else { text += 1; // skip '>' return 0; } } // Parse PI template xml_node *parse_pi(Ch *&text) { // If creation of PI nodes is enabled if (Flags & parse_pi_nodes) { // Create pi node xml_node *pi = this->allocate_node(node_pi); // Extract PI target name Ch *name = text; skip(text); if (text == name) RAPIDXML_PARSE_ERROR("expected PI target", text); pi->name(name, text - name); // Skip whitespace between pi target and pi skip(text); // Remember start of pi Ch *value = text; // Skip to '?>' while (text[0] != Ch('?') || text[1] != Ch('>')) { if (*text == Ch('\0')) RAPIDXML_PARSE_ERROR("unexpected end of data", text); ++text; } // Set pi value (verbatim, no entity expansion or whitespace normalization) pi->value(value, text - value); // Place zero terminator after name and value if (!(Flags & parse_no_string_terminators)) { pi->name()[pi->name_size()] = Ch('\0'); pi->value()[pi->value_size()] = Ch('\0'); } text += 2; // Skip '?>' return pi; } else { // Skip to '?>' while (text[0] != Ch('?') || text[1] != Ch('>')) { if (*text == Ch('\0')) RAPIDXML_PARSE_ERROR("unexpected end of data", text); ++text; } text += 2; // Skip '?>' return 0; } } // Parse and append data // Return character that ends data. // This is necessary because this character might have been overwritten by a terminating 0 template Ch parse_and_append_data(xml_node *node, Ch *&text, Ch *contents_start) { // Backup to contents start if whitespace trimming is disabled if (!(Flags & parse_trim_whitespace)) text = contents_start; // Skip until end of data Ch *value = text, *end; if (Flags & parse_normalize_whitespace) end = skip_and_expand_character_refs(text); else end = skip_and_expand_character_refs(text); // Trim trailing whitespace if flag is set; leading was already trimmed by whitespace skip after > if (Flags & parse_trim_whitespace) { if (Flags & parse_normalize_whitespace) { // Whitespace is already condensed to single space characters by skipping function, so just trim 1 char off the end if (*(end - 1) == Ch(' ')) --end; } else { // Backup until non-whitespace character is found while (whitespace_pred::test(*(end - 1))) --end; } } // If characters are still left between end and value (this test is only necessary if normalization is enabled) // Create new data node if (!(Flags & parse_no_data_nodes)) { xml_node *data = this->allocate_node(node_data); data->value(value, end - value); node->append_node(data); } // Add data to parent node if no data exists yet if (!(Flags & parse_no_element_values)) if (*node->value() == Ch('\0')) node->value(value, end - value); // Place zero terminator after value if (!(Flags & parse_no_string_terminators)) { Ch ch = *text; *end = Ch('\0'); return ch; // Return character that ends data; this is required because zero terminator overwritten it } // Return character that ends data return *text; } // Parse CDATA template xml_node *parse_cdata(Ch *&text) { // If CDATA is disabled if (Flags & parse_no_data_nodes) { // Skip until end of cdata while (text[0] != Ch(']') || text[1] != Ch(']') || text[2] != Ch('>')) { if (!text[0]) RAPIDXML_PARSE_ERROR("unexpected end of data", text); ++text; } text += 3; // Skip ]]> return 0; // Do not produce CDATA node } // Skip until end of cdata Ch *value = text; while (text[0] != Ch(']') || text[1] != Ch(']') || text[2] != Ch('>')) { if (!text[0]) RAPIDXML_PARSE_ERROR("unexpected end of data", text); ++text; } // Create new cdata node xml_node *cdata = this->allocate_node(node_cdata); cdata->value(value, text - value); // Place zero terminator after value if (!(Flags & parse_no_string_terminators)) *text = Ch('\0'); text += 3; // Skip ]]> return cdata; } // Parse element node template xml_node *parse_element(Ch *&text) { // Create element node xml_node *element = this->allocate_node(node_element); // Extract element name Ch *name = text; skip(text); if (text == name) RAPIDXML_PARSE_ERROR("expected element name", text); // part of the readxl namespace-prefix-stripping patch if (Flags & parse_strip_xml_namespaces) { Ch *saved_name = name; skip(name); if (name++ == text) name = saved_name; } element->name(name, text - name); // Skip whitespace between element name and attributes or > skip(text); // Parse attributes, if any parse_node_attributes(text, element); // Determine ending type if (*text == Ch('>')) { ++text; parse_node_contents(text, element); } else if (*text == Ch('/')) { ++text; if (*text != Ch('>')) RAPIDXML_PARSE_ERROR("expected >", text); ++text; } else RAPIDXML_PARSE_ERROR("expected >", text); // Place zero terminator after name if (!(Flags & parse_no_string_terminators)) element->name()[element->name_size()] = Ch('\0'); // Return parsed element return element; } // Determine node type, and parse it template xml_node *parse_node(Ch *&text) { // Parse proper node type switch (text[0]) { // <... default: // Parse and append element node return parse_element(text); // (text); } else { // Parse PI return parse_pi(text); } // (text); } break; // (text); } break; // (text); } } // switch // Attempt to skip other, unrecognized node types starting with ')) { if (*text == 0) RAPIDXML_PARSE_ERROR("unexpected end of data", text); ++text; } ++text; // Skip '>' return 0; // No node recognized } } // Parse contents of the node - children, data etc. template void parse_node_contents(Ch *&text, xml_node *node) { // For all children and text while (1) { // Skip whitespace between > and node contents Ch *contents_start = text; // Store start of node contents before whitespace is skipped skip(text); Ch next_char = *text; // After data nodes, instead of continuing the loop, control jumps here. // This is because zero termination inside parse_and_append_data() function // would wreak havoc with the above code. // Also, skipping whitespace after data nodes is unnecessary. after_data_node: // Determine what comes next: node closing, child node, data node, or 0? switch (next_char) { // Node closing or child node case Ch('<'): if (text[1] == Ch('/')) { // Node closing text += 2; // Skip '(text); if (!internal::compare(node->name(), node->name_size(), closing_name, text - closing_name, true)) RAPIDXML_PARSE_ERROR("invalid closing tag name", text); } else { // No validation, just skip name skip(text); } // Skip remaining whitespace after node name skip(text); if (*text != Ch('>')) RAPIDXML_PARSE_ERROR("expected >", text); ++text; // Skip '>' return; // Node closed, finished parsing contents } else { // Child node ++text; // Skip '<' if (xml_node *child = parse_node(text)) node->append_node(child); } break; // End of data - error case Ch('\0'): RAPIDXML_PARSE_ERROR("unexpected end of data", text); // Data node default: next_char = parse_and_append_data(node, text, contents_start); goto after_data_node; // Bypass regular processing after data nodes } } } // Parse XML attributes of the node template void parse_node_attributes(Ch *&text, xml_node *node) { // For all attributes while (attribute_name_pred::test(*text)) { // Extract attribute name Ch *name = text; ++text; // Skip first character of attribute name skip(text); if (text == name) RAPIDXML_PARSE_ERROR("expected attribute name", name); // part of the readxl namespace-prefix-stripping patch if (Flags & parse_strip_xml_namespaces) { Ch *saved_name = name; skip(name); if (name++ == text) name = saved_name; } // Create new attribute xml_attribute *attribute = this->allocate_attribute(); attribute->name(name, text - name); node->append_attribute(attribute); // Skip whitespace after attribute name skip(text); // Skip = if (*text != Ch('=')) RAPIDXML_PARSE_ERROR("expected =", text); ++text; // Add terminating zero after name if (!(Flags & parse_no_string_terminators)) attribute->name()[attribute->name_size()] = 0; // Skip whitespace after = skip(text); // Skip quote and remember if it was ' or " Ch quote = *text; if (quote != Ch('\'') && quote != Ch('"')) RAPIDXML_PARSE_ERROR("expected ' or \"", text); ++text; // Extract attribute value and expand char refs in it Ch *value = text, *end; const int AttFlags = Flags & ~parse_normalize_whitespace; // No whitespace normalization in attributes if (quote == Ch('\'')) end = skip_and_expand_character_refs, attribute_value_pure_pred, AttFlags>(text); else end = skip_and_expand_character_refs, attribute_value_pure_pred, AttFlags>(text); // Set attribute value attribute->value(value, end - value); // Make sure that end quote is present if (*text != quote) RAPIDXML_PARSE_ERROR("expected ' or \"", text); ++text; // Skip quote // Add terminating zero after value if (!(Flags & parse_no_string_terminators)) attribute->value()[attribute->value_size()] = 0; // Skip whitespace after attribute value skip(text); } } }; //! \cond internal namespace internal { // Whitespace (space \n \r \t) template const unsigned char lookup_tables::lookup_whitespace[256] = { // 0 1 2 3 4 5 6 7 8 9 A B C D E F 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, // 0 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 3 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 5 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 7 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // A 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // B 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // C 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // D 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // E 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // F }; // Node name (anything but space \n \r \t / > ? \0) template const unsigned char lookup_tables::lookup_node_name[256] = { // 0 1 2 3 4 5 6 7 8 9 A B C D E F 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, // 0 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, // 2 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, // 3 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F }; // Text (i.e. PCDATA) (anything but < \0) template const unsigned char lookup_tables::lookup_text[256] = { // 0 1 2 3 4 5 6 7 8 9 A B C D E F 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, // 3 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F }; // Text (i.e. PCDATA) that does not require processing when ws normalization is disabled // (anything but < \0 &) template const unsigned char lookup_tables::lookup_text_pure_no_ws[256] = { // 0 1 2 3 4 5 6 7 8 9 A B C D E F 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, // 3 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F }; // Text (i.e. PCDATA) that does not require processing when ws normalizationis is enabled // (anything but < \0 & space \n \r \t) template const unsigned char lookup_tables::lookup_text_pure_with_ws[256] = { // 0 1 2 3 4 5 6 7 8 9 A B C D E F 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, // 0 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, // 3 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F }; // Attribute name (anything but space \n \r \t / < > = ? ! \0) template const unsigned char lookup_tables::lookup_attribute_name[256] = { // 0 1 2 3 4 5 6 7 8 9 A B C D E F 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, // 0 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, // 2 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, // 3 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F }; // Attribute data with single quote (anything but ' \0) template const unsigned char lookup_tables::lookup_attribute_data_1[256] = { // 0 1 2 3 4 5 6 7 8 9 A B C D E F 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, // 2 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 3 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F }; // Attribute data with single quote that does not require processing (anything but ' \0 &) template const unsigned char lookup_tables::lookup_attribute_data_1_pure[256] = { // 0 1 2 3 4 5 6 7 8 9 A B C D E F 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, // 2 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 3 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F }; // Attribute data with double quote (anything but " \0) template const unsigned char lookup_tables::lookup_attribute_data_2[256] = { // 0 1 2 3 4 5 6 7 8 9 A B C D E F 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 3 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F }; // Attribute data with double quote that does not require processing (anything but " \0 &) template const unsigned char lookup_tables::lookup_attribute_data_2_pure[256] = { // 0 1 2 3 4 5 6 7 8 9 A B C D E F 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 1 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 3 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 4 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 5 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 6 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 7 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 8 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 9 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // A 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // B 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // C 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // D 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // E 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // F }; // Digits (dec and hex, 255 denotes end of numeric character reference) template const unsigned char lookup_tables::lookup_digits[256] = { // 0 1 2 3 4 5 6 7 8 9 A B C D E F 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 0 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 1 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 2 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,255,255,255,255,255,255, // 3 255, 10, 11, 12, 13, 14, 15,255,255,255,255,255,255,255,255,255, // 4 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 5 255, 10, 11, 12, 13, 14, 15,255,255,255,255,255,255,255,255,255, // 6 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 7 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 8 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // 9 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // A 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // B 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // C 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // D 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // E 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 // F }; // Upper case conversion template const unsigned char lookup_tables::lookup_upcase[256] = { // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A B C D E F 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, // 0 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, // 1 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, // 2 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, // 3 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, // 4 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, // 5 96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, // 6 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 123,124,125,126,127, // 7 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, // 8 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, // 9 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, // A 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, // B 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, // C 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, // D 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, // E 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 // F }; } //! \endcond } // Undefine internal macros #undef RAPIDXML_PARSE_ERROR // On MSVC, restore warnings state #ifdef _MSC_VER #pragma warning(pop) #endif #endif readxl/src/XlsxWorkSheet.h0000644000176200001440000003433613442224523015275 0ustar liggesusers#ifndef READXL_XLSXWORKSHEET_ #define READXL_XLSXWORKSHEET_ #include #include "rapidxml.h" #include "XlsxWorkBook.h" #include "Spinner.h" #include "XlsxCell.h" #include "ColSpec.h" #include "CellLimits.h" const int PROGRESS_TICK = 131072; // 2^17 // Page and section numbers below refer to // ECMA-376 (version, date, and download URL given in XlsxCell.h) // 18.3.1.73 row (Row) [p1685] // 18.3.1.4 c (Cell) [p1593] // 18.3.1.96 v (Cell Value) [p1707] // 18.18.11 ST_CellType (Cell Type) [p2451] class XlsxWorkSheet { // the host workbook XlsxWorkBook wb_; // xlsx specifics std::string sheet_; rapidxml::xml_document<> sheetXml_; rapidxml::xml_node<>* sheetData_; // common to xls[x] std::set dateFormats_; std::vector cells_; std::string sheetName_; CellLimits nominal_, actual_; int ncol_, nrow_; Spinner spinner_; public: XlsxWorkSheet(const XlsxWorkBook wb, int sheet_i, Rcpp::IntegerVector limits, bool shim, bool progress): wb_(wb), nominal_(limits), spinner_(progress) { rapidxml::xml_node<>* rootNode; if (sheet_i >= wb.n_sheets()) { Rcpp::stop("Can't retrieve sheet in position %d, only %d sheet(s) found.", sheet_i + 1, wb.n_sheets()); } sheetName_ = wb.sheets()[sheet_i]; std::string sheetPath = wb.sheetPath(sheet_i); spinner_.spin(); sheet_ = zip_buffer(wb.path(), sheetPath); spinner_.spin(); sheetXml_.parse(&sheet_[0]); spinner_.spin(); rootNode = sheetXml_.first_node("worksheet"); if (rootNode == NULL) { Rcpp::stop("Sheet '%s' (position %d): Invalid sheet xml (no )", sheetName_, sheet_i + 1); } sheetData_ = rootNode->first_node("sheetData"); if (sheetData_ == NULL) { Rcpp::stop("Sheet '%s' (position %d): Invalid sheet xml (no )", sheetName_, sheet_i + 1); } dateFormats_ = wb.dateFormats(); // nominal_ holds user's geometry request loadCells(shim); // nominal_ may have been shifted (case of implicit skipping and n_max) // actual_ reports populated cells inside the nominal_ rectangle // insert shims and update actual_ if (shim) insertShims(); nrow_ = (actual_.minRow() < 0) ? 0 : actual_.maxRow() - actual_.minRow() + 1; ncol_ = (actual_.minCol() < 0) ? 0 : actual_.maxCol() - actual_.minCol() + 1; } int ncol() const { return ncol_; } int nrow() const { return nrow_; } std::string sheetName() const { return sheetName_; } Rcpp::CharacterVector colNames(const StringSet &na, const bool trimWs) { Rcpp::CharacterVector out(ncol_); std::vector::iterator xcell = cells_.begin(); int base = xcell->row(); while(xcell != cells_.end() && xcell->row() == base) { xcell->inferType(na, trimWs, wb_.stringTable(), dateFormats_); out[xcell->col() - actual_.minCol()] = xcell->asCharSxp(wb_.stringTable(), trimWs); xcell++; } return out; } std::vector colTypes(std::vector types, const StringSet& na, const bool trimWs, int guess_max = 1000, bool has_col_names = false) { if (guess_max == 0) { return types; } std::vector::iterator xcell; xcell = has_col_names ? advance_row(cells_) : cells_.begin(); // no cell data to consult re: types if (xcell == cells_.end()) { std::fill(types.begin(), types.end(), COL_BLANK); return types; } std::vector type_known(types.size()); for (size_t j = 0; j < types.size(); j++) { type_known[j] = types[j] != COL_UNKNOWN; } // count is for spinner and checking for interrupt int count = 0; // base is row the data starts on **in the spreadsheet** int base = cells_.begin()->row() + has_col_names; while (xcell != cells_.end() && xcell->row() - base < guess_max) { count++; if (count % PROGRESS_TICK == 0) { spinner_.spin(); Rcpp::checkUserInterrupt(); } int j = xcell->col() - actual_.minCol(); if (type_known[j] || types[j] == COL_TEXT) { xcell++; continue; } xcell->inferType(na, trimWs, wb_.stringTable(), dateFormats_); ColType type = as_ColType(xcell->type()); if (type > types[j]) { types[j] = type; } xcell++; } return types; } Rcpp::List readCols(Rcpp::CharacterVector names, const std::vector& types, const StringSet& na, const bool trimWs, bool has_col_names = false) { std::vector::iterator xcell; xcell = has_col_names ? advance_row(cells_): cells_.begin(); // base is row the data starts on **in the spreadsheet** int base = cells_.begin()->row() + has_col_names; int n = (xcell == cells_.end()) ? 0 : actual_.maxRow() - base + 1; Rcpp::List cols(ncol_); cols.attr("names") = names; for (int j = 0; j < ncol_; ++j) { cols[j] = makeCol(types[j], n); } if (n == 0) { return cols; } // count is for spinner and checking for interrupt int count = 0; while (xcell != cells_.end()) { int i = xcell->row(); int j = xcell->col(); // col to write into int col = j - actual_.minCol(); count++; if (count % PROGRESS_TICK == 0) { spinner_.spin(); Rcpp::checkUserInterrupt(); } if (types[col] == COL_SKIP) { xcell++; continue; } xcell->inferType(na, trimWs, wb_.stringTable(), dateFormats_); CellType type = xcell->type(); Rcpp::RObject column = cols[col]; // row to write into int row = i - base; // Fit cell of type x into a column of type y // Conventions: // * process type in same order as enum, unless reason to do otherwise // * access cell contents only via asWhatever() methods switch(types[col]) { case COL_UNKNOWN: case COL_BLANK: case COL_SKIP: break; case COL_LOGICAL: if (type == CELL_DATE) { // print date string here, when/if it's possible to do so Rcpp::warning("Expecting logical in %s: got a date", cellPosition(i, j)); } switch(type) { case CELL_UNKNOWN: case CELL_BLANK: case CELL_LOGICAL: case CELL_DATE: case CELL_NUMERIC: LOGICAL(column)[row] = xcell->asLogical(); break; case CELL_TEXT: { std::string text_string = xcell->asStdString(wb_.stringTable(), trimWs); bool text_boolean; if (logicalFromString(text_string, &text_boolean)) { LOGICAL(column)[row] = text_boolean; } else { Rcpp::warning("Expecting logical in %s: got '%s'", cellPosition(i, j), text_string); LOGICAL(column)[row] = NA_LOGICAL; } } break; } break; case COL_DATE: if (type == CELL_LOGICAL) { Rcpp::warning("Expecting date in %s: got boolean", cellPosition(i, j)); } if (type == CELL_NUMERIC) { Rcpp::warning("Coercing numeric to date %s", cellPosition(i, j)); } if (type == CELL_TEXT) { Rcpp::warning("Expecting date in %s: got '%s'", cellPosition(i, j), xcell->asStdString(wb_.stringTable(), trimWs)); } REAL(column)[row] = xcell->asDate(wb_.is1904()); break; case COL_NUMERIC: if (type == CELL_LOGICAL) { Rcpp::warning("Coercing boolean to numeric in %s", cellPosition(i, j)); } if (type == CELL_DATE) { // print date string here, when/if possible Rcpp::warning("Expecting numeric in %s: got a date", cellPosition(i, j)); } switch(type) { case CELL_UNKNOWN: case CELL_BLANK: case CELL_LOGICAL: case CELL_DATE: case CELL_NUMERIC: REAL(column)[row] = xcell->asDouble(); break; case CELL_TEXT: { std::string num_string = xcell->asStdString(wb_.stringTable(), trimWs); double num_num; bool success = doubleFromString(num_string, num_num); if (success) { Rcpp::warning("Coercing text to numeric in %s: '%s'", cellPosition(i, j), num_string); REAL(column)[row] = num_num; } else { Rcpp::warning("Expecting numeric in %s: got '%s'", cellPosition(i, j), num_string); REAL(column)[row] = NA_REAL; } } break; } break; case COL_TEXT: // not issuing warnings for NAs or coercion, because "text" is the // fallback column type and there are too many warnings to be helpful SET_STRING_ELT(column, row, xcell->asCharSxp(wb_.stringTable(), trimWs)); break; case COL_LIST: switch(type) { case CELL_UNKNOWN: case CELL_BLANK: SET_VECTOR_ELT(column, row, Rf_ScalarLogical(NA_LOGICAL)); break; case CELL_LOGICAL: SET_VECTOR_ELT(column, row, Rf_ScalarLogical(xcell->asLogical())); break; case CELL_DATE: { Rcpp::RObject cell_val = Rf_ScalarReal(xcell->asDate(wb_.is1904())); cell_val.attr("class") = Rcpp::CharacterVector::create("POSIXct", "POSIXt"); cell_val.attr("tzone") = "UTC"; SET_VECTOR_ELT(column, row, cell_val); break; } case CELL_NUMERIC: SET_VECTOR_ELT(column, row, Rf_ScalarReal(xcell->asDouble())); break; case CELL_TEXT: { Rcpp::CharacterVector rStringVector = Rcpp::CharacterVector(1, NA_STRING); SET_STRING_ELT(rStringVector, 0, xcell->asCharSxp(wb_.stringTable(), trimWs)); SET_VECTOR_ELT(column, row, rStringVector); break; } } } xcell++; } return removeSkippedColumns(cols, names, types); } private: void loadCells(const bool shim) { // by convention, min_row = -2 means 'read no data' if (nominal_.minRow() < -1) { return; } rapidxml::xml_node<>* row = sheetData_->first_node("row"); if (row == NULL) { return; } // count is for spinner and checking for interrupt int count = 0; int i = 0; bool nominal_needs_checking = !shim && nominal_.maxRow() >= 0; for (; row; row = row->next_sibling("row")) { int j = 0; for (rapidxml::xml_node<>* cell = row->first_node("c"); cell; cell = cell->next_sibling("c")) { count++; if (count % PROGRESS_TICK == 0) { spinner_.spin(); Rcpp::checkUserInterrupt(); } rapidxml::xml_node<>* first_child = cell->first_node(0); // only consider cells that have >= 1 child nodes // we require cell to have content, not just, e.g., a format if (first_child != NULL) { // We have a cell! // (i, j) is our best guess at location, but if cell declares // it's own location, we store that instead XlsxCell xcell(cell, i, j); i = xcell.row(); j = xcell.col(); if (nominal_needs_checking) { if (i > nominal_.minRow()) { // implicit skip happened nominal_.update( i, i + nominal_.maxRow() - nominal_.minRow(), nominal_.minCol(), nominal_.maxCol() ); } nominal_needs_checking = false; } if (nominal_.contains(i, j)) { cells_.push_back(xcell); actual_.update(i, j); } } j++; } i++; } } // shim = TRUE when user specifies geometry via `range` // shim = FALSE when user specifies no geometry or uses `skip` and `n_max` // // nominal_ reflects user's geometry request // actual_ reports populated cells inside the nominal_ rectangle // // When shim = FALSE, we shrink-wrap the data that falls inside // the nominal_ rectangle. // // When shim = TRUE, we may need to insert dummy cells to fill out // the nominal_rectangle. // // actual_ is updated to reflect the insertions void insertShims() { // no cells were loaded if (cells_.empty()) { return; } // Recall cell limits are -1 by convention if the limit is unspecified. // funny_*() functions account for that. // if nominal min row or col is less than actual, // add a shim cell to the front of cells_ bool shim_up = funny_lt(nominal_.minRow(), actual_.minRow()); bool shim_left = funny_lt(nominal_.minCol(), actual_.minCol()); if (shim_up || shim_left) { int ul_row = funny_min(nominal_.minRow(), actual_.minRow()); int ul_col = funny_min(nominal_.minCol(), actual_.minCol()); XlsxCell ul_shim(std::make_pair(ul_row, ul_col)); cells_.insert(cells_.begin(), ul_shim); actual_.update(ul_row, ul_col); } // if nominal max row or col is greater than actual, // add a shim cell to the back of cells_ bool shim_down = funny_gt(nominal_.maxRow(), actual_.maxRow()); bool shim_right = funny_gt(nominal_.maxCol(), actual_.maxCol()); if (shim_down || shim_right) { int lr_row = funny_max(nominal_.maxRow(), actual_.maxRow()); int lr_col = funny_max(nominal_.maxCol(), actual_.maxCol()); XlsxCell lr_shim(std::make_pair(lr_row, lr_col)); cells_.push_back(lr_shim); actual_.update(lr_row, lr_col); } } bool funny_lt(const int funny, const int val) { return (funny >= 0) && (funny < val); } bool funny_gt(const int funny, const int val) { return (funny >= 0) && (funny > val); } int funny_min(const int funny, const int val) { return funny_lt(funny, val) ? funny : val; } int funny_max(const int funny, const int val) { return funny_gt(funny, val) ? funny : val; } std::vector::iterator advance_row(std::vector& x) { std::vector::iterator it = x.begin(); while (it != x.end() && it->row() == x.begin()->row()) { ++it; } return(it); } }; #endif readxl/src/utils.h0000644000176200001440000001212513442224523013633 0ustar liggesusers#ifndef UTILS_ #define UTILS_ #include #include "StringSet.h" // The date offset needed to align Excel dates with R's use of 1970-01-01 // depends on the "date system". // // xls ------------------------------------------------------------------------ // Page and section numbers below refer to // [MS-XLS]: Excel Binary File Format (.xls) Structure // version, date, and download URL given in XlsCell.h // // 2.4.77 Date1904 p257 ... it boils down to a boolean // 0 --> 1900 date system // 1 --> 1904 date system // // xlsx ------------------------------------------------------------------------ // Page and section numbers below refer to // ECMA-376 // version, date, and download URL given in XlsxCell.h // // 18.2.28 workbookPr (Workbook Properties) p1586 // in xl/workbook.xml, node workbook, child node workbookPr // attribute date1904: // 0 or false --> 1900 date system // 1 or true --> 1904 date system (this is the default) // // 18.17.4.1 p2073 holds definition of the date systems // // Date systems --------------------------------------------------------------- // 1900 system: first possible date is 1900-01-01 00:00:00, // which has serial value of **1** // 1904 system: origin 1904-01-01 00:00:00 inline double dateOffset(bool is1904) { // as.numeric(as.Date("1899-12-30")) // as.numeric(as.Date("1904-01-01")) return is1904 ? 24107 : 25569; } // this is sort of horrible // convert serial date to decimilliseconds // use well-known hack to round to nearest integer w/o C++11 or boost, e.g. // http://stackoverflow.com/questions/485525/round-for-float-in-c // convert back to serial date inline double dateRound(double dttm) { double ms = dttm * 10000; ms = (ms >= 0.0 ? std::floor(ms + 0.5) : std::ceil(ms - 0.5)); return ms / 10000; } // this is even more horrible // correct for Excel's faithful re-implementation of the Lotus 1-2-3 bug, // in which February 29, 1900 is included in the date system, even though 1900 // was not actually a leap year // https://support.microsoft.com/en-us/help/214326/excel-incorrectly-assumes-that-the-year-1900-is-a-leap-year // How we address this: // If date is *prior* to the non-existent leap day: add a day // If date is on the non-existent leap day: make negative and, in due course, NA // Otherwise: do nothing inline double POSIXctFromSerial(double xlDate, bool is1904) { if (!is1904 && xlDate < 61) { xlDate = (xlDate < 60) ? xlDate + 1 : -1; } if (xlDate < 0) { Rcpp::warning("NA inserted for impossible 1900-02-29 datetime"); return NA_REAL; } else { return dateRound((xlDate - dateOffset(is1904)) * 86400); } } // Simple parser: does not check that order of numbers and letters is correct inline std::pair parseRef(const char* ref) { int col = 0, row = 0; for (const char* cur = ref; *cur != '\0'; ++cur) { if (*cur >= '0' && *cur <= '9') { row = row * 10 + (*cur - '0'); } else if (*cur >= 'A' && *cur <= 'Z') { col = 26 * col + (*cur - 'A' + 1); } else { Rcpp::stop("Invalid character '%s' in cell ref '%s'", *cur, ref); } } return std::make_pair(row - 1, col - 1); // zero indexed } // col = 1 --> first column aka column A, so 1-indexed inline std::string intToABC(int col) { std::string ret; while (col > 0) { col--; ret = (char)('A' + col % 26) + ret; col /= 26; } return ret; } // row = 1, col = 1 --> upper left cell aka column A1, so 1-indexed inline std::string asA1(const int row, const int col) { std::ostringstream ret; ret << intToABC(col) << row; return ret.str(); } // expects 0-indexed row and col inline std::string cellPosition(const int row, const int col) { std::ostringstream ret; ret << asA1(row + 1, col + 1) << " / R" << row + 1 << "C" << col + 1; return ret.str(); } inline bool logicalFromString(std::string maybe_tf, bool *out) { bool matches = false; if (Rf_StringTrue(maybe_tf.c_str())) { *out = true; matches = true; } else if (Rf_StringFalse(maybe_tf.c_str())) { *out = false; matches = true; } return matches; } inline bool doubleFromString(std::string mystring, double& out) { char* e; errno = 0; out = std::strtod(mystring.c_str(), &e); if (*e != '\0' || // error, we didn't consume the entire string errno != 0 ) { // error, overflow or underflow return false; } return true; } inline std::string trim(const std::string& s) { size_t begin = s.find_first_not_of(" \t"); if (begin == std::string::npos) { return ""; } size_t end = s.find_last_not_of(" \t"); return s.substr(begin, end - begin + 1); } inline std::string dirName(const std::string& path) { std::size_t found = path.find_last_of("/"); if (found == std::string::npos) { return ""; } return path.substr(0, found); } inline std::string baseName(const std::string& path) { std::size_t found = path.find_last_of("/"); if (found == std::string::npos) { return path; } return path.substr(found + 1); } inline std::string removeLeadingSlashes(const std::string& s) { size_t start = s.find_first_not_of("/"); if (start == std::string::npos) { return ""; } return s.substr(start); } #endif readxl/src/XlsCell.h0000644000176200001440000002211413442224523014040 0ustar liggesusers#ifndef READXL_XLSCELL_ #define READXL_XLSCELL_ #include #include #include #include #include #include "ColSpec.h" #include "utils.h" // Key reference for understanding the structure of the xls format is // [MS-XLS]: Excel Binary File Format (.xls) Structure // https://msdn.microsoft.com/en-us/library/cc313154(v=office.12).aspx // http://interoperability.blob.core.windows.net/files/MS-XLS/[MS-XLS].pdf // Page and section numbers below refer to // v20161017, Release: October 17, 2016 class XlsCell { xls::xlsCell *cell_; std::pair location_; CellType type_; public: XlsCell(xls::xlsCell *cell): cell_(cell) { location_ = std::make_pair(cell_->row, cell_->col); type_ = CELL_UNKNOWN; } XlsCell(std::pair loc) { cell_ = NULL; location_ = loc; type_ = CELL_BLANK; } int row() const { return location_.first; } int col() const { return location_.second; } CellType type() const { return type_; } void inferType(const StringSet& na, const bool trimWs, const std::set& dateFormats) { // 1. Review of Excel's declared cell types, then // 2. Summary of how Excel's cell types map to our CellType enum // // 2.2.1 Cell Table p80: // "Cells are specified by any of the records specified in the CELL rule // (section 2.1.7.20.6)." // // 2.1.7.20.6 p74 The CELL Rule: // CELL = FORMULA / Blank / MulBlank / RK / MulRk / BoolErr / Number / LabelSst // // 2.3 Record Enumeration // Has 2 tables associating each record type value with a name and number. // 2.3.1 starting p168 is ordered by name // 2.3.2 starting p180 is ordered by number // // LabelSst 2.4.149 p325 // Label 2.4.148 p325 // Formula 2.4.127 p309 // Formula (Apple Numbers Bug) via libxls // MulRk 2.4.175 p344 // Number 2.4.180 p348 // Rk 2.4.220 p376 // MulBlank 2.4.174 p344 // Blank 2.4.20 p212 // BoolErr 2.4.24 p216 // // For info on how libxls extracts and exposes, see xls_addCell. Also // consult xlsstruct.h to confirm record numbers. // // We map Excel's cell types to the CellType enum based on declared type // and contents. // // CELL_BLANK // shared string or string formula whose value matches na // boolean or boolean formula whose value (TRUE or FALSE) matches na // number or numeric formula whose double value (d) matches na // explicit blank cell // formula in error (except #NULL!) or static error (#N/A) // examples: // static: id = 517, str = "error", d = 42, l = 0, xf = 15 // formula: id = 6, str = "error", d = 29, l = 65535, xf = 15 // // CELL_LOGICAL // boolean or boolean formula whose value (TRUE or FALSE) does not match na // examples: // static: id = 517, str = "bool", d = 0 or 1, l = 0, xf = 15 // formula: id = 6, str = "bool", d = 0 or 1, l = 65535, xf = 15 // // CELL_DATE // number or numeric formula with a date format, whose double value (d) // does not match na // examples: // static: id = 638, str = "42426.000000", d = 42426, l = 0, xf = 62 // formula: id = 6, str = "42431", d = 42431, l = 0, xf = 62 // // CELL_NUMERIC // number or numeric formula with no format or a non-date format, whose // double value (d) does not match na // examples: // static: id = 638, str = "1.300000", d = 1.3, l = 0, xf = 15 // formula: id = 6, str = "1", d = 1.69, l = 0, xf = 15 // // CELL_TEXT // shared string or string formula whose value does not match na // examples: // static: id = 253, str = "something", d = 0, l = 0, xf = 15 // formula: id = 6, str = "something", d = 0, l = 65535, xf = 15 if (type_ != CELL_UNKNOWN) { return; } CellType ct; switch(cell_->id) { case XLS_RECORD_LABELSST: case XLS_RECORD_LABEL: { std::string s = cell_->str == NULL ? "" : cell_->str; ct = na.contains(s, trimWs) ? CELL_BLANK : CELL_TEXT; break; } case XLS_RECORD_FORMULA: case XLS_RECORD_FORMULA_ALT: // l = 0 --> result is a number, possibly date // l = 65535 --> everything else if (cell_->l == 0) { if (na.contains(cell_->d)) { ct = CELL_BLANK; break; } int format = cell_->xf; ct = (dateFormats.count(format) > 0) ? CELL_DATE : CELL_NUMERIC; break; } else { // formula evaluates to Boolean, string, or error // Boolean if (strncmp((char *) cell_->str, "bool", 4) == 0) { if ( (cell_->d == 0 && na.contains("FALSE")) || (cell_->d == 1 && na.contains("TRUE")) ) { ct = CELL_BLANK; } else { ct = CELL_LOGICAL; } break; } // error // libxls puts "error" in str for all errors and // puts the error code in d // Code Error // 0x00 #NULL! <-- indistinguishable from "error" formula string :( // 0x07 #DIV/0! // 0x0F #VALUE! // 0x17 #REF! // 0x1D #NAME? // 0x24 #NUM! // 0x2A #N/A // 0x2B #GETTING_DATA if (strncmp((char *) cell_->str, "error", 5) == 0 && cell_->d > 0) { ct = CELL_BLANK; break; } // string (or #NULL! error) // d = 0 and str holds string formula result ct = na.contains((char*) cell_->str, trimWs) ? CELL_BLANK : CELL_TEXT; } break; case XLS_RECORD_MULRK: case XLS_RECORD_NUMBER: case XLS_RECORD_RK: { if (na.contains(cell_->d)) { ct = CELL_BLANK; break; } int format = cell_->xf; ct = (dateFormats.count(format) > 0) ? CELL_DATE : CELL_NUMERIC; } break; case XLS_RECORD_MULBLANK: case XLS_RECORD_BLANK: ct = CELL_BLANK; break; case XLS_RECORD_BOOLERR: if (strncmp((char *) cell_->str, "bool", 4) == 0) { if ( (cell_->d == 0 && na.contains("FALSE")) || (cell_->d == 1 && na.contains("TRUE")) ) { ct = CELL_BLANK; } else { ct = CELL_LOGICAL; } } else { // must be an error ct = CELL_BLANK; } break; default: Rcpp::warning("Unrecognized cell type at %s: '%s'", cellPosition(row(), col()), cell_->id); ct = CELL_UNKNOWN; } type_ = ct; } std::string asStdString(const bool trimWs) const { switch(type_) { case CELL_UNKNOWN: case CELL_BLANK: return ""; case CELL_LOGICAL: return cell_->d ? "TRUE" : "FALSE"; case CELL_DATE: // not ideal for a date but will have to do ... one day: asDateString()? case CELL_NUMERIC: { std::ostringstream strs; // if cell_->d is integer-ish, need to: // * prevent use of scientific notation // * prevent gratuitous zeros after decimal mark // GOOD: "36436153" // BAD: "3.64362e+07" // BAD: "36436153.000000" // examples: social security or student number double intpart; if (std::modf(cell_->d, &intpart) == 0.0) { strs << std::fixed << (int64_t)cell_->d; } else { strs << std::setprecision(std::numeric_limits::digits10 + 2) << cell_->d; } std::string out_string = strs.str(); return out_string; } case CELL_TEXT: { std::string out_string = (char*) cell_->str; return trimWs ? trim(out_string) : out_string; } default: Rcpp::warning("Unrecognized cell type at %s: '%s'", cellPosition(row(), col()), cell_->id); return ""; } } Rcpp::RObject asCharSxp(const bool trimWs) const { std::string out_string = asStdString(trimWs); return out_string.empty() ? NA_STRING : Rf_mkCharCE(out_string.c_str(), CE_UTF8); } int asLogical() const { switch(type_) { case CELL_UNKNOWN: case CELL_BLANK: case CELL_DATE: case CELL_TEXT: return NA_LOGICAL; case CELL_LOGICAL: case CELL_NUMERIC: return cell_->d != 0; default: Rcpp::warning("Unrecognized cell type at %s: '%s'", cellPosition(row(), col()), cell_->id); return NA_LOGICAL; } } double asDouble() const { switch(type_) { case CELL_UNKNOWN: case CELL_BLANK: case CELL_TEXT: return NA_REAL; case CELL_LOGICAL: case CELL_DATE: case CELL_NUMERIC: return cell_->d; default: Rcpp::warning("Unrecognized cell type at %s: '%s'", cellPosition(row(), col()), cell_->id); return NA_REAL; } } double asDate(bool is1904) const { switch(type_) { case CELL_UNKNOWN: case CELL_BLANK: case CELL_LOGICAL: case CELL_TEXT: return NA_REAL; case CELL_DATE: case CELL_NUMERIC: return POSIXctFromSerial(cell_->d, is1904); default: Rcpp::warning("Unrecognized cell type at %s: '%s'", cellPosition(row(), col()), cell_->id); return NA_REAL; } } }; #endif readxl/src/unix/0000755000176200001440000000000013430703667013314 5ustar liggesusersreadxl/src/unix/config.h0000644000176200001440000000566613442224523014737 0ustar liggesusers/* config.h. Generated from config.h.in by configure. */ /* config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if you have the header file. */ #define HAVE_DLFCN_H 1 /* Define if you have the iconv() function and it works. */ #define HAVE_ICONV 1 /* Define to 1 if you have the header file. */ #define HAVE_INTTYPES_H 1 /* Define to 1 if your system has a GNU libc compatible `malloc' function, and to 0 otherwise. */ #define HAVE_MALLOC 1 /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 /* Define to 1 if your system has a GNU libc compatible `realloc' function, and to 0 otherwise. */ #define HAVE_REALLOC 1 /* Define to 1 if you have the header file. */ #define HAVE_STDINT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 /* Define to 1 if you have the `strdup' function. */ #define HAVE_STRDUP 1 /* Define to 1 if you have the header file. */ #define HAVE_STRINGS_H 1 /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 /* Define to 1 if you have the header file. */ #define HAVE_UNISTD_H 1 /* Define to 1 if you have the header file. */ #define HAVE_WCHAR_H 1 /* Define as const if the declaration of iconv() needs const. */ #if defined(_AIX) || defined(__sun) #define ICONV_CONST const #else #define ICONV_CONST #endif /* Major version */ #define LIBXLS_MAJOR_VERSION 1 /* Micro version */ #define LIBXLS_MICRO_VERSION 0 /* Minor version */ #define LIBXLS_MINOR_VERSION 5 /* Define to the sub-directory where libtool stores uninstalled libraries. */ #define LT_OBJDIR ".libs/" /* Name of package */ #define PACKAGE "libxls" /* Define to the address where bug reports for this package should be sent. */ #define PACKAGE_BUGREPORT "emmiller@gmail.com" /* Define to the full name of this package. */ #define PACKAGE_NAME "libxls" /* Define to the full name and version of this package. */ #define PACKAGE_STRING "libxls 1.5.0" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "libxls" /* Define to the home page for this package. */ #define PACKAGE_URL "https://github.com/libxls/libxls" /* Define to the version of this package. */ #define PACKAGE_VERSION "1.5.0" /* Define to 1 if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Version number of package */ #define VERSION "1.5.0" /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */ /* Define to rpl_malloc if the replacement function should be used. */ /* #undef malloc */ /* Define to rpl_realloc if the replacement function should be used. */ /* #undef realloc */ /* Define to `unsigned int' if does not define. */ /* #undef size_t */ readxl/src/zip.h0000644000176200001440000000035113442224523013273 0ustar liggesusers#ifndef READXL_ZIP_ #define READXL_ZIP_ #include "rapidxml.h" std::string zip_buffer(const std::string& zip_path, const std::string& file_path); bool zip_has_file(const std::string& zip_path, const std::string& file_path); #endif readxl/src/xlstool.c0000644000176200001440000004747313442224523014210 0ustar liggesusers/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright 2004 Komarov Valery * Copyright 2006 Christophe Leitienne * Copyright 2008-2017 David Hoerl * Copyright 2013 Bob Colbert * Copyright 2013-2018 Evan Miller * * This file is part of libxls -- A multiplatform, C/C++ library for parsing * Excel(TM) files. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "config.h" #include #include #include #include #ifdef HAVE_ICONV #include #if defined(_AIX) || defined(__sun) static const char *from_enc = "UTF-16le"; #else static const char *from_enc = "UTF-16LE"; #endif #else #include #endif #include #include #include #include //#include "xls.h" #include "libxls/xlstypes.h" #include "libxls/xlsstruct.h" #include "libxls/xlstool.h" #include "libxls/brdb.h" #include "libxls/endian.h" extern int xls_debug; static const DWORD colors[] = { 0x000000, 0xFFFFFF, 0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0xFF00FF, 0x00FFFF, 0x800000, 0x008000, 0x000080, 0x808000, 0x800080, 0x008080, 0xC0C0C0, 0x808080, 0x9999FF, 0x993366, 0xFFFFCC, 0xCCFFFF, 0x660066, 0xFF8080, 0x0066CC, 0xCCCCFF, 0x000080, 0xFF00FF, 0xFFFF00, 0x00FFFF, 0x800080, 0x800000, 0x008080, 0x0000FF, 0x00CCFF, 0xCCFFFF, 0xCCFFCC, 0xFFFF99, 0x99CCFF, 0xFF99CC, 0xCC99FF, 0xFFCC99, 0x3366FF, 0x33CCCC, 0x99CC00, 0xFFCC00, 0xFF9900, 0xFF6600, 0x666699, 0x969696, 0x003366, 0x339966, 0x003300, 0x333300, 0x993300, 0x993366, 0x333399, 0x333333 }; // Display string if in debug mode void verbose(char* str) { if (xls_debug) printf("libxls : %s\n",str); } char *utf8_decode(const char *str, DWORD len, char *encoding) { int utf8_chars = 0; char *ret = NULL; DWORD i; for(i=0; i> 6); *out++ = (BYTE)0x80 | (c & 0x3F); } else { *out++ = c; } } *out = 0; } return ret; } #ifdef HAVE_ICONV static char* unicode_decode_iconv(const char *s, size_t len, size_t *newlen, const char* to_enc) { char* outbuf = 0; if(s && len && from_enc && to_enc) { size_t outlenleft = len; int outlen = len; size_t inlenleft = len; iconv_t ic = iconv_open(to_enc, from_enc); const char* src_ptr = s; char* out_ptr = 0; if(ic == (iconv_t)-1) { // Something went wrong. if (errno == EINVAL) { if (!strcmp(to_enc, "ASCII")) { ic = iconv_open("UTF-8", from_enc); if(ic == (iconv_t)-1) { printf("conversion from '%s' to '%s' not available", from_enc, to_enc); return outbuf; } } } else { printf ("iconv_open: error=%d", errno); return outbuf; } } size_t st; outbuf = malloc(outlen + 1); if(outbuf) { out_ptr = outbuf; while(inlenleft) { st = iconv(ic, (ICONV_CONST char **)&src_ptr, &inlenleft, (char **)&out_ptr,(size_t *) &outlenleft); if(st == (size_t)(-1)) { if(errno == E2BIG) { size_t diff = out_ptr - outbuf; outlen += inlenleft; outlenleft += inlenleft; outbuf = realloc(outbuf, outlen + 1); if(!outbuf) { break; } out_ptr = outbuf + diff; } else { free(outbuf), outbuf = NULL; break; } } } } iconv_close(ic); outlen -= outlenleft; if (newlen) { *newlen = outbuf ? outlen : 0; } if(outbuf) { outbuf[outlen] = 0; } } return outbuf; } #else static char *unicode_decode_wcstombs(const char *s, size_t len, size_t *newlen) { // Do wcstombs conversion char *converted = NULL; int count, count2; size_t i; wchar_t *w; if (setlocale(LC_CTYPE, "") == NULL) { printf("setlocale failed: %d\n", errno); return NULL; } w = malloc((len/2+1)*sizeof(wchar_t)); for(i=0; i len) { return NULL; } ln= ((BYTE*)str)[0] + (((BYTE*)str)[1] << 8); ofs+=2; } else { // single byte length if (ofs + 1 > len) { return NULL; } ln=*(BYTE*)str; ofs++; } if(!is5ver) { // unicode strings have a format byte before the string if (ofs + 1 > len) { return NULL; } flag=*(BYTE*)(str+ofs); ofs++; } if (flag&0x8) { // WORD rt; // rt=*(WORD*)(str+ofs); // unused ofs+=2; } if (flag&0x4) { // DWORD sz; // sz=*(DWORD*)(str+ofs); // unused ofs+=4; } if(flag & 0x1) { if (ofs + 2*ln > len) { return NULL; } ret = unicode_decode(str+ofs, ln*2, NULL, charset); } else { if (ofs + ln > len) { return NULL; } ret = utf8_decode(str+ofs, ln, charset); } #if 0 // debugging if(xls_debug == 100) { ofs += (flag & 0x1) ? ln*2 : ln; printf("ofs=%d ret[0]=%d\n", ofs, *ret); { unsigned char *ptr; ptr = ret; printf("%x %x %x %x %x %x %x %x\n", ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], ptr[6], ptr[7] ); printf("%s\n", ret); } } #endif return ret; } DWORD xls_getColor(const WORD color,WORD def) { int cor=8; int size = 64 - cor; int max = size; WORD idx=color; if( idx >= cor) idx -= cor; if( idx < max ) { return colors[idx]; } else return colors[def]; } void xls_showBookInfo(xlsWorkBook* pWB) { verbose("BookInfo"); printf(" is5ver: %i\n",pWB->is5ver); printf("codepage: %i\n",pWB->codepage); printf(" type: %.4X ",pWB->type); switch (pWB->type) { case 0x5: printf("Workbook globals\n"); break; case 0x6: printf("Visual Basic module\n"); break; case 0x10: printf("Worksheet\n"); break; case 0x20: printf("Chart\n"); break; case 0x40: printf("BIFF4 Macro sheet\n"); break; case 0x100: printf("BIFF4W Workbook globals\n"); break; } printf("------------------- END BOOK INFO---------------------------\n"); } void xls_showBOF(BOF* bof) { printf("----------------------------------------------\n"); verbose("BOF"); printf(" ID: %.4Xh %s (%s)\n",bof->id,brdb[get_brbdnum(bof->id)].name,brdb[get_brbdnum(bof->id)].desc); printf(" Size: %i\n",bof->size); } #if 0 static void xls_showBOUNDSHEET(BOUNDSHEET* bsheet) { switch (bsheet->type & 0x000f) { case 0x0000: /* worksheet or dialog sheet */ verbose ("85: Worksheet or dialog sheet"); break; case 0x0001: /* Microsoft Excel 4.0 macro sheet */ verbose ("85: Microsoft Excel 4.0 macro sheet"); break; case 0x0002: /* Chart */ verbose ("85: Chart sheet"); break; case 0x0006: /* Visual Basic module */ verbose ("85: Visual Basic sheet"); break; default: break; } printf(" Pos: %Xh\n",bsheet->filepos); printf(" flags: %.4Xh\n",bsheet->type); // printf(" Name: [%i] %s\n",bsheet->len,bsheet->name); } #endif void xls_showROW(struct st_row_data* row) { verbose("ROW"); printf(" Index: %i \n",row->index); printf("First col: %i \n",row->fcell); printf(" Last col: %i \n",row->lcell); printf(" Height: %i (1/20 px)\n",row->height); printf(" Flags: %.4X \n",row->flags); printf(" xf: %i \n",row->xf); printf("----------------------------------------------\n"); } void xls_showColinfo(struct st_colinfo_data* col) { verbose("COLINFO"); printf("First col: %i \n",col->first); printf(" Last col: %i \n",col->last); printf(" Width: %i (1/256 px)\n",col->width); printf(" XF: %i \n",col->xf); printf(" Flags: %i (",col->flags); if (col->flags & 0x1) printf("hidden "); if (col->flags & 0x700) printf("outline "); if (col->flags & 0x1000) printf("collapsed "); printf(")\n"); printf("----------------------------------------------\n"); } void xls_showCell(struct st_cell_data* cell) { printf(" -----------\n"); printf(" ID: %.4Xh %s (%s)\n",cell->id, brdb[get_brbdnum(cell->id)].name, brdb[get_brbdnum(cell->id)].desc); printf(" Cell: %c:%u [%u:%u]\n",cell->col+'A',cell->row+1,cell->col,cell->row); // printf(" Cell: %u:%u\n",cell->col+1,cell->row+1); printf(" xf: %i\n",cell->xf); if(cell->id == XLS_RECORD_BLANK) { //printf("BLANK_CELL!\n"); return; } printf(" double: %f\n",cell->d); printf(" int: %d\n",cell->l); if (cell->str!=NULL) printf(" str: %s\n",cell->str); } void xls_showFont(struct st_font_data* font) { printf(" name: %s\n",font->name); printf(" height: %i\n",font->height); printf(" flag: %.4X\n",font->flag); printf(" color: %.6X\n",font->color); printf(" bold: %i\n",font->bold); printf("escapement: %i\n",font->escapement); printf(" underline: %i\n",font->underline); printf(" family: %i\n",font->family); printf(" charset: %i\n",font->charset); } #if 0 typedef struct st_format { long count; //Count of FORMAT's struct st_format_data { WORD index; char *value; } * format; } st_format; #endif void xls_showFormat(struct st_format_data* frmt) { printf(" index : %u\n", frmt->index); printf(" value: %s\n", frmt->value); } void xls_showXF(XF8* xf) { static int idx; printf(" Index: %u\n",idx++); printf(" Font: %u\n",xf->font); printf(" Format: %u\n",xf->format); printf(" Type: 0x%x\n",xf->type); printf(" Align: 0x%x\n",xf->align); printf(" Rotation: 0x%x\n",xf->rotation); printf(" Ident: 0x%x\n",xf->ident); printf(" UsedAttr: 0x%x\n",xf->usedattr); printf(" LineStyle: 0x%x\n",xf->linestyle); printf(" Linecolor: 0x%x\n",xf->linecolor); printf("GroundColor: 0x%x\n",xf->groundcolor); } char *xls_getfcell(xlsWorkBook* pWB, struct st_cell_data* cell, BYTE *label) { struct st_xf_data *xf = NULL; WORD len = 0; DWORD offset = 0; char *ret = NULL; size_t retlen = 100; if (cell->xf < pWB->xfs.count) xf=&pWB->xfs.xf[cell->xf]; switch (cell->id) { case XLS_RECORD_LABELSST: offset = label[0] + (label[1] << 8); if(!pWB->is5ver) { offset += ((DWORD)label[2] << 16); offset += ((DWORD)label[3] << 24); } if(offset < pWB->sst.count && pWB->sst.string[offset].str) { ret = strdup(pWB->sst.string[offset].str); } break; case XLS_RECORD_BLANK: case XLS_RECORD_MULBLANK: ret = strdup(""); break; case XLS_RECORD_LABEL: len = label[0] + (label[1] << 8); label += 2; if(pWB->is5ver) { ret = malloc(len+1); memcpy(ret, label, len); ret[len] = 0; //printf("Found BIFF5 string of len=%d \"%s\"\n", len, ret); } else { if ((*(label++) & 0x01) == 0) { ret = utf8_decode((char *)label, len, pWB->charset); } else { ret = unicode_decode((char *)label, len*2, NULL, pWB->charset); } } break; case XLS_RECORD_RK: case XLS_RECORD_NUMBER: ret = malloc(retlen); snprintf(ret, retlen, "%lf", cell->d); break; // if( RK || MULRK || NUMBER || FORMULA) // if (cell->id==0x27e || cell->id==0x0BD || cell->id==0x203 || 6 (formula)) default: if (xf) { ret = malloc(retlen); switch (xf->format) { case 0: snprintf(ret, retlen, "%d", (int)cell->d); break; case 1: snprintf(ret, retlen, "%d", (int)cell->d); break; case 2: snprintf(ret, retlen, "%.1f", cell->d); break; case 9: snprintf(ret, retlen, "%d", (int)cell->d); break; case 10: snprintf(ret, retlen, "%.2f", cell->d); break; case 11: snprintf(ret, retlen, "%.1e", cell->d); break; case 14: //ret=ctime(cell->d); snprintf(ret, retlen, "%.0f", cell->d); break; default: // asprintf(&ret,"%.4.2f (%i)",cell->d,xf->format);break; snprintf(ret, retlen, "%.2f", cell->d); break; } break; } } return ret; } char* xls_getCSS(xlsWorkBook* pWB) { char color[255]; char* align; char* valign; char borderleft[255]; char borderright[255]; char bordertop[255]; char borderbottom[255]; char italic[255]; char underline[255]; char bold[255]; WORD size; char fontname[255]; struct st_xf_data* xf; DWORD background; DWORD i; char *ret = malloc(65535); char *buf = malloc(4096); ret[0] = '\0'; for (i=0;ixfs.count;i++) { xf=&pWB->xfs.xf[i]; switch ((xf->align & 0x70)>>4) { case 0: valign=(char*)"top"; break; case 1: valign=(char*)"middle"; break; case 2: valign=(char*)"bottom"; break; // case 3: valign=(char*)"right"; break; // case 4: valign=(char*)"right"; break; default: valign=(char*)"middle"; break; } switch (xf->align & 0x07) { case 1: align=(char*)"left"; break; case 2: align=(char*)"center"; break; case 3: align=(char*)"right"; break; default: align=(char*)"left"; break; } switch (xf->linestyle & 0x0f) { case 0: sprintf(borderleft,"%s", ""); break; default: sprintf(borderleft,"border-left: 1px solid black;"); break; } switch (xf->linestyle & 0x0f0) { case 0: sprintf(borderright,"%s", ""); break; default: sprintf(borderright,"border-right: 1px solid black;"); break; } switch (xf->linestyle & 0x0f00) { case 0: sprintf(bordertop,"%s", ""); break; default: sprintf(bordertop,"border-top: 1px solid black;"); break; } switch (xf->linestyle & 0x0f000) { case 0: sprintf(borderbottom,"%s", ""); break; default: sprintf(borderbottom,"border-bottom: 1px solid Black;"); break; } if (xf->font) sprintf(color,"color:#%.6X;",xls_getColor(pWB->fonts.font[xf->font-1].color,0)); else sprintf(color,"%s", ""); if (xf->font && (pWB->fonts.font[xf->font-1].flag & 2)) sprintf(italic,"font-style: italic;"); else sprintf(italic,"%s", ""); if (xf->font && (pWB->fonts.font[xf->font-1].bold>400)) sprintf(bold,"font-weight: bold;"); else sprintf(bold,"%s", ""); if (xf->font && (pWB->fonts.font[xf->font-1].underline)) sprintf(underline,"text-decoration: underline;"); else sprintf(underline,"%s", ""); if (xf->font) size=pWB->fonts.font[xf->font-1].height/20; else size=10; if (xf->font) sprintf(fontname,"%s",pWB->fonts.font[xf->font-1].name); else sprintf(fontname,"Arial"); background=xls_getColor((WORD)(xf->groundcolor & 0x7f),1); sprintf(buf,".xf%i{ font-size:%ipt;font-family: \"%s\";background:#%.6X;text-align:%s;vertical-align:%s;%s%s%s%s%s%s%s%s}\n", i,size,fontname,background,align,valign,borderleft,borderright,bordertop,borderbottom,color,italic,bold,underline); strcat(ret,buf); } ret = realloc(ret, strlen(ret)+1); free(buf); return ret; } readxl/src/endian.c0000644000176200001440000001560213442224523013727 0ustar liggesusers/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright 2013 Bob Colbert * * This file is part of libxls -- A multiplatform, C/C++ library for parsing * Excel(TM) files. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS''AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * */ #include #include "libxls/xlstypes.h" #include "libxls/endian.h" #include "libxls/ole.h" int xls_is_bigendian() { #if defined (__BIG_ENDIAN__) return 1; #elif defined (__LITTLE_ENDIAN__) return 0; #else static int n = 1; return (*(char *)&n == 0); #endif } DWORD xlsIntVal (DWORD i) { unsigned char c1, c2, c3, c4; if (xls_is_bigendian()) { c1 = i & 255; c2 = (i >> 8) & 255; c3 = (i >> 16) & 255; c4 = (i >> 24) & 255; return ((int)c1 << 24) + ((int)c2 << 16) + ((int)c3 << 8) + c4; } else { return i; } } unsigned short xlsShortVal (short s) { unsigned char c1, c2; if (xls_is_bigendian()) { c1 = s & 255; c2 = (s >> 8) & 255; return (c1 << 8) + c2; } else { return s; } } void xlsConvertDouble(unsigned char *d) { unsigned char t; int i; if (xls_is_bigendian()) { for (i=0; i<4; i++) { t = d[7-i]; d[8-i] = d[i]; d[i] = t; } } } void xlsConvertBof(BOF *b) { b->id = xlsShortVal(b->id); b->size = xlsShortVal(b->size); } void xlsConvertBiff(BIFF *b) { b->ver = xlsShortVal(b->ver); b->type = xlsShortVal(b->type); b->id_make = xlsShortVal(b->id_make); b->year = xlsShortVal(b->year); b->flags = xlsIntVal(b->flags); b->min_ver = xlsIntVal(b->min_ver); } void xlsConvertWindow(WIND1 *w) { w->xWn = xlsShortVal(w->xWn); w->yWn = xlsShortVal(w->yWn); w->dxWn = xlsShortVal(w->dxWn); w->dyWn = xlsShortVal(w->dyWn); w->grbit = xlsShortVal(w->grbit); w->itabCur = xlsShortVal(w->itabCur); w->itabFirst = xlsShortVal(w->itabFirst); w->ctabSel = xlsShortVal(w->ctabSel); w->wTabRatio = xlsShortVal(w->wTabRatio); } void xlsConvertSst(SST *s) { s->num = xlsIntVal(s->num); s->numofstr = xlsIntVal(s->numofstr); } void xlsConvertXf5(XF5 *x) { x->font=xlsShortVal(x->font); x->format=xlsShortVal(x->format); x->type=xlsShortVal(x->type); x->align=xlsShortVal(x->align); x->color=xlsShortVal(x->color); x->fill=xlsShortVal(x->fill); x->border=xlsShortVal(x->border); x->linestyle=xlsShortVal(x->linestyle); } void xlsConvertXf8(XF8 *x) { W_ENDIAN(x->font); W_ENDIAN(x->format); W_ENDIAN(x->type); D_ENDIAN(x->linestyle); D_ENDIAN(x->linecolor); W_ENDIAN(x->groundcolor); } void xlsConvertFont(FONT *f) { W_ENDIAN(f->height); W_ENDIAN(f->flag); W_ENDIAN(f->color); W_ENDIAN(f->bold); W_ENDIAN(f->escapement); } void xlsConvertFormat(FORMAT *f) { W_ENDIAN(f->index); } void xlsConvertBoundsheet(BOUNDSHEET *b) { D_ENDIAN(b->filepos); } void xlsConvertColinfo(COLINFO *c) { W_ENDIAN(c->first); W_ENDIAN(c->last); W_ENDIAN(c->width); W_ENDIAN(c->xf); W_ENDIAN(c->flags); } void xlsConvertRow(ROW *r) { W_ENDIAN(r->index); W_ENDIAN(r->fcell); W_ENDIAN(r->lcell); W_ENDIAN(r->height); W_ENDIAN(r->notused); W_ENDIAN(r->notused2); W_ENDIAN(r->flags); W_ENDIAN(r->xf); } void xlsConvertMergedcells(MERGEDCELLS *m) { W_ENDIAN(m->rowf); W_ENDIAN(m->rowl); W_ENDIAN(m->colf); W_ENDIAN(m->coll); } void xlsConvertCol(COL *c) { W_ENDIAN(c->row); W_ENDIAN(c->col); W_ENDIAN(c->xf); } void xlsConvertFormula(FORMULA *f) { W_ENDIAN(f->row); W_ENDIAN(f->col); W_ENDIAN(f->xf); if(f->res == 0xFFFF) { switch(f->resid) { case 0: // string case 1: // bool case 2: // error case 3: // empty string break; default: xlsConvertDouble(&f->resid); break; } } else { xlsConvertDouble(&f->resid); } W_ENDIAN(f->flags); W_ENDIAN(f->len); //fflush(stdout); left over from debugging? } void xlsConvertFormulaArray(FARRAY *f) { W_ENDIAN(f->row1); W_ENDIAN(f->row2); W_ENDIAN(f->col1); W_ENDIAN(f->col2); W_ENDIAN(f->flags); W_ENDIAN(f->len); } void xlsConvertHeader(OLE2Header *h) { unsigned long i; for (i=0; iid)/sizeof(h->id[0]); i++) h->id[i] = xlsIntVal(h->id[i]); for (i=0; iclid)/sizeof(h->clid[0]); i++) h->clid[i] = xlsIntVal(h->clid[i]); h->verminor = xlsShortVal(h->verminor); h->verdll = xlsShortVal(h->verdll); h->byteorder = xlsShortVal(h->byteorder); h->lsectorB = xlsShortVal(h->lsectorB); h->lssectorB = xlsShortVal(h->lssectorB); h->reserved1 = xlsShortVal(h->reserved1); h->reserved2 = xlsIntVal(h->reserved2); h->reserved3 = xlsIntVal(h->reserved3); h->cfat = xlsIntVal(h->cfat); h->dirstart = xlsIntVal(h->dirstart); h->reserved4 = xlsIntVal(h->reserved4); h->sectorcutoff = xlsIntVal(h->sectorcutoff); h->sfatstart = xlsIntVal(h->sfatstart); h->csfat = xlsIntVal(h->csfat); h->difstart = xlsIntVal(h->difstart); h->cdif = xlsIntVal(h->cdif); for (i=0; iMSAT)/sizeof(h->MSAT[0]); i++) h->MSAT[i] = xlsIntVal(h->MSAT[i]); } void xlsConvertPss(PSS* pss) { int i; pss->bsize = xlsShortVal(pss->bsize); pss->left = xlsIntVal(pss->left); pss->right = xlsIntVal(pss->right); pss->child = xlsIntVal(pss->child); for(i=0; i<8; i++) pss->guid[i]=xlsShortVal(pss->guid[i]); pss->userflags = xlsIntVal(pss->userflags); /* TIME_T time[2]; */ pss->sstart = xlsIntVal(pss->sstart); pss->size = xlsIntVal(pss->size); pss->proptype = xlsIntVal(pss->proptype); } readxl/src/Makevars.win0000644000176200001440000000032713442224523014613 0ustar liggesusersPKG_CFLAGS = $(C_VISIBILITY) PKG_CXXFLAGS = $(CXX_VISIBILITY) PKG_CPPFLAGS=-Iwindows -I. -D__USE_MINGW_ANSI_STDIO -DRCPP_DEFAULT_INCLUDE_CALL=false PKG_LIBS=-lRiconv all: clean clean: rm -Rf $(SHLIB) $(OBJECTS) readxl/src/RcppExports.cpp0000644000176200001440000001443013442224523015320 0ustar liggesusers// Generated by using Rcpp::compileAttributes() -> do not edit by hand // Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 #include using namespace Rcpp; // xls_sheets CharacterVector xls_sheets(std::string path); RcppExport SEXP _readxl_xls_sheets(SEXP pathSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< std::string >::type path(pathSEXP); rcpp_result_gen = Rcpp::wrap(xls_sheets(path)); return rcpp_result_gen; END_RCPP } // xls_date_formats std::set xls_date_formats(std::string path); RcppExport SEXP _readxl_xls_date_formats(SEXP pathSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< std::string >::type path(pathSEXP); rcpp_result_gen = Rcpp::wrap(xls_date_formats(path)); return rcpp_result_gen; END_RCPP } // read_xls_ List read_xls_(std::string path, int sheet_i, IntegerVector limits, bool shim, RObject col_names, RObject col_types, std::vector na, bool trim_ws, int guess_max, bool progress); RcppExport SEXP _readxl_read_xls_(SEXP pathSEXP, SEXP sheet_iSEXP, SEXP limitsSEXP, SEXP shimSEXP, SEXP col_namesSEXP, SEXP col_typesSEXP, SEXP naSEXP, SEXP trim_wsSEXP, SEXP guess_maxSEXP, SEXP progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< std::string >::type path(pathSEXP); Rcpp::traits::input_parameter< int >::type sheet_i(sheet_iSEXP); Rcpp::traits::input_parameter< IntegerVector >::type limits(limitsSEXP); Rcpp::traits::input_parameter< bool >::type shim(shimSEXP); Rcpp::traits::input_parameter< RObject >::type col_names(col_namesSEXP); Rcpp::traits::input_parameter< RObject >::type col_types(col_typesSEXP); Rcpp::traits::input_parameter< std::vector >::type na(naSEXP); Rcpp::traits::input_parameter< bool >::type trim_ws(trim_wsSEXP); Rcpp::traits::input_parameter< int >::type guess_max(guess_maxSEXP); Rcpp::traits::input_parameter< bool >::type progress(progressSEXP); rcpp_result_gen = Rcpp::wrap(read_xls_(path, sheet_i, limits, shim, col_names, col_types, na, trim_ws, guess_max, progress)); return rcpp_result_gen; END_RCPP } // xlsx_sheets CharacterVector xlsx_sheets(std::string path); RcppExport SEXP _readxl_xlsx_sheets(SEXP pathSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< std::string >::type path(pathSEXP); rcpp_result_gen = Rcpp::wrap(xlsx_sheets(path)); return rcpp_result_gen; END_RCPP } // xlsx_strings std::vector xlsx_strings(std::string path); RcppExport SEXP _readxl_xlsx_strings(SEXP pathSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< std::string >::type path(pathSEXP); rcpp_result_gen = Rcpp::wrap(xlsx_strings(path)); return rcpp_result_gen; END_RCPP } // xlsx_date_formats std::set xlsx_date_formats(std::string path); RcppExport SEXP _readxl_xlsx_date_formats(SEXP pathSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< std::string >::type path(pathSEXP); rcpp_result_gen = Rcpp::wrap(xlsx_date_formats(path)); return rcpp_result_gen; END_RCPP } // parse_ref IntegerVector parse_ref(std::string ref); RcppExport SEXP _readxl_parse_ref(SEXP refSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< std::string >::type ref(refSEXP); rcpp_result_gen = Rcpp::wrap(parse_ref(ref)); return rcpp_result_gen; END_RCPP } // read_xlsx_ List read_xlsx_(std::string path, int sheet_i, IntegerVector limits, bool shim, RObject col_names, RObject col_types, std::vector na, bool trim_ws, int guess_max, bool progress); RcppExport SEXP _readxl_read_xlsx_(SEXP pathSEXP, SEXP sheet_iSEXP, SEXP limitsSEXP, SEXP shimSEXP, SEXP col_namesSEXP, SEXP col_typesSEXP, SEXP naSEXP, SEXP trim_wsSEXP, SEXP guess_maxSEXP, SEXP progressSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< std::string >::type path(pathSEXP); Rcpp::traits::input_parameter< int >::type sheet_i(sheet_iSEXP); Rcpp::traits::input_parameter< IntegerVector >::type limits(limitsSEXP); Rcpp::traits::input_parameter< bool >::type shim(shimSEXP); Rcpp::traits::input_parameter< RObject >::type col_names(col_namesSEXP); Rcpp::traits::input_parameter< RObject >::type col_types(col_typesSEXP); Rcpp::traits::input_parameter< std::vector >::type na(naSEXP); Rcpp::traits::input_parameter< bool >::type trim_ws(trim_wsSEXP); Rcpp::traits::input_parameter< int >::type guess_max(guess_maxSEXP); Rcpp::traits::input_parameter< bool >::type progress(progressSEXP); rcpp_result_gen = Rcpp::wrap(read_xlsx_(path, sheet_i, limits, shim, col_names, col_types, na, trim_ws, guess_max, progress)); return rcpp_result_gen; END_RCPP } // zip_xml void zip_xml(const std::string& zip_path, const std::string& file_path); RcppExport SEXP _readxl_zip_xml(SEXP zip_pathSEXP, SEXP file_pathSEXP) { BEGIN_RCPP Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< const std::string& >::type zip_path(zip_pathSEXP); Rcpp::traits::input_parameter< const std::string& >::type file_path(file_pathSEXP); zip_xml(zip_path, file_path); return R_NilValue; END_RCPP } static const R_CallMethodDef CallEntries[] = { {"_readxl_xls_sheets", (DL_FUNC) &_readxl_xls_sheets, 1}, {"_readxl_xls_date_formats", (DL_FUNC) &_readxl_xls_date_formats, 1}, {"_readxl_read_xls_", (DL_FUNC) &_readxl_read_xls_, 10}, {"_readxl_xlsx_sheets", (DL_FUNC) &_readxl_xlsx_sheets, 1}, {"_readxl_xlsx_strings", (DL_FUNC) &_readxl_xlsx_strings, 1}, {"_readxl_xlsx_date_formats", (DL_FUNC) &_readxl_xlsx_date_formats, 1}, {"_readxl_parse_ref", (DL_FUNC) &_readxl_parse_ref, 1}, {"_readxl_read_xlsx_", (DL_FUNC) &_readxl_read_xlsx_, 10}, {"_readxl_zip_xml", (DL_FUNC) &_readxl_zip_xml, 2}, {NULL, NULL, 0} }; RcppExport void R_init_readxl(DllInfo *dll) { R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } readxl/src/cran.c0000644000176200001440000000023113442224523013404 0ustar liggesusers#include "cran.h" void Rprintf2(FILE * stream, const char *format, ...) { va_list(ap); va_start(ap, format); Rprintf(format, ap); va_end(ap); } readxl/src/XlsWorkSheet.h0000644000176200001440000003404713442224523015104 0ustar liggesusers#ifndef READXL_XLSWORKSHEET_ #define READXL_XLSWORKSHEET_ #include #include #include "XlsWorkBook.h" #include "Spinner.h" #include "XlsCell.h" #include "ColSpec.h" #include "CellLimits.h" #include "utils.h" const int PROGRESS_TICK = 131072; // 2^17 class XlsWorkSheet { // the host workbook XlsWorkBook wb_; // xls specifics xls::xlsWorkBook* pWB_; xls::xlsWorkSheet* pWS_; // common to xls[x] std::set dateFormats_; std::vector cells_; std::string sheetName_; CellLimits nominal_, actual_; int ncol_, nrow_; Spinner spinner_; public: XlsWorkSheet(const XlsWorkBook wb, int sheet_i, Rcpp::IntegerVector limits, bool shim, bool progress): wb_(wb), nominal_(limits), spinner_(progress) { if (sheet_i >= wb.n_sheets()) { Rcpp::stop("Can't retrieve sheet in position %d, only %d sheet(s) found.", sheet_i + 1, wb.n_sheets()); } sheetName_ = wb.sheets()[sheet_i]; xls::xls_error_t error = xls::LIBXLS_OK; std::string path = wb_.path(); spinner_.spin(); pWB_ = xls_open_file(path.c_str(), "UTF-8", &error); if (!pWB_) { Rcpp::stop( "\n filepath: %s\n libxls error: %s", path, xls::xls_getError(error) ); } spinner_.spin(); pWS_ = xls::xls_getWorkSheet(pWB_, sheet_i); if (pWS_ == NULL) { Rcpp::stop("Sheet '%s' (position %d): cannot be opened", sheetName_, sheet_i + 1); } xls_parseWorkSheet(pWS_); spinner_.spin(); dateFormats_ = wb.dateFormats(); // nominal_ holds user's geometry request loadCells(shim); // nominal_ may have been shifted (case of implicit skipping and n_max) // actual_ reports populated cells inside the nominal_ rectangle // insert shims and update actual_ if (shim) insertShims(); nrow_ = (actual_.minRow() < 0) ? 0 : actual_.maxRow() - actual_.minRow() + 1; ncol_ = (actual_.minCol() < 0) ? 0 : actual_.maxCol() - actual_.minCol() + 1; } ~XlsWorkSheet() { try { xls::xls_close_WS(pWS_); xls::xls_close_WB(pWB_); } catch(...) {} } int ncol() const { return ncol_; } int nrow() const { return nrow_; } Rcpp::CharacterVector colNames(const StringSet &na, const bool trimWs) { Rcpp::CharacterVector out(ncol_); std::vector::iterator xcell = cells_.begin(); int base = xcell->row(); while(xcell != cells_.end() && xcell->row() == base) { xcell->inferType(na, trimWs, dateFormats_); out[xcell->col() - actual_.minCol()] = xcell->asCharSxp(trimWs); xcell++; } return out; } std::vector colTypes(std::vector types, const StringSet &na, const bool trimWs, int guess_max = 1000, bool has_col_names = false) { if (guess_max == 0) { return types; } std::vector::iterator xcell; xcell = has_col_names ? advance_row(cells_) : cells_.begin(); // no cell data to consult re: types if (xcell == cells_.end()) { std::fill(types.begin(), types.end(), COL_BLANK); return types; } std::vector type_known(types.size()); for (size_t j = 0; j < types.size(); j++) { type_known[j] = types[j] != COL_UNKNOWN; } // count is for spinner and checking for interrupt int count = 0; // base is row the data starts on **in the spreadsheet** int base = cells_.begin()->row() + has_col_names; while (xcell != cells_.end() && xcell->row() - base < guess_max) { count++; if (count % PROGRESS_TICK == 0) { spinner_.spin(); Rcpp::checkUserInterrupt(); } int j = xcell->col() - actual_.minCol(); if (type_known[j] || types[j] == COL_TEXT) { xcell++; continue; } xcell->inferType(na, trimWs, dateFormats_); ColType type = as_ColType(xcell->type()); if (type > types[j]) { types[j] = type; } xcell++; } return types; } Rcpp::List readCols(Rcpp::CharacterVector names, const std::vector& types, const StringSet &na, const bool trimWs, bool has_col_names = false) { std::vector::iterator xcell; xcell = has_col_names ? advance_row(cells_) : cells_.begin(); // base is row the data starts on **in the spreadsheet** int base = cells_.begin()->row() + has_col_names; int n = (xcell == cells_.end()) ? 0 : actual_.maxRow() - base + 1; Rcpp::List cols(ncol_); cols.attr("names") = names; for (int j = 0; j < ncol_; ++j) { cols[j] = makeCol(types[j], n); } if (n == 0) { return cols; } // count is for spinner and checking for interrupt int count = 0; while (xcell != cells_.end()) { int i = xcell->row(); int j = xcell->col(); // col to write into int col = j - actual_.minCol(); count++; if (count % PROGRESS_TICK == 0) { spinner_.spin(); Rcpp::checkUserInterrupt(); } if (types[col] == COL_SKIP) { xcell++; continue; } xcell->inferType(na, trimWs, dateFormats_); CellType type = xcell->type(); Rcpp::RObject column = cols[col]; // row to write into int row = i - base; // Fit cell of type x into a column of type y // Conventions: // * process type in same order as enum, unless reason to do otherwise // * access cell contents only via asWhatever() methods switch(types[col]) { case COL_UNKNOWN: case COL_BLANK: case COL_SKIP: break; case COL_LOGICAL: if (type == CELL_DATE) { // print date string here, when/if it's possible to do so Rcpp::warning("Expecting logical in %s: got a date", cellPosition(i, j)); } switch(type) { case CELL_UNKNOWN: case CELL_BLANK: case CELL_LOGICAL: case CELL_DATE: case CELL_NUMERIC: LOGICAL(column)[row] = xcell->asLogical(); break; case CELL_TEXT: { std::string text_string = xcell->asStdString(trimWs); bool text_boolean; if (logicalFromString(text_string, &text_boolean)) { LOGICAL(column)[row] = text_boolean; } else { Rcpp::warning("Expecting logical in %s: got '%s'", cellPosition(i, j), text_string); LOGICAL(column)[row] = NA_LOGICAL; } } break; } break; case COL_DATE: if (type == CELL_LOGICAL) { Rcpp::warning("Expecting date in %s: got boolean", cellPosition(i, j)); } if (type == CELL_NUMERIC) { Rcpp::warning("Coercing numeric to date in %s", cellPosition(i, j)); } if (type == CELL_TEXT) { Rcpp::warning("Expecting date in %s: got '%s'", cellPosition(i, j), xcell->asStdString(trimWs)); } REAL(column)[row] = xcell->asDate(wb_.is1904()); break; case COL_NUMERIC: if (type == CELL_LOGICAL) { Rcpp::warning("Coercing boolean to numeric in %s", cellPosition(i, j)); } if (type == CELL_DATE) { // print date string here, when/if possible Rcpp::warning("Expecting numeric in %s: got a date", cellPosition(i, j)); } switch(type) { case CELL_UNKNOWN: case CELL_BLANK: case CELL_LOGICAL: case CELL_DATE: case CELL_NUMERIC: REAL(column)[row] = xcell->asDouble(); break; case CELL_TEXT: { std::string num_string = xcell->asStdString(trimWs); double num_num; bool success = doubleFromString(num_string, num_num); if (success) { Rcpp::warning("Coercing text to numeric in %s: '%s'", cellPosition(i, j), num_string); REAL(column)[row] = num_num; } else { Rcpp::warning("Expecting numeric in %s: got '%s'", cellPosition(i, j), num_string); REAL(column)[row] = NA_REAL; } } break; } break; case COL_TEXT: // not issuing warnings for NAs or coercion, because "text" is the // fallback column type and there are too many warnings to be helpful SET_STRING_ELT(column, row, xcell->asCharSxp(trimWs)); break; case COL_LIST: switch(type) { case CELL_UNKNOWN: case CELL_BLANK: SET_VECTOR_ELT(column, row, Rf_ScalarLogical(NA_LOGICAL)); break; case CELL_LOGICAL: SET_VECTOR_ELT(column, row, Rf_ScalarLogical(xcell->asLogical())); break; case CELL_DATE: { Rcpp::RObject cell_val = Rf_ScalarReal(xcell->asDate(wb_.is1904())); cell_val.attr("class") = Rcpp::CharacterVector::create("POSIXct", "POSIXt"); cell_val.attr("tzone") = "UTC"; SET_VECTOR_ELT(column, row, cell_val); break; } case CELL_NUMERIC: SET_VECTOR_ELT(column, row, Rf_ScalarReal(xcell->asDouble())); break; case CELL_TEXT: { Rcpp::CharacterVector rStringVector = Rcpp::CharacterVector(1, NA_STRING); SET_STRING_ELT(rStringVector, 0, xcell->asCharSxp(trimWs)); SET_VECTOR_ELT(column, row, rStringVector); break; } } } xcell++; } return removeSkippedColumns(cols, names, types); } private: void loadCells(const bool shim) { // by convention, min_row = -2 means 'read no data' if (nominal_.minRow() < -1) { return; } // count is for spinner and checking for interrupt int count = 0; int nominal_ncol = pWS_->rows.lastcol; int nominal_nrow = pWS_->rows.lastrow; xls::xlsCell *cell; bool nominal_needs_checking = !shim && nominal_.maxRow() >= 0; for (int i = 0; i <= nominal_nrow; ++i) { if (i < nominal_.minRow() || (!nominal_needs_checking && !nominal_.contains(i))) { continue; } for (xls::WORD j = 0; j <= nominal_ncol; ++j) { count++; if (count % PROGRESS_TICK == 0) { spinner_.spin(); Rcpp::checkUserInterrupt(); } if (nominal_needs_checking) { cell = xls_cell(pWS_, (xls::WORD) i, j); if (cell_is_readable(cell)) { if (i > nominal_.minRow()) { // implicit skip nominal_.update( i, i + nominal_.maxRow() - nominal_.minRow(), nominal_.minCol(), nominal_.maxCol() ); } nominal_needs_checking = false; } } if (nominal_.contains(i, j)) { cell = xls_cell(pWS_, (xls::WORD) i, j); if (cell_is_readable(cell)) { cells_.push_back(cell); actual_.update(i, j); } } } } } // shim = TRUE when user specifies geometry via `range` // shim = FALSE when user specifies no geometry or uses `skip` and `n_max` // // nominal_ reflects user's geometry request // actual_ reports populated cells inside the nominal_ rectangle // // When shim = FALSE, we shrink-wrap the data that falls inside // the nominal_ rectangle. // // When shim = TRUE, we may need to insert dummy cells to fill out // the nominal_rectangle. // // actual_ is updated to reflect the insertions void insertShims() { // no cells were loaded if (cells_.empty()) { return; } // Recall cell limits are -1 by convention if the limit is unspecified. // funny_*() functions account for that. // if nominal min row or col is less than actual, // add a shim cell to the front of cells_ bool shim_up = funny_lt(nominal_.minRow(), actual_.minRow()); bool shim_left = funny_lt(nominal_.minCol(), actual_.minCol()); if (shim_up || shim_left) { int ul_row = funny_min(nominal_.minRow(), actual_.minRow()); int ul_col = funny_min(nominal_.minCol(), actual_.minCol()); XlsCell ul_shim(std::make_pair(ul_row, ul_col)); cells_.insert(cells_.begin(), ul_shim); actual_.update(ul_row, ul_col); } // if nominal max row or col is greater than actual, // add a shim cell to the back of cells_ bool shim_down = funny_gt(nominal_.maxRow(), actual_.maxRow()); bool shim_right = funny_gt(nominal_.maxCol(), actual_.maxCol()); if (shim_down || shim_right) { int lr_row = funny_max(nominal_.maxRow(), actual_.maxRow()); int lr_col = funny_max(nominal_.maxCol(), actual_.maxCol()); XlsCell lr_shim(std::make_pair(lr_row, lr_col)); cells_.push_back(lr_shim); actual_.update(lr_row, lr_col); } } bool funny_lt(const int funny, const int val) { return (funny >= 0) && (funny < val); } bool funny_gt(const int funny, const int val) { return (funny >= 0) && (funny > val); } int funny_min(const int funny, const int val) { return funny_lt(funny, val) ? funny : val; } int funny_max(const int funny, const int val) { return funny_gt(funny, val) ? funny : val; } std::vector::iterator advance_row(std::vector& x) { std::vector::iterator it = x.begin(); while (it != x.end() && it->row() == x.begin()->row()) { ++it; } return(it); } // Dimensions reported by xls and cells contained in xls include blank cells // that have formatting, therefore we test explicitly for non-blank cell types // and only load those cells. // 2.4.90 Dimensions p273 of [MS-XLS] bool cell_is_readable(const xls::xlsCell *cell) { return cell && ( cell->id == XLS_RECORD_MULRK || cell->id == XLS_RECORD_NUMBER || cell->id == XLS_RECORD_RK || cell->id == XLS_RECORD_LABELSST || cell->id == XLS_RECORD_LABEL || cell->id == XLS_RECORD_FORMULA || cell->id == XLS_RECORD_FORMULA_ALT || cell->id == XLS_RECORD_BOOLERR ); } }; #endif readxl/src/xls.c0000644000176200001440000014520313442224523013300 0ustar liggesusers/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright 2004 Komarov Valery * Copyright 2006 Christophe Leitienne * Copyright 2008-2017 David Hoerl * Copyright 2013 Bob Colbert * Copyright 2013-2018 Evan Miller * * This file is part of libxls -- A multiplatform, C/C++ library for parsing * Excel(TM) files. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #include "config.h" #include #include #include #include #include #include #include #include #include #include "libxls/endian.h" #include "libxls/xls.h" #ifndef min #define min(a,b) ((a) < (b) ? (a) : (b)) #endif //#define DEBUG_DRAWINGS int xls_debug = 0; static double NumFromRk(DWORD drk); static xls_formula_handler formula_handler; static xls_error_t xls_addSST(xlsWorkBook* pWB, SST* sst, DWORD size); static xls_error_t xls_appendSST(xlsWorkBook* pWB, BYTE* buf, DWORD size); static xls_error_t xls_addFormat(xlsWorkBook* pWB, FORMAT* format, DWORD size); static char* xls_addSheet(xlsWorkBook* pWB, BOUNDSHEET* bs, DWORD size); static xls_error_t xls_addRow(xlsWorkSheet* pWS,ROW* row); static xls_error_t xls_makeTable(xlsWorkSheet* pWS); static struct st_cell_data *xls_addCell(xlsWorkSheet* pWS, BOF* bof, BYTE* buf); static char *xls_addFont(xlsWorkBook* pWB, FONT* font, DWORD size); static xls_error_t xls_addXF8(xlsWorkBook* pWB, XF8* xf); static xls_error_t xls_addXF5(xlsWorkBook* pWB, XF5* xf); static xls_error_t xls_addColinfo(xlsWorkSheet* pWS, COLINFO* colinfo); static xls_error_t xls_mergedCells(xlsWorkSheet* pWS, BOF* bof, BYTE* buf); static xls_error_t xls_preparseWorkSheet(xlsWorkSheet* pWS); static xls_error_t xls_formatColumn(xlsWorkSheet* pWS); static void xls_dumpSummary(char *buf, int isSummary, xlsSummaryInfo *pSI); #if defined(_AIX) || defined(__sun) #pragma pack(1) #else #pragma pack(push, 1) #endif typedef struct { uint32_t format[4]; uint32_t offset; } sectionList; typedef struct { uint16_t sig; uint16_t _empty; uint32_t os; uint32_t format[4]; uint32_t count; sectionList secList[1]; } header; typedef struct { uint32_t propertyID; uint32_t sectionOffset; } propertyList; typedef struct { uint32_t length; uint32_t numProperties; propertyList properties[1]; } sectionHeader; typedef struct { uint32_t propertyID; uint32_t data[1]; } property; #pragma pack(pop) int xls(int debug) { xls_debug = debug; return 1; } static xls_error_t xls_addSST(xlsWorkBook* pWB,SST* sst,DWORD size) { verbose("xls_addSST"); pWB->sst.continued=0; pWB->sst.lastln=0; pWB->sst.lastid=0; pWB->sst.lastrt=0; pWB->sst.lastsz=0; if (sst->num > (1<<24)) return LIBXLS_ERROR_MALLOC; if (pWB->sst.string) return LIBXLS_ERROR_PARSE; if ((pWB->sst.string = calloc(pWB->sst.count = sst->num, sizeof(struct str_sst_string))) == NULL) return LIBXLS_ERROR_MALLOC; return xls_appendSST(pWB, sst->strings, size - offsetof(SST, strings)); } static xls_error_t xls_appendSST(xlsWorkBook* pWB, BYTE* buf, DWORD size) { DWORD ln; // String character count DWORD ofs; // Current offset in SST buffer DWORD rt; // Count of rich text formatting runs DWORD sz; // Size of asian phonetic settings block BYTE flag; // String flags char* ret = NULL; if (xls_debug) { printf("xls_appendSST %u\n", size); } sz = rt = ln = 0; // kch ofs=0; while(ofssst.continued) { ln=pWB->sst.lastln; rt=pWB->sst.lastrt; sz=pWB->sst.lastsz; } else { if (ofs + 2 > size) { return LIBXLS_ERROR_PARSE; } ln = buf[ofs+0] + (buf[ofs+1] << 8); rt = 0; sz = 0; ofs+=2; } if (xls_debug) { printf("ln=%u\n", ln); } // Read flags if ( !pWB->sst.continued || (pWB->sst.continued && ln != 0) ) { if (ofs + sizeof(BYTE) > size) { return LIBXLS_ERROR_PARSE; } flag=*(BYTE *)(buf+ofs); ofs++; // Count of rich text formatting runs if (flag & 0x8) { if (ofs + sizeof(WORD) > size) { return LIBXLS_ERROR_PARSE; } rt = buf[ofs+0] + (buf[ofs+1] << 8); ofs+=2; } // Size of asian phonetic settings block if (flag & 0x4) { if (ofs + sizeof(DWORD) > size) { return LIBXLS_ERROR_PARSE; } sz = buf[ofs+0] + (buf[ofs+1] << 8) + (buf[ofs+2] << 16) + ((DWORD)buf[ofs+3] << 24); ofs+=4; if (xls_debug) { printf("sz=%u\n", sz); } } } else { flag = 0; } // Read characters (compressed or not) ln_toread = 0; if (ln > 0) { if (flag & 0x1) { size_t new_len = 0; ln_toread = min((size-ofs)/2, ln); ret=unicode_decode((char *)buf+ofs,ln_toread*2,&new_len,pWB->charset); if (ret == NULL) { ret = strdup("*failed to decode utf16*"); new_len = strlen(ret); } ret = realloc(ret,new_len+1); ret[new_len]=0; ln -= ln_toread; ofs+=ln_toread*2; if (xls_debug) { printf("String16SST: %s(%lu)\n", ret, (unsigned long)new_len); } } else { ln_toread = min((size-ofs), ln); ret = utf8_decode((char *)buf+ofs, ln_toread, pWB->charset); ln -= ln_toread; ofs += ln_toread; if (xls_debug) { printf("String8SST: %s(%u) \n",ret,ln); } } } else { ret = strdup(""); } if (ln_toread > 0 || !pWB->sst.continued) { // Concat string if it's a continue, or add string in table if (!pWB->sst.continued) { if (pWB->sst.lastid >= pWB->sst.count) { free(ret); return LIBXLS_ERROR_PARSE; } pWB->sst.lastid++; pWB->sst.string[pWB->sst.lastid-1].str=ret; } else { char *tmp = pWB->sst.string[pWB->sst.lastid-1].str; if (tmp == NULL) { free(ret); return LIBXLS_ERROR_PARSE; } tmp = realloc(tmp, strlen(tmp)+strlen(ret)+1); if (tmp == NULL) { free(ret); return LIBXLS_ERROR_MALLOC; } pWB->sst.string[pWB->sst.lastid-1].str=tmp; memcpy(tmp+strlen(tmp), ret, strlen(ret)+1); free(ret); } if (xls_debug) { printf("String %4u: %s\n", pWB->sst.lastid-1, pWB->sst.string[pWB->sst.lastid-1].str); } } else { free(ret); } // Jump list of rich text formatting runs if (ofs < size && rt > 0) { int rt_toread = min((size-ofs)/4, rt); rt -= rt_toread; ofs += rt_toread*4; } // Jump asian phonetic settings block if (ofs < size && sz > 0) { int sz_toread = min((size-ofs), sz); sz -= sz_toread; ofs += sz_toread; } pWB->sst.continued=0; } // Save current character count and count of rich text formatting runs and size of asian phonetic settings block if (ln > 0 || rt > 0 || sz > 0) { pWB->sst.continued = 1; pWB->sst.lastln = ln; pWB->sst.lastrt = rt; pWB->sst.lastsz = sz; if (xls_debug) { printf("continued: ln=%u, rt=%u, sz=%u\n", ln, rt, sz); } } return LIBXLS_OK; } static double NumFromRk(DWORD drk) { double ret; // What kind of value is this ? if (drk & 0x02) { // Integer value int tmp = (int)drk >> 2; // cast to keep it negative in < 0 ret = (double)tmp; } else { // Floating point value; unsigned64_t tmp = drk & 0xfffffffc; tmp <<= 32; memcpy(&ret, &tmp, sizeof(unsigned64_t)); } // Is value multiplied by 100 ? if (drk & 0x01) { ret /= 100.0; } return ret; } static char * xls_addSheet(xlsWorkBook* pWB, BOUNDSHEET *bs, DWORD size) { char * name; DWORD filepos; BYTE visible, type; filepos = bs->filepos; visible = bs->visible; type = bs->type; // printf("charset=%s uni=%d\n", pWB->charset, unicode); // printf("bs name %.*s\n", bs->name[0], bs->name+1); name = get_string(bs->name, size - offsetof(BOUNDSHEET, name), 0, pWB->is5ver, pWB->charset); // printf("name=%s\n", name); if(xls_debug) { printf ("xls_addSheet[0x%x]\n", type); switch (type & 0x0f) { case 0x00: /* worksheet or dialog sheet */ printf ("85: Worksheet or dialog sheet\n"); break; case 0x01: /* Microsoft Excel 4.0 macro sheet */ printf ("85: Microsoft Excel 4.0 macro sheet\n"); break; case 0x02: /* Chart */ printf ("85: Chart sheet\n"); break; case 0x06: /* Visual Basic module */ printf ("85: Visual Basic sheet\n"); break; default: printf ("???\n"); break; } printf("visible: %x\n", visible); printf(" Pos: %Xh\n",filepos); printf(" type: %.4Xh\n",type); printf(" name: %s\n", name); } pWB->sheets.sheet = realloc(pWB->sheets.sheet,(pWB->sheets.count+1)*sizeof (struct st_sheet_data)); if (pWB->sheets.sheet == NULL) return NULL; pWB->sheets.sheet[pWB->sheets.count].name=name; pWB->sheets.sheet[pWB->sheets.count].filepos=filepos; pWB->sheets.sheet[pWB->sheets.count].visibility=visible; pWB->sheets.sheet[pWB->sheets.count].type=type; pWB->sheets.count++; return name; } static xls_error_t xls_addRow(xlsWorkSheet* pWS,ROW* row) { struct st_row_data* tmp; //verbose ("xls_addRow"); if (row->index > pWS->rows.lastrow) return LIBXLS_ERROR_PARSE; tmp=&pWS->rows.row[row->index]; tmp->height=row->height; tmp->fcell=row->fcell; tmp->lcell=row->lcell; tmp->flags=row->flags; tmp->xf=row->xf&0xfff; tmp->xfflags=(row->xf >> 8)&0xf0; if(xls_debug) xls_showROW(tmp); return LIBXLS_OK; } static xls_error_t xls_makeTable(xlsWorkSheet* pWS) { DWORD i,t; struct st_row_data* tmp; verbose ("xls_makeTable"); if ((pWS->rows.row = calloc((pWS->rows.lastrow+1),sizeof(struct st_row_data))) == NULL) return LIBXLS_ERROR_MALLOC; // printf("ALLOC: rows=%d cols=%d\n", pWS->rows.lastrow, pWS->rows.lastcol); for (t=0;t<=pWS->rows.lastrow;t++) { tmp=&pWS->rows.row[t]; tmp->index=t; tmp->fcell=0; tmp->lcell=pWS->rows.lastcol; tmp->cells.count = pWS->rows.lastcol+1; if ((tmp->cells.cell = calloc(tmp->cells.count, sizeof(struct st_cell_data))) == NULL) return LIBXLS_ERROR_MALLOC; for (i=0;i<=pWS->rows.lastcol;i++) { tmp->cells.cell[i].col = i; tmp->cells.cell[i].row = t; tmp->cells.cell[i].width = pWS->defcolwidth; tmp->cells.cell[i].id = XLS_RECORD_BLANK; } } return LIBXLS_OK; } int xls_isCellTooSmall(xlsWorkBook* pWB, BOF* bof, BYTE* buf) { if (bof->size < sizeof(COL)) return 1; if (bof->id == XLS_RECORD_FORMULA || bof->id == XLS_RECORD_FORMULA_ALT) return (bof->size < sizeof(FORMULA)); if (bof->id == XLS_RECORD_MULRK) return (bof->size < offsetof(MULRK, rk)); if (bof->id == XLS_RECORD_MULBLANK) return (bof->size < offsetof(MULBLANK, xf)); if (bof->id == XLS_RECORD_LABELSST) return (bof->size < offsetof(LABEL, value) + (pWB->is5ver ? 2 : 4)); if (bof->id == XLS_RECORD_LABEL) { if (bof->size < offsetof(LABEL, value) + 2) return 1; size_t label_len = ((LABEL*)buf)->value[0] + (((LABEL*)buf)->value[1] << 8); if (pWB->is5ver) { return (bof->size < offsetof(LABEL, value) + 2 + label_len); } if (bof->size < offsetof(LABEL, value) + 3) return 1; if ((((LABEL*)buf)->value[2] & 0x01) == 0) { return (bof->size < offsetof(LABEL, value) + 3 + label_len); } return (bof->size < offsetof(LABEL, value) + 3 + 2 * label_len); } if (bof->id == XLS_RECORD_RK) return (bof->size < sizeof(RK)); if (bof->id == XLS_RECORD_NUMBER) return (bof->size < sizeof(BR_NUMBER)); if (bof->id == XLS_RECORD_BOOLERR) return (bof->size < sizeof(BOOLERR)); return 0; } void xls_cell_set_str(struct st_cell_data *cell, char *str) { if (cell->str) { free(cell->str); } cell->str = str; } static struct st_cell_data *xls_addCell(xlsWorkSheet* pWS,BOF* bof,BYTE* buf) { struct st_cell_data* cell; struct st_row_data* row; WORD col; int i; verbose ("xls_addCell"); if (xls_isCellTooSmall(pWS->workbook, bof, buf)) return NULL; // printf("ROW: %u COL: %u\n", xlsShortVal(((COL*)buf)->row), xlsShortVal(((COL*)buf)->col)); row=&pWS->rows.row[xlsShortVal(((COL*)buf)->row)]; col = xlsShortVal(((COL*)buf)->col); if (col >= row->cells.count) { if (xls_debug) fprintf(stderr, "Error: Column index out of bounds\n"); return NULL; } cell = &row->cells.cell[col]; cell->id=bof->id; cell->xf=xlsShortVal(((COL*)buf)->xf); switch (bof->id) { case XLS_RECORD_FORMULA: case XLS_RECORD_FORMULA_ALT: xlsConvertFormula((FORMULA *)buf); cell->id=XLS_RECORD_FORMULA; if (((FORMULA*)buf)->res!=0xffff) { // if a double, then set double and clear l cell->l=0; memcpy(&cell->d, &((FORMULA*)buf)->resid, sizeof(double)); // Required for ARM cell->id = XLS_RECORD_NUMBER; // hack xls_cell_set_str(cell, xls_getfcell(pWS->workbook,cell, NULL)); cell->id = bof->id; } else { double d = ((FORMULA*)buf)->resdata[1]; cell->l = 0xFFFF; switch(((FORMULA*)buf)->resid) { case 0: // String break; // cell is half complete, get the STRING next record case 1: // Boolean memcpy(&cell->d, &d, sizeof(double)); // Required for ARM xls_cell_set_str(cell, strdup("bool")); break; case 2: // error memcpy(&cell->d, &d, sizeof(double)); // Required for ARM xls_cell_set_str(cell, strdup("error")); break; case 3: // empty string xls_cell_set_str(cell, strdup("")); break; } } if(formula_handler) formula_handler(bof->id, bof->size, buf); break; case XLS_RECORD_MULRK: for (i = 0; i < (bof->size - 6)/6; i++) // 6 == 2 row + 2 col + 2 trailing index { WORD index = col + i; if(index >= row->cells.count) { if (xls_debug) fprintf(stderr, "Error: MULTI-RK index out of bounds\n"); return NULL; } cell=&row->cells.cell[index]; cell->id=XLS_RECORD_RK; cell->xf=xlsShortVal(((MULRK*)buf)->rk[i].xf); cell->d=NumFromRk(xlsIntVal(((MULRK*)buf)->rk[i].value)); xls_cell_set_str(cell, xls_getfcell(pWS->workbook,cell, NULL)); } break; case XLS_RECORD_MULBLANK: for (i = 0; i < (bof->size - 6)/2; i++) // 6 == 2 row + 2 col + 2 trailing index { WORD index = col + i; if(index >= row->cells.count) { if (xls_debug) fprintf(stderr, "Error: MULTI-BLANK index out of bounds\n"); return NULL; } cell=&row->cells.cell[index]; cell->id=XLS_RECORD_BLANK; cell->xf=xlsShortVal(((MULBLANK*)buf)->xf[i]); xls_cell_set_str(cell, xls_getfcell(pWS->workbook,cell, NULL)); } break; case XLS_RECORD_LABELSST: case XLS_RECORD_LABEL: xls_cell_set_str(cell, xls_getfcell(pWS->workbook, cell, ((LABEL*)buf)->value)); if (cell->str) { sscanf((char *)cell->str, "%d", &cell->l); sscanf((char *)cell->str, "%lf", &cell->d); } break; case XLS_RECORD_RK: cell->d=NumFromRk(xlsIntVal(((RK*)buf)->value)); xls_cell_set_str(cell, xls_getfcell(pWS->workbook,cell, NULL)); break; case XLS_RECORD_BLANK: break; case XLS_RECORD_NUMBER: xlsConvertDouble((BYTE *)&((BR_NUMBER*)buf)->value); memcpy(&cell->d, &((BR_NUMBER*)buf)->value, sizeof(double)); // Required for ARM xls_cell_set_str(cell, xls_getfcell(pWS->workbook,cell, NULL)); break; case XLS_RECORD_BOOLERR: cell->d = ((BOOLERR *)buf)->value; if (((BOOLERR *)buf)->iserror) { xls_cell_set_str(cell, strdup("error")); } else { xls_cell_set_str(cell, strdup("bool")); } break; default: xls_cell_set_str(cell, xls_getfcell(pWS->workbook,cell, NULL)); break; } if (xls_debug) xls_showCell(cell); return cell; } static char *xls_addFont(xlsWorkBook* pWB, FONT* font, DWORD size) { struct st_font_data* tmp; verbose("xls_addFont"); pWB->fonts.font = realloc(pWB->fonts.font,(pWB->fonts.count+1)*sizeof(struct st_font_data)); if (pWB->fonts.font == NULL) return NULL; tmp=&pWB->fonts.font[pWB->fonts.count]; tmp->name = get_string(font->name, size - offsetof(FONT, name), 0, pWB->is5ver, pWB->charset); tmp->height=font->height; tmp->flag=font->flag; tmp->color=font->color; tmp->bold=font->bold; tmp->escapement=font->escapement; tmp->underline=font->underline; tmp->family=font->family; tmp->charset=font->charset; // xls_showFont(tmp); pWB->fonts.count++; return tmp->name; } static xls_error_t xls_addFormat(xlsWorkBook* pWB, FORMAT* format, DWORD size) { struct st_format_data* tmp; verbose("xls_addFormat"); pWB->formats.format = realloc(pWB->formats.format, (pWB->formats.count+1)*sizeof(struct st_format_data)); if (pWB->formats.format == NULL) return LIBXLS_ERROR_MALLOC; tmp = &pWB->formats.format[pWB->formats.count]; tmp->index = format->index; tmp->value = get_string(format->value, size - offsetof(FORMAT, value), (BYTE)!pWB->is5ver, (BYTE)pWB->is5ver, pWB->charset); if(xls_debug) xls_showFormat(tmp); pWB->formats.count++; return LIBXLS_OK; } static xls_error_t xls_addXF8(xlsWorkBook* pWB,XF8* xf) { struct st_xf_data* tmp; verbose("xls_addXF"); pWB->xfs.xf= realloc(pWB->xfs.xf, (pWB->xfs.count+1)*sizeof(struct st_xf_data)); if (pWB->xfs.xf == NULL) return LIBXLS_ERROR_MALLOC; tmp=&pWB->xfs.xf[pWB->xfs.count]; tmp->font=xf->font; tmp->format=xf->format; tmp->type=xf->type; tmp->align=xf->align; tmp->rotation=xf->rotation; tmp->ident=xf->ident; tmp->usedattr=xf->usedattr; tmp->linestyle=xf->linestyle; tmp->linecolor=xf->linecolor; tmp->groundcolor=xf->groundcolor; // xls_showXF(tmp); pWB->xfs.count++; return LIBXLS_OK; } static xls_error_t xls_addXF5(xlsWorkBook* pWB,XF5* xf) { struct st_xf_data* tmp; verbose("xls_addXF"); pWB->xfs.xf = realloc(pWB->xfs.xf, (pWB->xfs.count+1)*sizeof(struct st_xf_data)); if (pWB->xfs.xf == NULL) return LIBXLS_ERROR_MALLOC; tmp=&pWB->xfs.xf[pWB->xfs.count]; tmp->font=xf->font; tmp->format=xf->format; tmp->type=xf->type; tmp->align=(BYTE)xf->align; /* tmp->rotation=xf->rotation; tmp->ident=xf->ident; tmp->usedattr=xf->usedattr; tmp->linestyle=xf->linestyle; tmp->linecolor=xf->linecolor; tmp->groundcolor=xf->groundcolor; */ // xls_showXF(tmp); pWB->xfs.count++; return LIBXLS_OK; } static xls_error_t xls_addColinfo(xlsWorkSheet* pWS,COLINFO* colinfo) { struct st_colinfo_data* tmp; verbose("xls_addColinfo"); pWS->colinfo.col = realloc(pWS->colinfo.col,(pWS->colinfo.count+1)*sizeof(struct st_colinfo_data)); if (pWS->colinfo.col == NULL) return LIBXLS_ERROR_MALLOC; tmp=&pWS->colinfo.col[pWS->colinfo.count]; tmp->first=colinfo->first; tmp->last=colinfo->last; tmp->width=colinfo->width; tmp->xf=colinfo->xf; tmp->flags=colinfo->flags; if(xls_debug) xls_showColinfo(tmp); pWS->colinfo.count++; return LIBXLS_OK; } static xls_error_t xls_mergedCells(xlsWorkSheet* pWS,BOF* bof,BYTE* buf) { if (bof->size < sizeof(WORD)) return LIBXLS_ERROR_PARSE; int count = buf[0] + (buf[1] << 8); DWORD limit = sizeof(WORD)+count*sizeof(struct MERGEDCELLS); if(limit > (DWORD)bof->size) { verbose("Merged Cells Count out of range"); return LIBXLS_ERROR_PARSE; } int i,c,r; struct MERGEDCELLS *span; verbose("Merged Cells"); for (i=0;icolf,span->rowf,span->coll,span->rowl); // Sanity check: if(!( span->rowf <= span->rowl && span->rowl <= pWS->rows.lastrow && span->colf <= span->coll && span->coll <= pWS->rows.lastcol )) { return LIBXLS_ERROR_PARSE; } for (r=span->rowf;r<=span->rowl;r++) for (c=span->colf;c<=span->coll;c++) pWS->rows.row[r].cells.cell[c].isHidden=1; pWS->rows.row[span->rowf].cells.cell[span->colf].colspan=(span->coll-span->colf+1); pWS->rows.row[span->rowf].cells.cell[span->colf].rowspan=(span->rowl-span->rowf+1); pWS->rows.row[span->rowf].cells.cell[span->colf].isHidden=0; } return LIBXLS_OK; } int xls_isRecordTooSmall(xlsWorkBook *pWB, BOF *bof1) { switch (bof1->id) { case XLS_RECORD_BOF: // BIFF5-8 return (bof1->size < 2 * sizeof(WORD)); case XLS_RECORD_CODEPAGE: return (bof1->size < sizeof(WORD)); case XLS_RECORD_WINDOW1: return (bof1->size < sizeof(WIND1)); case XLS_RECORD_SST: return (bof1->size < offsetof(SST, strings)); case XLS_RECORD_BOUNDSHEET: return (bof1->size < offsetof(BOUNDSHEET, name)); case XLS_RECORD_XF: if(pWB->is5ver) { return (bof1->size < sizeof(XF5)); } return (bof1->size < sizeof(XF8)); case XLS_RECORD_FONT: case XLS_RECORD_FONT_ALT: return (bof1->size < offsetof(FONT, name)); case XLS_RECORD_FORMAT: return (bof1->size < offsetof(FORMAT, value)); case XLS_RECORD_1904: return (bof1->size < sizeof(BYTE)); default: break; } return 0; } xls_error_t xls_parseWorkBook(xlsWorkBook* pWB) { BOF bof1 = { .id = 0, .size = 0 }; BOF bof2 = { .id = 0, .size = 0 }; BYTE* buf = NULL; BYTE once = 0; xls_error_t retval = LIBXLS_OK; verbose ("xls_parseWorkBook"); do { if(xls_debug > 10) { printf("READ WORKBOOK filePos=%ld\n", (long)pWB->filepos); printf(" OLE: start=%d pos=%u size=%u fatPos=%u\n", pWB->olestr->start, (unsigned int)pWB->olestr->pos, (unsigned int)pWB->olestr->size, (unsigned int)pWB->olestr->fatpos); } if (ole2_read(&bof1, 1, 4, pWB->olestr) != 4) { retval = LIBXLS_ERROR_READ; goto cleanup; } xlsConvertBof(&bof1); if(xls_debug) xls_showBOF(&bof1); if (bof1.size) { if ((buf = realloc(buf, bof1.size)) == NULL) { if (xls_debug) fprintf(stderr, "Error: failed to allocate buffer of size %d\n", (int)bof1.size); retval = LIBXLS_ERROR_MALLOC; goto cleanup; } if (ole2_read(buf, 1, bof1.size, pWB->olestr) != bof1.size) { if (xls_debug) fprintf(stderr, "Error: failed to read OLE block\n"); retval = LIBXLS_ERROR_READ; goto cleanup; } } if (xls_isRecordTooSmall(pWB, &bof1)) { retval = LIBXLS_ERROR_PARSE; goto cleanup; } switch (bof1.id) { case XLS_RECORD_EOF: //verbose("EOF"); break; case XLS_RECORD_BOF: // BIFF5-8 pWB->is5ver = (buf[0] + (buf[1] << 8) != 0x600); pWB->type = buf[2] + (buf[3] << 8); if(xls_debug) { printf("version: %s\n", pWB->is5ver ? "BIFF5" : "BIFF8" ); printf(" type: %.2X\n", pWB->type); } break; case XLS_RECORD_CODEPAGE: pWB->codepage = buf[0] + (buf[1] << 8); if(xls_debug) printf("codepage=%x\n", pWB->codepage); break; case XLS_RECORD_CONTINUE: if(once) { if (bof2.id==XLS_RECORD_SST) { if ((retval = xls_appendSST(pWB,buf,bof1.size)) != LIBXLS_OK) goto cleanup; } bof1=bof2; } break; case XLS_RECORD_WINDOW1: { WIND1 *w = (WIND1*)buf; xlsConvertWindow(w); pWB->activeSheetIdx = w->itabCur; if(xls_debug) { printf("WINDOW1: "); printf("xWn : %d\n", w->xWn/20); printf("yWn : %d\n", w->yWn/20); printf("dxWn : %d\n", w->dxWn/20); printf("dyWn : %d\n", w->dyWn/20); printf("grbit : %d\n", w->grbit); printf("itabCur: %d\n", w->itabCur); printf("itabFi : %d\n", w->itabFirst); printf("ctabSel: %d\n", w->ctabSel); printf("wTabRat: %d\n", w->wTabRatio); } } break; case XLS_RECORD_SST: //printf("ADD SST\n"); xlsConvertSst((SST *)buf); if ((retval = xls_addSST(pWB,(SST*)buf,bof1.size)) != LIBXLS_OK) { goto cleanup; } break; case XLS_RECORD_EXTSST: break; case XLS_RECORD_BOUNDSHEET: { //printf("ADD SHEET\n"); BOUNDSHEET *bs = (BOUNDSHEET *)buf; xlsConvertBoundsheet(bs); //char *s; // different for BIFF5 and BIFF8 /*s = */ xls_addSheet(pWB, bs, bof1.size); } break; case XLS_RECORD_XF: if(pWB->is5ver) { XF5 *xf; xf = (XF5 *)buf; xlsConvertXf5(xf); if ((retval = xls_addXF5(pWB,xf)) != LIBXLS_OK) { goto cleanup; } if(xls_debug) { printf(" font: %d\n", xf->font); printf(" format: %d\n", xf->format); printf(" type: %.4x\n", xf->type); printf(" align: %.4x\n", xf->align); printf("rotatio: %.4x\n", xf->color); printf(" ident: %.4x\n", xf->fill); printf("usedatt: %.4x\n", xf->border); printf("linesty: %.4x\n", xf->linestyle); } } else { XF8 *xf; xf = (XF8 *)buf; xlsConvertXf8(xf); if ((retval = xls_addXF8(pWB,xf)) != LIBXLS_OK) { goto cleanup; } if(xls_debug) { xls_showXF(xf); } } break; case XLS_RECORD_FONT: case XLS_RECORD_FONT_ALT: { char *s; FONT *f = (FONT*)buf; xlsConvertFont(f); s = xls_addFont(pWB,f, bof1.size); if(xls_debug) { printf(" height: %d\n", f->height); printf(" flag: 0x%x\n", f->flag); printf(" color: 0x%x\n", f->color); printf(" weight: %d\n", f->bold); printf("escapem: 0x%x\n", f->escapement); printf("underln: 0x%x\n", f->underline); printf(" family: 0x%x\n", f->family); printf("charset: 0x%x\n", f->charset); if(s) printf(" name: %s\n", s); } } break; case XLS_RECORD_FORMAT: xlsConvertFormat((FORMAT *)buf); if ((retval = xls_addFormat(pWB, (FORMAT*)buf, bof1.size)) != LIBXLS_OK) { goto cleanup; } break; case XLS_RECORD_STYLE: if(xls_debug) { struct { unsigned short idx; unsigned char ident; unsigned char lvl; } *styl; styl = (void *)buf; printf(" idx: 0x%x\n", styl->idx & 0x07FF); if(styl->idx & 0x8000) { printf(" ident: 0x%x\n", styl->ident); printf(" level: 0x%x\n", styl->lvl); } else { char *s = get_string((char *)&buf[2], bof1.size - 2, 1, pWB->is5ver, pWB->charset); printf(" name=%s\n", s); free(s); } } break; case XLS_RECORD_PALETTE: if(xls_debug > 10) { unsigned char *p = buf + 2; int idx, len; len = buf[0] + (buf[1] << 8); for(idx=0; idxis1904 = *(BYTE *)buf; // the field is a short, but with little endian the first byte is 0 or 1 if(xls_debug) { printf(" mode: 0x%x\n", pWB->is1904); } break; case XLS_RECORD_DEFINEDNAME: if(xls_debug) { int i; printf(" DEFINEDNAME: "); for(i=0; iolestr->eof)&&(bof1.id!=XLS_RECORD_EOF)); cleanup: if (buf) free(buf); return retval; } static xls_error_t xls_preparseWorkSheet(xlsWorkSheet* pWS) { BOF tmp; BYTE* buf = NULL; xls_error_t retval = LIBXLS_OK; verbose ("xls_preparseWorkSheet"); if (ole2_seek(pWS->workbook->olestr,pWS->filepos) == -1) { retval = LIBXLS_ERROR_SEEK; goto cleanup; } do { size_t read; if((read = ole2_read(&tmp, 1, 4, pWS->workbook->olestr)) != 4) { if (xls_debug) fprintf(stderr, "Error: failed to read OLE size\n"); retval = LIBXLS_ERROR_READ; goto cleanup; } xlsConvertBof(&tmp); if (tmp.size) { if ((buf = realloc(buf, tmp.size)) == NULL) { if (xls_debug) fprintf(stderr, "Error: failed to allocate buffer of size %d\n", (int)tmp.size); retval = LIBXLS_ERROR_MALLOC; goto cleanup; } if((read = ole2_read(buf, 1, tmp.size, pWS->workbook->olestr)) != tmp.size) { if (xls_debug) fprintf(stderr, "Error: failed to read OLE block\n"); retval = LIBXLS_ERROR_READ; goto cleanup; } } switch (tmp.id) { case XLS_RECORD_DEFCOLWIDTH: if (tmp.size < sizeof(WORD)) { retval = LIBXLS_ERROR_PARSE; goto cleanup; } pWS->defcolwidth = (buf[0] << 8) + (buf[1] << 16); break; case XLS_RECORD_COLINFO: if (tmp.size < sizeof(COLINFO)) { retval = LIBXLS_ERROR_PARSE; goto cleanup; } xlsConvertColinfo((COLINFO*)buf); if ((retval = xls_addColinfo(pWS,(COLINFO*)buf)) != LIBXLS_OK) goto cleanup; break; case XLS_RECORD_ROW: if (tmp.size < sizeof(ROW)) { retval = LIBXLS_ERROR_PARSE; goto cleanup; } xlsConvertRow((ROW*)buf); if (pWS->rows.lastcol<((ROW*)buf)->lcell) pWS->rows.lastcol=((ROW*)buf)->lcell; if (pWS->rows.lastrow<((ROW*)buf)->index) pWS->rows.lastrow=((ROW*)buf)->index; break; /* If the ROW record is incorrect or missing, infer the information from * cell data. */ case XLS_RECORD_MULRK: if (xls_isCellTooSmall(pWS->workbook, &tmp, buf)) { retval = LIBXLS_ERROR_PARSE; goto cleanup; } if (pWS->rows.lastcolcol) + (tmp.size - 6)/6 - 1) pWS->rows.lastcol=xlsShortVal(((MULRK*)buf)->col) + (tmp.size - 6)/6 - 1; if (pWS->rows.lastrowrow)) pWS->rows.lastrow=xlsShortVal(((MULRK*)buf)->row); break; case XLS_RECORD_MULBLANK: if (xls_isCellTooSmall(pWS->workbook, &tmp, buf)) { retval = LIBXLS_ERROR_PARSE; goto cleanup; } if (pWS->rows.lastcolcol) + (tmp.size - 6)/2 - 1) pWS->rows.lastcol=xlsShortVal(((MULBLANK*)buf)->col) + (tmp.size - 6)/2 - 1; if (pWS->rows.lastrowrow)) pWS->rows.lastrow=xlsShortVal(((MULBLANK*)buf)->row); break; case XLS_RECORD_NUMBER: case XLS_RECORD_RK: case XLS_RECORD_LABELSST: case XLS_RECORD_BLANK: case XLS_RECORD_LABEL: case XLS_RECORD_FORMULA: case XLS_RECORD_FORMULA_ALT: case XLS_RECORD_BOOLERR: if (xls_isCellTooSmall(pWS->workbook, &tmp, buf)) { retval = LIBXLS_ERROR_PARSE; goto cleanup; } if (pWS->rows.lastcolcol)) pWS->rows.lastcol=xlsShortVal(((COL*)buf)->col); if (pWS->rows.lastrowrow)) pWS->rows.lastrow=xlsShortVal(((COL*)buf)->row); break; } if (pWS->rows.lastcol > 256) { retval = LIBXLS_ERROR_PARSE; goto cleanup; } } while ((!pWS->workbook->olestr->eof)&&(tmp.id!=XLS_RECORD_EOF)); cleanup: if (buf) free(buf); return retval; } static xls_error_t xls_formatColumn(xlsWorkSheet* pWS) { DWORD i,t,ii; DWORD fcol,lcol; WORD width; BYTE isHidden; for (i=0;icolinfo.count;i++) { width = pWS->colinfo.col[i].width; isHidden = (pWS->colinfo.col[i].flags&1); if (pWS->colinfo.col[i].first<=pWS->rows.lastcol) fcol=pWS->colinfo.col[i].first; else fcol=pWS->rows.lastcol; if (pWS->colinfo.col[i].last<=pWS->rows.lastcol) lcol=pWS->colinfo.col[i].last; else lcol=pWS->rows.lastcol; for (ii=0;ii<=pWS->rows.lastrow;ii++) { for (t=fcol;t<=lcol;t++) { pWS->rows.row[ii].cells.cell[t].isHidden |= isHidden; pWS->rows.row[ii].cells.cell[t].width = width; } } } return LIBXLS_OK; } xls_error_t xls_parseWorkSheet(xlsWorkSheet* pWS) { BOF tmp; BYTE* buf = NULL; long offset = pWS->filepos; size_t read; xls_error_t retval = 0; struct st_cell_data *cell = NULL; xlsWorkBook *pWB = pWS->workbook; verbose ("xls_parseWorkSheet"); if ((retval = xls_preparseWorkSheet(pWS)) != LIBXLS_OK) { goto cleanup; } // printf("size=%d fatpos=%d)\n", pWS->workbook->olestr->size, pWS->workbook->olestr->fatpos); if ((retval = xls_makeTable(pWS)) != LIBXLS_OK) { goto cleanup; } if ((retval = xls_formatColumn(pWS)) != LIBXLS_OK) { goto cleanup; } if (ole2_seek(pWS->workbook->olestr,pWS->filepos) == -1) { retval = LIBXLS_ERROR_SEEK; goto cleanup; } do { long lastPos = offset; if(xls_debug > 10) { printf("LASTPOS=%ld pos=%d filePos=%d filePos=%d\n", lastPos, (int)pWB->olestr->pos, pWS->filepos, pWB->filepos); } if((read = ole2_read(&tmp, 1, 4, pWS->workbook->olestr)) != 4) { if (xls_debug) fprintf(stderr, "Error: failed to read OLE size\n"); retval = LIBXLS_ERROR_READ; goto cleanup; } xlsConvertBof((BOF *)&tmp); if (tmp.size) { if ((buf = realloc(buf, tmp.size)) == NULL) { if (xls_debug) fprintf(stderr, "Error: failed to allocate buffer of size %d\n", (int)tmp.size); retval = LIBXLS_ERROR_MALLOC; goto cleanup; } if((read = ole2_read(buf, 1, tmp.size, pWS->workbook->olestr)) != tmp.size) { if (xls_debug) fprintf(stderr, "Error: failed to read OLE block\n"); retval = LIBXLS_ERROR_READ; goto cleanup; } } offset += 4 + tmp.size; if(xls_debug) xls_showBOF(&tmp); switch (tmp.id) { case XLS_RECORD_EOF: break; case XLS_RECORD_MERGEDCELLS: if ((retval = xls_mergedCells(pWS,&tmp,buf)) != LIBXLS_OK) { goto cleanup; } break; case XLS_RECORD_ROW: if (tmp.size < sizeof(ROW)) { retval = LIBXLS_ERROR_PARSE; goto cleanup; } if(xls_debug > 10) printf("ROW: %x at pos=%ld\n", tmp.id, lastPos); xlsConvertRow((ROW *)buf); if ((retval = xls_addRow(pWS,(ROW*)buf)) != LIBXLS_OK) { goto cleanup; } break; case XLS_RECORD_DEFCOLWIDTH: if (tmp.size < sizeof(WORD)) { retval = LIBXLS_ERROR_PARSE; goto cleanup; } if(xls_debug > 10) printf("DEFAULT COL WIDTH: %d\n", ((WORD *)buf)[0]); break; case XLS_RECORD_DEFAULTROWHEIGHT: if (tmp.size < 2 * sizeof(WORD)) { retval = LIBXLS_ERROR_PARSE; goto cleanup; } if(xls_debug > 10) printf("DEFAULT ROW Height: 0x%x %d\n", ((WORD *)buf)[0], ((WORD *)buf)[1]); break; case XLS_RECORD_DBCELL: if(xls_debug > 10) { DWORD *foo = (DWORD *)buf; WORD *goo; int i; printf("DBCELL: size %d\n", tmp.size); printf("DBCELL OFFSET=%4.4u -> ROW %ld\n", foo[0], lastPos-foo[0]); ++foo; goo = (WORD *)foo; for(i=0; i<5; ++i) printf("goo[%d]=%4.4x %u\n", i, goo[i], goo[i]); } break; case XLS_RECORD_INDEX: if(xls_debug > 10) { DWORD *foo = (DWORD *)buf; int i; printf("INDEX: size %d\n", tmp.size); for(i=0; i<5; ++i) printf("FOO[%d]=%4.4x %u\n", i, foo[i], foo[i]); } #if 0 0 4 4 4 8 4 12 4 16 4∙nm Not used Index to first used row (rf, 0-based) Index to first row of unused tail of sheet (rl, last used row + 1, 0-based) Absolute stream position of the DEFCOLWIDTH record (➜5.32) of the current sheet. If this record does not exist, the offset points to the record at the position where the DEFCOLWIDTH record would occur. Array of nm absolute stream positions to the DBCELL record (➜5.29) of each Row Block #endif break; case XLS_RECORD_MULRK: case XLS_RECORD_MULBLANK: case XLS_RECORD_NUMBER: case XLS_RECORD_BOOLERR: case XLS_RECORD_RK: case XLS_RECORD_LABELSST: case XLS_RECORD_BLANK: case XLS_RECORD_LABEL: case XLS_RECORD_FORMULA: case XLS_RECORD_FORMULA_ALT: if ((cell = xls_addCell(pWS, &tmp, buf)) == NULL) { retval = LIBXLS_ERROR_PARSE; goto cleanup; } break; case XLS_RECORD_ARRAY: if(formula_handler) formula_handler(tmp.id, tmp.size, buf); break; case XLS_RECORD_STRING: if(cell && (cell->id == XLS_RECORD_FORMULA || cell->id == XLS_RECORD_FORMULA_ALT)) { xls_cell_set_str(cell, get_string((char *)buf, tmp.size, (BYTE)!pWB->is5ver, pWB->is5ver, pWB->charset)); if (xls_debug) xls_showCell(cell); } break; default: if(xls_debug) { //xls_showBOF(&tmp); if (tmp.size >= sizeof(COL)) { printf(" [%d:%d]: 0x%X at pos=%lu size=%u\n", xlsShortVal(((COL*)buf)->row), xlsShortVal(((COL*)buf)->col), tmp.id, lastPos, tmp.size); } else { printf(" 0x%X at pos=%lu size=%u\n", tmp.id, lastPos, tmp.size); } } break; } } while ((!pWS->workbook->olestr->eof)&&(tmp.id!=XLS_RECORD_EOF)); cleanup: if (buf) free(buf); return retval; } xlsWorkSheet * xls_getWorkSheet(xlsWorkBook* pWB,int num) { xlsWorkSheet * pWS = NULL; verbose ("xls_getWorkSheet"); if (num >= 0 && num < (int)pWB->sheets.count) { pWS = calloc(1, sizeof(xlsWorkSheet)); pWS->filepos=pWB->sheets.sheet[num].filepos; pWS->workbook=pWB; pWS->rows.lastcol=0; pWS->rows.lastrow=0; pWS->colinfo.count=0; } return pWS; } static xlsWorkBook *xls_open_ole(OLE2 *ole, const char *charset, xls_error_t *outError) { xlsWorkBook* pWB; xls_error_t retval = LIBXLS_OK; pWB = calloc(1, sizeof(xlsWorkBook)); verbose ("xls_open_ole"); if ((pWB->olestr=ole2_fopen(ole, "\005SummaryInformation"))) { pWB->summary = calloc(1,4096); if (ole2_read(pWB->summary, 4096, 1, pWB->olestr) == -1) { if (xls_debug) fprintf(stderr, "SummaryInformation not found\n"); retval = LIBXLS_ERROR_READ; goto cleanup; } ole2_fclose(pWB->olestr); } if ((pWB->olestr=ole2_fopen(ole, "\005DocumentSummaryInformation"))) { pWB->docSummary = calloc(1, 4096); if (ole2_read(pWB->docSummary, 4096, 1, pWB->olestr) == -1) { if (xls_debug) fprintf(stderr, "DocumentSummaryInformation not found\n"); retval = LIBXLS_ERROR_READ; goto cleanup; } ole2_fclose(pWB->olestr); } #if 0 if(xls_debug) { printf("summary=%d docsummary=%d\n", pWB->summary ? 1 : 0, pWB->docSummary ? 1 : 0); xlsSummaryInfo *si = xls_summaryInfo(pWB); printf("title=%s\n", si->title); printf("subject=%s\n", si->subject); printf("author=%s\n", si->author); printf("keywords=%s\n", si->keywords); printf("comment=%s\n", si->comment); printf("lastAuthor=%s\n", si->lastAuthor); printf("appName=%s\n", si->appName); printf("category=%s\n", si->category); printf("manager=%s\n", si->manager); printf("company=%s\n", si->company); } #endif // open Workbook if (!(pWB->olestr=ole2_fopen(ole,"Workbook")) && !(pWB->olestr=ole2_fopen(ole,"Book"))) { if(xls_debug) fprintf(stderr, "Workbook not found\n"); retval = LIBXLS_ERROR_PARSE; goto cleanup; } pWB->sheets.count=0; pWB->xfs.count=0; pWB->fonts.count=0; if (charset) { pWB->charset = malloc(strlen(charset) * sizeof(char)+1); strcpy(pWB->charset, charset); } else { pWB->charset = strdup("UTF-8"); } retval = xls_parseWorkBook(pWB); cleanup: if (retval != LIBXLS_OK) { if (!pWB->olestr) ole2_close(ole); xls_close_WB(pWB); pWB = NULL; } if (outError) *outError = retval; return pWB; } xlsWorkBook* xls_open(const char *file, const char* charset) { return xls_open_file(file, charset, NULL); } xlsWorkBook* xls_open_file(const char *file, const char* charset, xls_error_t *outError) { OLE2* ole = NULL; if (!(ole=ole2_open_file(file))) { if (xls_debug) fprintf(stderr, "File \"%s\" not found\n",file); if (outError) *outError = LIBXLS_ERROR_OPEN; return NULL; } return xls_open_ole(ole, charset, outError); } xlsWorkBook *xls_open_buffer(const unsigned char *buffer, size_t len, const char *charset, xls_error_t *outError) { OLE2* ole = NULL; if (!(ole=ole2_open_buffer(buffer, len))) { if (outError) *outError = LIBXLS_ERROR_OPEN; return NULL; } return xls_open_ole(ole, charset, outError); } xlsRow *xls_row(xlsWorkSheet* pWS, WORD cellRow) { if(cellRow > pWS->rows.lastrow) return NULL; if (pWS->rows.row == NULL) return NULL; return &pWS->rows.row[cellRow]; } xlsCell *xls_cell(xlsWorkSheet* pWS, WORD cellRow, WORD cellCol) { struct st_row_data *row; if ((row = xls_row(pWS, cellRow)) == NULL) return NULL; if(cellCol >= row->cells.count) return NULL; return &row->cells.cell[cellCol]; } void xls_close_WB(xlsWorkBook* pWB) { OLE2* ole; verbose ("xls_close"); if(!pWB) return; // OLE first if (pWB->olestr) { ole=pWB->olestr->ole; ole2_fclose(pWB->olestr); ole2_close(ole); } // WorkBook free(pWB->charset); // Sheets { DWORD i; for(i=0; isheets.count; ++i) { free(pWB->sheets.sheet[i].name); } free(pWB->sheets.sheet); } // SST { DWORD i; for(i=0; isst.count; ++i) { free(pWB->sst.string[i].str); } free(pWB->sst.string); } // xfs { free(pWB->xfs.xf); } // fonts { DWORD i; for(i=0; ifonts.count; ++i) { free(pWB->fonts.font[i].name); } free(pWB->fonts.font); } // formats { DWORD i; for(i=0; iformats.count; ++i) { free(pWB->formats.format[i].value); } free(pWB->formats.format); } // buffers if(pWB->summary) free(pWB->summary); if(pWB->docSummary) free(pWB->docSummary); // TODO - free other dynamically allocated objects like string table?? free(pWB); } void xls_close_WS(xlsWorkSheet* pWS) { if(!pWS) return; if (pWS->rows.row) { DWORD i, j; for(j=0; j<=pWS->rows.lastrow; ++j) { struct st_row_data *row = &pWS->rows.row[j]; for(i=0; icells.count; ++i) { free(row->cells.cell[i].str); } free(row->cells.cell); } free(pWS->rows.row); } // COLINFO { free(pWS->colinfo.col); } free(pWS); } const char* xls_getVersion(void) { return PACKAGE_VERSION; } const char* xls_getError(xls_error_t code) { if (code == LIBXLS_OK) return "No error"; if (code == LIBXLS_ERROR_READ) return "Unable to read from file"; if (code == LIBXLS_ERROR_OPEN) return "Unable to open file"; if (code == LIBXLS_ERROR_SEEK) return "Unable to seek within file"; if (code == LIBXLS_ERROR_MALLOC) return "Unable to allocate memory"; if (code == LIBXLS_ERROR_PARSE) return "Unable to parse file"; return "Unknown error"; } // // http://poi.apache.org/hpsf/internals.html // or google "DocumentSummaryInformation and UserDefined Property Sets" and look for MSDN hits // xlsSummaryInfo *xls_summaryInfo(xlsWorkBook* pWB) { xlsSummaryInfo *pSI; pSI = (xlsSummaryInfo *)calloc(1, sizeof(xlsSummaryInfo)); xls_dumpSummary(pWB->summary, 1, pSI); xls_dumpSummary(pWB->docSummary, 0, pSI); return pSI; } void xls_close_summaryInfo(xlsSummaryInfo *pSI) { if(!pSI) return; if(pSI->title) free(pSI->title); if(pSI->subject) free(pSI->subject); if(pSI->author) free(pSI->author); if(pSI->keywords) free(pSI->keywords); if(pSI->comment) free(pSI->comment); if(pSI->lastAuthor) free(pSI->lastAuthor); if(pSI->appName) free(pSI->appName); if(pSI->category) free(pSI->category); if(pSI->manager) free(pSI->manager); if(pSI->company) free(pSI->company); free(pSI); } static void xls_dumpSummary(char *buf,int isSummary,xlsSummaryInfo *pSI) { header *head; sectionList *secList; propertyList *plist; sectionHeader *secHead; property *prop; uint32_t i, j; if(!buf) return; // perhaps the document was missing?? head = (header *)buf; //printf("header: \n"); //printf(" sig=%x\n", head->sig); //printf(" os=%x\n", head->os >> 16); //printf(" class=%8.8x%8.8x%8.8x%8.8x\n", head->format[0], head->format[1], head->format[2], head->format[3]); //printf(" count=%x\n", head->count); for(i=0; icount; ++i) { secList = &head->secList[i]; //printf("Section %d:\n", i); //printf(" class=%8.8x%8.8x%8.8x%8.8x\n", secList->format[0], secList->format[1], secList->format[2], secList->format[3]); //printf(" offset=%d (now at %ld\n", secList->offset, (char *)secList - (char *)buf + sizeof(sectionList)); secHead = (sectionHeader *)((char *)head + secList->offset); //printf(" len=%d\n", secHead->length); //printf(" properties=%d\n", secHead->numProperties); for(j=0; jnumProperties; ++j) { BYTE **s; plist = &secHead->properties[j]; //printf(" ---------\n"); //printf(" propID=%d offset=%d\n", plist->propertyID, plist->sectionOffset); prop = (property *)((char *)secHead + plist->sectionOffset); //printf(" propType=%d\n", prop->propertyID); switch(prop->propertyID) { case 2: //printf(" xlsShortVal=%x\n", *(uint16_t *)prop->data); break; case 3: //printf(" wordVal=%x\n", *(uint32_t *)prop->data); break; case 30: //printf(" longVal=%llx\n", *(uint64_t *)prop->data); //printf(" s[%u]=%s\n", *(uint32_t *)prop->data, (char *)prop->data + 4); if(isSummary) { switch(plist->propertyID) { case 2: s = &pSI->title; break; case 3: s = &pSI->subject; break; case 4: s = &pSI->author; break; case 5: s = &pSI->keywords; break; case 6: s = &pSI->comment; break; case 8: s = &pSI->lastAuthor; break; case 18: s = &pSI->appName; break; default: s = NULL; break; } } else { switch(plist->propertyID) { case 2: s = &pSI->category; break; case 14: s = &pSI->manager; break; case 15: s = &pSI->company; break; default: s = NULL; break; } } if(s) *s = (BYTE *)strdup((char *)prop->data + 4); break; case 64: //printf(" longVal=%llx\n", *(uint64_t *)prop->data); break; case 65: #if 0 { uint32_t k; for(k=0; k<*(uint32_t *)prop->data; ++k) { unsigned char *t = (unsigned char *)prop->data + 4 + k; printf(" %2.2x(%c)", *t, *t); } printf("\n"); } #endif break; default: //printf(" UNKNOWN!\n"); break; } } } } void xls_set_formula_hander(xls_formula_handler handler) { formula_handler = handler; } readxl/src/XlsxWorkBook.cpp0000644000176200001440000000064113442224523015442 0ustar liggesusers#include #include "XlsxWorkBook.h" using namespace Rcpp; // [[Rcpp::export]] CharacterVector xlsx_sheets(std::string path) { return XlsxWorkBook(path).sheets(); } // [[Rcpp::export]] std::vector xlsx_strings(std::string path) { return XlsxWorkBook(path).stringTable(); } // [[Rcpp::export]] std::set xlsx_date_formats(std::string path) { return XlsxWorkBook(path).dateFormats(); } readxl/src/XlsxString.h0000644000176200001440000000467113442224523014627 0ustar liggesusers#ifndef READXL_XLSXSTRING_ #define READXL_XLSXSTRING_ #include #include "rapidxml.h" #include // Rf_ucstoutf8 is exported in R_ext/GraphicsDevice.h // unescape an ST_Xstring. See 22.9.2.19 [p3786] inline std::string unescape(const std::string &s) { std::string out; out.reserve(s.size()); for (size_t i = 0; i < s.size(); i++) { if (i+6 < s.size() && s[i] == '_' && s[i+1] == 'x' && isxdigit(s[i+2]) && isxdigit(s[i+3]) && isxdigit(s[i+4]) && isxdigit(s[i+5]) && s[i+6] == '_') { // extract character unsigned int ch = strtoul(&s[i+2], NULL, 16); char utf8[16]; // 16 from definition of Rf_ucstoutf8 Rf_ucstoutf8(utf8, ch); out += utf8; i += 6; // skip to the final '_' } else { out.push_back(s[i]); } } return out; } // Parser for and inlineStr tags CT_Rst [p3893] // returns true if a string is found, false if missing. inline bool parseString(const rapidxml::xml_node<>* string, std::string *out) { bool found = false; out->clear(); const rapidxml::xml_node<>* t = string->first_node("t"); if (t != NULL) { // According to the spec (CT_Rst, p3893) a single element // may coexist with zero or more elements. // // However, software that read these files do not appear to exclusively // follow this spec. // // MacOSX preview, considers only the element if found and ignores any // additional r elements. // // // Excel 2010 appears to produce only elements with r elements or with a // single t element and no mixtures. It will, however, consider an element // with a single t element followed by one or more r elements as valid, // concatenating the results. Any other combination of r and t elements // is considered invalid. // // We read the tag, if present, first, then concatenate any tags. // All Excel 2010 sheets will read correctly under this regime. *out = unescape(t->value()); found = true; } // iterate over all r elements for (const rapidxml::xml_node<>* r = string->first_node("r"); r != NULL; r = r->next_sibling("r")) { // a unique t element should be present (CT_RElt [p3893]) // but MacOSX preview just ignores chunks with no t element present const rapidxml::xml_node<>* t = r->first_node("t"); if (t != NULL) { *out += unescape(t->value()); found = true; } } return found; } #endif readxl/NAMESPACE0000644000176200001440000000100413431612743012747 0ustar liggesusers# Generated by roxygen2: do not edit by hand export(anchored) export(cell_cols) export(cell_limits) export(cell_rows) export(excel_format) export(excel_sheets) export(format_from_ext) export(format_from_signature) export(read_excel) export(read_xls) export(read_xlsx) export(readxl_example) export(readxl_progress) importFrom(Rcpp,sourceCpp) importFrom(cellranger,anchored) importFrom(cellranger,cell_cols) importFrom(cellranger,cell_limits) importFrom(cellranger,cell_rows) useDynLib(readxl, .registration = TRUE) readxl/NEWS.md0000644000176200001440000002606713442224243012642 0ustar liggesusers# readxl 1.3.1 Pragmatic patch release to update some tests in advance of v2.1.0 of the tibble package. That release updates name repair: standard suffix becomes `...j`, instead of `..j`, partially motivated by user experience in readxl. # readxl 1.3.0 ## Dependency changes readxl embeds libxls v1.5.0. This is the first *official* release of libxls in several years, although readxl has been tracking the development version in the interim. The libxls project is now officially hosted at . In particular, libxls v1.5.0 addresses these two CVEs: * [CVE-2018-20452](http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-20452) * [CVE-2018-20450](http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-20450) # readxl 1.2.0 ## Column name repair readxl exposes the `.name_repair` argument that is [coming to version 2.0.0 of the tibble package](https://www.tidyverse.org/articles/2018/11/tibble-2.0.0-pre-announce/). The readxl default is `.name_repair = "unique"`, keeping with the readxl convention to ensure column names are neither missing nor duplicated. * [Column Names](https://readxl.tidyverse.org/articles/articles/column-names.html) is a new article about this feature. * readxl delegates name repair to tibble, therefore the installed tibble version determines how names are repaired. * If tibble >= v2.0.0, the full power of `.name_repair` is available, defaulting to `.name_repair = "unique"`. Otherwise, the legacy function `tibble::repair_names(prefix = "X", sep = "__")` is used, replicating the behaviour of readxl v1.1.0. - Consider a spreadsheet with three columns: one unnamed and two named `x`. - Content of cells in Excel: `""`, `x`, `x` - New style column names: `..1`, `x..2`, `x..3` - Legacy column names: `X__1`, `x`, `x__1` * Once per session, readxl emits a message stating that it works best with tibble >= v2.0.0. It is anticipated that this will become a hard minimum version requirement in a future version of readxl. ## Other changes * `read_excel()` and friends gain a `progress` argument that controls a progress spinner (#243, #538). * `read_xls()` and `read_xlsx()` pass the `trim_ws` argument along (#514). * readxl has a [new article](https://readxl.tidyverse.org/articles/articles/multiple-header-rows.html) on reading Excel files with multiple header rows (#486, #492 @apreshill). * xlsx files that do not have a "styles" part can now be read (#505, #506 @jt6) * All paths are passed through `normalizePath()` (#498, #499, new behaviour for xlsx but not xls) and `enc2native()` (#370). ## Dependency changes readxl is now tested back to R >= 3.1. Embedded libxls has been updated, using the source in . readxl's DESCRIPTION now records the SHA associated to the embedded libxls in a `Note`. # readxl 1.1.0 * `read_excel()` and `excel_sheets()` associate a larger set of file extensions with xlsx and are better able to guess the format of a file with a nonstandard or missing extension. This is about deciding whether to treat a file as xls or xlsx. (#342, #411, #457) - `excel_format()` is the newly-exported format-guessing function. - `format_from_ext()` is a low-level helper, also exported, that only consults file extension. In addition to the obvious interpretation of `.xls` and `.xlsx`, the extensions `.xlsm`, `.xltx`, and `.xltm` are now associated with xlsx. - `format_from_signature()` is a low-level helper, also exported, that consults the file's signature (a.k.a. magic number). It's handy for files that lack an extension. * Embedded libxls has been updated to address security vulnerabilitities identified in late 2017 (#441, #442). - [CVE-2017-12110](https://www.talosintelligence.com/vulnerability_reports/TALOS-2017-0462), [CVE-2017-2896](https://www.talosintelligence.com/vulnerability_reports/TALOS-2017-0403), and [CVE-2017-2897](https://www.talosintelligence.com/vulnerability_reports/TALOS-2017-0404) were demonstrated to affect readxl v1.0.0. These have been addressed in libxls and the embedded version of libxls incorporates those fixes. - Although [CVE-2017-12111](https://www.talosintelligence.com/vulnerability_reports/TALOS-2017-0463) and [CVE-2017-2919](https://www.talosintelligence.com/vulnerability_reports/TALOS-2017-0426) mention readxl, the notices clarify that these CVEs do not actually affect readxl. Both have been fixed in libxls for quite a while: CVE-2017-12111 since 2014 and CVE-2017-2919 since 2012. * xlsx structured as a "minimal conformant SpreadsheetML package" can be read. Most obvious feature of such sheets is the lack of an `xl/` directory in the unzipped form. (xlsx, #435, #437) * Reading xls sheet with exactly 65,536 rows no longer enters an infinite loop. (xls, #373, #416, #432 @vkapartzianis) * Doubles, including datetimes, coerced to character from xls now have much higher precision, comparable to the xlsx behaviour. (xls, #430, #431) * Integer-y numbers larger than 2^31 are coerced properly to string (xls, #346) * Shared strings are only compared to NA strings after lookup, never on the basis of their index. (xlsx, #401) * Better checks and messaging around nonexistent files. (#392) * Add `$(C_VISIBILITY)` to compiler flags to hide internal symbols from the dll. (#385 @jeroen) * Numeric data in a logical column now coerces properly to logical. (xlsx, #385 @nacnudus) # readxl 1.0.0 ## Sheet geometry * `range` is a new argument for reading a rectangular range, possibly open. (#314, #8) * `n_max` is a new argument that limits the number of data rows read. (#306, #281) * Empty cells, rows, columns (xlsx #248 and #240, xls #271): Cells with no content are no longer loaded, even if they appear in the file. Affects cells that have no data but that carry explicit formatting, detectable in Excel as seemingly empty cells with a format other than "General". Such cells may still exist in the returned tibble, with value `NA`, depending on the sheet geometry. * Eliminates a source of trailing rows (#203) and columns (#236, #162, #146) consisting entirely of `NA`. * Eliminates a subtle source of disagreement between user-provided column names and guessed column types (#169, #81). * Embedded empty columns are no longer automatically dropped, regardless of whether there is a column name. (#157, #261) * Worksheets that are completely empty or that contain only column names no longer error, but return a tibble with zero rows. (#222, #144, #65) * Improved handling of leading and embedded blank rows and explicit row skipping. (#224, #194, #178, #156, #101) * User-supplied `col_names` are processed relative to user-supplied `col_types`, if given. Specifically, `col_names` is considered valid if it has the same length as `col_types`, before *or after* removing skipped columns. (#81, #261) ## Column types and coercion * `"list"` is a new accepted value for `col_types`. Loads data as a list of length-1 vectors, that are typed using the logic from `col_types = NULL`, but on a cell-by-cell basis (#262 @gergness). * `"logical"` is a new accepted value for `col_types`. When `col_types = NULL`, it is the guessed type for cells Excel advertises as Boolean. When a column has no data, it is now filled with logical `NA`. (#277, #270) * `"guess"` is a new accepted value for `col_types`. Allows the user to specify some column types, while allowing others to be guessed (#286) * A user-specified `col_types` of length one will be replicated to have length equal to the number of columns. (#127, #114, #261) * `"blank"` has been deprecated in favor of the more descriptive and readr-compatible `"skip"`, which is now the preferred way to request that a column be skipped. (#260, #193, #261) * `guess_max` is a new argument that lets user adjust the number of rows used to guess column types. (#223, #257 @tklebel and @jennybc) * `trim_ws` is a new argument to remove leading and trailing whitespace. It defaults to `TRUE`. (#326, #211) * `na` can now hold multiple NA values, e.g., `read_excel("missing-values.xls", na = c("NA", "1"))`. (#13, #56, @jmarshallnz) * Coercions and cell data: - Numeric data that appears in a date column is coerced to a date. Throws a warning. (#277, #266) - Dates that appear in a numeric column are converted to `NA` instead of their integer representation. Throws warning. (#277, #263) - "Number stored as text": when a text cell is found in a numeric column, `read_excel()` attempts to coerce the string to numeric and falls back to `NA` if unsuccessful. Throws warning. (#277, #217, #106) - Cells in error are treated as blank and are imported as `NA` (instead of the string `"error"`). (#277, #62) - BoolErr cells are now handled in xls. Suppresses message `"Unknown type: 517"`. (#274, #259) - Dates that arise from a formula are treated as dates (vs. numeric) in xls. (#277) - Dates in .xlsx files saved with LibreOffice are now recognized as such. (#134, @zeehio) ## Compatibility Many 3rd party tools write xls and xlsx that comply with the spec, but that are quite different from files produced by Excel. * Namespace prefixes are now stripped from element names and attributes when parsing XML from xlsx. Workaround for the creative approach taken in some other s/w, coupled with rapidxml's lack of namespace support. (#295, #268, #202, #80) * Excel mixes 0- and 1-indexing in reported row and column dimensions for xls and libxls expects that. Other s/w may index from 0 for both, preventing libxls from reading the last column. Patched to restore access to those cells. (#273, #180, #152, #99) * More robust logic for sheet lookup in xlsx. Improves compatibility with xlsx written by a variety of tools and/or xlsx containing chartsheets. (#233, #104, #200, #168, #116, @jimhester and @jennybc) * The `numFmtId` attribute is no longer accessed when it does not exist (xlsx written by ). (#191, #229) * Location is inferred for cells that do not declare their location (xlsx written by JMP). (#240, #163, #102) ## Other * `read_xls()` and `read_xlsx()` are now exposed, such that files without an `.xls` or `.xlsx` extension can be read. (#85, @jirkalewandowski) * The [Lotus 1-2-3 leap year bug](https://support.microsoft.com/en-us/help/214326/excel-incorrectly-assumes-that-the-year-1900-is-a-leap-year) is now accounted for, i.e. date-times prior to March 1, 1900 import correctly. Date-times on the non-existent leap day February 29, 1900 import as NA and throw a warning. (#264, #148, #292) * The tibble package is now imported (#175, @krlmlr) and `tibble::repair_names()` is used to prevent empty, `NA`, or duplicated column names. (#216, #208, #199 #182, #53, #247). * Default column names for xlsx now start with X__1 instead of X__0. (#98, @zeehio, @krlmlr) * Fix compilation warnings/failures (FreeBSD 10.3 #221, gcc 4.9.3 #124) and/or problems reading xls (CentOS 6.6 #189). (#244, #245, #246 @jeroen) * Unwanted printed output (e.g., `DEFINEDNAME: 21 00 00 ...`) is suppressed when reading xls that contains a defined range. (#82, #188, @PedramNavid) # readxl 0.1.1 * Add support for correctly reading strings in .xlsx files containing escaped unicode characters (e.g. `_x005F_`). (#51, @jmarshallnz) readxl/R/0000755000176200001440000000000013437677232011750 5ustar liggesusersreadxl/R/xlsx-zip.R0000644000176200001440000000106513275227031013657 0ustar liggesusers# Called only from C++ code, but currently needs to be implemented in R. zip_buffer <- function(zip_path, file_path) { files <- utils::unzip(zip_path, list = TRUE) indx <- match(file_path, files$Name) if (is.na(indx)) { stop("Couldn't find '", file_path, "' in '", zip_path, "'", call. = FALSE) } size <- files$Length[indx] con <- unz(zip_path, file_path, open = "rb") on.exit(close(con), add = TRUE) readBin(con, raw(), n = size) } zip_has_file <- function(zip_path, file_path) { file_path %in% utils::unzip(zip_path, list = TRUE)$Name } readxl/R/utils.R0000644000176200001440000000051713365715153013231 0ustar liggesuserscheck_file <- function(path) { if (!is_string(path)) { stop("`path` must be a string", call. = FALSE) } if (!file.exists(path)) { stop("`path` does not exist: ", sQuote(path), call. = FALSE) } path } is_integerish <- function(x) { floor(x) == x } is_string <- function(x) { length(x) == 1 && is.character(x) } readxl/R/readxl.R0000644000176200001440000000004113067126266013340 0ustar liggesusers#' @keywords internal "_PACKAGE" readxl/R/excel-format.R0000644000176200001440000000503713336631200014445 0ustar liggesusers#' Determine file format #' #' @description Determine if files are xls or xlsx (or from the xlsx family). #' #' @description `excel_format(guess = TRUE)` is used by `read_excel()` to #' determine format. It draws on logic from two lower level functions: #' * `format_from_ext()` attempts to determine format from the file extension. #' * `format_from_signature()` consults the [file #' signature](https://en.wikipedia.org/wiki/List_of_file_signatures) or "magic #' number". #' #' @description File extensions associated with xlsx vs. xls: #' * xlsx: `.xlsx`, `.xlsm`, `.xltx`, `.xltm` #' * xls: `.xls` #' #' @description File signatures (in hexadecimal) for xlsx vs xls: #' * xlsx: First 4 bytes are `50 4B 03 04` #' * xls: First 8 bytes are `D0 CF 11 E0 A1 B1 1A E1` #' #' @inheritParams read_excel #' @param guess Logical. If the file extension is absent or not recognized, this #' controls whether we attempt to guess format based on the file signature or #' "magic number". #' #' @return Character vector with values `"xlsx"`, `"xls"`, or `NA`. #' @export #' #' @examples #' files <- c( #' "a.xlsx", #' "b.xls", #' "c.png", #' file.path(R.home("doc"), "html", "logo.jpg"), #' readxl_example("clippy.xlsx"), #' readxl_example("deaths.xls") #' ) #' excel_format(files) excel_format <- function(path, guess = TRUE) { format <- format_from_ext(path) if (!isTRUE(guess)) { return(format) } guess_me <- is.na(format) & file.exists(path) format[guess_me] <- format_from_signature(path[guess_me]) format } #' @rdname excel_format #' @export format_from_ext <- function(path) { ext <- tolower(tools::file_ext(path)) formats <- c( xls = "xls", xlsx = "xlsx", xlsm = "xlsx", xltx = "xlsx", xltm = "xlsx" ) unname(formats[ext]) } #' @rdname excel_format #' @export format_from_signature <- function(path) { signature <- lapply(path, first_8_bytes) vapply(signature, sig_to_fmt, "xlsx?") } first_8_bytes <- function(x) readBin(x, n = 8, what = "raw") sig_to_fmt <- function(x) { ## https://en.wikipedia.org/wiki/List_of_file_signatures xlsx_sig <- as.raw(c( "0x50", "0x4B", "0x03", "0x04" )) xls_sig <- as.raw(c( "0xD0", "0xCF", "0x11", "0xE0", "0xA1", "0xB1", "0x1A", "0xE1" )) if (identical(x[1:4], xlsx_sig)) { "xlsx" } else if (identical(x, xls_sig)) { "xls" } else { NA_character_ } } check_format <- function(path) { format <- excel_format(path) if (is.na(format)) { stop("Can't establish that the input is either xls or xlsx.", call. = FALSE) } format } readxl/R/example.R0000644000176200001440000000100513071552553013512 0ustar liggesusers#' Get path to readxl example #' #' readxl comes bundled with some example files in its `inst/extdata` #' directory. This function make them easy to access. #' #' @param path Name of file. If `NULL`, the example files will be listed. #' @export #' @examples #' readxl_example() #' readxl_example("datasets.xlsx") readxl_example <- function(path = NULL) { if (is.null(path)) { dir(system.file("extdata", package = "readxl")) } else { system.file("extdata", path, package = "readxl", mustWork = TRUE) } } readxl/R/read_excel.R0000644000176200001440000003215313406506420014154 0ustar liggesusers#' @useDynLib readxl, .registration = TRUE #' @importFrom Rcpp sourceCpp NULL #' Read xls and xlsx files #' #' @param path Path to the xls/xlsx file. #' @param sheet Sheet to read. Either a string (the name of a sheet), or an #' integer (the position of the sheet). Ignored if the sheet is specified via #' `range`. If neither argument specifies the sheet, defaults to the first #' sheet. #' @param range A cell range to read from, as described in [cell-specification]. #' Includes typical Excel ranges like "B3:D87", possibly including the sheet #' name like "Budget!B2:G14", and more. Interpreted strictly, even if the #' range forces the inclusion of leading or trailing empty rows or columns. #' Takes precedence over `skip`, `n_max` and `sheet`. #' @param col_names `TRUE` to use the first row as column names, `FALSE` to get #' default names, or a character vector giving a name for each column. If user #' provides `col_types` as a vector, `col_names` can have one entry per #' column, i.e. have the same length as `col_types`, or one entry per #' unskipped column. #' @param col_types Either `NULL` to guess all from the spreadsheet or a #' character vector containing one entry per column from these options: #' "skip", "guess", "logical", "numeric", "date", "text" or "list". If exactly #' one `col_type` is specified, it will be recycled. The content of a cell in #' a skipped column is never read and that column will not appear in the data #' frame output. A list cell loads a column as a list of length 1 vectors, #' which are typed using the type guessing logic from `col_types = NULL`, but #' on a cell-by-cell basis. #' @param na Character vector of strings to interpret as missing values. By #' default, readxl treats blank cells as missing data. #' @param trim_ws Should leading and trailing whitespace be trimmed? #' @param skip Minimum number of rows to skip before reading anything, be it #' column names or data. Leading empty rows are automatically skipped, so this #' is a lower bound. Ignored if `range` is given. #' @param n_max Maximum number of data rows to read. Trailing empty rows are #' automatically skipped, so this is an upper bound on the number of rows in #' the returned tibble. Ignored if `range` is given. #' @param guess_max Maximum number of data rows to use for guessing column #' types. #' @param progress Display a progress spinner? By default, the spinner appears #' only in an interactive session, outside the context of knitting a document, #' and when the call is likely to run for several seconds or more. See #' [readxl_progress()] for more details. #' @param .name_repair Handling of column names. By default, readxl ensures #' column names are not empty and are unique. If the tibble package version is #' recent enough, there is full support for `.name_repair` as documented in #' [tibble::tibble()]. If an older version of tibble is present, readxl falls #' back to name repair in the style of tibble v1.4.2. #' @return A [tibble][tibble::tibble-package] #' @seealso [cell-specification] for more details on targetting cells with the #' `range` argument #' @export #' @examples #' datasets <- readxl_example("datasets.xlsx") #' read_excel(datasets) #' #' # Specify sheet either by position or by name #' read_excel(datasets, 2) #' read_excel(datasets, "mtcars") #' #' # Skip rows and use default column names #' read_excel(datasets, skip = 148, col_names = FALSE) #' #' # Recycle a single column type #' read_excel(datasets, col_types = "text") #' #' # Specify some col_types and guess others #' read_excel(datasets, col_types = c("text", "guess", "numeric", "guess", "guess")) #' #' # Accomodate a column with disparate types via col_type = "list" #' df <- read_excel(readxl_example("clippy.xlsx"), col_types = c("text", "list")) #' df #' df$value #' sapply(df$value, class) #' #' # Limit the number of data rows read #' read_excel(datasets, n_max = 3) #' #' # Read from an Excel range using A1 or R1C1 notation #' read_excel(datasets, range = "C1:E7") #' read_excel(datasets, range = "R1C2:R2C5") #' #' # Specify the sheet as part of the range #' read_excel(datasets, range = "mtcars!B1:D5") #' #' # Read only specific rows or columns #' read_excel(datasets, range = cell_rows(102:151), col_names = FALSE) #' read_excel(datasets, range = cell_cols("B:D")) #' #' # Get a preview of column names #' names(read_excel(readxl_example("datasets.xlsx"), n_max = 0)) #' #' if (utils::packageVersion("tibble") > "1.4.2") { #' ## exploit full .name_repair flexibility from tibble #' #' ## "universal" names are unique and syntactic #' read_excel( #' readxl_example("deaths.xlsx"), #' range = "arts!A5:F15", #' .name_repair = "universal" #' ) #' #' ## specify name repair as a built-in function #' read_excel(readxl_example("clippy.xlsx"), .name_repair = toupper) #' #' ## specify name repair as a custom function #' my_custom_name_repair <- function(nms) tolower(gsub("[.]", "_", nms)) #' read_excel( #' readxl_example("datasets.xlsx"), #' .name_repair = my_custom_name_repair #' ) #' #' ## specify name repair as an anonymous function #' read_excel( #' readxl_example("datasets.xlsx"), #' sheet = "chickwts", #' .name_repair = ~ substr(.x, start = 1, stop = 3) #' ) #' } read_excel <- function(path, sheet = NULL, range = NULL, col_names = TRUE, col_types = NULL, na = "", trim_ws = TRUE, skip = 0, n_max = Inf, guess_max = min(1000, n_max), progress = readxl_progress(), .name_repair = "unique") { path <- check_file(path) format <- check_format(path) read_excel_( path = path, sheet = sheet, range = range, col_names = col_names, col_types = col_types, na = na, trim_ws = trim_ws, skip = skip, n_max = n_max, guess_max = guess_max, progress = progress, .name_repair = .name_repair, format = format ) } #' `read_excel()` calls [excel_format()] to determine if `path` is xls or xlsx, #' based on the file extension and the file itself, in that order. Use #' `read_xls()` and `read_xlsx()` directly if you know better and want to #' prevent such guessing. #' @rdname read_excel #' @export read_xls <- function(path, sheet = NULL, range = NULL, col_names = TRUE, col_types = NULL, na = "", trim_ws = TRUE, skip = 0, n_max = Inf, guess_max = min(1000, n_max), progress = readxl_progress(), .name_repair = "unique") { path <- check_file(path) read_excel_( path = path, sheet = sheet, range = range, col_names = col_names, col_types = col_types, na = na, trim_ws = trim_ws, skip = skip, n_max = n_max, guess_max = guess_max, progress = progress, .name_repair = .name_repair, format = "xls" ) } #' @rdname read_excel #' @export read_xlsx <- function(path, sheet = NULL, range = NULL, col_names = TRUE, col_types = NULL, na = "", trim_ws = TRUE, skip = 0, n_max = Inf, guess_max = min(1000, n_max), progress = readxl_progress(), .name_repair = "unique") { path <- check_file(path) read_excel_( path = path, sheet = sheet, range = range, col_names = col_names, col_types = col_types, na = na, trim_ws = trim_ws, skip = skip, n_max = n_max, guess_max = guess_max, progress = progress, .name_repair = .name_repair, format = "xlsx" ) } read_excel_ <- function(path, sheet = NULL, range = NULL, col_names = TRUE, col_types = NULL, na = "", trim_ws = TRUE, skip = 0, n_max = Inf, guess_max = min(1000, n_max), progress = readxl_progress(), .name_repair = NULL, format) { if (format == "xls") { sheets_fun <- xls_sheets read_fun <- read_xls_ } else { sheets_fun <- xlsx_sheets read_fun <- read_xlsx_ } sheet <- standardise_sheet(sheet, range, sheets_fun(path)) shim <- !is.null(range) limits <- standardise_limits( range, skip, n_max, has_col_names = isTRUE(col_names) ) col_types <- check_col_types(col_types) guess_max <- check_guess_max(guess_max) trim_ws <- check_bool(trim_ws, "trim_ws") progress <- check_bool(progress, "progress") set_readxl_names( read_fun( path = enc2native(normalizePath(path)), sheet_i = sheet, limits = limits, shim = shim, col_names = col_names, col_types = col_types, na = na, trim_ws = trim_ws, guess_max = guess_max, progress = progress ), .name_repair = .name_repair ) } # Helper functions ------------------------------------------------------------- ## return a zero-indexed sheet number standardise_sheet <- function(sheet, range, sheet_names) { range_sheet <- cellranger::as.cell_limits(range)[["sheet"]] if (!is.null(range_sheet) && !is.na(range_sheet)) { if (!is.null(sheet)) { message( "Two values given for `sheet`. ", "Using the `sheet` found in `range`:\n", range_sheet ) } sheet <- range_sheet } if (is.null(sheet)) { sheet <- 1L } if (length(sheet) != 1) { stop("`sheet` must have length 1", call. = FALSE) } if (is.numeric(sheet)) { if (sheet < 1) { stop("`sheet` must be positive", call. = FALSE) } floor(sheet) - 1L } else if (is.character(sheet)) { if (!(sheet %in% sheet_names)) { stop("Sheet '", sheet, "' not found", call. = FALSE) } match(sheet, sheet_names) - 1L } else { stop("`sheet` must be either an integer or a string.", call. = FALSE) } } ## return a zero-indexed vector describing the corners of a cell rectangle: ## min_row, max_row, min_col, max_col ## NA becomes -1 and means "unspecified", by convention ## if both min and max are -1, for rows or cols, means "read them all" ## min_row = -2 is a special flag meaning "read no rows" standardise_limits <- function(range, skip, n_max, has_col_names) { if (is.null(range)) { skip <- check_non_negative_integer(skip, "skip") n_max <- check_non_negative_integer(n_max, "n_max") n_read <- if (has_col_names) n_max + 1 else n_max limits <- c( min_row = if (n_read > 0) skip else -2, max_row = if (n_read == Inf || n_read == 0) NA else skip + n_read - 1, min_col = NA, max_col = NA ) } else { limits <- cellranger::as.cell_limits(range) limits <- c( min_row = limits[["ul"]][1] - 1, max_row = limits[["lr"]][1] - 1, min_col = limits[["ul"]][2] - 1, max_col = limits[["lr"]][2] - 1 ) } limits[is.na(limits)] <- -1 limits } check_col_types <- function(col_types) { if (is.null(col_types)) { return("guess") } stopifnot(is.character(col_types), length(col_types) > 0, !anyNA(col_types)) blank <- col_types == "blank" if (any(blank)) { message("`col_type = \"blank\"` deprecated. Use \"skip\" instead.") col_types[blank] <- "skip" } accepted_types <- c("skip", "guess", "logical", "numeric", "date", "text", "list") ok <- col_types %in% accepted_types if (any(!ok)) { info <- paste( paste0("'", col_types[!ok], "' [", seq_along(col_types)[!ok], "]"), collapse = ", " ) stop(paste("Illegal column type:", info), call. = FALSE) } col_types } check_bool <- function(bool, arg_name) { if (!isTRUE(bool) && !identical(bool, FALSE)) { stop("`", arg_name, "` must be either TRUE or FALSE", call. = FALSE) } bool } check_non_negative_integer <- function(i, arg_name) { if (length(i) != 1 || !is.numeric(i) || !is_integerish(i) || is.na(i) || i < 0) { stop("`", arg_name, "` must be a positive integer", call. = FALSE) } i } ## from readr check_guess_max <- function(guess_max, max_limit = .Machine$integer.max %/% 100) { guess_max <- check_non_negative_integer(guess_max, "guess_max") if (guess_max > max_limit) { warning( "`guess_max` is a very large value, setting to `", max_limit, "` to avoid exhausting memory", call. = FALSE ) guess_max <- max_limit } guess_max } set_readxl_names <- function(l, .name_repair = "unique") { tibble_version <- utils::packageVersion("tibble") if (tibble_version > "1.4.2") { if (is.null(.name_repair)) { return(tibble::as_tibble(l)) } else { return(tibble::as_tibble(l, .name_repair = .name_repair)) } } tibble_message(.name_repair) tibble::repair_names( tibble::as_tibble(l, validate = FALSE), prefix = "X", sep = "__" ) } tibble_message <- (function(.name_repair) { first_call <- TRUE function(.name_repair) { if (first_call) { message( "readxl works best with a newer version of the tibble package.\n", "You currently have tibble v", utils::packageVersion("tibble"), ".\n", "Falling back to column name repair from tibble <= v1.4.2.\n", "Message displays once per session." ) first_call <<- FALSE return() } if (!first_call && !identical(.name_repair, "unique")) { message( "Update the tibble package to use the `.name_repair` argument. ", "Ignoring." ) } } })() readxl/R/progress.R0000644000176200001440000000154313406506420013724 0ustar liggesusers#' Determine whether to show progress spinner #' #' @description By default, readxl displays a progress spinner **unless** #' one of the following is `TRUE`: #' * The spinner is explicitly disabled by setting #' `options(readxl.show_progress = FALSE)`. #' * The code is run in a non-interactive session (`interactive()` is `FALSE`). #' * The code is run by knitr / rmarkdown. #' * The code is run in an RStudio notebook chunk. #' readxl uses the [progress #' package](https://cran.r-project.org/package=progress) under-the-hood and #' therefore is also sensitive to any options that it consults. #' @export readxl_progress <- function() { ## based on readr:::show_progress() isTRUE(getOption("readxl.show_progress", default = TRUE)) && interactive() && !isTRUE(getOption("knitr.in.progress")) && !isTRUE(getOption("rstudio.notebook.executing")) } readxl/R/RcppExports.R0000644000176200001440000000223613437677232014367 0ustar liggesusers# Generated by using Rcpp::compileAttributes() -> do not edit by hand # Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 xls_sheets <- function(path) { .Call(`_readxl_xls_sheets`, path) } xls_date_formats <- function(path) { .Call(`_readxl_xls_date_formats`, path) } read_xls_ <- function(path, sheet_i, limits, shim, col_names, col_types, na, trim_ws, guess_max = 1000L, progress = TRUE) { .Call(`_readxl_read_xls_`, path, sheet_i, limits, shim, col_names, col_types, na, trim_ws, guess_max, progress) } xlsx_sheets <- function(path) { .Call(`_readxl_xlsx_sheets`, path) } xlsx_strings <- function(path) { .Call(`_readxl_xlsx_strings`, path) } xlsx_date_formats <- function(path) { .Call(`_readxl_xlsx_date_formats`, path) } parse_ref <- function(ref) { .Call(`_readxl_parse_ref`, ref) } read_xlsx_ <- function(path, sheet_i, limits, shim, col_names, col_types, na, trim_ws, guess_max = 1000L, progress = TRUE) { .Call(`_readxl_read_xlsx_`, path, sheet_i, limits, shim, col_names, col_types, na, trim_ws, guess_max, progress) } zip_xml <- function(zip_path, file_path) { invisible(.Call(`_readxl_zip_xml`, zip_path, file_path)) } readxl/R/excel-sheets.R0000644000176200001440000000100613336631200014440 0ustar liggesusers#' List all sheets in an excel spreadsheet #' #' @inheritParams read_excel #' @export #' @examples #' excel_sheets(readxl_example("datasets.xlsx")) #' excel_sheets(readxl_example("datasets.xls")) #' #' # To load all sheets in a workbook, use lapply #' path <- readxl_example("datasets.xls") #' lapply(excel_sheets(path), read_excel, path = path) excel_sheets <- function(path) { path <- check_file(path) format <- check_format(path) switch(format, xls = xls_sheets(path), xlsx = xlsx_sheets(path) ) } readxl/R/cell-specification.R0000644000176200001440000000542413172305601015615 0ustar liggesusers#' Specify cells for reading #' #' The `range` argument of [read_excel()] provides many ways to limit the read #' to a specific rectangle of cells. The simplest usage is to provide an #' Excel-like cell range, such as `range = "D12:F15"` or `range = #' "R1C12:R6C15"`. The cell rectangle can be specified in various other ways, #' using helper functions. In all cases, cell range processing is handled by the #' [cellranger][cellranger] package, where you can find full documentation for #' the functions used in the examples below. #' #' @examples #' path <- readxl_example("geometry.xls") #' ## Rows 1 and 2 are empty (as are rows 7 and higher) #' ## Column 1 aka "A" is empty (as are columns 5 of "E" and higher) #' #' # By default, the populated data cells are "shrink-wrapped" into a #' # minimal data frame #' read_excel(path) #' #' # Specific rectangle that is subset of populated cells, possibly improper #' read_excel(path, range = "B3:D6") #' read_excel(path, range = "C3:D5") #' #' # Specific rectangle that forces inclusion of unpopulated cells #' read_excel(path, range = "A3:D5") #' read_excel(path, range = "A4:E5") #' read_excel(path, range = "C5:E7") #' #' # Anchor a rectangle of specified size at a particular cell #' read_excel(path, range = anchored("C4", dim = c(3, 2)), col_names = FALSE) #' #' # Specify only the rows or only the columns #' read_excel(path, range = cell_rows(3:6)) #' read_excel(path, range = cell_cols("C:D")) #' read_excel(path, range = cell_cols(2)) #' #' # Specify exactly one row or column bound #' read_excel(path, range = cell_rows(c(5, NA))) #' read_excel(path, range = cell_rows(c(NA, 4))) #' read_excel(path, range = cell_cols(c("C", NA))) #' read_excel(path, range = cell_cols(c(NA, 2))) #' #' # General open rectangles #' # upper left = C4, everything else unspecified #' read_excel(path, range = cell_limits(c(4, 3), c(NA, NA))) #' # upper right = D4, everything else unspecified #' read_excel(path, range = cell_limits(c(4, NA), c(NA, 4))) #' #' @seealso The [cellranger][cellranger] package has full documentation on cell #' specification and offers additional functions for manipulating "A1:D10" #' style spreadsheet ranges. Here are the most relevant: #' \itemize{ #' \item [cellranger::cell_limits()] #' \item [cellranger::cell_rows()] #' \item [cellranger::cell_cols()] #' \item [cellranger::anchored()] #' } #' @name cell-specification NULL #' @importFrom cellranger cell_limits #' @name cell_limits #' @export #' @rdname cell-specification NULL #' @importFrom cellranger cell_rows #' @name cell_rows #' @export #' @rdname cell-specification NULL #' @importFrom cellranger cell_cols #' @name cell_cols #' @export #' @rdname cell-specification NULL #' @importFrom cellranger anchored #' @name anchored #' @export #' @rdname cell-specification NULL readxl/vignettes/0000755000176200001440000000000013442224523013542 5ustar liggesusersreadxl/vignettes/sheet-geometry.Rmd0000644000176200001440000002064613406366260017164 0ustar liggesusers--- title: "Sheet Geometry" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Sheet Geometry} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) options(tibble.print_min = 4, tibble.print_max = 4) ``` ```{r setup} library(readxl) ``` `readxl::read_excel()` brings data from a rectangle of cells into R as a data frame or, more specifically, a [tibble](http://tibble.tidyverse.org/reference/tibble.html). The extent of the data rectangle can be determined in various ways: * **Discovered**: By default, `read_excel()` uses the smallest rectangle that contains the non-empty cells. It "shrink wraps" the data. * **Bounded**: The `skip` and `n_max` arguments constrain `read_excel()`'s discovery process with respect to rows. At least `skip` spreadsheet rows will be skipped or ignored and at most `n_max` spreadsheet rows will be considered as data. Compared to the default of **discovery**, these arguments can only lead to making the output tibble smaller. * **Set**: The `range` argument is taken literally, even if that means you will have leading or trailing rows or columns filled with `NA`. If you ask for `range = "A1:D4"`, you are guaranteed to get a tibble with 4 columns (A through D) and either 3 rows (`col_names = TRUE`, default) or 4 rows (`col_names = FALSE`). * **Mixed**: In typical use, `read_excel()`'s geometry arguments often imply that certain limits are **discovered** while others are **bounded** or **set**. This will be more clear in the concrete examples below. For now, here are a few ways `read_excel()` can look when you take control of the geometry: ```{r eval = FALSE} read_excel("yo.xlsx", skip = 5) read_excel("yo.xlsx", n_max = 100) read_excel("yo.xlsx", skip = 5, n_max = 100) read_excel("yo.xlsx", range = "C1:E7") read_excel("yo.xlsx", range = cell_rows(6:23)) read_excel("yo.xlsx", range = cell_cols("B:D")) read_excel("yo.xlsx", range = anchored("C4", dim = c(3, 2))) ``` ## Little known Excel facts readxl's behavior and interface may be easier to understand if you understand this about Excel: > Cells you can see don't necessarily exist. Cells that look blank aren't necessarily so. Among lots of other information, Excel files obviously must contain information on each cell. Let's use the word "item" to denote one cell's-worth of info. Just because you see a cell on the screen in Excel, that doesn't mean there's a corresponding item on file. Why? Because Excel presents a huge gridded canvas for you to write on. Until you actually populate a cell, though, it doesn't really exist. The stream of cell items describes the existing cells, going from upper left to lower right, travelling by row. Blank cells simply do not exist in it. Ah, but what is a blank cell? Some cells appear blank to the naked eye but are not considered so by Excel and, indeed, are represented by a cell item. This happens when a cell has no content but does have an associated format. This format could have been applied directly to a single cell or, more often, indirectly via formatting applied to an entire row or column. Once a human has spent some quality time with a spreadsheet, many seemingly empty cells will bear a format and will thus have an associated cell item. ### Implications for readxl readxl only reads cell items that have content. It ignores cell items that exist strictly to convey formatting. The tibble returned by readxl will often cover cells that are empty in the spreadsheet, filled with `NA`. But only because there was some other reason for the associated row or column to exist: actual data or user-specified geometry. ## `skip` and `n_max` `skip` and `n_max` are the "entry-level" solution for controlling the data rectangle. They work only in the row direction. Column-wise, you're letting readxl discover which columns are populated. If you specify `range` (covered below), `skip` and `n_max` are ignored. ### `skip` The `skip` argument tells `read_excel()` to start looking for populated cells after skipping at least `skip` rows. If the new start point begins with 1 or more empty rows, `read_excel()` will skip even more before it starts reading from the sheet. Here's a screen shot of the `geometry.xlsx` example sheet that ships with readxl, accessible via `readxl_example("geometry.xlsx")`. ```{r out.width = '70%', echo = FALSE} knitr::include_graphics("img/geometry.png") ``` By default, `read_excel()` just discovers the data rectangle: ```{r} read_excel(readxl_example("geometry.xlsx")) ``` If you explicitly skip one row, note that `read_excel()` still skips row 2, which is also empty, leading to the same result as before: ```{r} read_excel(readxl_example("geometry.xlsx"), skip = 1) ``` You can also use `skip` to skip over populated cells. In real life, this is a mighty weapon against the explanatory text that people like to include at the top of spreadsheets. ```{r} read_excel(readxl_example("geometry.xlsx"), skip = 3) ``` Summary: `skip` tells `read_excel()` to skip *at least this many* spreadsheet rows before reading anything. ### `n_max` The `n_max` argument tells `read_excel()` to read at most `n_max` rows, once it has found the data rectangle. Note that `n_max` is specifically about *the data*. You still use `col_names` to express whether the first spreadsheet row should be used to create column names (default is `TRUE`). `n_max = 2` causes us to ignore the last data row -- the 3rd one -- in `geometry.xlsx`. ```{r} read_excel(readxl_example("geometry.xlsx"), n_max = 2) ``` `n_max` is an upper bound. It will never cause empty rows to be included in the tibble. Note how we get 3 data rows here, even though `n_max` is much greater. ```{r} read_excel(readxl_example("geometry.xlsx"), n_max = 1000) ``` ## `range` The `range` argument is the most flexible way to control geometry and is powered by the [cellranger](https://github.com/rsheets/cellranger#readme) package. One huge difference from `skip` and `n_max` is that `range` is taken literally! Even if it means the returned tibble will have entire rows or columns consisting of `NA`. You can describe cell limits in a variety of ways: **Excel-style range**: Specify a fixed rectangle with `range = "A1:D4"` or `range = "R1C1:R4C4"`. You can even prepend the worksheet name like so: `range = "foofy!A1:D4"` and it will be passed along to the `sheet` argument. The `deaths.xlsx` example sheet features junk rows both before and after the data rectangle. The payoff for specifying the data rectangle precisely is that we get the data frame we want, with correct guesses for the column types. ```{r} read_excel(readxl_example("deaths.xlsx"), range = "arts!A5:F15") ``` We repeat the screenshot of `geometry.xlsx` as a visual reference. ```{r out.width = '70%', echo = FALSE} knitr::include_graphics("img/geometry.png") ``` Going back to `geometry.xlsx`, here we specify a rectangle that only partially overlaps the data. Note the use of default column names, because the first row of cells is empty, and the leading column of `NA`s. ```{r} read_excel(readxl_example("geometry.xlsx"), range = "A2:C4") ``` **Specific range of rows or columns**: Set exact limits on just the rows or just the columns and allow the limits in the other direction to be discovered. Example calls: ```{r eval = FALSE} ## rows only read_excel(..., range = cell_rows(1:10)) ## is equivalent to read_excel(..., range = cell_rows(c(1, 10))) ## columns only read_excel(..., range = cell_cols(1:26)) ## is equivalent to all of these read_excel(..., range = cell_cols(c(1, 26))) read_excel(..., range = cell_cols("A:Z")) read_excel(..., range = cell_cols(LETTERS)) read_excel(..., range = cell_cols(c("A", "Z")) ``` We use `geometry.xlsx` to demonstrate setting hard limits on the rows, running past the data, while allowing column limits to discovered. Note the trailing rows of `NA`. ```{r} read_excel(readxl_example("geometry.xlsx"), range = cell_rows(4:8)) ``` **Anchored rectangle**: Helper functions `anchored()` and `cell_limits()` let you specify limits via the corner(s) of the rectangle. Here we get a 3 by 4 rectangle with cell C5 as the upper left corner: ```{r} read_excel( readxl_example("geometry.xlsx"), col_names = paste("var", 1:4, sep = "_"), range = anchored("C5", c(3, 4)) ) ``` Here we set C5 as the upper left corner and allow the other limits to be discovered: ```{r} read_excel( readxl_example("geometry.xlsx"), col_names = FALSE, range = cell_limits(c(5, 3), c(NA, NA)) ) ``` readxl/vignettes/img/0000755000176200001440000000000013406366260014323 5ustar liggesusersreadxl/vignettes/img/type-me-logical.png0000644000176200001440000032377213406366260020037 0ustar liggesusersPNG  IHDR4-e iCCPICC ProfileHTSIBB D@JM^" l$@(1${YTp-`EWE\ bae],P& ~|y;wg2 , U + a&$&1I=$́=-xGFhۻ0UKIWSpElH);1pM@  f $ Hp$"ckiLL/d?TK$?3( [9<>䝐=,ngAVB6M.OrdX6x"Ak9۲ģ}BMEI mP CH#?%< <4^wA#l/3_(d8(C=¶,-Gy1#"5gY \hL*/ 2\ixN%Yr(3:tt8JTa@,S b}CM Q LcGapuD-dEc۹YQyGv&a+$R{'ȍiq|`1,)`~KVX@XxF[Kk @4GZye+{ZTimE&x9=p7< >`ŝqvL^D?b1h6 Ug" o.D t :  ݄ X @X62!pԁFpAµ ^ !BBh@t#E CD$IC,Cb مT""'3E }kTTFщ3ꍆ1t4 A@2zF_1YbΘ/%a[b%XV5*֍cq"NǙ%\Ax,sj ߏ-Uh-LH f %spDфf"18XCl"vI$ɂN HAiR,O%ےId>y)||E~JS3s͕[+GA\EbBqP2(K(j9=yyy}y)|Q IX_\eYGtn@{轪DU` "Cj*jjqjsNu301#X8¸4N{8Uu{>^K^^~]S_#ScF}M\\sl4ǫw_8;ZVg1YRf s@OK/HOK]oHD?V~}AFfC]Ɇ 9m6j5zolbo¸III=Sii53Y6s<ݼjhf90eBńTKo<*+UR: '&M\?uWk,=wmTlBl4ؼ5eۖ^-{eoaϵnˁ0aCG'GccSVΪΑΫ/\|\4|tutu=[gL&q']ߝ˽ۃӣSϓY멷wA>>B>}]}6a~~~*e6B fW8,i F> 35LF'L0^Q8?.DGli)SDD͏jGό>.'fmXXqlsbܴʸ~ $\NL%'& Nij4inL7>g3f85h2!9>@gV55e~lqݹܧũ6{|yeWA;2gFdΊϪ&g'g3-tf͙)s\s6 C{Eh>WuĦ=yyyf>:GyN\>e>=y%{x/صYyz.޿$sK/},~Yr勗?)an+vWV[eBN"뢒ϫ٫/lskR״u\}qݍ+?0yCFo7tľdffҰ-[m\^vܧfU[olzvv¸d7qw'{K^ͽE{ҩցUhഃW[VaŇ#G:>ftlqZvn@]z]w}b}牐 n m_^cIkOQN-?5|:`LڙG3M8{eJKs?zƋO\rTwrmC~?^{J}KGCS]]g]=-;o޸us[[ng~u' +/y?jO=~xыǢǟ{?=)yƾS/Sϭ/M_믶WWïWx /aG班?=ٗ_ g XB(zDxv8%5DvgO,I}^. Qb ߒw@ʈRleC0m& R pHYs%%IR$iTXtXML:com.adobe.xmp 948 564 ޛH'iDOT(F+Nh@IDATx eEy.ZͻA64F * >07ɐ&bh@1l3|!ngwX 5mnܐ`ׅ aO .+mM+AXcǎr4;R 7E/~I ׌08 ;߁{NR裏 {t0*lw7JhmGXfmwE1?wؔ4 %M,)|ZŏbDhm?v1,{Y?l,dzahͳopm]q9=?,/EۂH-% gBоȟV'(Cg{C6}G_ m?_>V6Pkx BLB֮ vg7Hwbf]h1GC";OY_?):OY_?):OY_?):OY_:`^{5>Ӈ}I?)]O)]O)]O)]O)]O)]O)]OSGh h'&h'u OŃAG)g/q"1O8[gGX ?0l_(e ƿcS//cΝ6\xhIc:/vvYv,oOInx$3ova?ҤnZ/zqd!7vA!&]ZA!;$+)k}2e;l_,}eooau@_8@JOz/&/ +BC4g. hI@[-<F`},Sml묟?Y[})yugznX˳[::g:tV_Jq噞?B{rby-q3o~l}cL߷=gzq>m޷?lo{?a}}3Kv -cܸ.-Nh'MMMɧ?smSt7smSt7smSt7s9J St7smSt7smSt7smSt7smSt7smSt7smSt7smSt7smSt7smi;v 0l޼tA%F&)E3lS0hI{1:g:Ւo4yzboR>џ1{ ~g::3o_5:}٧8?/Y?Y6mW̕_`^|}3L,tw]?xZ uwG8t@["TR7ԂϪ Xb){c6u4S0l?e/W?u?̟Oq3=Sr\gLG>#ǒrcu`#WU}K\>S0l?e/W?u?̟Oq3=Sr\gLO\>S0l?e/W?u?̟Oq3=Sr\gLOڿ; -u f#V:@!HIO[_\~/Z_\~/Z_\~/Z_\~/aFZz>EoMݖk_ʹrkX9W_1u[}-+?n˵ec\}}|mlo-׾sQײrc>\Z6V7Gݖk_ 6ٗBiPtYYikrB?1\Tt7 xSmGlT=1;߱3^_ּ0?b*u=1}1%|,B9u3>uv?ear8K6/R7&Qow;ɘwh3`> Y4N2 0e|!I5;!>C_1)['ɘCm'_۶ϋi\}aI^Ä !Sֿ5ߏpFd|o`*U,Umg{U]h-J@tn]iyO gЪmVm s=SQC?sڼ\p1g{S.Gv++#:Ki&-IT7(՗O\Iy;Ǫm%9mnzl''XGbI8=Sm"|}Iy9=rh.?t֥a1Iyr>Ǫm%1/ׄ뇮\~՗7z(S,n&'`zk??xRk?qk}?Uϵߵ\znrStO۶푰wtsk?d,RZ_DmS\Zص=g{\ZOswm?/۟\?]Kcz\~T=~.SrOӵ=g{\Z믫c^'fl?IH$45`:c~Y64?g:s=W>ş}<ӹtz|?Eg\gys,\L1?Y)sc~Y?G~}BdV@ hOz | Vz@x^J_[~~:3=Ug{)}m,Tgg~Eg}mrٿ|s)gR):k[ϵSt׶k/_7xxMYJVb D-rj^n׊+Oo#1 Q90HX?&7s:~p!8!B?f<3x|W]$o?@l? ׋zoKo}['O-&lEQо/]l? #*=w~IOlksHț$o2>)ksEvZ;@=r&`VRISjLwR7\ R.mmmxrϙ8Eio?x[0Ki$OYruOoy)o^s]^?Z'mY Tmjt9)[H_h߸#w'5J 5XzhkpcB[=h12/d?߯W^nptulv4=3HʱGH >f 2?sV{cy???ܿpo8 j!PF࡭>!d@lu9ni[u 8t{Ō0 hA'=G, 6`GrfN]!O>^>慝~=nd.?s+5KߺA 9Y\Kl'&KbRNV q7r2OX}ϛZX#G#6;ktǎ % fC/;S{B+ʁ/rR b>R7W>~K$ehsnnιw52wovc?A`{6wlGc"w˞pIO-Eh $l6\&B<$P$5YG5>[K};=u/qo{ix'$;&\I@a?ZB#G1Y3幞O _HQخ,G f1@.y$/=֟ǵV15Lϭ=֟mo^}8=]?v縛oZ?^pXwDO#+<>#dTR\)}Lgm Zb? l腢>ZuS~TR~7E)eC+Gsܧz׭p]};zKc__K/EϵtoOGoO ܺ;|3څЦYy<@㕪^px4К-WI呤'L/[n//KS'ѷ/.}jl9}MWĪ.گwxus޺w{G|)#Gj=K_)O-~ltP _j~@F'4[Ř6E4~LuZ~nx؊K͝޵Wiwn95?x鬟\g}k`䯯"ݲO6< « hmUJ-/풧9Ko-uO/sbP?pY\N?rQCf)?$?>x`o'x|j|?UO.>Y?ӭ1^:7?e鬟)?Ug{)tBtwͥʻӮ{ݍg~vܙwo?@1Kkoam_ύI 9Rj~Y>"4Nfĺ]K )Ԅ L$g~iS"'B;[n O=ueW|8B og~wq}?9߲A\,/3噟,랬yIY>d,>?ˢa3噟,/<ϿC{;enhwt[lt+kozU՚ _s7RoyL) zZΗh[]^Oo@[b> bDưY="_ЊR !r'V-~̿}ܧGdzMW{xv`b܅~I:wckܑ{s~=ɷ>K=ʓy @F9/znrge21Q;]tYt{099w.=o9iO_?=Qlgg7Q m`6= ' h'hR s矧~gv; oqw;v߱܅ `|!0 vjwՕq_Iڵ=Vw/iGOqoz0'$ Ciޜe0 N<:N3#E[fw~j8|Ȳ:ZZ[rsk֟\\X?w@lO|.]U+Nu1ß a'_qSun>'3#@miO|.֟\\qmiO|.h^s誀g{R;)sMO.\ǟ]~ݓ/=޷RbrӖ\i'^N`"G< 3Yߛg.,·ٞZnret=)ncV|H(?qf5?Ӹ'[NO7aC4',]l␥ZWZy?wSڀ zK޳>O[E}v_gK/ w*)&m0~IX.;4,{?|Ig:2?Y>o5@[~J?Fa3>~ m1ϭ9Wr½僗.#zŇ-oOOܮ[`G@,C+)E֤ޅ#VL O|&^VTHy)Sjo3\3ˆ$SX葨1zoovVw3osh7mĎ8R9S|U) ˴`ƿ2 ?I9Rs U7Ss@{W}Ԓ❥8KT}F/foQΥ%*s}m#,)J0~Nh1&>R0s$@c,s¥Bow 6Ly{95cOm×w">ff)&_LtЕC?d>?m#cPCF/_q(uxGܩOlr7}ͽuu~r|l;r!yB6&\Php,|E7m?O;ʽ񼗻C3^οF{ w;uea;?r; 86Ofd's!GJ/.#Ù hS, TjU1{ CV^Ҥܵʗ;nO {O|= ߛjj+T5*vm:ÂG%mŏyk+ߴ׵K]k|~ _꫗I?wCz{͵ g[}mŏyk+ߴ׵K]k|~ _?P{YRT0+e^/OGz@N}/A=" m1YY_F?p3Ў)o=78 y\Qyp=z3mck!`\fl/A'x4˅ڄ7D*;UʎO۞حʧϴ|![-#ȎUi]o+ =˽'cNJsdP?ӶK"ڪԥ*9gRXL۟i۳#0֞?)ԿQK-s-?=YG{OH&ͻӶhL۞iG7|8!$Yͧ9f'8>ͧoV4NO]߮Y0|1$6e_|\~Ӧs)$wb@; &cG \FF\׾MwrOF}kߦQ?gm#׿o(ݟ\賶_ڷT9!&lmV 'J_Y/j@joǂ-Xʽrc6u[>]_ ?#r+ڷGQy*g1mm՘H_ ;ՀI0/Y*7 h Pk}~^[yvk}m֗<׵>kd~Fh[y^[a}z[ʳ]c\ok|Tmٿ~VkX__X?k+ߵ?/Uo[yN߯@`j|flU@{ 'n !UHwM珄pè8P*C_%=o_Ht}*|W<6ף3Vo6e]vj8{m;̕Zo^n# 4~g.@5J8;T~<7IHO^z@MA@-?lEe@ ;EOl Po@SSzmc ׳;>U\ c ӓ he9@dzꆑKgl9AKtx謿k~2)k)#%Ɵy{7ꀖY?oo?Xxu=_ּ0?kamKx O׀VY68 +XYS %`a[1=ANH6/7#?~AYGc/]Zw'˗?f)d})#oRhÓ[187us@b7wh1ϐR7~z\埭5_dN4DG$bͷoun}W ^Iٜ[}WKb~鶺_uʂɇ"(Gƀ"Gʕg)}):a|.dl/jXA@/j`V_Z"o]oo}?RFb{ ?K;2g[5Bʶ׉Z?Y+i@PYLY hsjO>iGY?{q. ŗB=ab7lkHʶ/#/<3"h럭_T0+Iim}d4k9Vkp6C}~ ǯ8|5 C0 CZ@#ǩ`v DV'~$w'3 to2޵]P@v/;]۵>!|T hk}}k}}Y߮i_(woٵ]ӾQ߮gk֧}ܵ]ZgvO*p>6E0eRh=zZi|6ZVSjB)cmSS)mSS)mSS)mS/pBۭx l~`V]ȧKS>OoKO췕OoKO췕OoKO췕OoKO췕OoKO췕OoKO췕OoKO췕OoKOWG#NjdV*}'@PݐUg̟VqaT3^[yu֟Su){mYOY?쵕g{\g)X>Ug̟Vq]W&~6x7  hs~iau]׹?a>am|uh/'=ڮzY_v޵]뺿kv]߮u_׵]cwo/߮]׻k}]u& hkYZէh27Vlc.ĒސV^늕Y?mY:˕g}\gLg{mY:˕g}\gLg{mY:˕g}\gLg{mY_ly>#&~X닕urX?YmYY?߶qʳ>~qʳ>~qʳ>~qʳ>~qʳ>~qʳ>~qʳ>~qi_lgGcY h#uࠞϥl6=ײMSv~[aoOѻX?_OlC >$g\^0ai#j~f͵ߕ OL/x9|CWѮQ ?wc빟6|$•_W2ڐ҃?Yŷ_\:#<0.-Nh'M қ ,c)/&Ӧ|÷׏5gH9]v˚ xNv/k憔ma16܃WŘb-`B( qd}`־ߏ?&~H6y=? G<)̋zחǠ61== O'.Av3|J9߃c׿U_>V-9X@OLnpH0RSt;RStoaS'aJͯ|hi>>k9މƮ2oG?,/v/Śu;?rqB_~~c6C0 C0 C0 C`6Xblye!`!`!P;ww$4k A;'?{oȻ*yu-2WꚟQyu֗>En@| vה!`!0_ђ]vx5:W\=#I*U zx~ -/_H vIA1O|n --7 ھ6!`!0Qh9` Q.'ü20yN^zK+*yeT+"/,-,7 ھ6!`!0_Q6oU'@S*FjcCˤ2!@֥`{(Y#|*u#c# Cm C0 C` "K(N2Y?˳ 0o@txT {Xj^YlCNhg!Y-mI!`A@GKv`S. /|$p/ZD/BMBIhUSn-fuC Y- ak!` Uʉ䱎JP(rxVCBtU몒<:a$/񩊶!el*h" l C0 C`! Q@O.e]<}c8HP(4J[#vΆ-LU[@j_ %x3^{Usa+5&Guw}S"FA@ZowqGa|c= C0 CUdTC G%x2d9<- ߔ<|XYè-u=Qu1vБCYlCQmW~Gݞ{ثя~PE].آ?C;[v[~۲eۼyse/{{^V\Y`" vw7^.qVI ٛGTLt.X.oZmn%d1qk@Z@،xZ@;+ҭY?r;xS' h5Q<߰aC̲eˢY0tT+;궩1 C0 hqT$_=5o]~/شC;bK\ K ÊsĆvBCp6nd͢Qڶm[ԷxsPk^k!` P;wܭ7a@$ .]tIq:xrÿeWlڴ(;7zV5');AfHM^]̛'I:p7[2e08җԭB$/nTqc6󟻟!N=Pԧ>5|ALf[_Ӥe5Y__%`$}Ʒ>ojC߿򕯸nkC~)daX(L/hb' ][}mv FUs֯׿X1?x4EOn hn=nx;8yµ/kObycp O~SSϜqW@IDATt~ĻXb,ISdxWYem[zuG%A:}(Zl}n蕼z=Uv!`,L$rvڍVr_ ;v<&ob9~7 kvodc7h?i\P7s=û0Xo8[ou\EK?Rp5FW>5t1Y,.nI> t.u9V7xcrN]^ct -g?a2~X$5\#"g̡&kQ(J?/}+ZyX0 C`! #+vup];?Ѷ;B xc?` K{,4%4MizxR]!0>`nN$-͛*[Ҫʠth:6]>Ͷ;UN]~]OWs3LikY,M6  .NJfh~bXk1:3isRk|j~W:z0Hc!`D@GVY \wڢsTq>k,X@4Oku^DQtdUyҀ6Sn bl*q=lt#S {ч7M6}Hj׋2'eL?b}O\DEWf.}uU )nU>'6sk<:x7)),MdO\C*r0O5(G|x|d:5?U26MXG@['e>.^4R:k3 CX8xXUnvx\V@9]蒇2rc@mRNu#@7bJ +mJ{ۀ.>5Onȱ1ÆF'/elb ]!b'|BmVYͤЫ62F l, 3 p} \Ny7ߵ>~6}O!s%o}UeϸbfX@Xtl?%]?k@60n?bx rG ?I,#ckϹObk[ؓKi{בrC0 'SY l,r.l48zV[<`5 V d+6K;M@ˏi %ǩhUj!c+v6=;FRo@V˰N 'mp]$6/ujN]nwl4̧k^u} =oQܔ;&DPԏd+ }K%>XT0H1zXXgni"7}Q׭j!@Q"XEPA,׋YϏ UPt]C\;tA}tR[n/V[8٩K)NelCZg/F'DBx1^z#rUᏝFIX/ˈ=M6_4$V]T._/7eO#kΘL][js?R"Nq"@E;TjX|AVt!Nc1;5a]MC[IJ"<1|W:cvESrL66?XoQ_!`,,dd%\֪IY(}Yީ hJ,"ՏYl'.ǂ[9}dRmjCe߰l/^y3U)'xUolcT!#'-_6S 7%G-MsFV0Bյ>~Ns|sGyPtxauH[0|ZN%ǮNJl33'[=<4,sa&}5r)c:&^_6 :[!`,.dTC+-S{Ks Xцι>MԜwhE0V(I ˿bËUo@R otcwlO'^z3hD5֟%~5g9Dq}#1Nm[Mn<~4Gc]uNȡS;b]Ile35vS;`?]nglXFOOl8'x.9 ޹q"\leߔLcU8uUP7+$c,zXV_Uڊo9`ܪnjUu"2%Yf!Lr 4L v`Oo]l4pOE_|Z'72]zl|\l;ϹMnzVP]rYYWS2}"Ňj x!_L-_?ѮI@$A,ʥ֟܎Ne%-Uګ6-du`;_ZldCꋙLp^~Lj;RV o)Ӛ_WxbH8'qyv>9뺧+[F˂-Xθ6O>1?&m}q-5Kʺ?ۤZM2?y>a|Eιo铘Θ]O XkEG,s^/v`u6Ė冀!` NhuX]W#6 h /K[**Z`VIFMJfY[u&=^ɏM7>.NJvO|aqc|܏>6 J`W=!O}СScוy+&ceU<z8LZSr<ڮ/Uv?§{!`B@GZ"o?R\>Z|Y\Keu h% 2:度q@+uU$p>E| hys$C?.KgG)$xdã7|(oFe}c<~/بKȨ?Fzy.Ƨy~66` Ʊk7b| }GƠ& Hi(5@q8Iq/,s0OJ?_7<1_)96R"r7' C0?*ZTQǍ?֎6d5Vgy%9X@KJ*A96FJ.9h>_Zpm~S&-N}ys)&4oxNp]D?= J>?M6f~5kKAr؜z|܏6#d8۹.՝)'H]N'EW._a<җIǧy>ʆ,ةyy,XJSy0amBy> ~k >Oؑ?œ9X̏ϾIerTI>\h}'Mzcݿ rC0 Ń*ߡ@WRAȥɿ"A׿CĦzRP[uJ A)Ŕ֛Cr ]ج7Ib??ئX* b&}<}iℽ +׮qz|܏>6|YeCl =U+j0gd4ꤐU- hue|tUfYzx>W]U']_n}ssÒ!`!C@GK.Y 9#K/W^o o[75*>* MI+u娼u֗>EJuE;.\{GQ4wy~: ~ne7WJ~sp^X1̝1ROݓ$wmM >pguVJ>vZwsO;YRK}qr|܏Ե@&ε^>b,l| <}s ު>C-?K_1zP7~u$r!`,.dTCOr_UUI.''/KS;oxD'7hS8yũ+KPr2,x]>OfVyBw8T,'mʏzp!'&l ?szʏ'9U5t LH} Z~Ʀ+}oާRW<~xFh?Pu')}H67f1Ve_m;V[^XS: 1\IƸJ66Y?|isЪ:z:t1փ># C0?Z OV NdݟH-! -TjD;\9g>]LU@,yݭA,uB}C=;޲[t{Ԟ5Ns_ Va_WrC|f+ߴ;v|pjŊAg 1&udL7lX=pJ>9Rе 3G<:=F vs }ruQn}l+_a@s[5 7NOdߴo &!ڳrdHxzVܣT6p㉘;ڦtZj}e4C0 C VqcDҁ O].u@N&uHtݒ^ P+ECu6{`#i'+{u>`,jpЁem C0 Cp eȡc',ɳ Tj ']D0ȉq,'Xl&:_V1Sԭ`v8N[ h3 CX,h ޗE$H^NMٖ ˁ*|B;_e R Lv4|H 9'!FXKn5ؗA0en'B hga$C0 쏊whmF$ |U%yJa+r:/I%Y@;@ⳟ{_-8S=o|cQ!`G@l hc9M gX@;M͖!`bB@GV\˺4ydUǀPh:8=)&G  --%!50ȂmmY'XY0 C`# ZtH7)#oN/%:JixZ^y>J 毳)>JβbKӥMx~]2:xu V\he|ӟۂ_;Ok0E@l hŵomɘ=[|yfM!`!(QMJ@< dII歳S NiLnUm,c'TV0 [͙zC0 C0f-Q `pDpU2!I/{G  .CC!-CA^V(D=K>h/8:oZh>߲䮻}Bn C0 C0 C00Fs`0?K`c(2NID8-ߤ;Yr1};O`4` |-CyT/t{Z~uA冀!`!`!`L;tЅirQ :}88$؀<+9Ji(K2"r:W䱢薾i9 'Z!`]" #]j C0 C`># "Nw2L #y f}T #&u/&eɅsŨC$nGޡt,7 ھ6!`!0_ђ;w7IUA]tIsȀV;,:x6:ߴW 浀VeECY-fSn!`X=q.Y^蜋|,o«yG5 &6b2hlK4 h%C`[@; ͆!`!`dTyBi>|,9 nm/Qr͇r<麖A)sƊ?Qym`l# Ck C0 C`" ZC<9D[Up)JNZWѮƗNwJE`)K/+iK* RC;g'A+@Ȃmm(nC0 COxK&Aj.ü1yN^Jt ~%2,2⯦U!Sկ XxX J@ȂmmH~C0 C/(~B; 4sFt4%mFkd$\ls̔Z2UB$R C`[@;̈́!`!` dT{ Pցtvx2.Ye}}~]Mn˖-noZws~gسa/^v;F C`BdvBM0 C0?Zk.,l`[USne!`,v鳟lwv4!`@xV@ON<%yI$-ݦ*ǹw^'7zUWȩrqjN)k;VmCY-G}瞅.]|E !`!0h@)ovS|"]zUn[(#We6w_zsNt8]Hu}`$Ujl}" ݠu}=(]q/V0 C0 G@G;pY7)#oF-r) .<tq#Am|ݴX;K]dCNK ;U+@Ȃmm7(cM,M!`!0W(~B\ #!0Dzٽ{x[}aw}j;-gѻݹ'=dgGt@Ub]`Z CWd[@ 0 C+d4:SQ*v^"dWO?񛷜6oyh^ܕ=q A;WH!`LY' hz!|vmp[n )9昤xTk_ߠ/}[jM6'[ֹ8|@V^?PAEPWv|龂tl*ײ C0 CكNh%Ѓ(nںSDj=ҦmYW>]g)z!$eH_ˮ/?*0h" vN@m6[FƜ[+@:{A ˗sw}̼;COo^{E~T'.va21>S"}?^P4.E C0 C`"d4:%5rF;5 ~Ã/$9y8|ap Y %(v^hX+|@+JNH.X^7_w`'ĭ0 i@ϸWUE !`!-ٹsniH@N E 砋 hu?߈a7e M?1>Sk_ڀ1 ) v*SAVHNq!/k8dZ[r%BNڑxn(CF'?I7 "}|@Pя~ڵk'x{ߒ-4 eА-[V qrm C0 C UC ĉ Λs.|A?|zEW\xi+؈ɠMtJ-u, C`Ȃ hZwg.ս &:7A?[03 ~/~z^箿BEQ^'81tpR{G&$l;N( -7 C0 Vu4>yG휄W7K(9~|u4k{[}8PG d2*]ޡܚ CcdN~_D/]B>M|vB;3k# v]@֝j]T逖Cᓜt \ ֩&-r?g o0 C0# cJn+T YWASwXE?~yw7*)zsOr O^U "0,-,7 .`>!@M}a}{Ewǀv˖-煤#r.rJf͚B4uJ]0Z0 C0QvhMOnyWYt Ns{ߐ*uXK_tP *_Eѧ!&AƗg{C YZ>ĕU>^'Xu 2i@ L)$ 0g}]٥zmAJ?B/t!UhUSC1 ) v]@?:-O`_L-|z+uf!`! Z}C9 H[͟}뛆As܅g[ R/* bWU=tJZ COd h ^/| 7Z8QfWn@dG~/)!`! ?*ޡ ޤy8P'][{7,qeU% eNi.2U>Ȇ}yʆ!#`Xt w^|=cS&>0?|ܱck w'7N:rK1"K冀!`!?I=d K͝#]nxHX󇗹3.woQҶΐE4]Y)MGNhxY0C@캀֯ZwgٺuKm\ٴi{.2wYgd:H-G_r9iiO{ZT0 C0 d4:Sϒ ^hʠ4XOZ[@8Mq(]HKt'o a_`I[@ ?!0dNXt*WSG}yϊF>d}ТO]tQDž{ڪGy`)<9~ц*zGoN;r;pd!`" {c~ tk o[KO< fL)eH_ˮ[@ˈX0B@T@ HӪU1mwU[ou|O?(M7}Sg?YWZ;*!`!?В" /IM$IH`[x./9]gU,~\ht:xw%O[!`! vFl'E:暙M foٲeIZr瞢.nhC0 C pB](7WOn]vz(_u;xjqZD|yWwI܎ :@Ȃ4֮]6h|;ݛfO'u#xC-T?w+W,\h>  ^= ׾oo 0#KU9g>i+!`@OhΝ;wWݬT E<砋 hu,,)چ4h*h~浀VeECYsZq ?3z|+VVRuX$NoH+rt!H{t'm7~_,H7nP Z0 C0:E@Gqz\G{$S<̏CtJ-uX@ ,4{Ҁv>e,S}zmo~ !`TQ $<|Y Ys+*yu-#>?4oߡem!`[@ܬ_|{{STO C0 ZX-aR%8:rtSt$":Wa.RA1O|g'冀!7`[@;mˠ>\0!`!0@@G#h-.7h J%i UB+nMB_h_riJt7*p}"2 h% Codv6Zo!`# L%W1"%CਃKbRrL"!'tRT*>|ClO{1|: }D~G0 C?*Z q(ƭ$e,6tDw90Tj}PMF!`t,؋1ź-~7M|PL Ozm/ާd!`E@GKv忍i`\M^IY%a`8 c9PN-Q/dG$sbd E2jV7 [^C0 C0 ?Zс6ꅶ@{ > oQ2PB*`, ErI!ڎoB#hIݏD Y$4GPH>qk!`!`!0UB@ rE8օoW>/ar;lG䣻}P `(i;p>ku[08v_a(4C 騌 J>;(v5 C0 C0 C`05H.[,?&3#A&ayTl_ˢ郖_i*[WB= fjTl}" #}l C0 C`>! g{t *A䱎ICI=&r5SC0p4MYԵ1ݾޡ,7 ھ6!`!0_VNN}Rugc2SyR,/T>@[@B膀!`[@0 C0;?*"PLi\xu:M1:ڄxVKLW h5V6 >>Q6݆!`!0脖 RO>!)ϫ9 uEumi Ks9 }rh[w-%ObV6 CsdshM!`!`SdT #y x%X-H%~W3u;t,7 ھ6!`!0_ђ;w7IUA]tIsȀV/ˢ1mH_g^ hPV4 ^^a6冀!`!0Q; q? &Ic9˧xGsu`[ీ(X2 i |hq\۶ms{{QYh=6nXznʕE !`U@͇OޑP /ڶm?{mUuN imAFj7Qb1Sc4`nXJMW XchV2Xwt)i;#*#xw~sog>#>^k}kw\6~N/}ڍYw¤uS^x駟?X‚ … s&ׯ_&Nk!`FGZLW6n$IctSovOuuVFMt}ssci oEs 96G"R"uC;wSO=m߾3f|T<`Ch;i7O#FkP6l&M?ީh"7o޼CY?U C(.9tIؐ#E"Yb$\Y 1_&`Li#:jpӟo:j+cNiGsZGb6dC;vlm<QBd*]vʏ*?S?>ׅ1crmVn SN{ܹscʭX"'x"֭`!0Q:B\|rm*8;jD{;эw;#ΫܶvF?EK'}&pܜ jFsd RWSvuۓC*Gnj_?$ɒns/M=<`!c5s^j jhH7!0ZbYDrC0?>SGIFd[r{l/%~to}w;w[t). զEүL^Y[t&e ~aw7禛GW^qw^N*bvBI?rNר^]xQ"hAWqӦMq^ƍsG}twW{n۶?wj|k!!aZH6e^"e!Dzs92׽7Ž+p)p s&mzfk.uwxɈ:7#-íy-JĬlbVjy&um'Hͥ?xR&Eg![fΜz表o3<3֭`!08QMFW%9dēy <$1OɢQ_Y|/>biE9ܭF}v3qeC6k ,#g2BK$,7 }*/[K䪨U~N(ѡ#U]L'tK/_|1tڵ+,_sxRWE6,=1_ eP.{/߻ѣG+M8QuD~wtWagyƽ/9"lsz|"'tS2:h׹7=*X0 C+9]d@>j6䩗ߡq@/39SQ/6zUc76n뮟6v2,}@GlK{4+je0 v/\ ԩSc*[.,d'$se5sIMՒNsOK/4J]M<9 8Ζ-.h=OzzG'bRGYbY4}Ǡhne-֛oѮĝuYa}{(;5@IDATd?k,ΜpZ3pӦMs.N;xя u\s ͅ\ciB _ӟO>9߯XD=c㏏ͩݪS8m) `X׌6m"1S}O=ThZWqwbl䤟M_j$Ugٚ_F|?!`^ravY`erΥGζV>Y/w56h{M--Rbady8[r{hےcb0ziX2XO ոP Uߟ2Ϣչ'XQvIKWSKM5֞a{%EM Ή9/Jz yot^brʜK. |0?~n|o\c%د (>C0 .GG?cac_r1Z n}^$.sD$Qߺ[ݓfk>Wnp_ҿvgB}DEFyZd)<%6چ,_ieuԵ0Q9a֪E-/UNQ5'{ґVFh+kyD< F?ʒ7z*_|ͰV륹)yMDz{9/̥l>1*^dTi2h?n[UO1-!` x} -N:?˓b-}Ex{sO3=ڕ\?\46A2*_F,ےf =4K*d-.ev HC8* iiY$4u|6QG-[#|X[rn۹q0Uz)||VjZUNʇZFL0 C+0,Mz)~b;t~/C|œ߽b1]>{wS ƢBF{9lXb#E`[!0$6I"2B1:GjM:Qq]B\F`[c]'iiv+jцYG{F_Si"ԴN^}kǞ!`(1Nd2i>ȑuOyKyHw-7ݩ#J_)$ml%#IȋhcH>Ev,C=`gHz ın*B[[wk\ '.wog5 CQa''I\r=h׉=,x̥s;#sgguw3)IT9]MemPD@^DcUBFM_͛sk7Fh(ψ&zW*lS}-}(>i!`t>H24DO,:F7EW5p_f$߬Ϳ3wŎKی{r#`;KƐsr:R"DrCK}F"N*Bi?;wtcǎo6"1rj AY(Cc?2G9knKk8ڷϗlhx4>r. 6}#X F{i@u?^ C>2kժUHZʢ^ R~2SN?$OJ.R uR&Ҏ;z%?5Gr617Oƭ[6=ejwNzE͟??//薥Ke 9>c C0/>誌2ܟ,z$ShY;? %;uqnHm۷c7_r˖>Z[A5U2)o$½,rLߘ'ClBe9Eh402V^.]p_o~m( V':v7|s2I'J`BG'َ8ޟ1cƄ17mΝyļ(خU8`V#}˗}knĈlr[{Nzn^1vuQ\/ܳ>.(S=2+VDyd0 C`"ͳ? 8Qh Hƀܺ-2r/F Wr^Xhr\UEd -7BK,7 " ېo~֬Y#C<`!0)?z8_Рn@:ߌcn'-->}z~"r֮*XW^o}}znΉK9zoه6nܘЂ1{i+!` 2x}pB(#'-yQ\'_T~wtn _KO2Y^mϡZ0<8>wqɋ@eR캄S~H<@/mu۶v@(Ӆ kf̘OZҟvSO=gcg;'zEQ>}E9H\I9MY C(I <ɠNj4_ƽtۊ±q5׸ &6g>Y.55?ڂEhvCXh7o^! x஻/u -o?hNǮg%]tQ\B[~ɹ MtZ;i0cc9& 7a„@}} _i@P㫎VEdr!`G6>EhAԘS1/'d?rlJ$Q^kBJ$̶>BP/3@=GۉmD)жzUsKv`L&C0FhS;ǸՊ430$?-`$ Cb(Z8CI$|-}ExIa#/mc9uN_eePɤQ-ѱ0:Fh~L=V+;p~d!040 zC79}yb("a?m]ړeSeKZ\Ew?'вFhSY!`tav~;" 0m,!M0 ! 2-=]'Qd{QNTud#v<ml#@!` <`w+F?cǎA5|`\U :m/^\Gd C0 >*J"Y6g){dI .e{,%ad.P.r.uS3'eS夾מCB Cݭ[}_;nܸѽ{!z E`̙E v^lY[0 C`h x- _F0VD.)Or:rݔmMU9~N6DbKCN(Sc9R/-0:Lh;7 C0 B/tX>a_ -DSem gđ0;`W|I9e;u0,Ι,tAC0 C0 C0 E`h yᕑ7@<-%Q^7sߌtq@<}^:9ڐ2S.[&18<10dM(Bt C0 C0 Cx&lE2[%:\>v&u 'ed6dŃ|+SQtҶ36 ~CKjlqAj C0 CѰC5ó~B$2'e!Dzs1! FMH:rDX#!T [91 @l# a!`]Z푤ғH};j)ge3=>)#$lXl/ʋ'%a~b#h[!`3<`g`͜!`!`t->jZ$V4-C C?mj C0 CQ!c9 eI>ȱCˁgRlLȼh,/}`;r(Pݗ9@ƒ!` <`m C0 Cx}XK'!&zKYТqr4#GrrLh!g톀!m5{!`!Э*2~9qe%YW7'[$Z2?S},#7BB CmMC0 CFx}ВaB8MP<-딕&T?( dR)}ҿvDʆ!IxfBc[oaڷo>O6+u֭[qN>X!`@Gw$~w'tJ4FE l " f.iVwhW8ܧ?ѝ;#+)h2/`pœ׻'ڬb!0Q$r$p˜Đm9#$?q7j}7yR*s%_1[6@ y<9tPQIJhGjnuRnĈ揓ul̑ ܤIwx;-Z͛3ߛV΀U C0 ^ ;x`C^YHI"'Q iZuIіZ||UB>alwuSrל@c略h"wd;zhwW'j""Nꫯ1<{WN/ZDNjңNtIN?ꨣY`ǖ C07<]1]Iׅ"T0=v\s_-.9:#qLfĚso}ڦ~c{%CB@GKЦ|?Rv&M;[wWcs%ܼyo=#Eù{sEucǎu]v{{@ỷ \~ykmgV1ʰs"V W|=z5kVjJ 6AFWc(̘1_E\qΜ9?{6m!!0Ahq2dӖD.@+ZˇΤ ;V?j뾗_zs~^!3H3ms" uWf^Y[t&e uHݗ]Ï%"2]nٲe8JB ¤_[d`kB+[ж+vzƳTa=kx$>\bkӧGY`4TaF7|ӝuY~ ڹsÏ Lv[x1!` Bx}4Am3 *NLa@Y,^ C󬍢x[͋HKw-xlO_5 9Rh95t!`T Dn!O?K#2k׮u'OЦd,hH@v}mG†|v%ifMRQ:>"i/p[鋌P+!08Q=`&zx2O$IV$Ob?tC/&Lsu;-|<=ԇXXG l C@`(ZI2pMZ|iE[Q14?OsK^s%SNu=X\N)6|pi.RQ\mꩧB3Z(Bwbl䤟M_j$UvѢEn޼yt]`!Ub?4Dzڲ yO}ɡz߿?׎Eעڝ苯7+djyeZA.-Ӕ߳gOC.O|%C0Q0_8ζ^}IG|}dZ+bE;>bWh'\=dٜ/n4xrC]_%T;'["s}ʕ9K.ɧ_j"ϟߓ 1ʒ_ƝW[!`@#BWt??hE]C䏔=T`~?yw܌{r,KGh/~J$C&588D&+rJm` ?.ZV'ljZO:rԲֲO2B[\Ys c"UF\OhC4SM}dw,ut$U >l|*k=mZmp7b} !`10BZr< ,3#oCr ʴ=YwG@}n=ɩ'w%3rc=Nߌ8'zZǖ) C Fhq씄4Eꍾ }V͵]?lƏZ/ƿnZ/E&|,,Nyuʇ u6 C"r6ȩ$ ,CA/6$-ul{;\4??>WWGhw~8kKG o1 *]B\F`_:>IEĨ]_J^c $t?;'z)̴Ujn'cd C0\r'"MDu=5uno=8 ۿGtsRf91S>1}ȑ_zM$V6 BդykHz ın*B[[ݯڮ;IBrv1YC0 OM_9Z/3"ys-KmKf]wHPOɢ=Xz)Uvm~gM;o޼9{o^#Mշ T@Fhwm6C0  $peCYgy}ݿ%-{_2{~1Wבl1ѱ0~a+eڝ;wcu.im*BS$ f^*B ~6hڔ=0 Ck0<$-pb"c9eO[l\P Ɔ}wդF1|P)eЦ6CNhqlJz/I^B UPϲYD]?9vvDZ/o0 C6{&bi)ą>&֑IA:ݧ~se~wdG{yPٲy#5@ Nh3Dݹ瞛&نoX:fDfv}mV]JO$qhW0넿y C0Hh"81HW4])p-}1rzi9M&RN_cR6IT9oϡMAem!@`Ip4ӤI"HEZEP`O޳, Em`WϿw׮]裏f0s;l\M6-%jm!`Hh|pBBbD2=Ie{.ON)9i+%~4GJ;Mh/H~|6FT) CS/oԑr C FhE]q^*bZ!T2OuY̢kAվԑן/بCm>Ϲ͚5+0[`[p!ޯ{/w-;?nf0իW /0oݺṴ C0'9B; r]f4L:fѮet2 ׶ZS40Ԝv֑Fh#LV0 <ƨQ3QM:pHB: `wUV1cƄcMܹs#}zzЊ"r֮Օכ-L8m߾=t[s=R~ 7nLZFhu~ԩ瞓l!0Q$8i9(rhgZrRF OhBMc?Pk4 Tؒ~uds C*bv m83{K\$g;Ah1$e̘1=CQk]ʁۑRSO=5Ii/>l/-I?!`^ ;tC]wLBɼjԁ2'pDXwK!34q; ]98Y>za-FZj0$z++Wmv]B)?-Z͛>v g*2"?ɓskGv}?"0׿Rbnvo|=ΉzX|5װ;۷};qK,I}簃3)a+(4S冀!`ݍB'"]yjG,xZG}E+Z]_!"ye #EY!`7<`%=~o쁬|3DiR ?^ Qc ߦLRkfw3~,9c &+{iWDGI㫎E{隩!`Eh3[F,HhJ'$VTY :K1ZsFh%ZV6 N"v7Z1gΜ\͖vS2tmkK C0^{h1%?'(G9hiԲ1#s&ٔT;uƒ N W7Iqɴr+!_m6jE ;3?-( C(I:? /E}їc#b1Ɩ}b]Q-0:FhwĉOY2+;< 9%!`t%>jEh9ө"s3I.Y.e6,317VFܥ.sLFꆀ!)xFB L=E\fw 7”l 6EC04>EhI$~EHIudGeRe!O%K}ҿͮ(ՈX0:Jhرcs̟?-X fC)2{mŋQ7C0 AZZ5HpOUQL(g Y$ iH=YYTeԓ9uSy?vIaիnfJhȺuܗƍ{1Yl̜9˖-u+!` x} - ~I$|-}.k/3e}a>S^UZuLu C̈́}C0 CZhq439Bb't.D]};mprA%t|G޶ݖJh{p3LFٌOBi?CSJ-Ve:R u}_!`!`!` ,HL6bsc1L/p˞2ܳ b!Q_iyyonK"qi3)F2~lKZbj!`!`!`0\^ 6@vr)@<#9A_lm^ԕKK9K8_֥.'Z CSpI-9f0 C0 ^{h1 '7lc{,06!`!`t>ޓġL"rH$u]k}eLT2ErUADh=6ǥ|R"}#-+@' -ooVtݧ>X!`!`G*>Q7'(G9 U!?6 Wc1}iM9mȑG9Ȅ$lϡ2}KW[js7nʔ)OO_ܫ -[''t;vv?ϻ+]venȑ}sk]v;'O=?3<6mƌr-qt+~UJw\yoBa7iҤڵk]}AT8|{N?NA`!`^#5IbˬWwJ%39͈3}U!.cZXUnbNݬYꈺ;wSO=m߾T~ƌ,gСC"gmn޼y4ϟ,Xnįs惡߄?ʜr)׻'z J0w^wgn:5^v? wwk7 C0:>jEh9T9Kцa9smf=JS,#7B[Xy;"Çzcu[n "Uc[?pɱMzGݵ^U{Kh5{͝;7?M݈_ogms{0Z} HaoN'{6=C0 C`( \D%cNtd{vwro %ﮟ;Qa9&˜#rojDՁ=DiMN8ϻ+V0x׻e˖hGC]  vm!:41"w}[dI77tguV+SO=7Gͻq<`BHaom67 C0:ZZ5NH |HEC/ fЎw?{) o5w1nd&SDG_4x$ח9w\y6Bۗw>cqmg7nwcXn!`ix}x/O z!{u}חt?|>C0 C(FG@:c(JۣU@0ui]MQjҪq6!ԡZXm_nNL(li2Opܶm[~ٙ3g:1aLl>]Q~׻ ̿[_ {g6nN_уŏ;'뺀?G6~~/l05bX(tGm\>p|D2௾j]a/wgy͕SGE2$W\qE!xﰉ;wTK&X0 C84DhAjSTb6FbZ^fVEbeM挼h={suYH:<㹈/\_)Hm;ZDcA 2mn+lghܥEZ#Qd[~W9ruʞw8e?~_?rt28C_ c uǼRxц冀!`,.$E$A@J2,zxMs)2ȮZvLª5uنrTNbHt=5B;0i\ uȩ&ZAt&UΕ]~E#L i[)ʕ~*}]9&㑖i;T=?R_o!`'=p i=tPE;z$Y'@v/m- ,Hi(k/K%ye9N5q$!5Gd5B;0]\ =Uiڵ9ufo &oF4 m On¯Sֹ]gE/%nu~iR:1ʞ.%2J?A#/_&u-}yYUʱ\$:ȼ?- C0 # ^% $YDQ,+ +d#Mٌ䒤-6[~ukym,WlnE*I-ۊrZI^m@p3*.-I-ni|yANbzUIGiRe6zKhϟn\8e~NΕl9TY.|@RЦ#eCw l#GD ˗KR"-SoZsgٯ~ҥ=h] C0 #^#YT'DF_J˶dv9neW;]I$֓ОVYbN2ϡ%Qf0HZ'<6M)|[uQf>_[|ܧþ:PCMC3sk,a!ZYEϋų o\_t? ;R_TsZ?[nrǟZs9n͚5QO<эs}T7k֬TWۺ ^O2Sֹr]ǹb';Jؓ/lٲ8rw=97{rvSutM<9^h{7Yg^39+hC0 CAGðXTq2D^( 9edxzYw&>ҝtcǺ#6wnG{rfPW]~c_5ϓ|^}$RFhjg(>nh>|xl :\U%}!kJ-N4Gp n̘1>>coVB)b?g(h!GW݆22BG'dEH+.ݯ~|-<iŊQ<}g]Be7~΢IDAThG0k=F}utLu;W !`= \bR۬6.E,n7)1wPX߳gO(g=X{>qHnQF?ٳgWnlڵgΝANL;v(gŏO뮻Zι&䥍_Tu֕H;#kJ+3z8SfW W?E2g}OQx饗2Ț5kCں Jmy晩[ߟ-ܢEe~v)T(Ǐ*:ZFc]oUh?,o!` 9Lc咴$r[WLƒ2ʻdWnyduL#];wu%EZ~[^O? ?&4A1%Khތ/.mVOc$H WЍJUWEWY(#>:&y {+{},k&W`'Yu~tNi_cb:O}UZkA/cJٹzWg-`>q,lڴ)9З?N -1> ݺM !`hB#ҩWg5ܒRy1 m ~o}b +6olYp9z"|Ϗ6n7άmȃL1i'FdQfS@I& >T`S0mW2z `u.&֬G\d}վ/\+2bA$#ه׏>68:A 1ҋkX8 yܖ 9o^[hPO?em裟BC̦ј?"b6ߖ6 C0FΏ$o7fOy+C-Pg/Ͻͭו!?ލw;x;:#c!}˓頌ccu|"wᬋBl!pBw5TΑdp ]gu[jUWԺ7|3Z'.ґ'N'> hѢ4τ`N;=#n˖-,NcO܄ |Ao{>ҮT x< ͈+sT*l/\w;C׻iӦy@{nb׎'n޼y^'fS0NOLꔯIK!`Ώ`EDMIuK`؛C ۟sn*Ouq\iBIYy)Q}˗Q#|PZM"Qc5ydV3glb:go~ 6EfWXIvBk$Tsjq~MǣKc#-&MTzjB m۶N:T2 nܹ({Eƫ @+0 C0FΏ{hR!P͋iOQ^V/o}WZs2{^msֿ~{WOਤ[Xbʱ~}l?E}G 2(}喚^{83lRw/;)&anrH2m6/ e- Ux}W-$"<|qAw ԫ<ċ6-6 C0FΏ-4RW0-~e[o |+}Q*C;>u7p6or;vu{8wWc݉y|d}{]xN:y *pI-Tko[sE6lp5#n>wa;ovr/{Í3r,N/z_/Ɏ*+X]D3=?x7}t7n\gNm:zAˢڟPC6P;wR1LӉEce\⫬oB%⢎26ǻl"?_En; 1 C0 C0 C^B9ĿI":N&$ 1(j HFՖSX-޿?bm-8&'H&f}&ҝԶ7.ۺ-n`m!`!`!0dE)r 8pd3O>Iti[z<ۼ7}L^b~8I6&P|Ҡuᬋ"Vd@}pKm9Sd!`G)%*"$xRZ^E؈K1fLyWke=l2rZc!`4l#M#m C0 C`Ph޽{[1FʰXN}:+zϭE^d2KdH6Z% CQ8`mf3n!`GıDO>uLX\EVGƲ*mtPF$̣-P`Ál#Áa!`G+uHʁY@YYʒB02rHk9:H#?}|({hsbCFhk !`"Qz-AIKʓ2Xi+-[ЩvUʉDJ,.¥|!)J*0O!}r#lV"hiChFhDl!` !QΓ).$ABmxNro,G Du$Y<}-'_0g "Z CI8`mem!`GZALIteT dSK%OfJCPՊ$9Aa^`?!0 pBhԣ3fcǦ9!=}t7nܸ7C0 CGВ8Ad^djCZ_6;+ָg?ֿ~m''u3?xi+mMyH[o+kTp͵۟4iR͟w)1i>!R(hxGO6}۩#߄ dGevCM=\f;Ѓ 7pwg!`p~4f}9m,H6e\e!Ǵ3 1%{3nGF1g gY!GQL,k68֯_MV֭sSNu [llwQj{zno^LG}t κË2BIsyxto7o޼wiqŊ';wtgy;#Y7 C0$8?J$o0W<@d"&R?OGܗz۔ s7]yZj:\7Zy"ϴl-_v'xbuYnժU=ۿ;ܹs N.\讹暴iCmz;n%Rx ?ÙSmAP9<_~6AH)/ӣ><;ϋlX#϶) d ~|Kz`c_O}{Rᴧ]v=a?8ߢPڍ+AV\8~,k&zE1eоs8 N8'XH=ڍ[Wٱ~;揕!` Bɰ>0cPMC\7N/5G_z-!$8!BX/4 ,%Eڑ9q{mې$R^O9ac_U&eRDOs.&W~B8GءLIӞw~*W_]'؃Li[gYE}x k%9{Hf}÷fVg|rc{5vǶ֫/Zze?ЧrOc}kJ4$yUk:]ڑ=d変/bVDX[Z`"{M*bDnz5D\`A뮻]Ap,mO;J3PR({ʢ>/Xmgt?(+c)$Զ9i7/-Pwic $M20 C`h ȩa2XYbyj@%V,}5)`l7G/]3ڤgw2Jh' 9Iy-k}e^U?Yr~"UQP(@(|CrK~ ŋYfEU_~͛?1-{.zxH;ݝp ,Oj_?4_t72eʔy"nLO<e]7uC[=.v +dQHQ}~I'Ntv[OI2zG]mw}SNI}ӦMHc632G_wᇧɠ:s:'>h({Ʀ-ر7c!`#Q=E+YUX~ͭEK3'R+K&ru^*+Wes5/ lfUvLVhe@B?kru颠WL%ŠE^~(VfdSYy d'81ù_bmq-Ͽ>10 C^8?]͕`/̪g_j(eM綻_lzlM:]Nm_!_QW2FM}?y {72OحZj!§jlXVh3NVV*H^Wh=9p8E+=P*"u0ɕOzP>n{tZۍ]O#}X,ub6c:Ee&Mr[l "AO+2~`|>}ɤ|׫YZ?Ho3 '2I96'HӖ1 CΏ:M ?/$1>CP.4brV0?MniOLr]ry3ݻƅaܮ]+:nPnkw/}蝇}g|QE9B f.ȹԷ-03Yb䤉eU⢭~M(~cK8&ݽl=pn~%]uU~Ss$n{Zo}=mذwqw~eky $ewƍ'?Ix}ڵkZbt?z%w~gOD^}XYz~5=OO9p~Y!`@p~-H8IӶx {$}QjkCPgkr'&i;Rq-[+&]0G%I%_A }U#JFo{#',+1A="PMʊChc6n  Bi>O 9κa."]zj)XE nFm"7u?-u B χPE}l>6N,!`<O9}SV;+XW~ ȿ^|eE-Ǹ6(e﷽vQkczePy,g,)~2-ydG_~RVU5}4&'t,x="en=9(S)T=4w~mד״Z]?x2rL,fO u_%1ױ֫;l豰s̿& C0FΏRBK"I΃ʇCtRGbz1ݳgK|(6'd1Rʶn}Q[+6vA[I^BAĖ##wr?%ڗ&<\e=p]YLL76)+GCl-?:]]?<Ap^ʺ*dx8ԃ_u Fo}=voUӸt{* x.qA'v=~Tk\0~hMobC0 сGn}aNc׼!1-cC SARkD歹d]65G+!qŪ+$#-YF\ݙ<ݘy'rLhSNbYaR'yޤ][n&eR^5au  tLFLj/ lժo5+0-dv)}/d9O*,ӂtu𓿮w[BƎ<%y߂{=SHbڴia=We-&HCʞKy2c{z$'pn/qӜ,ؘQ2lj}XzU|~s̿~l C0F/eC_ڊU'y8Š-ƬKWcʬOcU֭Mao]>s5Vaeu|{Zpl\}[e=b1ʸ՘i[ӗnU?dqWW[e–â[)uZȷ}-=/e5O*TZPC,hY=ԫvz綾^JվcߓR[eף<ylk4U[ǘM~[!`!QzmJf=eԒ"&Ye]qx3v;[/G;:7=& b #,G,CiZ\6B;r'o/-RIeRw*C~ٲeن$e` [MF8gi3PVvOIG?]Mrt=36$nU1Nz~V9~u_efZﰥ*Icڗ:w^0 C`(B˕ڲ^l׊֢k[~YB b?: !IIlr-I\i똄V2ovN^Z֓,DQMLpk^ȗ- &˼s,X,KxUd0aG~4q %ygtk;./~cmRau[2(l_ձV80B6wOVn!0rp~Yy8Tl2J,L$o;I굷?za }ik~@lvWڔ2VIfeZZIlgڑ;y{iY,!`lC? .X#'LC׎ 8OL 2dU`Ʈ7,#mSok=H\s캅l>V5){մ _17]iǂ1cO>.~7Zl!0zP1LA5 eM)8OoCujON>mn kݫ|vTZ"u9J$dL#F|PKZ' {(Dcp?Q>*sz?9v3gd6e d$|ßd=~M4I/ie|ؼ9} [ i>ׇBi_.:O~裏FmzB&LХW=!kd Eol-{?^(/qa}Ǜv-6 Cp~m%|9!vȁ$}'P<-;T4~z2n;?C/[/uQ܀ F\kW5ܱlMRA(#]^)[Rc&ڼHu,Y.xGfl۶͝tI~2[Xܹs ?LY^dbזHZHy]Umo~*!ky-_C0 тGcn1]ɼLc[ΣL~P/xl'u/P~bu#-5e6KlG9Y婲l@6㪡.{EݣF={qWZyߤ|X}U^w#_~|.*m-u]!`LWX7 ޽4-iA iZySeK/mض#6};PjYDR_:VF^ږbVVXQk;ÊΑGYA@!sk׮ A.~lrKĽ+n6g̘`3;VړaĉCՔ)S6E6&&آLp͞|-Zw4vvXp8W駟'|2N Ǻw!`@p~{-$.<ʫb_&Cg?hdy  C`8/ C0 C0ΏrWh%,rLʁYBKٮ2|{nIK9KLIX:]ee!P?֏Y4 C0 DCR—Lt-\N=MY&IoxT!Q4%@ I9Ry:>J9F)g+E@Sp6Bf0 C0 Ώ- [ >9 "-Cjׯ2z_RGd]^:y :SBiCH}#DbChFhF!` Q|6!Ft<%$ı@Ē1ے)ԄX/Z'<-g^`?!0 p6B; `[!`!0p~Z8xO$rspHUOE2Z?֎i@߲D4Y*6ur 9B[71 Zm8͈!`!`p~4f}~/nG$2.+e!Ǵ3\5ղpz>{d@gM!ЮL !CU;rEPa]vjY0D&Q6ۆ!`!0Hp~4ƿ[ A+P ]Y?L{ݤj uIm R= z!Nnoi~o0Ўl?2v\\ȃwV!`!`!`Ê@ hDMm"Y] Hye`zBH"ݤi-O!fm -$1VXeYnrʇ4 tPGC[U~v-nzrFh 0 C0 C0 aG --(lEAN 1]m& I>EmGƐ#vI/˩R[`߁KIVjiChn-Ml C0 C`(}m$$yc#rtdY/RV)!7!Gɴl˶/{hņ!467 C0 AA -WN}egcQ˴Jyٮg}Y܏>u`iFhжzC FhB!`#QfDALX<-6X&X=({+P NDBeFh%6 &mIͶ!`!` uVh$ |"r !py\J0-:i[TPySOZF&P| ~ᬋ CFhk !`"QJhIdH" ++K1}i0Fӌ)c*c-M] Ci8`mio!`GcےMvč!4RrA]_֏ɤe :TV$5B+!`4l#l C0 C`(ZE8DOQ^%P?k2ȸW}-?R^~=Cj>m6w9WI&ԦI5'=F?|I}Ͻ+ԑG;ϝ~裏 VɃVvݿ;CS֬Y@`w 7nK,q]/;Zk0 Ώ{h+z!6S_zߊ[g@]}"2BCI׭[NԄ-͛wvwXn¶:xn!` [QN†!%rՁ,;!$}Q?K׾QwDUׯ>Z:Rm Ӱ%:,jժ+|F>ە~ynʕuc>Oƪ*VI?+RBuMlX-8NUK#ɓįP#. xV C8(B -⪁)-PVh= 1IPb!ޯ2_u.!m)8 U M۷/3a.ꢴ1o("W_}{;~_nt[y{֩*(#mOFhS -JUccnhl;)0 C(@ВAiIBb"z%NHݵս=AW!ӡƎscx]ĹIn;*,}."ү RVh+V$` S6lp UCCbz-w~[/^f͚U)P-uQ6aoNȔ3okaMFQ)OܫԄ6uFh'f#ql)cPư~چ~3=C0.8?o>%_"$`䘖qF?B š['=s5B`?rUvׅ fH>=P&z?~_>@Uҿ!K !ǘl6M?wΝۏux )!pP!Qz-$kG8t$idY¤lQݟo;穟VDBp!׏R"1p̧M֯_o߾Sځ[nuxq/+1=i(ĻL?8`\xꩧl\Fg}vNx믿v6iTΌ{,;4_|9sfOK/~_ xM x8pOj~}qǎnظWU'B y0xիW`ם|{/vM0 C78?–͖l!N~Ֆec={iׅt"t{L9=]okϛff|>֮]J?;w 2uexǎrzezG[X>*"~OjkOS~6S~]wUj.?'گ*$׉gM:>l sbۛ6mjc-DtOا=Ic}u5 ./˖-3%!>h0ڨnKu9/|?i Ծx8/: bc!`@sp~m b[Fj%%e]2N$Бmkϐ,eb_LE$aZ$( iIp}ms'ge9)̄^N}yeSځ:GFv,O(!Ct),K"2[6~Jm׼X^< KC\4}^ X!`@58?l9}o)/I[Q^%Tuڱzu>:{e_ll*m959EO:sy<I7CPTc=XbO92ooFt_ԑBgx4k} -5n95sRn22c{G3Oeq(ݳn{XO?|ƸO3Uo׃G*#D+<_EOM~\CXIfW-ȶmh_b3\`O}ʽo{ƹ& C0A)a#'2Oe}N@A&ՙHJ}gv-#z/ zr2eQuL#6BC2=iK+$?|uW0(,',$C!+VpsNW K.%\P &wBp^ٯ뙧c&x7LbO~;0&ZH<[}.v(qM8vm_~p-#Ayϝr)) Ə}2l*i~x*c d/CAر+OO1f+^ C0G=.\u1CVbr=i,1#޵֝s:t[fq[.~/-r1ӈezcp1b-~1O0'd*i]lH駟@?-Ӹ [О~JU -5ecT>~@h+s=`A6`e>XX2EVo!G{h1yeC(֮X;++gŷf[9['cXL:InQf6j_GkrRxP -|,#HMܲ 6ڷ2NI<&1-p^Mq#CƮyyNKh#K͘NQ1)k|פYGe?0lЖ8!iyG>Y0 C[׳hK/喣Jh| s[4k56lGB1c} YY}cmq f٪ Y~%K.(5'E5iAXv;Sbl|ӼNH?{h]\YW6S)+D9|%wy{EdD[jzreq(Jꪫzl޵%Oy mb.rawqx[;J׈blݸqO~^߃CZQITC~1X )AGЩdBkiC0 zh VWCǗ )zڬ:@IDATb9tzN;ߺ=7k"H֑GՄZm fč MaWre !3 1?e}ioo{_jU%Sy &UMyn^G1Z.0=\ve}Yoji1L ~T[b)WIkP_h]OsyN|۱0 C8?ʽDۏ>4A2yU>rk1eݛWwΞ}m__Ӄmíƌecn#΋vؿGn9Fڶ)0E4W̑ x69ݳ%YsOz[wwb1Cg}+Ԕi譚87ʂ&Uѯ2bD| m/})^k?@(+Qﺯc<P$7y^h,o!P?9RL6咸Ғ̆>%quW:Oymk^ALQ/?< -Im,GlQN"4 O2uNh/yN?+ǵH翕j";v T0#&:PmOwUiQx\BaiC0 (P(VUZˁ:̣L~J H~HK[s2_j܌''dvW'MnR2I\Ifk+I`I\3D6!3BəgNV4ZXϘ*ekLlr-?rp.@*c<%+XUGMBQG[2ze~ 5h܀![.t?]f3י R5-~@;iyʹBڷ!`@p~n9!ŗcC>yqJt y1I-(M.WXA|n_)/ݿ:#9VfY^, . m=~[1"Fh=Ac뚸'drk#.?cT-+?`]&UyʞK久 'uc{ߚvBy1l1r%.t?Yf3rR5i+cy|p!`!Q|V@Nv-seRFm2mƳgZ#" YY",y, #i͐Z_rXıN@d8Y%Elj7=Q¯LK?bLt h>ĸ?+9cBCFv!}~ǎ!gVzm(+ z$uۣڮ$-y.UцĮ6f9~HU_ױAcI_7V2Uq?v8/d2!` 6bIdIh]V]IdCZ/2ξߩ[C*WeRrbՕiW䑖, cLn̼s"bW¨Wګ~h=3f[`Y:6- ˬ+E翜>DPc#uCۺ1.$ygtc7e=&^)<m sʪ8ey^Xycn!`@p~4&?o|?,czzZ8ݧ=S RH6jշ^|d{'{hG-^veJU7iҤ4_??<#& TH?dK>CW@;?1v}{رcY'|ҡݙۏݬYRY&fΜIs7߳{h=sw}G>ƍzw^r%nҥiF#̔y{2 w;4q+WEn{0kP^/\ye2?R~xBV^>Oi6lp̟ٟ}>O4y>rEA^1E:i/A?}'svb#~Z=/0 C`8(}(-We'c% i2 9c+Ҋx[sz5WrXMGYsUc(!CBG0E?J?y~jeUXuWE}(C_ؾ/ezeK8vt9wE^͂!a1f ht= XiЏk*f3ʳ!ۋa,Hb6u!o#ۗ.Aߋvlqy2獇uK!`4G=$AeIγο.{e??2bz)G@C$ΰ{ड़! u?ZyqMjbD^cQ'1b~bĝiu#!`ԏGZ?i pTe,t Ee²{u3c_&0Ë)6+#[v{לA.7~t{C{W3f8ؔJtuhۯ9OĉC)S6>uO`{O>Z@ˏ87nLz=}u1!0P(E%s\<-󔕶X&X=(SDnFG@Z CI8`Khl!`!0p~YU^/Ym&|6%*SDj)Tĺ]&e{Q*A=+LCe^8뢌e CFhF!`"QJhIdH2e$x24.}ExI!kvؖQG)cW$hG#o+DbChFhF!` 2U_#~&61B ,p pmm!` Q $Er |^WGYY,%ad,r2/uF~P']́̊ Cf8`X3g!`G= W$QG.)OrFeLkYIl1MuAӈв2ChFh@l!` "QfD1iy2QF>I.ROY mO4c 7v4o bz2B~z'|0aBȯ_m۶-ǍOʍDJ6G;MwsM`e6 C0E ?;|1%_ɧ2)ݛ꧟tO[n7ѝ8}s~ϝ}ƻۼ(BFd~ʘMbږm$ط|Ҡvᬋbꣾ C=4s͚5C6a3uA2B vgH-Xp N_طo;CRњоX5ԁx΍.C0 <8?J - T eL<ӌ9!mxnww;Oqϝ.;3S2om)]Тr2n:7u,˚Yq4`8`ڗ_~ٝx)r7o^1  ,UE&ƕ&l"ȆՕV1C0 h޽{[y|3@FY2)cԏ}umq~ʬ@mRBmvAZZm7jn݊{%wqD8묳ܪUB3t+W q Ǧӄ@8!`ԋGТ9MΣJ3Yp.wl7^ 6+._qǥ>6H}a#2m7.Vb evnisr㬍U<:Ϲa!`ÇG+U =$K erMx5mBJR;W;Es7ܱ%$ZIݩZ ]6m5( -n/Pԧ~of ^z 11 C8X(W$C:g1 Or@i…k {kG;M+M86@8!`ԋGc'#IU(d1%@$+ %`G:+|v=ێTgO”Nq~1(aEy 0ɫ ZGk?яBsxƻ.wꩧc=VЕ~뭷K/~_6}0U^O㩧r8Io|Kg,h¦_WߥMenE1p!s$f,ˋc=ywG,_|n̙yjVnt!WB뗯eB'fWZ}6obX9볕!`18?«ZQ /c{iw3W-\k+_ڽ{wk._?oϞ=bs[]IwCOgcǎP8^>pW:~ iӦ+PGڼ Z[n'i{zh?,&S."ɴ6曰 uG]_ߦIN-[k* >§J,r*HU[5ĸ҄MYgiqU]cU쫥 C0 *p~n9J]+~"DJ .Sd;7ͽo?6O=綺̻-I51M 8n3]E()WZX%YBWY?MWQHUt!#uЗ^VO?]m&ڭ)W0+Vs99p7*˛,[:zc#a֬YQ0\T R(A!"-ʻWNwlbs}<9bC0 C8?o>%_$ˌRrL8/ܼƥ4Nrgs~l&H_t_s s7]yZJ~3vrzmmF}/v-W0A\tiW *;ꨣ܋/uJDCevԩnR-Mme,l&l|]~t;~ӟ4z< 7F]qk,8 +oX\C@# g?pߥ~?~0 r!eBu^M+M1xwr7 C0 ^(l9ۋ=k1/sK1frck1^X|B~<ڛZm-śW_ZVvc9~Un̘[um(gۏWr~xR+oʱՓ߰OȺ.9-wvm+X3ƶh6{x';a >c v t ^ZMe"emܸ'? k׮ux$ ꀾH]e"WUW]nfj\$;!X»  {mkq͢&ƕ&lJ<W+]mG҆!`GZ|31!O9Ɣyʲ];O-vc,“ݛݳ߽nB6Oqdڕli5?vBh,Y.%YO.͢}>D0YA:^ ֩Жلu+اzj E'1jxԣ?@s!뚅-=FĮAɠuku*yX0 C`Bz Bx[P9䃙1?tqv֯s'ur`/q7k~s|N Byē觌Y'}zhk{hLb佶?]r%#HwSLl#JO?va)+HMجzYxT!z?~C? [GvS GkWYwߛlQ`!p Qx1n'3+G=VL9c]廓' o[՚`ѸS$=?2c2 mTN?峊oꑱ]M4=ՙ:1Tjbņ@-)~cٺYج{\if}cO㕍U8 C08?r "}$aE3ɫ.g 1Ov5o^Ѻ$Mom- )V\I^eZ\Zmʫ4"z_5ijf}m9eAmv(BvPX:ƫلͺǕ:+m>[0 C0Ώ2%e\Db)d$y/Kο"~!dk$ +R&% ѕuIZQH'mC_sMP9\5=4e71^u:ͮ!`! Mˈ X$b)hQeݮ/̽*8}ynxlL?^z,?_TEhe>_q_ ]겍۷ _9z~q8m7Pm6w`Bc@R>S[RVxXDvXߚf5Ǫx񴱪ɫl!`4Gw[{IJPQEvg;%x7z7vVqKr5M{PaKx-\ԁ]r>N_mٲĒ-gu[jUW=^ӓVzA~eYɳꪫdQH3X cc;4- Pfz8^c 7o^̬[jr :VFlJ6;l+ yUMrC0 фG)%H3H"H9IAH?\xyS&7* K*4I,uPᬋ:r˗?@_qv~x@įKE5&&耾O-|jf}G_6o&OnE }c3H&ضm;餓2ots΍UY!0lPe~lJ6;l"41^X!` .$ۈ XaJc똖1evr/\ܺ;jӧir?^یӧ{]n/fY'A[JONT仵k׺^{y|:CD+gtcZb;s*#+;FOg<c7qP5eʔJZڱlzq ~*jk\}f}>P+$6 C8?ڄ`SIK'+eڃ,d ۥ|QBG[dC%-K^M ^՗jg F+; C0&8?JEIFLtQrw$amg6#_&}dז>1B^[LHDBB`Æ ov[HN;hvdկ~utuƼ9(m8ܙNx2!`@GZ4IBGj& ]b'Q/R 9M3u2:MTi[U P[ouYwc9{Ó^?w=ɿ¨: mvavƫaܚ3 C8?rw̱^6FeLkYI&[.Jo~H}#E k''dW\ѓ u!m]X!`ËGZ="ckiy2QFUecR-0B+\O?>*&c4l#;x59g!0p~YUΤ7ykVPƔlz~' )[u[!?Se[z԰%F)rJC}{Ef{K{a~/3N5|W1!`TCВIu8Y43͸KۚKXöd:gLyK"Y-G;y[%:@p6B4f0 C0Ώjff%/eIwV]u: O:6n?dmqM}A].vx q~jm2TG2[n=L8&0 C0 C0 C`xHmR(tLʐIZ_zX@en!o'vRK}3E6 ȡ$ա)n F=iOw֭ eFh 0 C0 C0 aG`?%҃@> ] v Y-LYY@?nf,r2/uF`:{h5R7 rf0 C0 Ώ{h< '7lk{,0Fhlk0 C0ΏRBKI&D:E:z.䵾2Z2з,M`\jf)%}fې̬0jC 5C!`!0p~4f}~/n7$2.'e!Ǵ32d4e_ va1Bvd=~(LnglV"fiChFhDl!` !Qz\]%iC8IM*~Y]jUh7py{܁Xc C0!5I {9wGיwg?`rܹe$te4O#(Gl2x u^eA:c4 C`D X1#sБEΘsg]OmMUgSg~xW*Jݭ\PP;3ce1B[a C:l#=ׇʨ7[~}iYʗ"8NZ:/@5qqeG%ӁN#y3dd56s1f_]|;\[n)|J;b*cX ƶB+!` :l#Dmd'.*x-_-Z(t"Z?%7,ǵ]K.C08?sΆ$o8A9Slk<. >w_/to ˷m7 gn_jVH& V!+lD{G?q~ꩧm:9Cj.I|cq4 VBuOSSNAn3`v}>t7.xNXٞ:BGj[a>9ӀEOõ)Zn̯ugcwFsH@9OO^K| } bC0Ώ)NrU?8}3޹)tUEh?s2"^{;lТ'(|ULb Ip>D\OhjRR䉹j''9=Iz>h9."݄ CS1XU;#eR(jsM pZNq9XnDr7.ȱpΓO>YWۚg{i,V~s0Km_=cG+`8#QXsÏuNg 4bM`C'DXn^sg]9 2Wh%q%e ,'%qm#A^1Hb5&f&?$I0)Zal3 :]7߈X7>cҥ> }4PY9$~t>\!6K9\ʪ 9dllq2lذ!ll#l^9XJ|0^p[0 qDcR-.VaX$$r3޸6bV6Wf+EL2xv=ܪ 2vU7m,gLrNZntʓ!N*8Y'utm@r-@0+mC*쪲C!`tv n=/HK/j?E7In%Yֽ =`qz~FўCj mC4ԶPq΍vc"Q|Xc ԓݜU\?_ٸXc+l+kVvtAP[oWВv$GIhWk'Wœ/bؒN줝ӆ@::<<:X Z^jBWS3/#^zܠUAcCD%Kn+ uv Cw8?ۈ]ot)d:dZmJ}≿uP[s3oo?z^yW=Z_m9wLJL؂z~'ieQ?ӡ@oVOo{J{GQ 2K O\r9K"U;8hs цXqI':݌ v`'I^H$Q~hH E-m-)%=폯qUEP5&qSSO=,X :2&  C7'Ў7=Z-ꫯvzj,$ƚt(Z/$iTZ.}IO^v{׻U'=Mrtиkn r;hؑX0 qFZ>+i>Wdb>'K;bP?ϟis %Y<[4nlcc͝WK "o@f9M=[AA.sx#('Xέxǟpq%b\oI@>#(*8~78<9jb|u1Ɓs C'] !0:zkmh }9Mπ9>>w] eiL/_/Wm3-1@d*,]M'wUm[qI':݌Cڜιl;ʭeiC0$"_JFdU6*VorⲼX$Xu絊^ظmuvPddq̢WBg>`$צM nhw˖-r\xo0zG;oT L3wJ FZ/ׇkOr9bLrl׸ k8NñYl$ #qʬ%E3MR<Һ: ݱn?lykyͯ4yƵ˗@5ӟ;峳uD+'^UZU&y1bg /0ᎂ+UL8)cA^pe2Ν@Ɛmҧzsl#/ W/XJ9~迟sVniC0p~Z_}g+ 910YR'ot)0sӞ0-9>u;@FƢ*$˾ sl ی}7;0"{~ByDIEOݟܾbɓ[xqʭ[͝;7ZB؇S]XliТ\ЏıT }P[O3|"ͪ ,|~+W6'CqfzY7k֬(+| lGN\dNo.S'W )##EhaS*5y~r =[z(R>YmqF7{l9ҥK>1`.džRxȉnW/Xj%N9Nձ#!`G3݈ ˗@r3LVc/*ݾqub)ōn6n|i6cRb76_ی!t3dY?9NpOBy72y|v/|&UZ0 -5ݴRpo@.LݴO-L.vyоK#qc4πׯ_ණ7#PyW\/ۑu]W-a!`Ώfy}$23cZm\5ղ0 šb/va1BVz!hPXa82ofJ,mD0QZdɒ^r)Cu]w]vYNj(mC0 C Ώgh*I#d@J C{#d],. gQIl(+.dҡ F`HXlF޳_|[hQW W;+6 C0G-B+W. bYELòO$铆J\]#N#d?]ֲ2ϕaoVeiC&tFh-WhsxGQ1 C0G3i$pHWI |of\H>i#T_^r(ݧ-ڱ`@/a=Eo]zַob)?X^`m C0 A"Q|֯֒Бu=!BJ}WU?m ̴Gɴy'ʴ) C`a6־!`!`L ߎ?\72تpE:^ˢb>d2oSm Z2ehXK7mnJZCc]{6wƧ?z9o940 C0 C0 C`w(bIY)jϠެ+bPhڧٮOm2i *mݻzgA7-m*e0Mw[um[ڀ1 C0 C0 C`=C+/ $RvIyMݦb^}k/'I POeۑؤVx(h~ƙm+2 C`pxpZK!`!0p~TZ89*HG,}ق,l0Fӌ)c*c-G y{XlF C0 C`RhaC797i ˩cSuU߹պkLYVi#/eEBkY#(KP6B;TqC0 C 8?j{1 ıDO>uLX#+eh#cYtN1MmQg(X0 Q @mvh[!`!0 p~\Dj@RO>(+CYR(FR锾y4Ḃğ׾C̊ C`a8֠!`!`L(b$x\DY\Ry2ȶry 0wJR'Jbu*iW(N)_01RlKvZ C`a&ֶ!`!`Lx@}$rYa6(@I0C֯ВrP[ȳ1ur2_ K}ɮґHY0alm!`$!Q|VSQٔR zaYƴRiT+I)tR}ANoa Ct"O=T9?>e~r\ww}'y8k֬)sǺ?׭[6o^n d0im!0$$p,I o2/W2!K~W@~n ǹ|rFaָ_ܦmBoew;Ot'=y$]՟.ݬ&]MLzzhz+3 0-&{w 3<3tQv6ĄҥKW\1\pa8fصkkJY$yNז6,c!0R8?k.@joTYEY1-㠿s'q? ߿$z Smno7[C#?sQ't;X`-$ʈ:l ?/&9Κ5˽ꫢeݨM0v]jUP{7{wh & s=>$q-[-^xCԫ')~GQ, ѬeCF*=dqR#{w[.Jw› J} $uo[jlKee,P|w臶1)ri'ʺ!'t{'S.̞oJ!^WkFhʯޫ^e%IM7.\K\YzuR2@S%;1 C'IJQNE#޹mc߾:mrZm{ݰjG:L9'>p‘M[꾿v#k_#w=FhW 9y@) ~6B͊ C`(aZMNW0#')I(qgz;U7ntg$Yז5 CpZ*ӈ `>{2|&$fWA }3>*wXݧ?l}yH9{_+ok=Jɾ2JK|V9/dUi{I:VgLvʳ16)B{G9_[m7 CWhUك$| ]soiPB+ۧ>kO>lMwM;>sN}wRL'uz]M]q.;!` :l[UTdᯍV4UzD,_-Z(X! m~mBkC0x8?jЂ69iJ24 (dsy٫n~ᖞVh>C;& f[ԗZR=?^Us<5f殹gi;*;c1uP4^ mso+3 CaWZ<ApwEKu]dbop3Ij޲#~8oٲŝzpl;~<{`#ڂgu?~Jr=9jgFWlaˀ)~zz`_g{%SnVo!0<8?j[ ͔c;?'Vm[JxM߸K|xxG{:w(VtMLK]vT$}F!0,S1~]AIN^z%^xoObŊ@nE6yv=HmOr\u;{W^yqc;x.j_җ~WF*4ϵ^,YJm3/EGnm!~!`ΏZ+@bo-dӫJw^ \;- ˉ'X iwO7gϻeܺK.8Zv+6+W4'gq&UR*-=6b~jk-o:uLdRҖ@\}CE!O,X_>OOt(wQ.Ǖ"W]TT/?Mܿ˿ <[[[;IhqNǖ0 C`dp~4NԐMZ '>iʰm2lu yw'wv' оG[nfYP?>k~R^Jh>Nu{sEuVo:7/3CuD_{;Ycvܹ ql3wcrh ۡ:2#1^mKÍ}SN ~շvI^Zthԑn!0vp~4@j#_ u;v(edߚ/o籊g7nr۷w(k66\B?ܺOm?Ȣo}]Xe)eto֭ E\Qv}?? ~bK.m C`#olW{'DC֯c;dd_k[duOi=3`zv)},O;4ƚj+:9v)G2XAؙgpv v!o=Uez6׎>kr!`G30'cy/N,I5&/{sz<>w񍮼xYk޶_(rMhg6sb,rSa R[k'zLmpB?è'+YmHr=:*8 ;ىnFa;^ =e}C Z&k#QL$= +E3"Z WƠ/ %7\wh|벟px+7\1ҮAՄv / -*9PYI,dWBˉmhVj{ tHhӸ-boLRԓ$S>κ>Sw7 s.l3rIh9uب[!`Whg4WeArNeILY P2:NPsܧ:!w-Y>c_I`\zl &jbC3ÞB+?9`~|wu}ӭ(lBk^e冀!`L8?* -N\DԢ#;W0QkgxՁRNJkB|`,7ݢew|Z27QYB۵!@= kuK,k _WaYg nFaA\Hm+7 Co8?k.,* %aPrL=1e $-ݵw/o9v;оim6:wZ?XFh%b6 a"@= V'A?]Ehag]1v7 ۍЦ!` жJOpE d@)[\RVZTJʝ~W>E6-h@`ZcHYlF{~suu}nFaTmF< !`G-B+[A,51I0Q&x+:^߸p)v?=Ȑ&K.ux/[)}H8  UY0$Zs9}6ừ0W[(l7BQ!`!Q - $yc1 UG`hBMs%77`v҃SO׺9o~$9tRS2M6 _wh>H;-m:I HbKvOAة}VOv#e冀!`GZAqK2A.Rgh!:%<7Oֶ:>ί~#B55.j'ulHYlF[B{!KQ3$!2u|._-Z-[Ǖts… ӂ5z\1r9h;u9c( c3 EnJ֨!`!QkX1ɵ^ e3vowmg{_瞼2wӃT]Ϲܮ@w]':Fh_ׯXkN?q;ݛ kOwn]xs_õEݥ>c1uP4b#10vEr^V\^42CddGG:$9tqhy~@ݻݚ5k'?IC ]62l;%6h٭ޠm}Ա*0 C`jm'4IhYcS;?箹Z6gnt{gfh/qwKZ߶u?+o2.򫳜I[!D{^vE"aV#byCt9ϫ{ڵ+NFI>sLXn;wnW_}5P|jWA-G/z]㕳Q9ߨm C0FGZeNnQUPQI#^P//߳Ndϸ/X6%OZ/:yk3sNcwe6ĴSm*S߯"H=wJg4;vJ C :BVg͚%aZyfwG"Bn-wvv?m@܋ޠl9 Q:J/C0ΏJBK'MNNB_{\옟)vot[] C"@Khn3^dI=V_nL>w[Ilg?Y% Ϭmw^ _ԫ^kyOclyC0 G3vِM'8N|gLֳ-SNǨnmݵŭ'/xc>#V֯wVtG;Tg- #~3ž]nk+[55ԡMN/ļ~ߡ$ү릳;C6Y ]a-Ж.]ꮸ.Z0QCtu &:v1yW_{86ԍ{w̾Es<]hXqe `~]z;%$=iXr~T>C H"mfv֬YW_mPa9{K^ ^l[xq!`::B/#84IWC ]6 Nw`zxG=VXqOF&m-ISۉUBo  r~:A_zw͝mthW[WB{opq\;޷ ]^@+`LfZG =餓O#]oS0Fvnr . J?ի;!e:*3 $+M .Л"a?3 <~4ޓN}QW9? b17PtǶ܆?]·׉&.@hY=Y8{v|Ǿpw=ND- jAȺh,$g9Tn>3D7::BqF7{rr($.#1:9u$:z1N1b[:ցB@vсb@r%d>Ί[Hڻq_gJOh}">d޽]sZf#qr}QAi/z]=C/_)15MNvǴ(JB{u:HqUSmNnN ,aXu< Ikج_4~e%$=A0eo#Ώfڹ ˣ!`P$P~Ϲ/|Z6\=~ C[>ۛys|Z'7\fĘP F݈u`]vjJhS+#چQ1[և!tZݢE!I$`$+m{ۥǴaAu6A^"u3VٽO6|+%3gd~f_vVh>C{› +&BWSfk64Hb~8i)+Ml*{ /~ W~%5O/UD؁~9Ojb7<{l:͟?LawKhq<~vP eո*k.x.Ayl E@83ܩJdj 'ϓOxо_s __vݾ%vva?7־}sD/~#+2Ihk?9_6ё&y\Hݺ6,ړñ#~8؆?9_pQOep裏vucؓ@I|+FѦ lOtj\}ĢXڷWcAZ= }Z#s ](Osl$uޗ0uSUX> y ubml?}jlRFIGqxhРsJ{!r;aziC]Z_~3w[Q ?,+kȲ.Fh5q$L2NZ-I*ci阄V2+O;;w>8P\QNE\GtҎNߖ@f?SAup&qR1Ya %IysWjB{c8x_gXvb/c ˑٓӦlGAT{uX Y^I 9;O&`c }jvt/n뺠KѫkoGc"5ZN{Lcƴq.xBBWۙ~1Ʃ{&1|mYUb[+.AЦ0jb nDG?b\ c (iWHbIj:/ bD?` z$>%_W>(ͥ`~}< vlbx*׭][$)pAGkRFVYݹ`XszΏZ+$~5/ˢP_;,$u6DD6=$64yyWKrQάwT^^}9Xu;l0guţ63:a(OxK_jڷ LK5ZG 6hs^ B=1W z՘6N7(06nWBu{}z[:Wؤ|êlU:cmGojpurr uysZܱR9Aܱ1a2#@=qMxҹ'a+UCWpp>A s }αSan uAEoAc7 wL+X@ıUK೭nb-wθtor9}I .mRG9fܙtIDAT36AƜr|Jsd}rŰmdtcBϥsns#UYKš"$$a9B[|u$x19q7v8FhYFEY?;v`2Uui+ى A{8R~!AX?>,oLW谇=>y2ϨS WZ[Ach)\(&ZխLq2*gN۠Gg7q/RD;6o-UD+vq>w('gr0:1v9X9 .sdr`Wl1l#2c69?J>CKK*cX^XքXY*: [ARI\k$('EBsrԥ5e71'ܝ8;?rN ciC`"@=ɓ^ _j!ڷLz~.K ksXv4i]zcW$B4?˾ub}ZS`QY O8\&OJ\rګ3w=sơɑmJߩЇ~޵_B;LQrЦl(/"|)TIf2/Vn%!e$_ Ei\ׄVIdInIp{X;Q)gN"[ppǎRq4 DU:4¶fNN &&K'ӘW:'9l-|&A~=1˵CﻃK_ɱn; 6j\sKzLMk _cJcs% Xr9[ z?UU_'Mu.ˑvmUǀ# C6,f1G3b(Y.,p0 y gZȁVcꐬbP_t{ [UJ4IZد2MbQZl3"EMN݉a5ȳ|yJ  C :<ޥ|FnSt_}{Τanz2K_EhmW/:I1'H^%SY>g#`.$sK~MjZ.z_D.h x٭sыN/mJ0׶"R}6mN6p~Tr b1!_$X-Vb!"bYN>?HlAjI`-c -J+cSyɞ1Il,=jBV9/1 ܁ƶ][S>ˁ!"@=_iJOP=fz媗6}׋K')쵎NuvS庽Aؘꫪ}IێyGUxܽÕ+Um[׍H rz߉\5.h xrکzO:h6*F]兜melA9? b)j-~" V D2%ŋB@^}!/ImQrYȲ&tN,waZ3ocɃQHݾ =:ag?j*=AMHZ6Ǡ}T;xIrRݤpl{ٗ%VMUwu3neru-W)to9l]gmgla: 6rLޗ%N9+h, rv_I\lؾ cċlv{CSb/Ft*ni +p0mX9am|Vڐ&HmIb/~xo74VW7nDUY[7{͛765kƊljw6mhlذ|f6%%yEiN~ف;~+W&rBe郆Hm8R9AHܴbC`"@=Mxr eub l1&8یMZ_MM& ?#_K&O PF dtlv΍0]ĉ`!Ī[c1xPGchؾV߱j$m!c6h;svG5?ۏ}cD9p>}eql_ mؠ}M ecy4lb=c r߀,.j>;](ۖ}j6ΏZo0l6[+cCtAtA^yKp}|ac$֯2%=yɊ:"6fIf5ņ;wză =S.u(vvSIܩ-6+t11M-yo)[}8B.-#뮻NMۼٴNXEI(/"ڈ˶i c1͘:22zɠˑZc!` :l#Fzzs-m!x \{nɒ%A+Qw)C=/8.xyP {Z#8?OH&M4Rl=F=uP^ucZ<]&>bVf@0Н~mevmWQ>__*??(#|rhѢxeԿDɝwyYlv|+Ggha&q4DOIYN mdܭG`$C-P`@(О>=C;F0KZGusD >3?C`>H>(B+dyR.8(+C_3$)}-'Ri::楼NG+n!`tnPseq_}{sv؞ |B/z]~5w~wPċg[7?v{1{g ~|%7xةݶ䝐=,ngAVB6M.OrdX6x"Ak9۲ģ}BMEI mP CH#?%< <4^wA#l/3_(d8(C=¶,-Gy1#"5gY \hL*/ 2\ixN%Yr(3:tt8JTa@,S b}CM Q LcGapuD-dEc۹YQyGv&a+$R{'ȍiq|`1,)`~KVX@XxF[Kk @4GZye+{ZTimE&x9=p7< >`ŝqvL^D?b1h6 Ug" o.D t :  ݄ X @X62!pԁFpAµ ^ !BBh@t#E CD$IC,Cb مT""'3E }kTTFщ3ꍆ1t4 A@2zF_1YbΘ/%a[b%XV5*֍cq"NǙ%\Ax,sj ߏ-Uh-LH f %spDфf"18XCl"vI$ɂN HAiR,O%ےId>y)||E~JS3s͕[+GA\EbBqP2(K(j9=yyy}y)|Q IX_\eYGtn@{轪DU` "Cj*jjqjsNu301#X8¸4N{8Uu{>^K^^~]S_#ScF}M\\sl4ǫw_8;ZVg1YRf s@OK/HOK]oHD?V~}AFfC]Ɇ 9m6j5zolbo¸III=Sii53Y6s<ݼjhf90eBńTKo<*+UR: '&M\?uWk,=wmTlBl4ؼ5eۖ^-{eoaϵnˁ0aCG'GccSVΪΑΫ/\|\4|tutu=[gL&q']ߝ˽ۃӣSϓY멷wA>>B>}]}6a~~~*e6B fW8,i F> 35LF'L0^Q8?.DGli)SDD͏jGό>.'fmXXqlsbܴʸ~ $\NL%'& Nij4inL7>g3f85h2!9>@gV55e~lqݹܧũ6{|yeWA;2gFdΊϪ&g'g3-tf͙)s\s6 C{Eh>WuĦ=yyyf>:GyN\>e>=y%{x/صYyz.޿$sK/},~Yr勗?)an+vWV[eBN"뢒ϫ٫/lskR״u\}qݍ+?0yCFo7tľdffҰ-[m\^vܧfU[olzvv¸d7qw'{K^ͽE{ҩցUhഃW[VaŇ#G:>ftlqZvn@]z]w}b}牐 n m_^cIkOQN-?5|:`LڙG3M8{eJKs?zƋO\rTwrmC~?^{J}KGCS]]g]=-;o޸us[[ng~u' +/y?jO=~xыǢǟ{?=)yƾS/Sϭ/M_믶WWïWx /aG班?=ٗ_ g XB(zDxv8%5DvgO,I}^. Qb ߒw@ʈRleC0m& R pHYs%%IR$iTXtXML:com.adobe.xmp 740 426 ҹiDOT(Fr@IDATx dUy&M\A0iŀ5hxiGG`D:q0 GF3\t3yBd433rED0NC7 }UﮯZ{k:]uηY[VYyvi_7:B+6P_^^35p@nRYe;exX0s٣pI5 /i# o;|9ߜ빛&@?_<Ϟ?H:oka<C_ PvSj}>5&OٓWRy7~ʞԼڗOͫISվ}j^M'5lْo`<615}Fy1EWyIͫ})Լʛt?eOj^KѧUޤ){Rj_>5&OٓWRy7>y;Ys@0#(Q/yř|$#%vFkJP 1ڡP=0b_#'rcWZx\׿_Y^_yYOg~v@nm׾92Au@"K^/Rͷ<߯f?>;0|~7ƽ6jOQy3E_x-d/CzT ȫeE/(77WmU__Ϋ>|Wo+/ů:?*?Ev^i_گMU~LޖYPL@I:V_uΫ>|Wo+/ů:?*?Ev^i_گMU~[y)~է}ht>Î|;_D5Ա¹YyRMU7{'4ӒYyڣi?_X[?~G~mx[tMy~r͎>8~! ȇ&*:mnZS7?D?sV>m7o[\6m̏_aPl kY G}ΡF:_Bפi*]U5oF`T~7oڄ~\e8z#Lc6!gYZ:MG`F 3C~d\ 1țLF g-u@> F{< 6eic`$e׾.S[@t>yDN>$B 2 bQQZ#:SR"n?XsD?lܸ/cף\)yy7p#:~͡^FHQ4EhFG~By20k ۯ=l}A [@ᵇӿmyOay__>pz1.+  ׋.@WNSW7.(MoYۻ ߼fєE55_(-ƍK#+?}6ZZO_^ ~Oa̮-+)0U'4TS]Kҫ>w-OM7ZJ^4Oӵ> N;%_T6M7Oֵ>o)~T~TS5oOS=]Kҫ>w!oc} -w5U 2SH_PG5opHq{qO}?bv|QGWGe /u>t/WRהޯ,rWgxzzzj_u^5oOSzGU:7)ڣ?W~/j@nKe~3`cʯWjڣOIӫ~է(S:o_=J+4W}jk?ůʯ"vrQezЧ46XQҫLWJ+4W}jk?ůʯ&MUڣOIӫ~է(S:o_=J8wHp]pLyjC0HkA6 ?m>oķZ"Xz*5\l|5 m(=A~w$^rA4R:oX?qx8~o߆ Oh.3֮ O}B~ /c)ڼaۀqe.q6a5Gn?gziX#<N`#6|? D>>{^8ttcsF>?@޽.q" #Gp\w]a%ZH8_qʋ3}Kk8|C,>s'oOh!@.NFa!tyW",l"|QӉaϭˆ-a˖a߇+~p\2ϝ/yb?Zp; ۮf% g6WMͧlnߔ>?{)xwF>44]_~p5 YYzk_np|7ϞMrW=9M%-_5oyz)Y`gd湹}ʼrSF8z.ss^7nHlJ/FO㼠y0^^ j*_;85ߖ_i_ʯyv/OŮaᢿpM eg:?J/5ߖ_i_?$A˳=/4xsl}*3O>5ߖ_i_ʯy*@ᒋ+6%,uKp}K gdJ巾*_i7WԼ~[~}+ҧUCނmG6Xڲ.X]ٸ^@etW}trY<ժl>W{RjUx.<5\Cï0|kw+P=W5Tt^u<׾T>W{RjUΧmݺF]wmէyOu^OS_Iͫ}JW}:~?^Wå7OU#Ǿg":΄o;7UD'9ojO+/|( ~zF ~8{-FX6j8{qi#,b5ʈ}W^ֈZBeGOyrDwJU_MVSyʯE93&L L/0)}e|oO9SRSn+-ڙW:_…=?t^Ct@۱4{ґ^oxԞ1UJ^j>neh[ymղԼKǑ:Q8U6dk˯6U^V^[~/%/5z}!py$-*oC>.Q>hKK2j+-^+%/5R})yy{2{ey]0{:2@n0P׀(yu-Ӿ?!~'^_L8#7PO˭W.)!%0үl){7՗yς>n7^_ς:VرtlX̟ܲ%2k:|pEvJJ_Nd~)6'*_y5-~Jҧi;T_^߅3-~k*Uegˊ^PJt_/%F7eҧ/%:7 _ŒfKPЅ.? Zz'e;p}q e;?v~:ֿe3\t_m$g}ǹ l[7mz % Zu6|_zvxN_K0:%([<_/5o[=χpcjpeEͭa֭aÆ'Cp=w&;pkF?9zu[XX/gߴm /vubq IQ^- ]>/0>vn םw~;x9O8W ,<3<*3*PkTlߔިI_{;?6Lr7[V5Qȫ0uU5`ҧ7i&-WS.c =xi>ҫҫ>Ŭ򼶿oM5OIooMZx\-Tx+engm|Ri׷G9ijOS}MU_?i?5 PekU{+}p{^^Zy]?Ou^S:]WyM+SS:uOT#6uyDА.X" :VTgWy)mM՟J_/2 (0ǿ,+g}(\UK±Lإ /(SqM^Y?#{,3y,D:oyVz׾KokzկWz?>4ȏ \|<%/Cy6eΫJRۚ^?)^5WR+ʋ3?Or|9 (|ʧ7M)~S{)SÅ>ySyj,o}pfNcc]ᴥ w _qݐszqc_ʟH7Wojo+OU~7Lmx]p Ӿ^.J>z|!P~O͋W} ;?Oι4#'o MÇ?fxXj}S)y:}_Y;YG:/9r]oo`mF2!wְ-aKf;%kotx2W;?߬r2t}3ʯ<׾[o$?أ9 @e W! P/5Q5%re6|>WSS3O,'N3wʮQ#O0ˋ:}Mfr=H=|YxO ('Gs]<Dx v*y_vO V0w@6"kn8Kǿ}9+{E6%:<>|̕J[ݵ<۵i7?#=ryS?3)>9L-c|q_4@KR绎wmoleMn9~q(o_˵ Lb541QtǠ4)|3 g|?uy=)_{mR#|φs9?-Jgb9 [fcoY?{^{ex/) w3?oS@^wp - yk؂+0%o{[_^W}kW?}LMBϖ߮gӶ?6oz~eg(X>Wо~y?y̞ܽjrL}D?)JSmLy,?ger 81]r=G8ÏF:xwt?hmG[ir_/o6|}\ NfgBC.n΂uSz;4FMMiJouMc?MgkSSbiʟer7i2;'5>iʟsԾIӏ8ITԾIӏ8ITԾIӏ8ISG>7L ;5v+<Ï82V^S)ԼӯiG`׫k}G~0 ˒ܽ|}hUvF/7SyS^?EoyO6{@񝄼 ;/q^ P.h^wY$=_tOԏث#wl8qu}5:? {Qx?Pk}_}&Z?x" :_U^jUΧWz4ڧ}կ)^'Mi_|~Wy)~?x{GR>:TKO^ѾJRWu>eҫ>~Oٯ*/?izO_S+KO^Ӿy؏LȊqBUC% GQRDO]0WFi?eojW}Oo*oUSʛozէ:peGV4ԑONQTj^uLڧ^i?_jW}Oo*oUSʛozէ}o=쮏(W/GqT~ 4``SjeMZ~D/-O_Y(ˎ4,~{۳t7Ny0΋~NhЙ oΑ V-x0䤌jf+~u SګW)ymUmU}~J^[{U[y){U_^Ks WG){G)y1{9&/j/ A32)ymKh+/eKSګK٫RRT?%>#Y )|kS ܵig/ڰz1_ȧoӾM3 ۳C~A'|q,4r#ԍBu}v:G#0  |a(8ӡxg[ Whh5u3ӵ]r)]۵r˻ޮue:>p\>>\Py$ޮM:]۵<z7YGwg0?! ' _o /lxbG'9 Nv-/br}u{qDy֒@ڵ=2K_yOnqGܷ(`ܢ3|yYqełPĪ;_ǽDu^ߔ?EWW~W^_MSyկ}yOu^ߔ?EWW~W^_MSyկ}yOu^XJ_j^k_u^SzW~7OѧU_?y~S}j^k_u^SzW~7OѧU_?y~S}j^k_u^SzW~7OѧUv-We __s+K pU^P*K䵥WO+_S}՗ז^Q}*_鵯:꫾jSJ}T_䵥W{TWz+Χ/%=@>;b*_Q})ΧOQ*O|׾|Rҫ=O+_S}՗ז^Q}*_鵯:꫾jSJ}T_䵥W{TWz+?_w0!ZR?Eu[5Z@]0O~u~k+}q\-dQSm)JO{oYl h<՟?}olFq#4^xŶ_)l Ym쐗]!t~7n.%`S;Fe ce$_oB_V]aSףmmUilev?Xg @ q"7h0US:SzW}yէ_KS}yէJߣ ۨQ4>o;oTE_s#~)+~Sʯ)~S5ڲE|Ja͛*_Ϋ>7MU:{9C/ubPR8:^6SS S=_W)v|LK歬:m_gy* Oٔ/5Ub[k?_j^?VF+/5iRy+N{1^ 퀼biȫXXܖ_mZ~[}mGmo˯u-Ok]ۣRowվq䩌&]So-Tmվ|זk{T^j_TcveJG#x<G#y8 <.#x<G#P;Kl2-t-uxv+>OZ+F3Dlo\y-u_I;T},,opӍ9V=DG#0O~WbZMt<[GV i>@E  n1Omy>'))kF)Fd/ۨ7z<S&|SnG#("d yS ЂAZLmkqE 4SV1?VZαObw8 gxf%LgeNG`D8CiJt H&5XlsU" ȗ*69#G#0+`w@>++vz<%@n|])c,IA~ԶA[Ecemt?ir(#p=8P9I`vM7#8Uc=~V h5]x3%\#?яr7l^]wݵ2y/U`T8/γOJkiVҿpxap%煃3@BXM̱g,ZX:8 /v}ᄚ' .p)4ڰr:#4LGB?l亏jqA{i#z#xO6|{0/ 'vγB~:/ҢtŎs9#ѾF|w%S@]C=.㏏8~;FJG`"X~9 Ek1xs#qՅ˗~ .(uY;138nI'.r;T̈́|4\h4l<R\AO :A˯.wZ\@nMmecۚs c8 hFlsf6nܘ9B  Դ0; !1 {#d˖-sĂQclSU˷>?;TLYh0fhb6 ~KkfbC|Qrc߬os".MozS6V|E[(w\8Cb1{ï~vs(?;[/9L-i m~#ox+_)]|'z<sL5 (|p-o9'-~xx_?ALby*2:mm׬'/MZc]o×ý??nM-zyW>s8|ܵUנuMʵ2ʜ38ȡM.&OP~v>|3_|P>|X.ַm1W|?.RLF.bc`~[n.9h'6͛74Ϧs6mg͝xn[i.Imlأx@ymvO?=аu~{?% 'K0ZyAǒԹli)=沯H#y>J5lÚuTYd0{}c=6}:YgÈ!_*ސy72֢LQH^(y:quJNXa p(ߥ^JJkkܮ۠ݴMӤY q*cM:3x ̲{%u^eWm=֧:m+o2P'WPKvu>$[S5r1gu rΡ&(/ W>*cl S &;l"J{x)Ѩ (5-<-mЊic>%0uUԯ&k|%j8-ml:]]}ե^(_Yr^*^[{Imike¯Zu*W!r]# Y~cm",O XM֘sH[UVb {1W%S`WYQMbQ2}>"98-]s1q 9nH;5vG`==ǃ1QWp';e\ SceU`2>$6[ TA<Ԛ4yZZ./XgoKGMN3il]]`fE1h[mme̷5mEM|e1ClEbZ_R_lm!ngMe20΄_Eù2ƹb`+.t#0Nc9Fҳ]3bUfYD]RYR%Д]K]yYLc|[jUbLƾkxTLo{sqdło!&@gMoaqҳ@mU 1mv<3;k ȑ,W&HH`ҠD+`թZYFyvfegqM>?(W"(5@` aK=Pu=s0x^ 3jG A_׈b9#" Y\Z ' k;?Ըh?bǟ|NLqXhʀl,VZKmcz2>''0O#/v &&-8g$66ZoC^) &ؕ.+sP¸݌= T(Iڠ^W6YUEmQ`OX' uik? u-(_`1T?Sp XhZ0^ 苁|¼ZQ9Ce;lSԟ2y~W{uDH3eP.j-ƣy c<;1^<M#\rm$NX}jktg&Ƹ97Ax.@w۾>m9v<&ǒS؜ѶLbַ͐c<=Uވ]*w[4{4&.0۶F?&x d#F:q̵>_ CoeԎ$L} ub^ѥ4ȷOx:v)τ_E7.Q/"m΀}*3R[{Omuv։}o}\չrغӮ.sK*ȮU~MyZ;d[qآzȵ2cG``~rs\s -f۶ێ  T_ 8V0yxdJه"U sC98Sylם0N2?t\m0>hlMmmjG~k'Cb1Y[ʯ5N][}LvLۓX Ձ=&{cuQ+|la[׹TejvǮ\ nbҤ=Їq갵ʩ1|6x&O_+)*Fu_vj|bk)Swz:rb<]GyC^l&F9Ͼu '&(@cl6lGU0F`>+&V IbĈv=iwέI nIƴzR7+SMHѧigO|}Ջ>@6[3WOb-T&m~bkPUt[tL]w*:) /;5>RߔGŰDi7trkԸm?Ƹ 9~3zQs,3P>IA@7z'Ѷ}qԳu'N³N^M*ڍq WERfe~6UL['fM}$~F,/t]N7\%,iQ5BRHZyTrUb~xi/;5>1;7ѼgGLJ6)|#E;x+5۶skz[7,& mm&M&!Tg' X k T'y>xa@1E⡠0}|YFV#[^wf*3e#c|e1^u7/F31&*kA}zQl`YX1Ji躣OPwKUo\N%<⊱PlE嶍i=>* 'u.9mԠceCts}[h}l@Ktw Ǯ}Pv&OJvbD`7îU`6;~uPhvY;lښjS׬OYb!b ުUX*P5~뵀>}7 q̄\1SQM1:>\zS U|8}CVڱ6=#00?f<$b?pcqX6iMO{֭[ҌYBu;ߔ|m׬OUO ec5;_V_&l ll|ܵ@X W {_!eǴ*{TfٺwKUoWyk;Uě׸VS ٫IziJ{Dy nެd{K,'ba1sd/-Rg"|s:%gm`/s1aҥ{a'yt_WHue-nh_$؉{`ȥ6$bRvb V^]awcjeȐ xN!tA LqRE9Ԋ @#tLsfO&1BnGxr־]V7ݘwg [j8Nl#vmEtD \@>^6F,0v@Ê+<#4s @!dJyˣEٖm؊&*^D>ۨ~熏}c@%C)x#Lȧc= G#0?/yq{5jU̳mkqELx.T1 ?j[Rض`49O {:؂LÇ׬Mxz`Ÿu@r=YsqY`6J]LuΕd |0$O96j<|~뷊o+y[p܋G#0`Ÿu@Mx ^t#Ԉs|W[Kkۖc֜lF,D ,,0?/ٲeQeyU.,?2Sgcez: /{<&|ӺBnG#X#<-+ B5Hg_9?Tg _([!ڬceViзG]ȃqmh1n!g}ʣ"|#L[Oʸ=bs9lb.,k'Zi!(}p_# (^5똧OCz<S&|SHnG#(#\!GP- &Eɂ]%%}@LYԕiʅn+OzD|y,j>LsO*mbsqdA H&UK^cvG͸4#>8yhmtVK˹| 9t?xJʊbs|+L^7(#LsfOL)复ѕv)CkG`f"|f xI @N bVta enϿ  XXn]ؔon{ya|i{ /4x_il#+ TD T,x0?/ٺekgSx5%}mMp?o%'AkK~'“#0; f|p@M,]G`G9C^ *<[W~sB8+|G _:p9r;WӎzAg؝}UQ`m䌔D y7+nbR<=σrs.܂R`A<1RZ 4K\=斯<=\xA9Y]]Cݪ??(,D @SO|;[o KX~}^s1CI,B@ MozSXbɇ5kքn)mqי eʕ۱_䄽,gqF⋃sxǎs|#0$ ۏekV:AP?Nm7;o Ө/,fs@HxJ7uHo"ZCv-)t{W{ {Gկ~U-'1va׽.?wVȋ~8ޥO}Sv]K̫ #?+_ʂ ѯغuk WYxG#"\rPfp=.x𓇴fqf­$t;?N=r|z(}[sva6xf!Lu9q#n]zC W'G5O>!>O ȇ&Ͳ&u_db';qv屣7 |1|%o/xFlٲeS]`T)~,/ @9# _Wc,w͢~LP~Ȇ뮻.}х<4b@yv)3emlG˗/zX,IG#0`~.=CBE\ɈCu%v}Dž}0$pw/i6*m4j7;OI^<4F ?/p).T+"]*oD18ki~?pW"bGAcھ(d pv((Vu\_@QR^{< 'ϥ;tZIZ;p} h%x<3& gnKؕYȱy,yw H:peђԁ3S_̆kF0 ԇdmک>y06jhG#0`¯uv9\vPwկ&1w#{{CyӸ;G#0;`~rs6 $}_Gp_|pb|O gw(CPt 1;*~,1ПɳcQ1G`#_udgY (7"UE(X`~.ΐ[ LF Iul?\g A9 [y@x0kF+t9Wϕ;V)F,D #Y z衡WV5ݥC7o;Ca4tQGn>Iz^{< /rS`0!Qm]Os|*tjYV?öG#0`¯[R'֯_vyg4K˚5k _p燓O>C>  1hR𒗼$`x.σQ XjA)hpfO]7}'nÖaE;s`8h] 9 ,y<S& GnN  ?3?yx_Nʛ@VZN9>7+6lK.P 8 r-uVq{< /C;6 XZ>Iǚ']_D{H6VSßxhV uva7K9G#0+`OrhTW H3+o1~Qo|coJꪫoɃ~Фw<H 5 YsЕ.>+O\7^`ۂk [6Jxf!Lu9__TS@gZvX '„9e~-yIx< . 'VW\߸(;6Vǜ}ˋyVǚc=Y~]@N?=Cq2K 9=){7~4gC6hիÕW^9"'pB<7OfFs'VmN:pH}#X`~^EdDƢ@4,_kT,GUhs!,,Z>Lkr8Ʒ>p#y۾( 8v >|5m,;c. qzcpf1c)&,0?!e&-Q'|P:X+]F Ƀqmh1n}MVG`"?. 6؃oqj67n ;S!¿7<*ϥ;Hbuv<ǂk}я4N #l84z'!F=){cXqWG`QE8C P- &Eǂ]%%}@LYԕiʅnBzDO 3^{<&|cmV)#&ő%H&e @g]cvG͸lV~hcmN9 G#0+`w@>\пpV$#};]a G .X)_`5SI+R)NkG`f"FOÑn‡AñkG0?jbVtL,QzȰ%FgylM~U/il#+M"4D 1rmOaf˂soVm5o}[Γ{xglݲ5C X yg֤ Z2}:OЬ:n>ʷzl4`95ğ&t.s#+6bxf!|Kԏjbss_i'lW[*:k>vU|mU9G`#|Wmxs;SQLri[i-VZۧ^4&N3Yzr=ii_)#Xl`~!'PE0,- J}ZY1΃m:fMZZKY83^{<&|䳲bnG#X"LsO*mbs @m09['i)5eim,m[s}[svQ0fr o{<&|䳰ZnG#"d˖-s FZ >SU+j,;L_E=ii]!#X`~.=CVU}ɒJRk已hc6y0ζ1-c^Ӎ7oXytTz<i~@~wtAav( a>ҥKG#0%`~.!S,%eke{ã ɥa] ;7^zal\3d_z:,(Jkf͚ \|y.sݺu!{R>;Sn*b:4LfS};!oOaSg ol+wyg8]E^jU8sG#0`~.ΐ&T\IOp>h\=7?J:2lE8}!}6 ]ؖ]fE I3_s=л;X">qx-7]tQ8묳 ۶nM}({Gu& G޳/yO7[~_x3^"(tÆ e/{Y"4sqd" d PJBb;};oƇ[|;{\ʀۮ\Ώo}Y~dљ /?O˿K'\ɧ7]vY8S e|\(n]4L n_4R稿۰8ݽ?>%I-Z0^Y>u_|Ex vw <~q]aΏ_z$('M|loԠ۪$rFbk]YÎ+"]*5Imo  yN ; ǦDziĜ~G , ^NwrX=vi(ʱ86/ {;8~>Țpz X9grt7nXj bwUzUAs7Q.+]0}džX gʡj]m?\;mg:Ǽ0; rxlz,F{lݲ5; `\*m[[_)L~&_6s;¥g ,ͧ~ڄy| ¨rwnʢv CX0x~>o|+-[ =PB>y|kO[yrwn>c!(.u_Wy fb= /zыy7 gYO[n%|4b~ᇇ׿CwAN_|`X1uO WCmvQ>(#uuv9:y-{shm7m44G6=p{O zQ2@o !]c1>6mY1gE:Kv. '@gvԭTs5JhsU {Yvb؏Ȏ $JQnF]ws@> 0Or -Ǹ69kY y`<A;9ض5n!@4XG&/ 8]x&3ɱ-C|o*yL"K<O}Ss~|n22`q>H1C5:FX׉I3|r\cQf;!wwo__Mnswl!|RM0C;FWʶk]rsێs;ئMk^sNy_=k7GUpcg;811vmy6Pgw+Xg7vʊUcWƯvvۼLפJ~lXUГ!z谥ky~7R箳C~68lT?@_uo6&jCΘ壯8k%2z3H!"} Y[m=pfKv- 9>9kjpα|a$sF&u;ZLJ0t|T=$!_*{ha 1hcG ?e:G+byTRVot-Ln~+2bɌT&>D[UYe[K͕+y>v,qS&g#+k)L:zS~,7w=m6}8/LYJ`֜oŏh~{;}ۓcuꪣ*W>/GVpDIy_𶱗mzd%7!uMl'+^̿*B_UGV{olga(EنQxG??_%wuWGƾo1yG6f@5ci1jCܥ|:"Uf^M}w>sTWtؑM$ GJ'UE$ ƍ#%BI$D(\P ,"  }Ȏl`ٳ{ozlv~{}gfޜvvҼ}w ͨ G h8˔HaH9ݚ_ۛ]x~瞶u>wy)Rx6$kh:r`"=\kLmy b^S\0RaӾ5DWG ފufRX[~ljt9ǻA&\{A+fۺGu%()v =asnCٗ3ȕs 䃐 ޚŜ袮7RMW1d+:lNjsWc>ߩ9@ZœYJ}9{>u$FÐ ׫|9{M>#J NYIx!ε9 _~y)_K1vZm_,nDãݸ +顔#CCAGy?湓R{Uǯ?AߩIoo6+c׫CE1%RX[~Ncο[qK@sOAq#ǟlPˬ;z􂝴$r٩=9;h8#CyOS!:AޅyMHr#A"bjc/q44ć"?pA(!LnhJ]@uG8Ck:9~Sc8z5Cǜ2<#M!$IK94Xe`Gl?yjv۳ D~Й"^]C\lu{/F_ż&z#sE~xNL ?H.cs"2t3jjd8gω0;G< 9Y|#}M~}Ƥ<7n !6Pǽv-WQ=K V*l wɧh>{IAs8|}$IY}c~jٕk}|{s=o[9}n]d9 8s x&R>FQg9p17}*4<}1u1tEOu꩟Qj?6S)< &Q|[u99krys$e+_ 6#"`2j 8kmf=5 gS{mYmW{ s;X0<a|WBm{i7@ܾ3uol͡KKo΄>Ǹp7ov1g2Kt?k|iq\΃oUYʴmn7'@E[8y}]od)W=ʤwxK<@<)kRw(W\D&!7NC":ͧ~=qzJ{skC5jf"wܱOoj{ Z+]:'a߾햮?\W3rk#֧!;Cnt|\>}pq_wګ >޴y p}n 9;DRJRN1 g~b~'|#>iYu.c/Tn?9:WAqn͟HQsqV| ZaC\oƦ^U^5X%%H u^{cu4/q*Niϯɡ5(a'`7ѣGJ|xy7ܵ9D `CTծeiOCMCS Ŗ>򁧬k5nQaYh?l/qٿϿ9;g~1߆r25mOC(mS#כKnO =LKJeelϬN]Fy%bE TIDATۯEC@UU=K:5==?p<Ղb=y^FF߰ W<~\C.tؕ><!gW15`s裃ۡ܆֯^ڤP7ǎ?f#͕Ԇpu]؉'Zl>\R9` 05fSoqS9rH;qf 6gϞmyG&q]3 >/!'QE*(uySVԗӦ2,#ϥ~O7-9<.mg!y!䂸"!RK$L"N]O=%s$ԧT2)s BC+@`|R瞐*C$ЩѧeieSY-Vg?sC;}Lr"y l \o ?@`W|?%%N~B%Yn/j~l%AȳHGc l0\oA @`'\CTJDȱ|4%$`j$%A;˚=C;?+;V4@ p6@ Pb&)%e8J]ԑ)6XϨSX~esyh  F ~ >HZ $\=@U 1h%%%Q4blf.7NUAȉD@ -pB-G, ]A!m(]H$-m#[N\ΈacHT>.E@ @/>bO}J<$/5W ,C?E5*r6̻VhD mB ~m:jk \=Ė ż2DB^` ?#9\\#]4 Gۨ|7kӇ쐌bĚd{1q%C6ї#̵;8^i,ʵ6|1N~rE,ʁ@ pB G+| ]Bs>B^@NxL\ҧKYH:VPOT 96.A7c@ p}^DȻCI)$(#^ uY%j]NAˣ"?@ !߆>.!7[@IDAT]u/:r PH  QB&<)1$$R_*JR WR]L^Ꮛ!* hxDTKJ "a\ uk`\s|޳s]cZk͚g|۽{w7oO34'|oޜ>7ww O<_xc9}#q89qXyyL"W C!=A,%I2IG?vۍ>ڣl3O14-ydGriJoٲŽ,-c9%"Sr)>(qBs?O+Rp|Np?qw衇k!0#u24wBʚ5kt.]ꮸ⊽c}>;y5es 'mTW'<|3mv覢耳o vXμY'cYϾL0޼yskPK=7miY;<O~4)@ɲ&qW}kҦ-@_gBȋ/="&tjwe# ʶ5zV*'ZS(ͨeLSrEuW~ȧفUN7Hȵ&'gzBuCj?yvRO?ݭZ*7F}[ߊUevYQ}S"-t7"v-&a6D~_a ,i(# ?r Jcs=_cŻvE?;#Ekۗ,-\8u;W.eKn]۱c/>H3ϴoWY_ީ>s{{X< ]\|?>@v \!lK^*[JO)z/\")K{otY'S08c=9d=H։D%䗱aؕ]˃LpC? A^WLbs|Oyv!k6;_g%_m{ ~򓟔~v>HAF>}oAk_i.m]K0t/2Zl-9YcZ:mȏu;4 RQ9tHM 2rN?Ϸ~2 M0n8еܘOc^DXdx\Aۧi.欖Ee?l:4 봼Ƴ5.N. ?Yς`dURf,H:'Bo.x!Waȑ@vQ~1@ôY>b_0}>Bw5aE ϻN:(?ϋNH=Ȋߓ.~a*CROC&ӟۚ,DYN7zZ6cA~ՑGArw^k(G!(Gnƍg ?չ <ݏ'u7nժUEmZk.SGɱdؓBk3;䉇;cؕK퐧w 7jCG+^ݻ#.vCZ?ySvN9-ӥxplGUP]r!nBU;%uTw O9 _Kmmb_;6n:cAʠ=ctV6Lzgу:>9䎨މ̑ؓkyht sUi)0C_csR#1)SZm_W6:t=mC_Rq ٖ^ ?ΐK-r&01ұM+GU-ߴk֯_{m}?Fz}XmYwzW_}5o_IOˣ),#gl|'\XI3F0ר:(b/e_ש싎c2; I@%i rAG}.7]ˣ=}Zϟ|jJnLGZ9howi!#-F{-@I?|C ] 4K`)Mzws|`#%,(7_i#?ȊdW~*ne# l/rɯ~ԓٟYof2̦RKn~%:#+Sy{ %&-[,YRYQ)^zix< GUGVtk|}+_oÛ9v#<uQc31c@vk@n7Q/^q ݶn ?X* zyί߸kzH{C"b/5c2Ik\Zc].,rl9?SK#R-x-@?@FL64 B:~<Qi*@Ѭ3@ЎgU>9UP ǃf FSyM_nZR1.(cy8ri :Y4eI`ᮾ*Wf輋;A0oU>I z(͛ WFlW K쁟6݌\J6:G o> zR_G8/r:6'X9@L@޵<*__u9@S~?~_CK&Y#G: E*U|6JMt]7>l{ݷ-]~߂cxbA+-@ߨL{@.\y |K ^.on(y O cӠyd<< ROs\dWعNUU6נJko:: pNf Svtor_̟`MtA_Ab9c2cٓA.XH7 cK9H t9y0|ݪu?1_Fճ5Y[M+ӜslJc|憮~ݬB?s V}ZI;CtF:~r9ϻZ؍tK@!v=Gݙxm2ƻ>޻-@~wտۿ[P_/ G{K$qhoތ x(٦fm0ݎFe\[dc6m>wai s|m{SwnxSô,`X  Kds3;䃣"~ մHK:v5yZ~ri]K`:|pLGY`.YCN Ch3^I+,6iX<ӌuydLZ:țId9 b:|rLOY`Xyf\ ;ű@h<@\hz֓Oei'$-i6AgcٶLK>I+1zYXӡ9-aY,0-7@>-W4  ~Ĥ<B%-(N`(V_5KXN:LЕiO@&%= gC%<pzfY,`0 Z[ g?f0f8E@>Owc{$C:鳇r9H]ƨ+8"Vw)i}[_Y,`0 fn,0?yNAGcI4ieys?zEPBɶ_懘P0 fGVֲBY`-D_$S,`.ΐ Ƭz[%%Kl?s[| mFv)퐞П@Wo >i fiibY,0W,@\'`1j%~Q*4Cyh}i#iYp%sZC &fY`-@o|/)g0 A ?w!P`eI12c'IKzi*CbY`j,@o|j.)j0  ?'EZWMw5=d@ْ.|L&qd<ӈJY,0 7@> Wt0 3,FBO g؆SA 2,״ȧe;H2Ci,fiibY,0W,@\!g5% M/h3H,?,dm0M=%]*M3ybVn0 L O2fj@.w) *@EfY,Pm 9%0E!n^q;B zÏ;pjd_op~ [<riIwg}=nŊ_wr>ϵ6lpO~_z+?#wys9#wAΉ'8<-}otᇷ&E?y < >祗^r>{Gs=WxG/}}(st]k׺;Pc͚5nch`{G^tIg!f[9CqUWXubDeg}'aZƤ۶m:[~o {~YggU{~jH ;޻%믿>D[ne\|΃!MVdSר}<{2Z9k]ۑ qw~ۜ8Jl ^'|Oaݺu9꺉!yr`HЈmlƏdD-,`v ?\=X1N:0-J{?6cjnƲ1ӈ1C ] rp/_<8@i-Q:bᗴu@a/K^GtLvA89kݠKQqtģBcySNϡmBcIk'ZkcftXy@<K|Wt iXOY,/Ȅ:rԂ+~MC>LC}Eʣ*u%>y;DU<o0`Yj}vh c38iSd^hLY|#O?N;4fȑ=ϢCDεh\:ҳ8oRk¯DY7 0hoy'?C+ڇ.)ngEiLW~F)z;?wa/)f蟋#+߈僷X e3~Gxŋ{೸xe+{xp.:w 7 y ;Z&vQo|x0MZ Ʈ\ƵA/ zw)j>ȠIYGgn۹:W^t]oknqmɱ~]A[soPeB۱oO Ǝ0tP(ĮKL>Xio4)@Ry|9wcc2v>\hFM{!1wȳoWR!0 q ?Q<4~S8нSYnLzMFu9_::&,k~'1)=pVȨw 7/h򬷬KCH/Qh.S2L~6Qɵn"wڮtX@_еg},SuoY?cb=< OCU弌}7eNFM%q'xbRgyf:zu峟l!/ud߻WѠ%faD#$q&9pwUnݱ'?ȇ݇>Awwmq׿ۆ>KC:xnbbY z[|d0AKo)wZ>N׾6$?UbJ ~}ChZ "4å^~^ͨi/=F#Sץ\kW_)NJ:R9^i'_'wJz>̍7g}6eīHܟ[zc1a6lpGqD!z! 卑֥9<ΦMA8EZl0 -@\!088plşWxDeHWG=yE5~@eY 1UaGRXV:[U"s3Ns#gȷ2 飁Թq d]*0 e5!:fQ .ΗJz DKCNnh\m5䏫oҵ} >b= dT=|k, L5e.8MSwry8-6 .ΐ{'U`бF_VJH/lk֓-'UTl'dZ8 y% 5EDh{Q~ >8\u_nzPW4My`QHBYZ0\s5_]i?~k quTWpq9`n :~%ZudzSl8*"JQ!z>R+_'δ9 Gy;ꨣJGK>dʠD\l[d8oKϙ#Gl*ϹMa/f ?wNvS]qc7[J}ۦ.u6untU}@ @ G낼Mug^͜Mmuiڷfv.K-,ijp:g}+@93Vݺo]1qS2FZ l]si iл@8[:I%Py%Rlյ@97YtUv uM?rt+~ԠaQmf3;%s>x d <ӈS ̑BieoIEm+98hFLP2YΘ4 uN FLrtLk\[ lф>&K̹.CeE?kxuc1g WrF.hwsR̜"򦷫r=/S΍LU̽ ua*[ZY`.[2y&fY N=Y{cx w7,\|k|<*0 L#6@>;Bz!ء%Nի/0VW/9 J^ۺQ9kݶ/N<~T1 :u]rjۤyrnԱi֕ pQowVmo-M{kVӻr~՛ 'DZ"eX\a:&0ٙBX ,V39؃d4(@z. ,>K{X8GfU!m[uq]}߸tҠy@ /f>TLyUHq# ߈6)y>1[O 11@>yq6CY W2J} - Jl.5CiM Z.%Y,зs y y1Mu-OE~{QoQx W&΋ްBc xH3o|v.\KJXSuzYΣE4t~8us\:"jZ_1/JcJJBy cUNB?b+63?5M̦ %Y,зsr\4y,<YI/uE-KZvύx6u8 p- "L^h˴չnȼ^su2g[ymQn_ǥS[Mo8st>H.JiХ93g5 )zZB,3?5M̦Rqrӵ6 fނU! gL.yf?nޭ]UN`zw\Q;\S {pL s'\3LWzѬʧTൊ /憶:^̡øCl+O^k& 97(M9mMek<֑1<*&鐮 us!u6G=18.yS׀4'_Lf@~ę_/h_Μ7yK \~76 6mqG{8͟wG?;h>'!_ޯ)EL)2YϺF́??lYY`Æ οmc;S܁Ժ3inƍW_u7ouuNö_Θ-7osx_<rl֭EyHs W^k.':CmWԋv]8B:TrXÂY,0M7@>MWt5 蟋310J 8G7AD& %\9N6˄MKFl-W4 蟋3H#` ơ/0)H]~@%OJri1K`:|pLGY`.Y9C 1 H 3L#'wYW؆QGYi)fiibY,0W,@<?փN` 8K'|~`ǻܪP ~ BA?C2}/H?F9|@lQ?c^ǁ3Z$a?,`0 fY,0 @} 3i[Ooaw֒B-BQ2 AV`G?H$+= } cav_y f?fY,`0 #Zt\"X1eI=XMxC1NX|YF3_/1icqtvd%f-+3 &JԎLU2fhJcTW OR>cٶLK>I+1zYXӡ9-aY,0-7@>-W4 ;=X`T_ ^zʒ)ו8}wxP}i G-mf[_$S,`.eEhPm!U3Y_=HqgljQi<Gn?X?+4 f:|veLY`[9C$%eI+cHpi!p_# &ۢ #lk(vQ>yZVh0 L OE2f9i 9@*1hJJ-.(@bb[: Mh[Sf,jM YfIIJY,0-@\Y d D ح!~Q ,4CF9yt/2y$-Bsvdֱ,`  +fzs0xQ.DYo@LIrR<^Sc:qgy'o"o V^]4we(@IDATǻ<0׮]l￿; :K8.9("EZWMw5=d@ْn&ýw/}<;p~lwKql;$zgqWGV^~eoU8vϺ~حXA{w)osg}By^r>{Gs=W}sq_җ>|Ć >~Y:oڴuo xwW^y|p]|ŝڣr`89}ݷ`͚5v k#A2H'F]㾞eX7V[\%@_ b净q5r лwqGiNF:4[njS:Д\ ru%]`8GT_,',@_ז19NǜURƞ]t駟^7H7 nXڭDl-*+WɫZNhƊ3)NyggnEwGT!AO/X$ܱ>r{.4xߴp_ґM=gAӑ4Ax[ZY͛7]{AxdĎx,Xg+qt)g^߲g){?yۮh lZޚuvŹS.wǹ^m,r+:]6=[}Ʀ\ƵkMbmpԵ[_I^m^]L\e%tC`}e_[ƯnvKnztOLI4vEd]-|P鑕'nѢE=VOQI&;9,0)LJiC=! kޢ4O%/Ҝ)X#z_sQnn|]wն ]sF'MM]b^v!5] ;ZG}eяQ+V؍:Y3꺍k!m rўl\}кa,w.QL7r4xx-|Êެ#f^t ezʯ7g-t ;5Fe:OPz &ippM&Llʤc|<}^.’.\(0ޚ8KzX0 -OG߼9JsRu#J<.C΍ a{_n `_ h|uLטXٸ-e`/HEn#]z̥fsݖsB^QQ '1y&fLiͿgYa۶7W^O?V^[۵[ cy e)'g2eRt} I'8'0&]{7eS` |b|)Г?5ZOC64tڢ4yg+@Clƺ~yk)CFM1bv:32ċ5oݾdp~|"g差轥~|g/ux3~/uJ0qL A4TbU.ѓnR=>VũŜـ)9:a:ۚy*ȯ|AK/5UI#Ol9s]OK4_=M5IHQoQF<66cF=Rc<^3+6sr\4y,ր|MVtJ#I%Pur u 2pgy)NiX椑1A<L+PbzMjEmU DU_!j::G#_kO]e J$O2 0t PV4_=M5õA6|mqݶng/sq\r Yx)ߢkk-ֻ{7޾z[ܹ孍5D_YpQ޵[{rGttES {pLi -wO: ׻Opmw.\igZ8XдDvep ;r;N c72h;fchZi::88G+9?Aa)3sdFE-_gƞ|)vkt9} GPx焨st2dc Gbkʞ^ojiXHo6-2?GV 3oY!P'@|W('O'{k N0-{WJ^|=ciX0 Ltn<ͣAM#4x1`^V}ր1CUeC*v6Zrr /Ǧ1T{m7fu;U_>w6¸l۰c6n?wg ^{v'].nmtaX~Z>Ʋ:#186birw|w̸h0sO6= nXPVW}CY6FcLx┻kǡlfٴ~z.yr\rZ77sgSGZmr 4_Mc|ȯf69j Ó{A7@>K!=65Ik\[ @v8$f^/q wmɇ:̗5 ee;.y /\[f *ץSz\晞T@8'5}uc*sreXp3=:3L9 rjc 7Ԥ^UUPT"JG3 tuqscyrU,v#Z<귅ڔOt[̓@mcO|96|XmYlMMrHXMqn2$QK׌u 17뙏WZ {u?vUUc8Ǘxv4ca1 ʨm/S aKܐH! )vHh]]З6 ̆sږ s_K_j9Qder^h}Ώ?6n!{BMc|);/fm&c##m?AZC]uc(5bn*3CNpQci8FX;c-Ι7,Zryoٲ+{KJoUaJ-,Hp t A ]Ƕd;:"wԇQLje9D(Q["mlylZ?GmU`U'TO8ȱRi)p CS{Mc|);5qm;|5qMZV_\Xgv=<}%J 3onNBu8 [ cy e)'gy5ht!d DsvCTOj.\VW,uѵ/VooX;tsA(fzT7Q:s<מнMc|8 m7f1l57Z;Wm\Hw>W0—@}5I;BR}2J|Yp 5^73nƍW_u7oz{;8~>WqrwsG>2[nuok p'|;'Y'>:R=|+|{wC9dyUjA/X:0oxqM=ʕ+ݙgYHƺ?kX4&8Fmvnmyɢ4X T9G\< 1eXK٤4KM3-cG! ȣBY`j-@OmM6x֮][ȬJX,0 N t `k~X;\kZ.HBɶ([iw\! f򩽄S ?O\_q~']s5EfdCΎJ@L JKrK"=}&Ȃ>ʓ:z2+6B/ y +Y,`x  K5 .[-Y$w?g}o8 q(-6 % ?GVyO KLvڰiM3m @'"ӚGҲ.y#+fX\np_|q#k_Z##6 M`$8@k40]ԋ$߀`1ɓ复ѥxBs4@g;䴄fX\Sԧ>Cj4f 'E bU]gM2PK%gI\+24bM,nf$X$\W6j*ww^*Ot_E]7{Egfz ?H$kɓßo=z!PVQ/Δt),C:q~[`Ʋ,`  +fzs<  2C/x|@>l VB"а.ԃ/ &jfY,`0 -䞽N蔨( o o/@ @be}>]0]BIWm]kUo\дܯ ߁̐ ,k_\ȃY,`0 f(ΐC@<2yT(@'a)tv&&Sm.pt,'ۑi1K`~%jGVjf\sC ryn:f l%ei*~1&?b<:-h0m\[f[_),`k!9QgXQy)ZIô@4j-ȃ<ӵS/o,`  +fzsϥrUAДQ$:OZ)e!Sa=xfˤ\IXy 7,grZbY`Z,@o|Zi0  ?쐫"ԝ43 A.YM/2H[ЈWuSl+c? Ǭeef$[$_%,`.94e9!-3,K>I+Ӓ,c^Ƭl`\Zf4X4\-,`KYG %y\5,p\xj7xw򔵬,`T  +dzs30L x# D>(6k~);E Ƀreh=WdcNKt>{ >ڝs9K_>PذaCMZ7;Ƽp{Wd]|ŵ wݾ[i͚5͘*Xb*-`e3Et]{mQtRwWXBMUً/7|5\,YR%LW\۾}; RzYtZAf>o⃫Fsqd(`|JB;;/ʃ[V5Ou>u ALkzI˺P̠YvdֱxZ-ĝ-x~7X4,5޼y(Kb3LoJjwet@P]_=;cD9`_#Y3e>o䃫Fs||t :Lh@O7A]xTZ]5?lx, {UWvч\@1 ] #<=C] .vmIq*{ '^xwM7y뭷jwqIgy&EnSv($+viQ)#@5qo*r@3~ }kcE;fSo=vl/)c>x&s|8EŸ޶"ȳiĻv 4>۶l_k*76p™zvh_Rm۶di-7|`x r-Ŭ`QYgg{~Gus+hѲ@w{~;"A$MCYK)ߢ˫LĂO]x'{ݷ6@ -ǎE6< <%(ip YAΝ; 4bfbGo^<=0_ٹO4@u.\1}[Kt:3Ra%d:ڹ -A6Y|yh~7$D r6lU 9i&~Um;>t鲀;6|pyU\B9G\!yVړuE8jp6 y[#=^_VT|]}ɶqQ=H66'FlGVbֲI*.Z(<IGmϻN:`|vA\ ;WpTIҧ~t<$GGyt'gFtJEįD~tÀwƒv-=p-pMF{sǛ}pxn2O! {SO΃췼+%3<Aӧn`>.Z1:#Si=VHtQN\!/u\um9[H kgoYsgŷ%i9>8 &H`N bٴZ 5u9vrZ / IY9}5,eO@Q$捜)^]3Ÿ]/XgY_U:vSs]qXcAP'G:WƁ㮻Jcy|5\5;~ `|S.7xr eZp3 Zwػ}IywUl{t9A78󩘠\2mjXY4X`O-W!ϵ[lUIЦm XpxC]GႨ&A"r\-#3I4/z%X~6)יeܴ_{ Kҕ42N#c5Xr(m0|plDKgvw`>t3͘yS1A78wYxc7w/&'@'g e:]c+<:r| W + @wa5 x֙fWhKɠ6``1@ua}B @d=EJN\#vNr 7zql796~btC_cͱC,=~i@k6ei{ƔM7e/):@v w=R:#W#h)-m>8r/ >CNpScij˘ H3͘e!SAzuw[ Mc > GX;,C, W '& 09m`v γtv}5^rX:&9nW\ ȻG,t/b=Fં~ըA:گ= ȫt;VFN?+05<3 LZGú%"Eg_um\uMgv=Ǡ<1 8cn< Yb._VV;N> Q&,C1ib18똷aeu`q/C\dFJ2F07Su^s-|m+duأ*WѠ=4vū ̽<9ױJGi=מuꛢ:zc44jyMB&t0x\Uc9CN]P&L~uyťŷ,X6;Q?XYEYY^yհi@׋Οjp4.0Np6S+iڤX2d1r8XÏ2-S$I'Ӛ'?I^v\jd~Av: -mMumG}S7[yMwmt].Rw}Xɔ,S>JG 9|A"-Yih8&//-*_[i( @4 厸,?oTAn8˸KnjXY4X@?1*[.3㦃壦)J: GL\ @ GÞ):T=Gyrl&>Wl\=sUz4յ9Mu@?|8h]Y@> >j?GV 3@:]3@\=W_sx hn8 P.:d 0ͼN#/?CebuȫMZ nM% qDM\ ۤ6}I*e&F_7۱@e~ I:<F%Ԁ<iyw/ئoVTצz7!f6I1Wv:|oU9C>'wJ2Xul˚;KGU.\[ sA94`Ҭ/b3yհi@AJSGb$mᏤwd1wpRocip×eW'鑖 Sm;Af#mMuz]:ozK=1=g,:W|LS ;,c^GPػ{e&.@G!y LV2]u1``Z*.ҩ:D߼TU0QUwïscyr@N z76@gѯ8H鉛1T-ʡ:9س']cXv*q<2m>?g 5sd\+g{7.*߸b] xp\1pu{+WuشqL؉Cq !8H 5B(+VX5Mb#pRE8JDH$i5D1Iv$61hnep<{L7Xq@j<-O( qsSu} %s1"I9ę%fAhB̑de)[$uWxEDf-s<%゘rCI!%eFb~xm9iٴ7I$ 9 ȓxhF˲>ΣnZ`˹cgI_yXq5֫/ ^Z n>YL ;w+ oۦI&xMoyf+Ѿ:~J; $ެOɶoc^ޛ\% yIF2μ <`\6]dYD oX(Cuwl4Xз&Jr2X2c\Y.#-Ic#?ev۝Hu+_$,۱#]Oep=}~=2jٱe7-g!qٴL&%+>~MI7t&M e3I]J;wZquZ悶KK6n|z0Dv{u/۷o_v'9sYf;3c݌3ٳ駟X8{9gSNusuo~Eue{nR 'MOP<:OV84s̀ɓpdB{h8;/<3(%۷0??bx;|ju\H,&s 䚨P,GN2u/!l Ne:Rf3BN$L -!8 CV[+j&$ HY+$AGCG볙^eAҎuԡ=C"ԍɘ=в:CdQDD9%$ Mre-ӆOI_ZJ;+҆cYJI) u2!hX0|#pl!0`|c|j$WWرՕZx96dO,0|#zl\!0Q`|C`+*c0yCIA,HM3/%IxP޸a}0uFJC@!F9sLDRSWZwr#'#fԐs(ZVi>H64C0>{ȁ $$1$ٕ1]\IQbb_cD~ѷ\Ϙ'٪B]#D¤!`  Fȇ8 C` < ADE>)$8ڰr޺Gy}Ll nfXzcbU?r"b=;[cI'sצBM9 0wJs@0 C0 C@ANHT)}EK6fş UǕTܑ'hz"1z!Գ ,Ϡx'LZfǎ:#c!`!'Pn oem>ldovӞnd|2eM0SnIDAT~%j[Vh Ch!d\F!oBe C`x`7B>/ݏwDdD!0 0!ec4 s˕gpu P ģ-y$u*~2e1{O@1 !B4!`L=䘵$y6#avڱ|G`&˿r C``7B> Gh  y'$@c`҆zL#zmK;,=I $ aypVm=D60C0>VȓCRIFGb{ պHK:~֓eڠB{b%n(o\kyCѲ1DBmD@H$Z_+}.HO:lGyJ]G)  0n&YϺ@ȟz)N͝;M<9-gc1;ChG;n֭gM;wt)S>;Lc\Xsk\͓$xzOvIbmv;ݦݣv;^zєn> }@Mش.toia'~|:m۶Zt1 `/" K[b[r8;;TwP3zHsn :)!'#æ=m3[GAi4?]xYm+Yc?tŲlRk"Na'䘣|ݱc;38d>{@"Bk.7{ǝw.]ʌlul$YG| a6cXg} ?ϓ= :LБee%u%_wߺ=US&7sbw>TuQd/ԕ[U8樭lKo-T5j CW%w}[C.BO>1e˖?uħ:|:uOpՅ0>g!Ǵ+*a0yknt׏ϹONw[n7jOmEAmKhz(oܰ>~zQ^ &utm|0!_DGGG'NM~f<%TG['Vn )oNesn؏l`|N{\H-BܹJ?'ENOWoráf;KM7t_ڭnI~  kӷ/ ?X|{}#䝠7Nm1 F[B.zjwuׅ˽c=n#>y}x8˱y tKI %'$$QOҜ{Q$~WrZui "=_rSF>] \o ն,)"m upL3ϖ_?|C>w96*8^z% / %:+ 1,[='[o~͟??:&Vᓾ!<*]n{CG?ѰWXGkL3eI?ۼy;餓g\ef@m0wKx^y?1`Tq~s>Q#4s9[!00>U OPhSH9r}n?卑uyomReM /2/o!lO|=g Ikŧt^6_sm.o'm^}ЧV[0]:|ys L}o|5ygJC8;]ްaCk0@'hU&sL~U<=K<گ#>xV9w#U8\-o )!'''eZ<ːYv}oc͒M2. x|J.$ଓe!%o71M̲MP,}]G+׿uDGU>/>$S6y6|d eםE2o2]I=}ge?p,ǐe볮:S> hs:^1OY \;8O0"<_ǖ $?tHvE˦})wo2}n fm*wo\n'̅[6V4r; C>$P*=~进=7nt^z)]pB[yזg|@JPǯº=_LoC6Jna$T?SbI~:|wsя~䮺*;su>lx@ѿ;KYCVv㎎c%oku@U+Ѣ-+otms?pGSTzŶe] yl{,H4AE=H 9IxBIąNb|('e)Aeyۺo(-4ݼLrlIX萄 y {弳*h8v~޼aX!P  8pcQگ#>32sǤg1/X!=w"[<Í'[1h|W|ŎuL;+);c$p~Gnyi3LN*~%ZfJ/1>"桟k_-Z/ayke~qOT-!A ռ׷NMk]i[opyT$1zerzqZ%rݟt>oԳ/qNFa !d.˔ ۻw{g{,U}p'?,ysڴi[`A:<뮹暴\Թ:w$8};pzܩT궆rlq#_!K1ڇmk,::ż:C?[+"" (yَ<ꐴ.[۸wuٵnxw̽c@LtxJ-R&ar}I}U1wMm#ZcsRZʆ@0!/sͯk})b:>9&F=ݎ1[̓G@0>!{Ĺ\cEju=ycd *`|[HqiuR|gs"%45iW|tۏKăPn Ⱅu'?D۳$ 8Y.C^bd|ڈ$I~x#D?B"zذoHaT*2L$.qK@0OU1ڇ:S>{qb%CZSB.I6y i#oCt[%^hrte\'Vʗx-gu[2 [JI!NJ{M@ĉvTIXX!0~u]exi]q9>Y2V!|{!zuauz:>UOْ!`srkM%fRsIeஇۉ}ܪȔ'zuPk 5뙗R,A.I8,!zm+NX"E_}aGra@0W+棪kkc:>:αs s $yyIƋyǖJ"9eMUA 'גD$a9*3yBJ#{"dÇ $W̊*'K/oxE)}1wCB=)FoX ACqڢt^yЩiZ(\Y9~~㞞7Zg `|Np#NY98jxGXȑ]os_6qKR,mY&:Ҹg;8H6PlSf7oXsao:7alu\U'u={1pVX2zC9ݲRM |wZd;#-+C򨨧>dmV%o쌬ܻj<{U+$ YyMȹ%Eև:Rs%Ro=e_ H9Ieȗ% &|cQ~sgsz. fbsY\ϝ6ؒ#f(% ~`Gm15o|8Y{zpFX2zG` \UaE>ɗ0ѾCT(y[ZS3w3o~٭ܡ^~#'uU{X䃃.ۏUS̃C/61>D{CIOK=S qOɓ'tXɇ us3gՕX* ;< H>~H;.&CvCgƍK/Et+GNE@D0 s#Z᳎'Rqb^[k [TW؞Ȱ-oEɒmK<_b"\X}8ZԸ_4^9'WsK'_[PPfcm=EG[7{}Np -@zO|(A=- ˺]G__oC[ [GU{!X!鯏=!ED;`%C`,Wc'kTOʹ7=,! a;;J~V(C%"u6ݠ}=/=;N?;r'h&^JdCMݮ8ov//\|>!M#ʿkoq'sʕ+-ܒNogq_WҲe aCkq ̓!P'[OH^%qŀY 6ԓdyk[QfI"O]H$W# F3UVe˖/~︻)oqM7u0AC q"o|܂)Y+Ț w yU㒤eQ,5vC|$ҧγ_md6cОXx!W~j~|W6l  F?{cl= ܶBN ǚ:W2u)iS(3Oh#%u!u$YgH +EeFϟ_Ft F@ZgqXͩ!Pϭr$ +űDt~v<ߎ]q\rI8cf6JC |#8V{ڜ)!'#'مM{P)e2/YevJz:FȉICqDAyԃIK≼.`Pd\$kM_rEz~#.qcdҜkk[ǎa\' !`!`!)!Eh1gaED?gP! A}{PF켃@>:oʨoD_Jֿ/c8L{ =5m'`0 C0 CV%LIENDB`readxl/vignettes/img/type-me-date.png0000644000176200001440000024572013406366260017336 0ustar liggesusersPNG  IHDR4 iCCPICC ProfileHTSIBB D@JM^" l$@(1${YTp-`EWE\ bae],P& ~|y;wg2 , U + a&$&1I=$́=-xGFhۻ0UKIWSpElH);1pM@  f $ Hp$"ckiLL/d?TK$?3( [9<>䝐=,ngAVB6M.OrdX6x"Ak9۲ģ}BMEI mP CH#?%< <4^wA#l/3_(d8(C=¶,-Gy1#"5gY \hL*/ 2\ixN%Yr(3:tt8JTa@,S b}CM Q LcGapuD-dEc۹YQyGv&a+$R{'ȍiq|`1,)`~KVX@XxF[Kk @4GZye+{ZTimE&x9=p7< >`ŝqvL^D?b1h6 Ug" o.D t :  ݄ X @X62!pԁFpAµ ^ !BBh@t#E CD$IC,Cb مT""'3E }kTTFщ3ꍆ1t4 A@2zF_1YbΘ/%a[b%XV5*֍cq"NǙ%\Ax,sj ߏ-Uh-LH f %spDфf"18XCl"vI$ɂN HAiR,O%ےId>y)||E~JS3s͕[+GA\EbBqP2(K(j9=yyy}y)|Q IX_\eYGtn@{轪DU` "Cj*jjqjsNu301#X8¸4N{8Uu{>^K^^~]S_#ScF}M\\sl4ǫw_8;ZVg1YRf s@OK/HOK]oHD?V~}AFfC]Ɇ 9m6j5zolbo¸III=Sii53Y6s<ݼjhf90eBńTKo<*+UR: '&M\?uWk,=wmTlBl4ؼ5eۖ^-{eoaϵnˁ0aCG'GccSVΪΑΫ/\|\4|tutu=[gL&q']ߝ˽ۃӣSϓY멷wA>>B>}]}6a~~~*e6B fW8,i F> 35LF'L0^Q8?.DGli)SDD͏jGό>.'fmXXqlsbܴʸ~ $\NL%'& Nij4inL7>g3f85h2!9>@gV55e~lqݹܧũ6{|yeWA;2gFdΊϪ&g'g3-tf͙)s\s6 C{Eh>WuĦ=yyyf>:GyN\>e>=y%{x/صYyz.޿$sK/},~Yr勗?)an+vWV[eBN"뢒ϫ٫/lskR״u\}qݍ+?0yCFo7tľdffҰ-[m\^vܧfU[olzvv¸d7qw'{K^ͽE{ҩցUhഃW[VaŇ#G:>ftlqZvn@]z]w}b}牐 n m_^cIkOQN-?5|:`LڙG3M8{eJKs?zƋO\rTwrmC~?^{J}KGCS]]g]=-;o޸us[[ng~u' +/y?jO=~xыǢǟ{?=)yƾS/Sϭ/M_믶WWïWx /aG班?=ٗ_ g XB(zDxv8%5DvgO,I}^. Qb ߒw@ʈRleC0m& R pHYs%%IR$iTXtXML:com.adobe.xmp 930 426 .GiDOT(0!@IDATx Uy6B!  A@M Z"UG`9ЊP߯(b#ҟƖK*VJ5! 3γ̚gfo彮gY3﬙s㎝.Ksq;w"۸nR?4 EO?'.2u& _R:H&8zwFFK"wBwSy?ECD (>w=ap&(wJ_{{Ep:!i 65okh,y lG X;9ȑЉ;@Wk)Zvcz#;a.sg?=?ܮ~:ӎG^ctu=Octu=Octu=Octu=Octu=Octu=OctפcG?;TM̟ctu=Octu=Octu=Octu=Octu=Octu]chMu bw4uRvƤiCEv@)pf7RYHo{vT7 gb?|24R!zo=!mC C!P|8w؞͛7/_|94eAc'&Pu|ֿ?̼U^g,Z, ΀F DOxի} ԉ®3U{9c[m/G\0z}v?D%vW wgm?y`N% D@<7=~̟JgMYc},cMl묟?YS}1yugzjX˳S::g:tT_Lq噞??ߔQ_CW*(b=g1tutS鬿<:3=Y)q32Z%u D#:j::c1:HgzS{1MgzS{1MgzS{1MgzS{1MgzS{1MgzS{1Mgz5~ʼylMcܑ~!SMct7SMct7SMct7SMct7SMct7SU, ~z^{(:uCE䰎e^c f/eёw2ˎCcIy(o!5 e:m_!y3K6ֿa}_ D <EBEB[A|؁Go/~N)1y?CL^D1 %a9 o_()Ef֭vuW\{8䔵.uȑ7uY-A(Q,H]H?k[a?[TTOp֮N%(Ik[a?[TT; ]heXFA8տGB#QgFNkHoԙS? A(0 CMlݺ%Gs-!`eX !A(@lX!`!P0 C`DCA() D?UK(olkQKJD!/G1}1z@!}{ORGř?0/F'uU;|$1}1:y3(6|b 61F8!oYh9^Hf@,~e*`i fd_Bi>+lmec*KlH6-1# L6?:9a~HYVTuQ[ى\d}s&;\Cx.¢;{_t{a;ޒx۲eK6\|?0fSCǏ:pgƮWlg߬ DcA(:h.STmczT~X=~*cRIӶ=Og{\o[Sm?/ڟT?U6oƎNn bjFW)MmmӺS|h[_S=S۶ӗJOO*̟1=~*?zf] P}A D1HMw &ぎ'pZ1eLg} Q5ϊ>$x>|ug:K!jDd@4u>oǿ??{{Oo4=ͪ@Tt UQ؁JcLgy5?g{s=&tg{]}0?cLgy5?g{s=&tg{]}0?cLgy5?g{s=&tg{]}0?cLgy5?g{߼)_;1yk}(>c1y<뚟=g:˳>c1y<뚟=g:˳>c1y<뚟=^%?kZAe Dh*Y:c#'үbLgw e]o7?x㓏?Y3ώ?bܐx<V^=z:YnX[{@L텧̎袧<^*?Y_zT~/&T{_L>Fg}MRٿ|S15Kgb1:kZzjh}=|ҭA#&T{_L>Fg}MRٿ|S15Kgb1:kZOct״jO@4 Ue!U(D85!tD?l?{+</ՔRl?CPv#Gbx<=oJWF*} FL|8`A||<#Mz%mgoecJ1y5G*~_ /^/k|ft ,=Wgt D끆2>b$0Gw\luA~b>9\j&?( v=<8chFML{ u^ ;:m^U=^{푝O\gLd> D8Q|h F;\5ծ?[T>]| Ov[R߮婡?sHxGn9_w5q_YKv>h77^}-ӓsfϸ@^/7b͆!P@`?wOs?u;oAU C97>ߑJ D[5 d#,G}'<1Q(ra4gc [(8N'SiýO?-<Ǡ8#}'<7e1[SƿG O)gDlt D'wٱ]oᶬ+Oa &ƅv؍IS`6͕-ȳ1zOKTTr} -}F1WR'U>t4EqWP7Eeors 8 52E_?3udNﱇ?p5'U>>V&;|eћoW>pW(;]&t㦟ι+}dzq^ TB06ޭ'zlFMв]@t~J]r=Ҧsg] ʇt6֯i(s>7g}\gL0?Fg}\o*{5o{'=]7/q_.ZO[87#Pz%Əct묟<謏MYY?ӹ?LgyY׫|rN{X:gAYct묟<謏MYY?ӹ?LgyYO[?xщ,{ݙwg{qj+q1:zSyut/1^1zHnk*uM@IrY z'wxYzS{,mbu/Ɵ?lޫ󣹯uW_y uE/s/}fu7Yӹ7O1?ӹ7O1?ӹ:*@uCyALXS:Lg3=\Ocyo1XRc8w=۽e5swmاυ2Ib:@90e̼x£O]C)t(3\183x}h~Ύ蹃Gshߐٟ"[W鷹}J|۔Lb>gfPӍ6@sfT 3O-c䤽X ,MFL_bʳa}Rwp k-p:̏wo6wzL_ʧ3n{Oi By Re'*W\Xrp!60Ml1/t[.,bєg:=yܙ`G+w =]G;21\QI!X?7ڋ3?ӹ޴1T{1~s_!^<+)6~MbG>ᓜ,/f/ה6cbL:ߣӎ;nmoܰg?pG2Kq<78+~s=Y?7ڋ3?ӹ޴1T{1~sO@TNF^%_ѲRbȑd:ۋgw?oq+0u&zC+;๟r=} Au,OkѧmX{|b5 6SwCC8;Ɵ>Vhw )90<ϴ DuͶ@tlq^IpY=>pN-uW_9sv;>>Kw/wO;qce;3l\H: 랭OVLo:ם# ;v~soyKr]St(O WM6(hƿO~J3;g >]#HkwOinXaesl@4E_7ur$[?]ځ?{ry.v]s;|~W>K d} HK6m>LM)=Zw*Dяg=kov;/sB{ӎ+oJv6o~ҭŏ?FwC'yu;rEa*cUnǿrO@4 Ue[ =Q~萟#r$ٖř?sw?vݶ:V|rw:qƇݹ Ov|P{,s=p@tpo_yL)OOwD/(:}&sO}SVG_FLv< ҁhַFR6؄ O|F\틁M!` XDY{O dx(~G+f~ݛDOa)Nf( D= xdY-Gq=r?̊_]r4j{o^Wu9kuَ((΃$)4M߳Mo*|T+(WP>qz{*d{<:S2  U?ѯO`T{l/VZ?ObT{[Wª닗]T #TRԵ~'^*?ۋջSXKjG4^*LZS{]׵8kﺨ}G~a؇qBRKOkOT~wWٛrh TnqWee`z@>3?c?Ym/>>?to[?K3Bw=fNto[?K3'e9s6T{4ӏ?WXN;haJ'~Ll,t֟۶_JV~|{7LbY`*?L:O6?g~l~/&?Ŀ!ݪ\ß} Lqq .t+1[z'҃3dX_n_`~s'sb3?O6?g~l~Xاx(YY_L~>'?󳾘d}O'?}}௿_=w9J/r<3/&?lY_L~>'?*)rʝw,ţX֟cSg\o[>Okywᵃ8wێ}=x?c'~,G;4Y?ٟS?cX?c1zS},oC@4;'$Əzl|cXُY?c1zS},o3EK5- /~냦繏r=3Y3*sm؟~cXO@Id@ Dy"9Y$r3 'Ea!o3lg|Ǐ%gԍy-?}qG7~ϛ Vs9/>s;x^oMg7̄RFdǃ0^,2޳i_1n;6 1uwnb6Msk%m݆߾*R.CUU >~k_/z1::_0lώ !z7U,@IzY Z(x|7/UȑvfI Xחx &)߬gؕ2rd} +?Y࿺w9񓹈< 3޽ܝ۽>^1:Kꗵֿ?ϳԱ'vO9?Y|G44m?w 6A?wRѩbG D!$.41[S]?m?]rE'_>rj9}q[ܧ/8?*5hWA"v"uնo^i۶3Dq`bgs7Km;1S߶~%XCKNv7xh[Tg 0ih Tj\Jg1\U* [nm@"X G;i;xqDqL?&{sXrKܲϼ=/SeD:vDz@4@9R7ng0uþb!jcGs/˾zLL}^Gܽp,(cgI D!,=l{a۞qǸU>{*OUJyib}?gFx E£uS{um۟qۋa1nm_c{oqQJGcޥ|Y wDǖdW{qcY$Z{`o_I<,fZj;G D敍?{k2ِlc3k Щc(?[Sȑ.|r@Ŀ69oňv< xs?Vdj҇M?Xl`axolh T[o#-&!u"tcR?ii8?5ݘ4OZjNO*M7&-?ֱS_Ӎ͚Ln{s$ؘS?nl&?#;6&#IO*ȎI0?cF-3c D7֭_WˡS졭*ŀ#N_1?uo*տEL?whv|©#:>]/]gֿ6hZc2|Y ẕǕ~i`tDfEx_7lTXy g_3}GenO<x}w3k~~(mumL?;ɜ|9r7 Ms(x!?9e(vD!Iۦ艺Up~c{3?g'Qd_oNmgFPoG<:d!Gx<m?L_o:!064ШR~e$NbVuR@JS_>$W4F'w, C 13DL[tZ/[\]k!ヒ|Ovޓ)63_n6faxiѦ]oc3?wq3=?󳾘|>c3?wq3=?󳾘|>c3?wq3=?󳾘|쟮#Ep~wD|uR|mOP󳾘|>c3?wq3=?󳾘|>c3?wq3=?󳾘|>ӵJDԭO|U 4uxX_uFӣ)C袍vuOS[m5sIuԹJ $ɞw%_6X/;r$hcݼ>Y#uɛ+v1}Me?bbX=ll/Vk/o//ۋcDqZ;Ћ瓦?|k@S!`o/ 梔φ4_2[kC3Z"뿭aZH?[21-љb$b :-g9m!0~f :!0K9kO=ShU&K~:|Gjk[_6hm۶6XmW{m[_}Ѷm Z>Vh6ꗏGS[ܪ.4/i[_n߶B#m[_n߶B#m[_n߶B2R Z7ͭLB@t2C*<^o.W7I_=lm18r>^pIj;"-o]зߛ]v U.W7I_g 4[Y ]:QL@H0|^:3c~Y?g:s=U>}<ӹtz|?FC(k~tz|?Fg\gys,TL1?Y1sc~W$u"ה=\gyl/)?X?scugzb?l3?Y:ۋk=\gyl/)?X?sc?Sf{1}M',X5gg~gȘ) 'ߨwTb,mg/se5Ɠf|?Foc?CD<#e[T՟ѕ*_3 AS6jZh6_|#Z@eQd>5ǐ1 6>6/C`\<{|?[g;QHDp!qZY$Pɳ=?g:Sߔ=S<ۋcS:z~>e*MKMIjj=?>7'ž~I]c=np7H*m;ry( 4ybt궮k[([wm{wmk_/"ol m1]SIG3Gsk].Y'|L )_bNѵXB}UT5_X?כk*߶?/VoSym}M5o7<׶>ʷ՛Tk[ D]>/onj|Hж>ʷ՛Tk[zS{MMo*smb*W÷bZn!`!`!`#f"!`!`!`#0gǎ~G[Ed;7VW۲wGyڦ~fRg]g\yg;qIʆ!`!kGuj!`!PD`wK sE^Mih vZW1j?X#{M]ۇ kȆDFʻf Dq C0 a,Z C0Reb] ,_@-z?$h\9/g>]+k|JF[ !`!F0.j!PD D%p o,dioKĠ}.Nk?PoWT ]+Gs0C0 C@!`@_.V;ˈYچ.Itl\l/JlFg-o;5p3C0 Y~ !`B DchR$>X/X$ͣl'NjDžIG#vi OާLOc-UY0 C(A`0 C@\P$0ݯ=i+㗀t᭲?$y ~`*r:/I%Y *HXn!`#`h96F1 C Pjnَ!}pw2N@ݠ$Nb'hH^\ \o'LQV}ݗ+9Cݼyƃߟ;.׭`(X Z>r!nF5 C`"PQ~-I,Hس=G7O->n(w'lIٓvW?m;+0mZzܹΔ='cKEࡇrtPn!o|#E/r .3i&~׭X­Zmذ_wSNqo}[0aE@ >-[]r%F"0(@`La i_5I{UϮps>)w3_ն qiu9|#jVzt/nԤxG܁ˍkx7ov/}Kݞ{0(~p>[."W\=Zó{v Hk5#,-V>-_]p6uyN D "$H y5W=U]eyTs;a{_%r[d29]--C,xZ [N݀Q`fE^>)}-Y$IƘg#fRH2<["rV3'~Gi:@n!߱u{{<r?CwHͨZ^u.tI9W$?j40lCO屟Qw9ŮffwW'xbhZnܸC0@||G]{5,(uyff"0(ލ̒ EAO$fy~7?eUV;vh{(KR꜋ΙGEMˡmwyŬ<kYĘWGbbbbVZW^y ph(;xgV3<]wuʳ Duמr32 >u]Y#o;*Á.AxQ4$O*n]q/YTճ@qwDŖ\  C$nGvD9@9M5X 6|oٲ`,ukF/^niv!`hx"VO3|G ,K'"9?~]?u햳]6/;7xGT5;1;^M^]̛I:'M9Iu{Z(|$?#nHz;#B6|/~ 쳏{ ^?VSuqLnҲP|9 \aB) *Y1sχ/}?ղn:?Diy>a>EIꪫ+ՙkoS?zKqרx|;yuDg! 縣:*WS}hٱa$z5Mr;s |QirNe{<;~կc~¿Qe}2G s=mӐ=k3fSر#/Km۶ڥο[zPxηmڭ;;;ACI䚆ry~\逸ډS_Gۊ}N")[pFe כ]m.eI;Xe? O/÷>H4h+0zwf_P-ȈMɳqp17t} [ ^XU!TwF0V2I(5ߦ~ܽk\dج>FXı:1mwӖfOĿd|ƺK8Z6IhsUZ 3 D\!oc .s|Nl]k|ˮ5'Ѽu-.{ʢ`v”X8JP.c*zl( Em6dnP *&rOd&m(%  e LG Dc^l f;DRdcYJ+B'OB<DH'^5oo[*ӡLmħ[n% llcS7\vA]v*p.eӶem澅0M@9F7\@=خmiȖ3<hv1/ur 8up*mU9JJ9>>x?TxPPlJ*|X.gh7&h#:T8Q%9v!RL]/0v&ˋ7%@5?넟 >~ J|р>3=' ߁MR>؇[ȇwT?1׀ n RcDn < 8oJu gS6|,qbu@sO>й}gY-[H0#7U.wDuЉE\ŏ!:!>x&$cE+#%-?l$gr-(4V%^cCZhzSVSG wu h=UʘUw*2ZO|⮋[;u'vLwWxch[R2}r|Aq- ƈrr52vbu@[(aU )k:pXX-4?Yd` @Y@YHu%.eA~Q: E9LU.A'(vie7tskRh'̶e1.e fɆwbC;q,+#t4(7߁f?ԫ]֏P{p('ں2mjORb|GԑcIqi\wC~% U S~Nߡa@TneC #*SJ: eyW| mvcdb8 t⾱ ϵ:}~va[ ͭ B&rRr)K}(-j.T=:*b 9hL #/#wyTņYOśO4|{܉6m^/4&Ex8WGybc%^1wGN :yZz,Ckr^X'C>q.au }6}c}w؀=α:z0~Y ?VMv:%uiÂ˨!`S羜",mUy:8.(Bp}0HOf;1zTۑ(7_|Ls2_ʻ='cP~2[} ퟔc~ _J>_GyW31Rh4@@tTyQ8VR ]|lw@g|[p ;㧥'2<aGs9P߬Q|r)'xJ%:ri9ʡ@TPl xOʂO v'{`VGyWclR}@/ @@y>ԇ> Re`5M#q:y b݅}~ikqo:羱 f%<44 ;w_έ F=m['^\z7TJ:0 J)\v g?04K)4m|*X9q[e? )s}[$\3F`#y?h8i /r>v'+`2:~:rør")?o/@u.)?c (;6v`S'ᵧun/ D'8qXU%Cܬ)U;,vEuzM,S˿@ROɥshӹ:`Sh܎t DyYOd,Y'.>r؎2.q⻳I/u|qު|WoTnh}ⱯʶwT?X.t|1v m>~ʿf/uQf$|ЩmÏмa_W/D綎^?b}>[}f#P7b\ nnWI=2! 5 4Ie7g5uRk$_t'0v16s1N q EßPbM1 ٰ6C`#PkG:E{y?*3Ѳ]Q,6|Jlϵ_N(&,/Ⲙ"rY'ل>\Ix/~p{Fu@gWhqe>hʡh2T-2gQ7U@K;Y>jY+|@y7BS Ήe^IPb5u9f\5I9OJ]o!LL/R<?=]vT0-;0vA˂PO4Jip= TU$Th.&.|׋hUY  ֋qxf=e:'A i|xN]mo\WnH;7?683SP %~K)v D^pQZcE^N2/xF(ײwxX28aD~ԼkLGk. yO^2IYjs|S๋'81O1-vR!&^ODZ}Ш~`%~:eFے:hU a5|ml7.}PjOm}+TtWú\=Kl-Lcvn$ 3gNveGϹ9;$ϊ  U'?>DyJ!AVZ~_,?Fz"e%YzwkѢE^yFqLW2g!ϟ&O8V^ I뮻yqe]rUƷU>N%Z[xM>/S}{ީ:j$<ź"K8MO8ivcw-4R˅`sx(],>s$;=P=!bR!P<.eA@)Hz&A}.^`/,S櫶 "/w߅nw?pvm\kvg}V0 C4 D r.I/^k#Z,\rKsk#V0 CX :{zn@ y  E)"'<zyr 8{'UIJpXGv/2yH݈mCnh7w\2&F!`J,n6 C £PF U4I$ D{HtMNX\B=[0 C`v#`!`uY?N>K+T;O麔%@V:?$ ŮW9ѥ2y D{hxvL;!`LfJ O;c!0}[(u;_?r\,ʖ}il Z۳ʕ"|/~q7 Z2 C0/_]nַ.\(ݴ0 C!Gs˂4ؐ@ 9RUPO歲SjBer+jh,#CeC0 Cv!` 0g->D|~ +#û}llG}rs }dxբo{}U.y OZ@ ?4MѹemG1 C0 C0 C 9>\AoGmo^<FO$Q_RF轓Z-F}GN}̨t>m!`!`!02/ |(8A<.Y;e9OJ=hG_%ԏD\At^Ƌv-}rh[y#Z C0  `<0 CGTKŒA3Mȇm^`+AxChG[:GmxOtq;c!`!P0 C`@#&\8:r$iyAayi洛*i!9my- !fm!`@ DxX0 C @Q D%\K'9˄x5Ii(_dN @!`!P0 C@#*p45y휄WNJ$Г\\&|ePF~f}cɟ|h `l!`(,U`X0 CCp MuDݦU?RU`bI|I~{OS7-#|uy7KَFʆ!`@ DøX!`@^ JyJ0)$!R!E ыg|z.2bOګrXaʈh@TP0 C(Grlb!0@ D%C^7 o*OuyȔ@YV)Uۄn|`!` !`$`!@#*%:e Rf ^Ye uã?Y~rHگAkRZvDkf,!` Dg0 C@rY&́I^+OU?WݪO*/9o:1]  vj1`!o~XKnFʆ!`@ Dø4iw7gw_җ=ܳ:5 C`J Px4!/9`-ċ6m9WeLe v]wݷMM2<,eY!`!0@m~i7w\ղe%\׭`tEܪ`gQ\"`M #wٟpIC?Xt;EnbgݻWđU8}`f+~UIdbtLQ C0 0q%K.|rwu+!0]((:Q?p< 9 P.{~2#.X|{ғQ/:5hsOW]zѧ҃wC$,*.2e>(#kuC0 C` D1i҂k D h!0U(<[y Ԑ#IRgG>%?-9lJ;s.KCWP?*h!` `h 0#6Z31C?Vāi'12jwQoyKTsW~X7ϕ "&C0 Chnڴ}_w{c=ƍ}~'#8, W>$A7 'A^:xba/k׮͞Z~{@PP裏}ݷT&Dغu{3Q uP1P?3wKhC0ZD`Qd[3{5=>}y`ݽ - Ov7˳@TKsṢ"i9wrяuY9u Z +v;S!/vy %"=vSNqzTM7N;/~ѽoV0 C Q(".I0K.+Vp'T|*vjl;|=eȔ411Qб²m ChZ;I"(t5x>/RF_I|1dy.$K2jV7 C0^{T &n=ǹ'~5g N$h?K?Hַx㍹#v`C\AVArAB0 wD̠}d-Gu9OnYEGν׸%EZUz?kȊ #0]> C0 *r.ByUj=Mp@>C)y}acu;׿vmy3p߹*l߾뮪ǃ b@~GB7y I '^>X~w]tmy}/(}wžEKoQArC0 C:(X-e/]xڬqց(t'9 T ı:(nhw?k d@Sz(v6`4*QP5+Sr~~w()q3bTRMWFEg-oFʆ!`@:(д8 ,ct?wnذ̌tMEs/_y /Ec9 Ch< y$Pi~; -^>׻g!͒'eߨH`%h$ص݂x?pf谟ohY0 C#P']VŔt Do~uQOHr$u冀!`tGT/<F%'/gag6ewշ|akOud] ±4E9)mG4 Ac6 C Dy'nxm= LV!"}x1C0 :8B_F;A@#+_.x[[ʜ( Ȏ|]NQB[ !`!FN ?RѰ^+3!OS0| -*}F3 CM B~% !0F # x|.(w';V?A⡢%5l +v5͗uНWjl!`uA?5N}k_7BI۪nG4MV%mQ"^V3 C0B D!w׺>bƍnw/qeڵv_~;묳r2l!1,kv %ZʽE/ ~nP5!A "$HӺІļG/\>p.z;ܟ۰yr+bw'( >$-oFʆ!`@(α+ xGo|caW駟v?я{|gwYTDџe˖9yfB[Y`yf7|^2 oCGzz:ts./7K!`L~GS4,/SzR~yd@tщ繏Po,`O -t-[+[q⒓Bf!`)(۰a{ 6kUkZU*|QQ*ϝ;WG-b@;SI`&H&Pn]~*͞\^~B1MG%q;#*Xn!`#+V?? ~E]w9f:\=,g\?8΅:]:P7:_?g?{"_ؕvliG_*>3u]YlXwDa Tx. <砋 hUȲ,,0h9*h~@TeEC0 CQQQAP>Y͋-O:x}CT5TJ -v3wuW 8i!}xnI?P0`#*#uuOrj\P3 $K4 D%C0 ChM5c͖-[n햛lɡ!`L"|Ps^۲P*2yu-23˥K3W f͆!` Dw*%\./ɖ +$"~`?ʂBt&u:nn**0meZ!~;H9C6tE}DFَhX C0 ,Zh#ErS1F2 CszhC=0I0)$ HJ ̎{;ⲯOdĞ]VKk;,Ģe冀!`@9N@~|0Ƌ@J&A_77Xe<ޖ INA]& vPYWm!/+Ϸ !n !`9ǩh\@Od# ;v%XC/#gj '] [s(-~X C0f=9uQGuܷ-pIHы_oxdT@ Dc8EHRֹ=" `9sb)XC.{t D5bV6 C0@4!`u,"9I-to{E#L.D֞ S(^^_/E;=>OtK`}{=_^r~mg?0 C0 C0 C`4dm`|QŃ==e+>`$T҇2Cbm^'vo{>= Kff3=Cބc!`!`~GZ֘F A<ȣ&^eKz%i{^j#ʈY0 CFZ C0P@u .kުT^GtՠmeVV2 C0@ k7 C?VAiZ0i.3/tj~)]z,E^d[-mtC0 C9 Dm!`AQe:0c~ %m:&< Pe_JmX Ѱ!`!F0.j!PD`2*k@=7/ X Uѭm +䤂U C0 C`,d!P@#  B M7#@tI!yM]&eɅsŨC$nGvD C0 r,-(!`Q4!T %vtYEC-\ 3Qmvڨ22Rs?w8Ʋ@rtP<ښ˹R+~͝;7l2w%VXb;o؜j#fLuz#Z! 4 4&6 VݳriebwNӎ;F !񪫮r^xaq\P_Wv0@|ŋћ}{mV˹,Kuf v$uw_ݼy{K_p^7FOJ>C⧟~o,8^ ZG˙3@T0ukFw縯f肉&&vuUn?|;ṻy b`N,G\3F)t^.Ϸж!0+ L+d~+ T2c; {ȠRj \]~x:J <Ȃ磎:?u_Wq]WW۾-C?^.f ^/Х1liL Dy jN[Vw7І7o^c.;ff(T|xY|#2=ʊvlt79vD#K߲ח{|. ,mGte$];_uc?át͚5w>Ϲw(ł}ݗeCc6m!! >|}?.8mVcZBL]?<蠃 z~ }Bs0t.-hX >bsJW4})]w}!}6#"X'lP7Hh ZY\Ѕ(U*FA*^zQĭLܦؠQkW/}g̙s~߻go=3̜39tT71׸ EԄ>¥_ 7 KwdyxgNgǏa;6 ̾ɮ]N{jr4;v, Mc2Hge误O˭n038ϝ#^MqXg1#הCb\d/jK^0}7Z5Ocj}/vr2-֓Ͷ{;SɽKvofKyzLtͿE:˞* q>*Fa8Ѣs"H.Vh<-Hkڢ\ [&m־?x5Ch4eҟ%PQӹEH89^{p%4}lci /*yHZ`*σ޽;@Noce⧱߲5F5oH;qziEh(v$Mo^ꪫ>Ղ7T" %`5׿N>`G~Ru8s&=ya#92a7Loׇ;wRli>O?tN 7~5d9 ;B^xe(~aD[Ļlc ,+2]aUcƢCϮ@W.r?|c_bvNanix6~7I s^Nw@*'RZ@Q~JKh 'kHS(+2|&E5VNˇSZ>eP_PK+ E49@m'Rh~/bNdm<ʖ,VeJ" 7.b&6,mN۰hf 6]XEkKl ,N8ZeqNZrX[9lYk(Otks@ >zC~:=iUvyKuq:օc3=wp޶(B[~wYs()05Nd}9 ;wjmE5y8sI YGxѽ'FBz~ȔÄdTI'),i ;]A9.(UQ_kH&\._LVw?X l[&~zgW*r\?c9єwk *s@<)<]&+ּR5Nqiz^'KW/!N&=t׺8M)9n q@ KL9c=ּ@>ɥI:I0xr N3~?:Y{-k׾/?<(&0DI,%akD#Dtj3BwkΡDT/t~ӟ6ՂbQ|jkG ,?hӋj_߆"!94txs crV\kԗaG䁠Y" #B~GL昞KVܹA׫9.k~p6Y ?0+so|gx.i.I(*NDWg&"h< ŋe\֋5D V', uG +eg-B?WՎ w s<_KD-E%"qkAggB/%G/:pcjJR$FZ e00^8.>s}Z6]WR_Mjα,kz G.,;6W1ƼR*9 zhXscR;/-{y/ g+, 9oJHL5ODɿAS$~uE>&:NtIJDtkzwr$] oHQ^zQܗrѣ}xiu6XJc5ɗƱĵQY?]yRnZF'8]ʾnJi]dEZg4::a-9-oYYQ^YzQbSꏾ!;ty5:-2]CN׋ヴ.u7}KDXָW8ëZ|W[rsQU _*m?~;߿jKG/:|v+CIDATj̜NcNG?Btw~~V&H JC$. z}[SG+\[pw4rp^d;K$$_r8si#_}9 -Yyn}bڽ!!og"/\s5!۷oguVtH\|0+Zɑkv.}h_*$*o1UNne|nm,R0G'qpܭ^Vkwk:4nEwW0whGhYUd-ۢ'ۑ!Qm'tjWCO"J]ժO |)c k6TQwm1D%=#ƞl+qEZO1J?_a/$*ơNY-se%]s|m;|'_v9i]r%~nPA<wnۥEs{Tn\k\T[d;>b f햹o| uB%<,U'da&"}mU$"?QMަo*[ul}íڔk2g}2K_.p K/°m۶Z;)5sO Y_mvY-rFo~Ɋ䧵~N9W-lP|8>5Ek}A}|qC%C C1 QsWͼz{xHPr"SiaX3u\[?^XkˋhkO۲~7nEz9&!:|J(V,2]Z>-tS;GH3yv\ ]\nZ97jEHWV~Tiрθ+_ `PnLwa [[t Oos-Ͳb.ɹ0p5rcli-Q5mۈq!ұ7<7ijmzKjYJdKanIe`oTrN%9itL@ښI&ߚK2]I4!ߐ›sI.!0|R<>~Vѵs[q%aQI:[nNGI2*#$@E|(կ9-sQC0W_Wn 㯫\n!DyE/tDVh9J`%q$y?d}v ct ƞ}t\N5)jK~sW׸Aw@CDA*%%)-Jrʴ_"y<~{_k_IU&<{A& (I*8}PV؉j`(4<4%w(?,^]7.zQܵhS>i˒ "5kѫy "Kz<,xsF: t?5c [/mo_,]8X}t\N5)jK~sW׸;lΑQ~+4UKʦ,ONx"܉E8|fZyvg${'k͗ܖ{\m%$%- NDWcf XHKWBʒcb^88miys&c/7? +`(#8Vpc!i!~]i@͖XyG/ӇP]x;ˍ[#歮Scoս "v6v%ңeעأ?".eI_cuj!Q\H2KUσ"m~1zfTcX_cIBcxw'̬ (ӐNZCgϊI"JgDErNDWkк6F!/wdE\bRt@1۲N ēD%1T2:##)u"յp6,8B D,YĬh2z ]J(\ #,T'1^8KgY {YfhxO`Ea,yCB/zsbYO$A8^ 3c]rDGb0n і2ZC9V1IYx +o`6]~ I̻NM_ O߲*h-U$n9luڷX4cc5)E,5]˚C/y#0%oOM'2!l@ez*kݓ5Kɇ9ҩqS! eطn`u F@/&Bc9}e]X,bתw%"_ZD]',b ՇFC =/Yjz,[ޚQ;werak1/7Fe9y'ray}~9Y^ \NoLB~ּ^!E[]omn0, qL'C CuKorƾɍXGXKo.ik$2Li$c|Οm="h>mYDA[VAe:|f9$1Dtsl,y1-wգqsƲR7_bVH|lp"}c١Rm7^RW!}5fq=20/-zk檵ŎRqpO!DH^kZ8Xe8Vca>ioob)۩_֜5s˚\Z[sqH, 4M3-yd&{v'{_}ٶk)q1%TgHD%q';PuG`3mӋRkAEM<.}~&.˲JX mL% 1_z,xʍ?fD]}ڇ?"aOX^[%5ְ9.6MzL$)2u/#l9]/,5Noļ]:أ^ò(c_k5'"p2SlقqZađ|rRa-eo{/{á#D>sO.}Ѵ˳.z)2azBW8@o:ȑ#_>k>믇w}7g.pE-lco`Ç~;>S'ç>|$˩ ?я;vþ}}W^ye/(G$͘ ç?pYg91.oBr)-CL)})pqYa8:l8ψj<8#hjD<>xIѥ^ڼmn x^ԝ#$(-F"O4K'jYE>Jİi+#OMjC?Ӎe[Dg8#p"ZdzGp?~, w~gtDψBnϫHr$P?4>\v; ,՛c$E=@8Y٘{!R=_>Gel6dQZbs坈J<8#8qTGp6"MvEn?kDMI KmQnV}1G9LaIcؿ#@GpG ,48# ? @IDAT{u.C`6H D;@Npǥ1U '9P7AJހ58vé1UF\c$l#I@oo75kw{\-_V^u|=3י5kt:8Y8AK٪zJ oy2U ]kׄ.=/ C0 {`!F`=+PM˜/ NJ,3˳ǎsW҆)20|#1-0 C(#`D C0Š($9q8iҏ#2v_4\QF,:J4{gݻCI'̙S&i] CED1(Zxꩧ8[`#`c`1Gu?C;8wǻw]LVZ r+."^J a!j 3ݹ7K6ΑowGMaYЏI Y8]~Bz[s7m_}w۶m /}#iܡٳg;q#M[lq~x֬Y:"zꩧBڵk݋/~ߺSN9_?<-[nq> tz[tK(.Ͷ8A߼Qqs/;: wGJVm- x~(zdžs>1qWhæ6tf6'*}p> .p:pqǎE]8#u-"qFxgyf|S2z-~B ^ڝw^7;g MK?leX{-!(SJӓ={Jyvv~+;˖-+~HOy3]v rGXv3q鯾ptv;0,V.FqV$a'ɕ.u!%¸p҄VeskOLLRn'i9NhװN_$H ux~Ķ&&mK# m,CDsܥڧ۰ a{oXd? OՑ:sDDyG(jGN&0}=6AekݼystwDN~4&a{c PA8a3 0|5LA  ko# +e]|B&|OQM];$q7ADAxa!}Xi݅A;G9abz"]0B;Pwj58T9\ȺW_}5BpЕѺvζښ8A;1y`1za;쟶.hĭ9F2)%{KwSmԆΔ7q҃cK˝;%Mfp4l Ǩ&%p G G`ަUŊ(fHhH%1 Cت%VD!&:24cq|N&(<F]d.8ș #&/Pp,akq#;Oɢ<&ݶA\];9Nb%NrKLS- Gפkmm$7_Hձkg[ܶaS:sS%"W\"9l?6# 7d!-5=5d%Ik`La@@FOyqM4ybӰ i$:+3ܒK+rˤL$G:g=dLG "/.j<0ˋ @dYDI*ń`naE5mL]l-kY4ީ v'(F[M'x'#1oL UܗxFf {q|:џ?|dɒ@{1,O{衇7أ]xoor ?Ju/x.~1 \!]tEC8ŜcH)!΃}U;Q.#> Nۑ*;7걌4yN#~#XʅgU+UP|wWF_ܱbX_Ov>'VHˊʨ\{A|hqՓ2H |P#飮7<#N{4}N {W[+wq׼ nlՏ>yk75N$\C-,3^mKل^cO*JyLѶ0mmæ6t1^Ŷ'INXj; ΃c>aQW֛ UT9y6Y&N8|&p`]hڮAU(}9.8:6,/σ/úr±k4k)yepNINTg8&$$EZPiLC>~tp7?rS3-};-:H"{YўVܱmr5ā7OmAT/x0_xY<1OezńԯIT-lUzrl[ QR]qBsmu<Ɖ@d0> qLnU Z*c]OjK{naS:(~i[p$pRТ>=OY.wj, sUe֥) ǎسکHom  DwCRw*˷ℏ!|\uҶzЫu`6O0mmæ6t0$]4+ir$Ul'}Nst㸕QW^BDSǸJla[b.V82eyإ!<otlʒ̫:1hw?JkӥO43]rUŵ_-e+n#۳@S'LYFa<$^S.*28i$vi ünk{jgLwd8I=I]X>NBH_S_(m Z{i&_\LL/tWmj{lkk6S0a#z/ BRd;yǼ,EM[桿%zn H]L"M_|VQg076ԭG;Q^bCaiL0e~s8ds,]c4C`'yGڋ~m{Loc@cQݩcC1(7#@=5FU,Cٍ?)+I$eS}r8= .3tcYG94w(ɧ xhY"I(Úx".'[N.gY !ȋ!t0Rb;.dH@nt(c'8)G& !D[-`/>'ȲG:?d 6ljCg AAwbue;q 1|>zq8HKrUNw <8_!aO=qC،r /vD3LruS;4~97g&z,j bǙlW9MFyAcDU^DU] s,x; H>)x/7eVt־%$j"%%YRLUȧ *(BXS źɖ\w[y@Gv@tɃ<,cq=u>ڞh'mIu//xc}!˯`rlmWpU0d]:?I6ljCn q<.R# [ytο7. i?z}ȉ1Anbs0^Ź/~ْJIrAXnsh:ua,j #=U9L;~ԑtM˹l5="L\$ٔqFɧ̺i/|+ޚߦKZ"m$T"aQt`cYu@<*$\D:L-m]XydIt;a0mmz*XR/A#ُumuޜ|` r;RDaS:Q/K9y>C_A_d[R>aZW"(NpY'5Q$Ge}0C;}@ۉȪ):A۫mP=m0mcvqn-W;k}15Uǐ[9Fy~Aj mUA|Ê(&x|j$錃4G[ro-W^y/~ͦkaJzzW ZCΊEI h}}黠&/6UκQ0Q)tNHR(`E&:( G: vPԩ/'UNsMGia($XZ <&/Ӥign-3J۴.oK0.y!vCFxaS:ڑcHQNx!s Lr1]R/9DT_X!ꄯ퉕|A0@qD,U*m^"a ۶ƀ.>Lruqٞ:05Uǐ/bwN:]Nl]&9mUA;QK\ $e/:I'KixQёE H '}Lkcyj'lMؔF!U xaA^-3J۴.oKt"]]ڰ uy FƜ$ܹڝL6 CDaO豌/.YĪ)"Zgx࠱[Sc fG]e\nQW0*|9c6ɱstuAjꪓGpN4Z$ >*gOyK~/t#^y냝~sǎX MmŅ0 '}Uhd?^QWD]),9}q9Ap뜾xu]Y>؀ AKqqݱrM4։'**熅>.r7GfUoKoUGO1ӆMmkG,_/xcoagAɋ>΋3ER.Y> ,`R=!>.aU\W9~v441mc Ksh:ƸnKDEث1:t{N:XoвXE[bE3 "!h/,D5ޔ2~;u#|˪&Vsq|P! |G!SÒ@RΠ['F/ڞCY^~BZ @bkǨ Mu"Ɖ> r[$Ʃ cW y6Jۤ:܄^b[#uxB_WnȺ=? 6ljC%';唣A$9{]q}+bLsuNE:sJ<,.bTa}V9cض1bvԥSe:17"6^ru:Le]mXE[wD H6qb`X 2-F>^\gEI:{aI0 _~$AvX`#]tONtG]E Wqq%qWHuNH:'ÃE=#.QN֍NV[{JUKE &ܨmKՄ^= Ws.G )enH֍rưE@̎aXI5-W>暐ȱ5)O8'[D,EXaJ-tDZ{N4Q# (ߚK2$ ϓSA& Q`j"WDI0%eZI`!.?W9Nqn^d/zrāUwZ5(TwWyЭO 8 X/bv89mai"5mmr`,7bRq|uc}آɥ.NdAMu7vqP.8.\ٗǎ bewnRVنMmLaKAW1?M# @^q}Q+jRvccVc#Yp~ ꡟ:Idz`0OOp} U0X/|L؃ԗ^X!ԃ\\bSK ݨ턮6ۚ amI,Mb-}yzE29+T^*7-ju縫kk6Nڜ1/rN, 닪\]DuJ[%69eJ_$I%R.c:v,ˢ]X T}.W_Gİed_Uڔ ءcG\kJzR"ͱ1Ha%%u썵'vMT1h6OGh_ _a}N4ψJ‰JeX D5N#?#χ2D4a%D^,</+ZcrϏ|VKIJ7ED1sC[7TduvQ.Yo})ò1?FFm'0imam9qn@ldiٶ6zNڒ1qWVֆMm褽Uџ8}Št¥|**W Dtоy s 뛛Ud)gގi)vl$maϺqXmcX:6\nkR~"0c'/}:b5Š} l 2Y (%#:|AI@WIJd"z]OҊ͐}*hgdE2P (ߖ˸"Di M=;U.&At u0NT=Uzda \ƣMamlhõնg0q9LtXݬ0!?kz Viw6Aw::o.t9{RF, c۰'^iY _۸Im^;v.4mKccڴOM⠯#l0gmr h,r}9.\nKq5<ʍX rN1/ohu7Zuu}@lZvȕoXLY ftOu?!Q)d{dy% ]QWS~|J>WrO OkBܥ1ӦMοbmٲ%{N97FdC)xR,YR'[ _0#p{ܱ[Tk'LDo~_W^y:n޼yO엘KF\so~nΝ/^p.9Nq׆Mm謁vZg?{{;P;1=A,G};餓ܜ9sCa_qN8a/7AtzlybPcq .tgϦmШBYc@MDa1c2+pMqꩧf{=tN.%T+%1'e"'e,zig|YqBX:!-%kMJ&:,[ܵ^;&RLig+RC0j0"Ze!`J[sS$ $jx1xH3Hy)[UO^[ф2OS&:uyħOAb !`3$ȗ,ȋC50_U^AYY #O;.Ҭ.Kl95#k,o+!`G!`YDR&,GrP^XM$SKvŶaY ݶm$̇G{v|#1 !`qqTC0 2"1_H$cZJC|)Ŋ06> FDK[0 C"`D4 %!`(Jo%iS2!ș\+Iy.mzI(_WH@cGN_/(ĦhY0 C#0}' %'|={vN:͙3g:7f@wD!OܰA=7ܫϿvyƈc'Z.>A&%a(17زeKM\paй}vo߾J;w;*buq@E0mAqo2†C [s<)N{ʕkͶ!Ї@ikn$tLIw<̍nKs>{)^i_,\V`_J*,:ظq[xqڰa[hۺuk}qӶzaw 7+V߿?JdmC87Dst"믿-_<&ji<#Aj׮]Ow|pF)1 ɀ@eE%$I# NJ =O/\~ȌG'`hwQ Y 7"Bҧ /;o/.8 ~|/,m[nqW\qEQG*EҺu5V\SH>Zʵ@XEr %'c>ή'uWD~]|(2,d>zA.CJ4,<d6JDaǪU%\4I>xQ[MveL#Vw&5VckX"erDQ<]'|hgxA8)tUх]{#$_nnƒ'/Ma9d98腓吶v!ܥݻw'gwg2k֬q谂r| \M!ۼyst;:Im۶%\ME6mTvN9ToL7V(/VckX"erDXyUČ@\Duښ{u]tVGY+Kҏ|ۊ(1&# W;s0Dn;܂ JjjcE %-b Vw6)VckX"erDXy8Rd2'c:k}Dt'',|3l29_סeP&|E9rx\}=s܏~hmxќ6DDC`#|̀؅^^f}Ͻr)ypm2  =E;pwK,z?|~;rvoM:&r>`gu?\j;nH޴K/;it㚎׫KHۙ~Nוcy)=OMwK7&a߻wo)q9={=uY[qۺo q#dSyH'/}~;w8V'sE_`V.~LfcWrՖ<*DV𫭥p.AaitGW}1wq&7 xqs0%,/}OFx;_߈mT_|q:#I?\Ցcg^hs{`??zQ cN5,G1skocX!0MP09%1BJZ佱DDt"_QI8OBq3X1yLl(i"`]9,oDTaaC`4%X~J#qC:rۤ>MWh'm/J\y8GdRdKcwyguyQ}w}wkY6~KU_L-!0;VQPӂ`z">OL.=Q΂_ 2tI:O#',|0 )ɨ8|ͦF`I6ɘ:bjD6V0D1g4IDj&~g>%EW\YjUr1״>MR66#@yO2ˣNجneWe$Zw]\ߨzSaنۥYziu8Z!0q߼7wxЬ\a#^7#lue(2=( eE=Ius=wpkr]=hrvhI,oψFa~OOY(ȗ V??v<}[5^thm~_EI%tSٖnL }FdzO=X&k׺>#W׾R-=CJikN=T=b祦.\gc+O޲-'L a<=Q0Ço1E^n}[rz׻ ŋ)Β@F/,s|FT_+j,RS|p'?B469sb} m7c!0i+gCVC *}xFWA*)|Vwlυ&=G}jr>!Pq5a[ms3a4y*W( ;)J0Rwe`Ӡ?3;îr*juxYG5q.6WT\QW҉QVl|ՖӓQL e 1,crlkz%V7RMt4C`<ocpHåVo鼫XR._*ƓG2+/_cPum.Vm#]tTvيh.˙9 s7Ȼӽ7?ο\_[~=_T-S'qY-d3C`J!0슨w8Fvs=,9_4B:@ɷs7FkPFD1_錕JÎ["At;p>餓H)8j_\ ='JA9}7Q]2"8!PQM SðKziAf˿^Xn{{[hf};_~=ݳ/,AId̏ي|h?-7"*LE`IXɘi9~Ֆ\v&{kحuͺ~}sZTGM"?w%Ȇ=:J$9jZ_05$|i&wQGQĬϳslG(^{=S3. >ÖdIct;%e~Э[.bU~AcҤVT9=&ms̾T,(gDqPq~̰BvVw-&4}QF'ncwW2-q+v{dK2#WRL)4%dHbZ g# yڮd_d"0 @DT?)u}! }n}QlZUDT׋r8puz/H{n絊d#/ꅖxP?'u}%u7-jduX~7bt;rnmx|].vsMN9}mwfL&J "~$a}e/Y3EHݶ#_dtۺqij*䓲,%1a#iؚ-00m1^J±cqRɾJOBTm]iy36(Xq/rH9H \RG }Jr8WiN&8/8Kp՟Gt;rnmXj rlGa@}m7j!0~G4㭹8t±'A<&Lv]oJ+)gﭹ$p0O"WB7":6^ 3 69. }߶m[\l:/DmET#dqC 6(MyǺ^Y%oZ$H2z%6|0yΔl#]%N " Rɥ |2>$$C~Rk>W"X-g,UqMIBeXQIHg6t͞@`Iv8vQ.pΨrnp N`s9m4C`&!& <WfUh>_ir%Cxf֘X)M;gvYd@FD۠LrlaF9f0:StC`!VDA&5$>.I<#M3N8|I_OE[seݦ؏y `ijɕPFD6{@` SNƱګW7qcU.F`e.[e[n~ 3 6~Q}~7@&$oZmujr^x,:?!u;)Ctʥҵ @IDATr9CN Ɇ@3E{//$aシ/1φdJ"J*Bx#]~ QI"JJRI88NkLzΝa  zKh|u&'~¶Y`. CiU=|rMJ*EJ״>ڡjrQl9eb;mg|9T۠La]z̩O׶4ߩv[!0(VDA,VEK˖fbUxAn_׹˯~;q7;YVږ#MPL)|#m=s'o:&,g J=_ۃ2HK9@?Ѫc[qh#2.5uk#'zI6h< Ay1V'aV BDv6ez tvH Mw&K7&Ŋ&:.WDIJ#/FLeh-un۝GU-ۋ۷yuLPO`om\ xq\ aN铐Ja#mؚ=&n7$.vQk~&rL]F^X0 yq?[Fuv6 V]_*†TD`X" 7 ;xҏheOe9.ӏ\jZڕCD mpsH #qα"dcFmc| ϡ1sR'lżv9al>}ϱ'coPMY ~7k,a<:c~72sN/q_~i#}]BږAg98~v nONŹ*u>0Σ[n ?]83v.E9ٺ9!ʆT^'xv˭ҏ o54RRa :[RSpszꑶ>Q6)R^=1] jDT#fDQUy}M}z u$b"** :,h"vT]̳իy8N6sZU{o?ZH;/g4~W;wn)-iudb.ݎ"7tSD~׿"U5ngCˉ@L W!׿苋 vv^xrm綛عmؾ{/wH>0V\\Ƕ[t6];܎r 3~17[s钀mce̟JK??籕y2]qaPƕT3dX~vWbydE`حRY |[J KVn'r]S6̪ hF>gU܈2鲌C_&Khn'Jmg;b>v_U'XmRodC l+T->! Yݭ\e:DQ;m{ݦ-Ν޽4ou;_5P_e_y=FTB 5WeAC` !;X%}W >p.,` " +w>l8fuꩧVnOB;'^rut|:c-t>;B=Аu1lfϞ-E+ O8JE,qgH:4L?4/θz(ߩˤuB7klkn`!`(F%JE C0)Q.Qf<!YCzcIQ=2(+edyѶ2-zrz4˖S3b6"!`x!`!@AD!ibr) D ~[\mup:,ʠ0nI.CB(cD4b C0 JVc!`=J[sFbH?ɜ${LKɓ"UuH=2XFG;ۈh a!`QFaDC0 @z)T2!ș\+Iy.mzI(Oȸ)Oʸ^W!s%6UވD†!`@#q\,0 C@;'nc[XQNȗUuJbXEJ)WW/RVaI}ؾ#*Ѳ!`!GhK5 C(#Pښ"i(BgRb;.퓶2*N]q[-!`!Dh0 Cڳgw`&d߼ۓ龳WR:2%x 0>*+=ҢNҵ+3f̀Uݼ4cO}gdž HrC0 C0 C0 ?X{ֲںi݊-bH&=nM^AԮ*;zW;E 6vz`]Hٌ"+t{|lmذ!`!`!`#hXA -$ebZHjUb#/V\/vJ?%tu6k<*5g!`hlk~k!`gD)MŸIF8=2 2T<ꢏ Y^g~CztyG}Jdr-kD4!`e!`@Q4`)_ʓebRUâ.%|)w5mKEl0l+D|C0 C 46c!0@^CE2I?I.F Ǫ#gg k\gL,12Qd!`!Fh1 CC $a$mc"eK/-^䄺< JgI[$r$= Yl-酮'xOvg.9-V0 C`%oo?䓅'p?~oܸm߾=̙N:Bnژ9qlþ:t@xF 5䅰ʊt]^2]] ϸ/7n?q,<-9<*koiZ7Y2WDq= (y晑'6tZ0 C`J"KDAN;+Wt^{s 8Bv6Ncnr!l!PQM Sj4d9r["^t?ZY*X;3-էAiÇݒ\ v2S r߰a[h!oCPX!C0 I@.}qW}׻˗8nf4M&y e:2F5ʹH?V!NA֓i܎i!`TD`X"z7/<43pׯO?ݭ[nJ@Ƽ؆)f Fj":\ 0JC`(5Dr!,VcJ#NofTܢ%g>ټm+򖝎+B0dMR CR午Ja`eDK1 C`&#KDl?*SLjhK.v QBq̍5&wDaL>q[E9?K:KwD[.?|[0cyݦYGEG/"T2%Kn^PܥS"65=sJiF!`$%Us$x$u*6 k:er'fF5!=uoro=(=u[`Li.y2.1-{z\&HklUђ#BᘏҥpG|IJ6(}NjITT\NDUIOdlU6tx0zMv:7!0h9`I%6s-791/6vlcmrmcA1vo#'શJs׮ 7w#v?TJ_̇N: [s׮]>l+|sK.ux" >+_usr]֞yU' uLB7HɗWцNnw'> ]=y{駣AODpT?uHK//|]|L!0ݚ6^}]=//l?=ƒ:2ע&66t`n;t1ߦyعv1G7  *(dat".WGuؖ{e|ʫrԇ櫝ϼbunXocL㪧*(WI箈kJ?Od[gږ3tl]@s6;cU,h[l!zc+ymM=uN)VDq|hR;s!`LGYs0s-oric^lC'qo>u=e!0=ZM/Rラ!u:ooJxy)_[U{Sps|ui*}-㐅N|/1k}GѨ#3<3$u7RoD动VI{l:.^'6t*]'oOj޴i;ꨣԊ|=ywguVQNV^;o?Vr\r!`SAVDm>=Μ9y v'M̷6S&oL-J+ )H8NH׎νϸ&WM >"CJSA`Cm"Mεz9eۘ [cnض1\!K3]"$G $ a@52]CyIwW;XA]?g7^-./JltY~"*?, [YX9[}ʦ6(ˑ*^:YWm+9Ĉlen&|[VX0 xќs{M9y &ڮŜ>e|a͵,lL!< .}ǃU~2o<ٹFh.ϵD'/8k϶^Pzŧ[K_""s^V}!QI9F tBtODKu~:QASma  be+sE˥E C&ZԜ]m̋m脭pMn_C`:# ]UNBNbw(?# M_-WT~U ~U"|-Y6X@5jծQP'1]F% .}# 1}c)\w QvbQ#MB'?"ކ&o}iaoN;27p[bEw1 @+M͵9ژtۘomE/39PRp+f*zM7+{{ݻ7unLO>*hXʕQ"U];wuf\9+#Ξc0C7֒2aj[XҩЦQڮW7sLXp֜!`@WDkaistN빳Z9C`z#@(q26zt{>ӥO43]{l{e^Y&[u_v$tm RE#"$$3 " BBuՎXVZUe Jgmua;WebD4G7 C`"6s0s-zoag:noNl0]"J)$$x{ʰ&Tgs :7ܻ1h uVxF**VAI0(v eZ}WKD /x;xεED#zfrt7o\Tt6|C0*mѦM9详Ŷt66ۦyGf!0(}GԯU? |fy%by}/.cY͹_B'c6݊?8VOW,uӫ{,\mK{! Wf|Ge o?>*3 /v \ψֵ8 i6ڮwXݱD4`*eu'LwGJ1 !0#hQεƜkK:hnǨn70V jrk.}V7 (gUxϞ:w.m?-+Xܳr5ԇoYv\ +X%q)WBe+q:\\ aCÖW?B?g"sRoc'ewiv7뻾9 ++_lE@ >tN:ↀ!`L^Fzt6朦Eن6Goc:mŨ0gL'}L&$O|c>Io+mˋί^Y"/s"ؖtKb(D~\ _[WwAF!O0+dsz"vd)xN^Դ6L'X[\궳 ˾ !0":\ Lۘs0ڶ|v ^CY NnEWUa t:NYtvtO!/#l}u{֟Yz;-9EsϹ['3pׯ[b夠'XYoe]o-2ߓ^w%ȤF˭Z`mۖ}yWN/3ODˇ1!0`Թ:sژFۡn^Lʥ:6צtC`#v(7D0C!|PU#~}-c)Nr*$(픾qrH[恐~8 ڵkg-R_o%vsέ/%*{m(2Nڡ=UQ3^EFі-[?͊~袋iV&F l߾QI/J~~rK.s2_#5OΫ 71lxk,Y&r7- oүKnC'6vYl3HV-ODCz@D:%ω3 C`"0[s%v̵Ƽ؆Nd۩~͵D|C`z P Gl[d bHA9[dk qt:whw 'dPRg}ֽ+`өbYMlF<#3,0&،7zB=Аu1dcaC0*"1v6眦E&uvi 2\+!0u(E4bHt9c._'CZ^#vP'I2BɏcnP['KBC0A`"h;-2m `mNC`j!PJX)g@IdYJ) G{{s#iiMf>UJ Qm}_XvC0FDX5hͷ i @X ڛ"ȓ$qI]E*=?b7V[J @,{,U!(`;Q"=|n?>m?o޼}/il C,6 C`8t(etEk!0~t(V6+gc|: H#+zFI+}YFYɼTe]^(m6b2Q4[n]q>OTƄ C03":sGͷ30D$-Ge눤꒤P H[$aUdX2duR|K}0a;9F<!`(*@fPTC3$_GW+$k a,)Uuu02-zrz4˖S3b6"$r֭ss7sϕϪ . |菊I30 II=gmrC`!P:BȖkbr) D/ j{C6[GÇ?Km;FQ C0 8FDX!`@Ye-gyt!G:͇߰,}^:3n(7V eB],uO R[/y$҂}|hW/Ń!ܕl;!`!`!` ,A~Anu2 ,DYTv_!2ayWNz5v㴯2(um. (2]mL,o#|oذΈh!`!`!04B i$y[_e XѪ:!(S_xLg}UC4atLwD5b7 C0X!`@?o%QW]N"%R#Gp٪=#: C0 FDSX!`D "MHd2e~>)f픾quk<]z,faC0 C`X0 C @" 4 HWG&AFATO+/>OyVke>ttmEo!`0"r C0(VDE"{a> Y^gUmec2EZMmBVdZֈʂ!`@# `,0 C@֊( K2N/I21Y)reu>#~Gi3lKE\&pr":poYC0 j?OxcQbʕM7vsO;́Tz4.d.ba޽FFŋ4}{nXVnx*!@KDA+Xa@52=(߿}oC} [Q4DBqB.snD!` #o|}ӟ.iKiD.\n:5kָ:+\Dt:  QGU*m6w,2v;hD|X>nF]x!0~D$ ~lAX+ ;XD.rc6Xr${lgy4 a|KEZ!`<#3+EilEVO>7=Vt"P$!TؐX"a#$6 $;{;jݣ-w_}`X+gna(٫ ̇QŲ< 0C0 PΝ6K*xpҥYlW^;B dhT":]q) br""a~\ve?[dIU.C\Hҏi1 U<6>oʼGv t_/`E)땾e23 Έ(00 C 4iVn3xXHb /Qt%;;_t.xC=ގ7|3܈?] )>x$r);voZ`G?0bxXAƛ6.h(B>裏: }?,}66uX^uJ;]?蠃 E! "bgS[gnzdSJG\PNu;u:˖ny7:̴sgW~Ν|^}:3 C0FEOǝ *e'!V3ty̓"7θ@ w\'9OdJe^}pue"1 /)"]ڟ1{19R}^Iy)^]nBm+9.w7WڊLKm'n wUW㉀mG)L8c}Q+' (g*eWI(eb'tSat"-%1a#9,.C0/"y ?u!?Ƞni˝wޙ]DtR_+a"4d^W0DT֝ rɓn㚮=%eXc4twߝ ˥0c~DRg^ἒrS D.h %$Ѭ%=IyHI8e: fsPޱ(Ʉ|A>wuWKI. 3M$uq#9,.C0'V*] A/JB(v=H]љK{oil<3uEB7X0W?ETƋJ[2OKaaBH$2_? M A S+ʩe*6p4g'aETQFē>$$C~R[˫ےxM$Da#9$.C0'zٺYv0a!H.2ù[iàDtB|R^xqzܰ0ЯRSMDa/Nx(ohl?ui})LQ~؇nvrcE2vl%(,|e/Š($*If$4x <<{;_2 OQG1̕O4r4K≰يx I0 .9ItR+Ioʕ}6=Ia'GJ֣ <ޙڎ9D^M>! f.ujJb};r)"cQ:G:ޞ_ \/.ˋb3^^lPI:!8}7{Cy5uvȧ&:NJ?NϞt2MRR&g! "/"Fv(qrmzκrLå 7Bs7uDBsoh8-1"*z6&SDZ^2M9?fCSuC@#PXVbKb!F~+@$Kto]6(|'>&7Iad:q#zX0 C}H:x\m;jUUi`2U(PLU;UckT+"eҘ*!ILk.u@"ML5*LƠ`A;$&p{u}}徼eZk}ks":pP"O1nt(XѺ6N^G᫢&z bqiezXK]Ћm5 ?cOVtx[e}dA]?rht%WaC:)0fdN4!}ߞ#J,7 CHEࢋ.r۶m+q9w饗uYg|ŋKQ-c7xtM;(ɂR[g@^|17q;{7)pe~eO b38?K꺔e31ܘ~rֵ!`!@" ۻGcZܹsݎ; ɓ'XNT\bx8o&|ԝqVϔDM8X7X *noS?o6|rN|,#WvK,)LYB8 ͈h"h&6"dQFa0do$uG]'iXNVя2WwM9wΛu%iXCNovey[W>%Җ!` #):U2oʕ1]ʤ_GD'*.1߿ߝviEW*P>E~ᑢ+D#[lq+u\pAQ`"cMDC>t)(">tL2Ϣ $t!bq®eMrG[x.ݰ DWT% YBvC{#FD冀!`)sH*&Q*;}{ꪫ :":Qq) 4&XT7ELS.Du|$B>hy#@AD"jBt šZ^|-yP}nIþH2(B]$jz 7̭0 C`lpSL)X!*yW\6nlT"\GDDj؃/-njh+GjD4&9n4)q߳g;3 ~Kj:'ByRʆH"F!$`Y @N;:_u`=ƿn?+ޛ hL l\nV;n5Y[D471 C|H2ڔjCCCx [w.(GO>_)*#MDO\DnH#Zwh8wcM#āyz_p k)kZ/7tӦMc5|O qMn!Qk3F>;9[ge\9 D{?<@鹡wvxÇ/gB evߡ<ϟ*J2sCψX]6!`M)P6z:6r3h)&=fx~Eb*8b;z)kBDa0H'%ꐃ|T57Xfk8x ۫J{# ECiM(s|D$[GD<Ǵ Dӿ$e\ǎYٓ*I>#;V"z%|jAhN6%eA P0 C`")%BZXQ+_{2)D :41MI:]V*]n]וcNuD3$tN\ R&/g*">idے!08\#erBzsͥ#Cm40H*ۑ2ې3 Z%1e#cyYwm'lIDATX!`L<lJDbCۤwKDW#M&K X$}Įi+BGJtꫯ.jo*##pz~דLMD]Ì 7]- Dt4t&МRWה7> DC!_G>)PqWNK*(. )FD򲴱 CxMi]DLcMx,Q7"#Ubc}xť 3H"^}Qy4% >"r#Ү&kcSq\Ww]6_ `u o()%O:2lUlY! ]sre_ܥ墎r-5ԩmIvҤb\5DqSYFnw Bl!`ۻw{ݾ}.YgU{ͪ)]s%W/V쉂Ý!qn͙?ro~[8<;}Le֬Ynƌn)&T⎿wSNLupp]vede˖u+c@Q $ [l`I̴SVbChLv@YLw< @e(vH4I9ihGeqiޠ>u$'7H*s}RI,,"ʕ0 C#`D4!` #0ȑY(?vG7Ykĭ-!EA۬-2:HenFR6 $e_^On79 g2y9#Dž,nf*ςlfǗB~; C0 C0 C0C`xry•Mچ G2ϴIm@1 G# "z /7U:^[Ӟ'tX$hBr[Qa0 C0 C0 ~#*ɝ< "ʐˎŲ :#ǐeD#p {򛗳uESZ1ԷiЙ!`FN!@AD! jbI=DHB_i<5m!׉}YdQ C0 Nvbb-!`oV.t2T 2ɢ#UAY1})S*Ĕz2/ɉ e2r&#DrC0 C 86c!0@鮹U2#g2)"K$slmuA2H!Cq)_5TP1}#-+!`aqVC0 2爢+Q:G'mNy@X7$Urq9^l~jVۗ9T+!`FfC0 1 5I^4їUoNxrĽƐvC0 C`#XX0 C @fE%uI 4-+eXֲRwWn]ލ>u`eFDж~C0 C9#v!` ED!(aLQ3-딕&P?(# y(_S5!r # +!`aq駟.LwynE !`G:#FTlN\3L8*d[ѫrfĖg܋^u1u=y]zI'#(%tNR*s-#-7m?9T!`(";w=g-F;ݧ>)}ΝqE{ja˖-;NaNs\r>=ٓcǎO?ݝtIu*?ի3l9W_96'FDJ|;B~]Ma qDƒs=€-ED3 ͆}$n#7*E_?VOA,r /v_U|#}yHV}kKv-"B Cv᮹0iw]ّ9s.Vnݺu _B\u]BtŊnʕEB/6yp¤a_ . IBFD— HrG;J%C/K+Z!pܹsG0fq@xc=ʰ9'Mrk[CVg_wݘq,T>N*Y%!0̘1۷@6mrǣzW^y[vm_w|+_qnnT{UW]Uҹ[ݲeJmM*ؼ+ƍS>c6׈h5: Ĉh5;~ؽ{={vpB 'IQ4Θu)O}:zPIeΟ.t ?qst,}ӽ-k7J%Ҁ A)P1"Κ C%."m۶uDp{w]g_FB$6omذtM4S)DVD͛ZeՋMDaZwgDž=[/}KQ R#FD%je9$LED;qEDZED4I95:Q6kIWqOq[ r9p)wwF`achO.uY\sD5LV7 C`T-lVpH?63B{MDCY-w#I-6N,8KYDT C=@pÜc o$>#GNb˶ e%ns]w6>"˲?Tզp_CCm[oU"Q(`c cM!0hQD6}*XNL R`'$QC.3cnpGv>G,:({׸q*w4:Ucf~v=Lf.47"ZdC0 ;E&ݏv~.PF!sA뺖ñ /놈jw]dIî]<\4!-"z~e9|Bd̙Ql,q%X#&Ip͛|KO|%RHݪG}!|ꩧf?|/@:7(F~N>7׫<;søX'*?$ݴJC H _Tڿz$f3Q|bv7 /pg?YP©p wu;}7ϵAB9u֭gɺz*쮻!I_Ԗ`i?[=嬇mko 7?uȑ׷oӪE֖<;m>oY?sȢ~֙K7 u闿e ) d_˗_~yے-OI\?2d_:(OH sBa q?K 3LgǻKq]wX#W c1:k ޘ|ɵB_v=k{SUkʟJ)peȼkUp$$>\r''ed]0!ۺo0qXzu#=rx)^h]l둔"7"gWc@6r3 \6Pl]Wtf,|J[>`~GT: &@֥&DTlQ#zsĶf5/-uH٪_MKa/:*&CI9uytX#zbךY{]+ȥG1b[a510$yĂ*?(hDE;hN<5v#{h;:ЖaO,ALw,AGGQ)u%uFf(* l@郟HzCICDI%sͱXK鿾& vȲRHI[ȱFO1s}/(p!+1LO> tZ ._{x_K-h%)Ppv<mɧQ.QP,"[F::"qA!p" ɪ"K ^Yё ڗ)/hؤmic:hhQؖ_D"iؑcqMȤO]86nh:΍|̥]m4k$0+"ZN^a Qn2FRg$Z]m~aCt4WRLP//I)ѣZ,-G<.o-_TALj=C#%R*C\NYF_DTGBY7"z]6#C_;Mˈ؄6r9&8Z#_[|fI/u&m3GsB&IC}{!||XH^{M8/7PIRV%~)~_uIkW붬u^6ckצ~Zk<4nz>/nLެHRPRMH% ۑcp;:#Glھvͪ2I77zph4D3 !$FD5o C`b# &U cHV, 9tW( JG@Y(+7%~/5%ڦ ؃&|ֿW~ 6t:)H?`_B_[ЦB(h休{26FԄVݘcқۺ;QEL{3b65uI7ReK`WZhCd4CĐIoݔ >~9V%}&u)@caCME KټV\r-SU_2i?&\ʲuR|ɹ1L):BOڌeS_Q'okи/sRX[#PDDA,$\"^poI!_j ok-lm h$ ۏ|TH8C9>\I>Mi~ݎCC裝M6.O'\e=&G&7~!"GYD^  x@zsLl(R=7LO ,k_:1:BUڌeS_Q'okи ]i'f[$>MN~}]P.okh]p% -n=hI"*$2P=1/~!`8 z&I^FjݢꍔhuDQo(sM5Z"8Snǂ}ԤcQ=^_3X{} M nƒkDڌԏ:umM$i]~/IV" $JYU>2\`kY"ydYwsk.?J%2d3T&D_FFZ< <1 C $6 ^$ RIHlL|FJ{甤HK!:⑂Hܦ*z%CzCunC9%C7֍RIc5oz]ֲڏﷵxhF&זɎED3Ь=hPfolk]/ ͭoQ&DJ_R$um[$TPIHe=DFFJRJbjGs Chޯ%CYG`T~ZsB[]Xb"N ۼcUĤ"wڮބD:7m^6S 7cjB67UQcx'_eZJ?žɌ,lVQJ!cZSY@kѝGď>uEovz7+FDR֑?IJIlqh }S7)w3Vzc0~Ϭ{bqS_눥)EZM5߿V_}m"_xA.?O>%$i7e1#ڹG,m]k"no]U~SO]&VTOQּ1 aB_ g~ 7Utlx/m ҫ7BRVc?䡍W)f/+_D("Bč#D5XTGLcc`,-۱$Dž+L17v9RݔBDaGjM("$}لK`=%b̦GњDnݤne%&ƃjk mn`Jܱ뒯IbmI&+OV۠/NjWю~e?CO &;en{W|h'y_垚Z>gM'/QnC0 ^Xz[dIc+Vp+W=Ns_WeSOe=xe˖W^y[vmFם}I:կ2/RQN>Jvz6nȪMuQGAc~U.m۶- ٤ ܂iӦQ=Ϙ1۷/FGˮќڿ{Wb4r/f5(Fy]T忈pw}w!{]7unمݺk|?#t]vYEJ݂țqDDI44QRe^9>j*oJ{mKCQٶuzDž."uQΎȧs.d((sF@we]o C# ?to&2|]uB97l#+[k9"  ҬY'O{dyfғpwu-m/KDvkr]ݮu?굉h~Pf N@>Lx%#q)_5焻1}#-+!`a!aKj!p"#FlN܆R<:D^E%1"}lx(,I/b%!`Z C0:(͍4IBN-Ml,^_YEm_h'0 CBh:g!@J%$IېkY)ò&R%Yvh*ԑbzA?ȍvC0 C`#XX0 C @Ew& Mk}ʰ9dꗲHoL6/цDL1LjDʆ!`@#a\0 C@oDH R y G5l+ br6H,iO$22Nr,|pFTeeC0 C *f!(" BбčuFE g >b>S^UZuLu C0 8FDX!`02Tk%IENDB`readxl/vignettes/img/type-me-text.png0000644000176200001440000017542313406366260017407 0ustar liggesusersPNG  IHDR^~Se- iCCPICC ProfileHTSIBB D@JM^" l$@(1${YTp-`EWE\ bae],P& ~|y;wg2 , U + a&$&1I=$́=-xGFhۻ0UKIWSpElH);1pM@  f $ Hp$"ckiLL/d?TK$?3( [9<>䝐=,ngAVB6M.OrdX6x"Ak9۲ģ}BMEI mP CH#?%< <4^wA#l/3_(d8(C=¶,-Gy1#"5gY \hL*/ 2\ixN%Yr(3:tt8JTa@,S b}CM Q LcGapuD-dEc۹YQyGv&a+$R{'ȍiq|`1,)`~KVX@XxF[Kk @4GZye+{ZTimE&x9=p7< >`ŝqvL^D?b1h6 Ug" o.D t :  ݄ X @X62!pԁFpAµ ^ !BBh@t#E CD$IC,Cb مT""'3E }kTTFщ3ꍆ1t4 A@2zF_1YbΘ/%a[b%XV5*֍cq"NǙ%\Ax,sj ߏ-Uh-LH f %spDфf"18XCl"vI$ɂN HAiR,O%ےId>y)||E~JS3s͕[+GA\EbBqP2(K(j9=yyy}y)|Q IX_\eYGtn@{轪DU` "Cj*jjqjsNu301#X8¸4N{8Uu{>^K^^~]S_#ScF}M\\sl4ǫw_8;ZVg1YRf s@OK/HOK]oHD?V~}AFfC]Ɇ 9m6j5zolbo¸III=Sii53Y6s<ݼjhf90eBńTKo<*+UR: '&M\?uWk,=wmTlBl4ؼ5eۖ^-{eoaϵnˁ0aCG'GccSVΪΑΫ/\|\4|tutu=[gL&q']ߝ˽ۃӣSϓY멷wA>>B>}]}6a~~~*e6B fW8,i F> 35LF'L0^Q8?.DGli)SDD͏jGό>.'fmXXqlsbܴʸ~ $\NL%'& Nij4inL7>g3f85h2!9>@gV55e~lqݹܧũ6{|yeWA;2gFdΊϪ&g'g3-tf͙)s\s6 C{Eh>WuĦ=yyyf>:GyN\>e>=y%{x/صYyz.޿$sK/},~Yr勗?)an+vWV[eBN"뢒ϫ٫/lskR״u\}qݍ+?0yCFo7tľdffҰ-[m\^vܧfU[olzvv¸d7qw'{K^ͽE{ҩցUhഃW[VaŇ#G:>ftlqZvn@]z]w}b}牐 n m_^cIkOQN-?5|:`LڙG3M8{eJKs?zƋO\rTwrmC~?^{J}KGCS]]g]=-;o޸us[[ng~u' +/y?jO=~xыǢǟ{?=)yƾS/Sϭ/M_믶WWïWx /aG班?=ٗ_ g XB(zDxv8%5DvgO,I}^. Qb ߒw@ʈRleC0m& R pHYs%%IR$iTXtXML:com.adobe.xmp 606 382 iDOT(kV2@IDATx ]Uy.:"p (xAOۣ؍ݒ#>-[7"/@Ѳ-VS-P#KEV"B@n$;zo9ǜkεɿow9\m6,%=p%мߘ[<g\H6g}6ԝvکo>yX,k/1+C^@055͛#|V$_m5;Bi4ىskm-1clr¾6U/vg īlU ?䓰q o;{-Wmr?C^бŰWcſ{+#x7_2BnM_[OkyîIkR~-o=~m_>կ 'ֿ}?blXXF4'){Ra%EFRLٓFSZް){Rھ}_v=eO_ۗOkyèdvUϽxaRDOPm̮*ؗ[W@Q+kJO=wNm=?ռ0?0x<~+I'Xe/0[MUX??l^ TMV>QLr SZmcG/p3 Bn  ? :^&}&?ۉ:Wշ"B-Ok)Zk_ۯkm>]<ͯk}~mO?->:>EH<ꌏ22i~#E߶_u-_k5}~-֧_7}~O׵|ݯMRZk~ݏ◿.5j^84VJn?կ7MmSަi_۔^7&u!i0#u1~m}V_?կoJKM5z[})T)oZ>/^_-Z(#X'1Hr~[I~oi`˥S>H"OۓgHl|zr>'F'_1x& ʩҴ_uچim~z[ċ.];蠃rx:**z"5ilb4k+iQSt]){4}S}=}ZJ_S>]uMn_e]^k@@`Ja6AcIO{cs-Lg6%AЁ(^hH@4 M3.Ri?""TްsE*MGD䚚6}θH~.RNM ^ۧMk~]o*o>]o_zSyæzS_כ6OכTް}R^!bs?!R7 |mHO`Mx) xvuצֿy,.N`.@O40^v?tJM 9~.jHO:t3̱C@7u떰 vuΗ.=˂e䃤X۶//l]pr:x y9D@Pf@rȑl6\|y#9Zߛ'5F>?Wp\ ta͔$&l!B64x#H -nݟxņX6㯴gԝ6=o?ל=]ZKͤ>G& Im$+{mJ1K'j_ݔ^m%mk`oL`J0 m%mS1L[(s-UI]XuWrASSMSw-/O7ߔ^izSM֟W3xn7^aGMӔ^ꊕQTS*Z^Jo)֧]Swڰ~?|ǏT0HrqGO&4ޔ?Eu]~=>M57Oѧ~]_O~ͯMS~_5߼ysP@؇= R&>-_iT_[k4}_uͯO}>կ֧k>Mtއ9tYe׿!d oY']KkK|M_Z_J^[zm֧kz]?URk{>-_:#>40ھ~Mi}_ZG>-_֗ז^ۣi^5OյOu䵥h}Zuo޼p pqY:KOk{Rh})zݯKey,%;6o{u5n9,:?] ŗ*U6kJߔ|/Uo)֟OkymM5SZ^zS}Ma3R#.5SAP/M5צSZ^zS}M})T׶T_Szm_?կ嵭7ה^ۗOkymu͙:|㫀?AI~SѶ_kZmo/ƯY}Ut]5]+^PLKM)6lc)r.i8VVG?)b_^jL!EO[Um_XF^' c3~ZtaRʀn4&rPݘMySߴi0-أmDߥfb_Hx]p0Vq UobӖow݁/83ЃQdzTg6pcxUuBسj}xRācߞ]-Z#Ө? a.?/g]8rb&`ոjy`_)cV6n|:xpqkONw{Ѩ9nѯq^y5yCk[|"aowv68b$^psh2 o9J1sOw_{/I XC_Qf͉AW[TxЌh}JM\')SrcFc?W=]plwƧwG9@lk ='FkxluWn[*c0cy,iwGxAϑ'~ؽ!fcXn6=Ʃ߻m PtN*g,1$4/txCfOS=Iy2|˽OҌp?8F.cB_0 ,ܳW6βI>Y(Ǻ ߷}oq;m߾my1kɇIn9&h>vg +NMI^)^=MY^ҁ]SjĮu?\¹ȑ#'/Z^>+绋_gY95k7O6P2~?쟄 !/|^*ƗꟄ!窩7}tw Od_sg\tuSro! G=Z'=7>K+/n/-)j}Z~Δ<ݯktӺ֧}d\GOqٝ Kkw).o ǣMMi>=<R<ݯitӺ֧OR=}O2hZSK;ݔŐ ыxub't8_?Oo^J'B"2uon$ $q=^. /D^ܕgw:ԝ~eɿ#Zzwh+/e֗䵵Wo+/fFb`$^jL.AK<@jm< ?DkZOkz-Bt ˾ELwϺչ'wX[>.D}B6z>o|끈ݞ1և+|ٸmX{R^?濋G,8NJX"c8Ư kzNb xTq /[֮7/[֮k}>U wVw// ڹkzas+>|[qSLK iu/%)}Cs 4>M xWiKZ_J~SzNY<)4}ՉǗ?Dy#?;''>BcyMOӧZ_J~S~ݯ}>URҧ~-_>\j t5.: xH,m?v1lgSc>?u߸3?{ջeo;6Ϻ?۳ſuԻ5¤_Ϗ_ -5)A {.zb~- 5͟G}~m?E_`i:#iz x#ݩZ;(m܆׹_NϫoߪBL~hxs)D\ϧvu|mcׯ urX ES=DnRiJ?Z?lqW}e˝/k䃧7=ӎ_pr0ȑnmx_[7OSik^@4Onf))̎qsjdsh'sm:ǣxc|BK+ #O:ZBwRKY3Qnk%zj w+M;܍}J/OU_cBP1TABZO ok[vN >twꛏr;`O+m?-ifJmo?^Ԅx]+r^G7hom:4 _{<AGqPp;Hw(~BhPA8?/qs`DDY-{.8S9 ,~u+tҺX_c}Ut UkX:MnWXzˌܙ뎈7Kw>űUZ?!ԕ&g&Wm#p=Ow;gſ﬙>>dMc ?9A* ֛: 1"*Ϟ?0{Ax%>XNM=v}?Oo6"7կizݯZOSR5.Y|_܇7;%I+a˚YG5}__׵>ݟk~MizݯZ^.=aˀ ! E#ȿ9O>C9LǜV:W !{Խ[q E3CO=Ws?pYW/VƓfp߻ ͜ǝ=3l|[.5׸.z+ 'yd7v_/k_ӘGH Y,#GB|i4-AWM&wqZxM=~;C_tٗܡϝ?Z۫-MG˿-{󑚯Ta>;*uedӧwj x=~ʙ[}[-a۶mACqwz{x:(@O>6|5k˿VHÍh.Џ4O{rNR67|#5+mW\c.Jȷז?oMֵJypg/vo >=X[1v{.ro{Lh[ymY[$' vnM-}6`cc ͿԘ'Y[Oc%\] k}m/hIGLߺu^)U26/ys}sGG*#(/zPl5xR~\zJԟ83~_Kyߴw'.EhIeu  /+AOcA;q$Dv|sm|{;?}g9q_piE8'x,į/ 7c UvѡDuˀ*K:p*ezWmMǮ?(~z{^?c.v/u} F=W>ClĔX8{o̘ᵍz>F/Q3>}r/R/X`>U+G\SώըlmgXc:=񚄓.:tEq,q l;a.JN.gIY?:5mmdXF>㏆葝xU.^qtCkPy`\py/Ky`<mF*AW\`q)^Du^Ծa{ZTo xٷ?4v}æxa|m߰M6ǫ{<1?7#aX5N_81Dz4cA$/?ٳ-4 ^+T i6'?M)JMw1^Ը _UcGL_TSz+Vn,t̃C-͹o ꀮ؆:K8i޵<%Pm-6kyZזk{Tm}1y=Od?M޺Ƕ:I wRch-kyZזk{Tm}]u:!~y=I]2͗u1B~ X=4-~M`ϟHjih # f9f%#m#&G>~0N&t!U/ZIH@ezJ~?%__ZRj>[?1A)x1Hnw?4-yI)R)?mJA@YȑzL'U aiSRw ʲcbN8j%pQ$% &x?ɿj{D_kZ[zi"GsM赇^FGMW{-?%)=j?֎? :pbAW1Ake<7~_BP$݉V.>QG&=1Z^_BYg@"z=POX?؉*mOy{b~-ZO~-QkxtigLj OGB$r$=%%d7 XF^'בц&?o#pamor~00>oyPok>&PO%%H\kGRB:A@W[d/^]-0[ʊ!M7jޘ Um)y*2l8Ԉe??L~_IG5k%7ϸ^]-PڞQ˳@?UYF>W?9sumSUɌk.,q^Iҟ\H6'0!p' <, g iK)E%R4l^^yWQk^8Q^(ZGkKi}5t]Z_[z-Ou)ZkyZk}hl/Kh:u-_h{kyZk}M<]uז^t]kʯ麖Z֧Z_S~-O׵|ݯ>]ky~-=1~%OꀮJS4kˀԨ'BO}~-_׵=)?EZ֧뺍?Ow-zxN|]ڞZg깎I)}kyZ8=^~Qp.o570.-yH- 6г=EפMiy6~?\k8 dm1eHm-_/'}keX/xj '^KMk`Ed9ٿ9om'g3~ bKo)L~Vkm c4OUﯶl/^י=w]jXYJߩ?fw]Ē״_oFTmCJ6aOOT250o{>Kohv(v0y<005Ɠcy<0<0oǎī5V]'Ϝñ(V+P.t.yPF vXrMTi=?x+^1lU&<`0tƯy۷oxh(A蓠u2IYY;0T2]W4{2zzLmtzA{1̈ x͈My<_=%sOéV((P'V}2ŀ )2~ITh < xIOY<03`2537`ʀAAJѤM'-+ HH[$eCVi2[N&?˷l K恙m0 ƯpI!2_ůy+u2t<`#,Oos7Z~3=ekȎ6@`ʀW  ǜt!/N3O `(O=#ia\*oKz恙i5WR#1 %F 2~-窌EX6ev޹8}ʕ+G?"|o;?ܒ%KM-D ;r[0~½M>}OM .#"5E㏾OI}(3$OͱI>}* xNF Ii/C.7>O}ʡO&_Yڴi7n oƍ!?ܑGYV#q)'Б1U>@0p eOq2&pvt+=k_P.{rR#AkyIߎ;2ېo۶-::[n tmw_y';{Nmٲe }ۘ>= 2GoSM7~moF-k7VAl8crn/iN:nx' |hjLZz;_4N{v뽊=]؋rOw}QȵL 4h@L2ʈEׯa֋}!'(y_]eg8veI {'[ ̢AʧBg_`],AWn1pCmT<? tAm(l`C@,'䆓e[[oSO=UwYq5d+]I걲y=EރUu)2w1M_W]uUl(MS ӎ:9*KZo_TL_k铮*EE0AU@ˬ-R<d+Ope0j SO͊OXfm'X(ԊO_R/LmD9Wy㸧h~c{e˖&ۑx{?ccI%kұe;1=2b.ƿr)|-;)g,iҗ,Ә.kzKzT1ߎSr+Т̓/<%>" r*Yf[Y>C >brX98u@ ]Hx$eZb!WX48 z5 ꃌ)&m=3{Gp };2@b b v,Nb˘=&NϼLnvb>Xpo`Xz)Ocmt`ʀW\UK1UP8"*'" @,TeUW(cP߆v.pu0VXS>@OT:x)v_C, 2k3WJΤ)^h%,}cDY,z.bLv~8mRβHzl1`cW!L 0:ix+%A6g']t)YIt%pڿثS\{F|ƹ5L%7->I' # IOeI2}en \)yr}Ož140%?I۴ުX>M_v#uʃY'i[5ǺK% cS˝ a=*u&,s?u?뷳\$C9b]S.-13o3.a/}> I8rKU1>'4tcјWISDƧOP'݃SD|HÇ2\/diWg:c :k;1=6ͣ?qX;,gWR#bN%s+̜:ӱ`ˀ$ QdeM.@%/RI%%M=U7{H&`X*A3 B0>4^kur{qRfO>:0~XuH F02E0~1E0EzSY-ݶY\^$lXKMXM&)muR*ԑa4.s !8K0l;C?!c}2! !^%QQةA%)Vg!_(s =2iuRGƯܥ*ЅMpTpUF r L\^xK%ؒe/二Dx]'̫䲌J: X)o \U꼱"fʽajެc뼙kuR%wTvjq2c%<}+d^굪)WMZD\mt`*>( o| b1ED>G ƺ ddM0 x O?u.Y* d#(˿uV< \U|zNžJƄ},T:50Nk $Nإڪ˱Zn[Vc}Wv0UuM.Oӧ^2zEE)""bv(MT2}AWoOxؼeOKOlh?&s3{@S X:c]z+%sTcO{TO!K?}TkTv։c)g+U͂rQ}zS,-ͼ/ t K_KhۺyԺu릞Ԇ 6o0/1u'Ξпa:O!y1č`)B[A  aқpg2a^d P`.Qbb2< \)9㾧ba?"6XC2S-SȖ2P1vfC}TkXvb4c)B&B YtOĒk+kcCHõ(Vmcb=FKK~#ݵǝ};;<,A9u-7#so\W\{nŊU$σ(N;5k\マ{'ß&ӝuYY﮻lŋdO c*@K|^W$%BODru}kUGFJ `x_~x_b4JҎ\/崱r1=Oz^o|Q't{졛 sمO Ja`h@"Ip2ϯieW5VyX#H)X@[n u5zP u^$ heUi/SN9Ev;)m_ٴi[pa_bp_~y ATb `f\ taZf $+nwy24tS/8Юva'lEjb>IunMoJ0'}BۅOW8CT7os]}ˋ{nh\_yuETR4!M 4ZX qA/!_޷<8O%}OdH1IV6 7=/%-/eeM17tS[< .v8^oՋUXNnc+)ehr/.)ەOSz` Pv-@z|5\ U읦&NIϮv_媙]5x@ 04KKBdнvZAe]±sZvqțoQYzUC5=eÌ<`0~e+hRcNG@[M'æz*FJir$ڝ pK%? x Y<0C`25C`j恁=iBc^48Ѣ-6}k#)/1yi>ډ6^ev7M@7`>"DTRz]y bH: Cz vzW鐬GA?ۙCYVKD=2aKʹ}4V9ڞ}OeϾd0y)HJQJM="` 'n)~ܟ@k_u"t6hI5A{1y` p'@8^FGFpǼ@>Ѣ96ɇ6{j<0.5ߦ<`_/-A@*#/gV=`FP?ڑKh|h%WE(Knx;f \fnLy<0/`*,a?r$_'yQ1M6?Cy`'r$(d}K恙n04Wv%K8I`{Юie{h\O`\ҡ\Ưd]9롱%x8̚#:Tx+zH.A蓠u2HIp~GB.EiWRmte;otv%=hexˀߴ{+{*DevyN `lL\O2 ҘKY&ɾ2x] xð>DIH~^=٫y`&=ek>x+^)u6K E mG4R'dVϗq[y``25rכBy=^)G!NN82aKknOu??܃s6lp[}38hȗ&U0΅zvj̒N]fQxˀ(m:.=/ ʔi E>9h{p}ݻns^y%4h쿰O^.|Ǭl0pv[ 7I@ƯܥFy! \1Mw~[QYp;;dr+Ƽ'_}ހW<0:0pgy3a+WtGw1n:<IBȑD X/-+f \?N; [j;묳<{*|:(R=cw ޶8vvܱ>?w|ƭ8d :)WN,A/sgn xu{:^ҤR`]j,%F` HJW.{>-?bJݗI\|89 9{>Y ( dv%eE yˀW7g_@_ћ5P!(B J4aYJ{%wogOtDmFڭgB#h~^gYy``xmڴ}t~[p۸qcȏ;8wG&G$XoێAe˖<[Ο~y 'tfƅ|r׾6c/nLܧ>)'NJ>lv7K^f#‰%P JdNZO#gch{ޫWSֽtxx &#Ѿ2̓6&^恙We;;?Fp7 yhѢ\-Y$[fO>dLk_˜ woxèL4w}裏ۯ'ֱuV뮻_sʻn>~``*{|“c$/0xH;&̀%ɿ_qg\UUx1uNkY $fP޲y`f Wvozӛ2y(.{=^%,섎/R|Iz_NH d%= ">~{Eϯ}7; Ř.Mez^kV7 \)~ֽ  D\qxGƏ| }wyg G䮼LD'l8/ 8:eӠGˬ/ c'Tm c恹Ư P2gH:%CZy/=9OY.F.Nen]O}PBy6Y<@[z7qySdl0  \)= pt7&< Hu=C=T]wݕ$חE6w]w]֬y3FQؾ}e]DKy\Μz! HAxZFCG%wg5uZ<0K=/ui I?Ɲyqte+ܟx\:hˡQH!AO zs}IDȰIHoY<03`^gKfÉ~,_x|p}'ngbeus_ٓ67S({rCi~f]_ug]z}.٭:Pv0b=/>vUoFb>i$}X L].& R#dc<0W</ ͟_(?O@oyWZ_ #QSzdVDr)37%=fex xCԽǫjDx-=.'&i۫Yy`{+w #Ym鷡k.u_srnokc#dG_Ċy uɀ=ay`xaL+W ?X2 T@%JA\wDZY2z` '^hjJ$ C5?i՟p]ՁǜjWF/i xiX<0z0p,7kk-=TU>84ho*k֭X"%"b01>k3%0~½M>ɟ㑎!yKy gOxxP]h+9bh|ePyWɧQ4:.'^X t>P#z$N wygI^,iWvT@(\.P?~-y딗n[㣭2CGG؉cy`(밂y`{։ ::I01ZIC>'r$(d}K恙נkfoMԩ[;mlv}! 恜/ Xr"Lxu"lm 0t(k:Y<(#;}zh,y{{oxx̚/~_я~}c̰GHdy Ưs@e }\&6 ЏHU@(屓i @ߎ:RF߫f9Foy$xky`=ek.,XN|ϩ/N@KGl,|! % RM$\>l2n4 cs \):(ɪUYg!~d=6=6aaؐٸFYJ؄HOpuxT}:D{"^zr׻LzY|;>s+Ś /ALzek0Wb-i0p5^]v;ӂ?a(e/s?qim2؅C5Mٰ9(+^؀&fqaׂ܋-^۶au r?'=Po@9 @_f?ˤ?N$ CfnNbP`Juֹ;'2xu\>Jqͭh'SWN82Юy6?x_B\q /{s+{>o<ӭ:~GU=X@%x= X.ZZx-[MBӠC栶L:_/'uM_Ҁ`,.",_hqoot٣xsn퍗<-c[Y{oo-\0q<26ko 뚏x^kym2tv1v-a6{X횋&_wL|G/GYm۶mj^{(iPmݺ5׎nc}C7O䓧N8~˖-gy& e͛{7o|ey ߘ_z@oy'rO:J)cZ~}_W<{GNsq]Eك>-*C&w=v?N^^c=ato.aKEI:=eu eu>:gOݷl_c.00dv.Ap5GY>{=Npjt+YFNǜ'[g=4 }{?Gg}wWټgOݼf}8oT WKi,N'`uO0Flr;z)l>!i .j]W]uUt쓭p9ĴI0d.@'\՗GNG|D Yj~blY#fZ~Lz˱>=̙|T` x}l{86C6l0~ejԗuy鐗u;u>}ywp# ^s7H_ND]^beԈ>yΥF}&>$}lCԗٛL(nԖou]/^)QWcǛ[9#.7)S52i5.0lj-C; :4Ϩ0ljǶ*/lg~{rJ-]& k|DdI`F1X&7c䃼!ku>,Nd䍠Jfc׺pJJ'ФX``;ͥ {Z.q vCfc}efKa{>@IDAT ]u.؀ yHc'q RCVAjl#2e S@BXn~%c|mg!f.omBlݺ՗oj_i͙3}Ն@ϖ[l At3 S{§*-\}Uɺn!C֪UtN<3gΔU1;D]zu%nJAtׯ__v z Sv4sVc=gXaPc;蹌zA}yXr]Z:Pź PF: t><) de!~<̙Zk<i  q"oV#,\$'b^Xe12wxڵ\`A%xRKtpo:aĹXѪvy fsYϻu_!s}u!׮a={,?h E2^pIU/ Z!@kWի/nhU͢<25MtUyz7+2]reH  @nq" /7{?\É^|%[utW2w6f(,|斒oj~o{ quٜk- c.zÐ9~L1+, _IێEz!"br$=`j~%wֆMcqkkk[+﻽5?ґ~Nk6c py E`U &VtdiE t }M[zt˖-+b8d|΁`MtSҥK\Đ})܍7JN_;lmD;*sK<؞cCA$d[UV-@ JØz{AaF߇q5aai?r{[槠 (E/h@Wh 0Muc_:LIntuQ>IFt}@~l=>4?gyotzsOw';$$9s`A4ٹ~߸5ktx.ŽaFѧYfuߤMSN.0Ω]q)VVa_AU04\6 ;d]oɅu\'ӮE Q|9PB! ($U^JT)͟*BXNr#xCZL^ +'xB{׻Ոͯh8^W*;U^dcÆ nƌ9Bbrs;#]a`ӦM#L+Ҥb.TUXk *s sy0d0خm-@Ujۊc]n)r}Oh-iQk܉-ĉrټ+?{)nCbPJێb{Qn14ṷFn-iM#2.r@eo0xZ.Njm˗I{N/C/4naȄA2-FYC ;`cI< u 6vyc,f.=W?0Z\6 Nq5LZ<, /HXiAWX*?9ZIôcݛ^}5nnll2ts3+Gu1W4L#f1%]>n3eʔy,Moԩ}{MiI[3<^y?cAc=6Ľa=տGyĝtIpuc}: XCi4R7Xz C07Afߥ2ulװip 5J5&yJ9,qe kEXT<ԏ٪#i^Rw\ ̚5+%[{O۩xlOL0-`0k{W/mSA@Ls[<*=IGH䓱")e)r$V,WIeFju9m>T}k_mHwuż%Fo:.^ɶ7h /4PfD I<|Iҧeua,2ȘX3-!A#o+^/Z͟??(7.ؽ=ql_W:Wk lKwڎ1s|]ôɞ /4 7a= ɯcԓuU[~y͟ej#H64/a,y7K/+ܹt\ow1}W/6< s'ayR|eu<)yv )7Ї>Ԅh&t\&;@sv`*e%KdI`3\(ׁ<.n=~)O)y#I~o2-=Z W+W;˿K lkYgޫ''Vck=g:.^9 vczt^hcHP:I"Y&!߮iIzYA_PTGي-mY`t251f,@ְT9!ɯ^1_4atm.BI $^a!U4fv:5 C{L. inz-Xc;>\fY,`0 tm= E <AhM,#:AS`+]AX fE+C}g6bG޿/3^(9^ ,`0 f,\O^J ?@'>4 A/FQeUCb!Wg>K~j7Qm.V-mfA[+:D4"c҅8l8q PWjO#A@Yu`]X"|,GlK[fɷɷh0 gd@$T3/?S(#a}X"m)Ŋuc\#d,i xhYYg j'ȕ*҂uİ=Ё!*K6$+Wr,m x֪Y,лJ@eW ȸЙM "]!>F,g{!-AO{I-a xlaYG smH&:t/iVI_}dLtmj~m+g9+7 L xMͭ%Y`0J@D62M+iִ,YVE쪘zF𪲚ՙ&t\&֊Y,08 /'׌"^I+eLƩz&P Gud5,m踚'|2*y1Ǹ)S>>+wfi,@y g|xujODPqP>@Lub^\޽gx۹:Pn;YDmgCيNxO6l)Odnڴ٪n*z׻ܞ{YEhJxϛ9u 5yoڴihNqw_H;ZA{ջm3 +^К`(08w`FP?ֿwO= ۟;,Q~G;vuDDJkc[Sk֬qfbv`1~%`̙`7h,/whݻA-Z͟??o'[}~Qy::k[qΩ]f .tW\qŮG lN8~ -[+x˸h8gL#F`9tz.˥ ח>Sb=5.@RuuSK]фNC #賄7O<=]K%\Rɧuu7K/4^W\nqJO0 8ig>^5Z" B#n$= c?vreEc+D-Me2z^jiI[I .^]xYޠ& xيWy x|/Zlٟ_qKNI`3\(ׁ<.n="?s\{$ix 6I,$m*XagR?*e8c՚N:),_ Q.0\-Y~}2pjɒ%'mܸ150 >[ԝ1lsd,۝c:.^Ye+mnK͖Z,@~W$Wy JP\-*˭?#οѽ./<ПMH|!.t zyIg+^҂p5 6owߒت-Gdxe24OҶeV3* :E8jAQ<&en8dW^ S9qXV#ۋ2 l"4O'@/ii pz^3gt 8+WN9w'Y^!F qJӟA[od}CPliiu]W_ fϞ Q_ X{=裱"sgk?&vZ_:-f̘:p.*.X1>z=6G?N=RKq^~;]wzA6W-I#ug= Y_G~99Ń\Vi/<[6-#m۶>۷m1uxk+%̙tSeҗVFR}/PtH|Q<㱱P8g-|,tg]ǃ Q󠥖"=ڬzyU+_մR[R>dXل{>uJヹᷪ[r|WXʪ-@&%Ua8tQ'e>,χ2}ߚW]W.i +[WJ+۠kk|DzT^cU]cmF؀WL(K$@äCc^M7%1yi:͏7&?\)sԁA'ul_|ŕvkyɁ ݏndz뭕zUjФ/.]5}n7gKXg-t3 E2^Zp5\]eM(ۺQ/UWV&=\`+\[<"B= x5T)^ HBĺT۪rDЦx?W}Kx`$˖-s~zEoP]hIWR\>O}*WەDgh(;wᇳ?|1_qwJe8wTWǛq~cu8Ő䙡ԼVy=\$KAD%?&]\Nf=b}ݡ,նug͚&(dd$/&ENw@·?ayrw[n6M|a7cqs xm?V֢r [v"r+]V5g΢֪MGnCoʯxq*+[U.^ݚ^jxyg[ߒ z_ -|Wne ǯ}Ö}N~„q$K[Î\7=xbMʬZA;lц ٺߩynݹ('QU[O'jK~޻kWjی2Mp X|GƗ85g֊ykWgHp^\ue bZRř%Tpܔ s%\|WiQkgoҤOFĸy[DI:o~Mnbc"y<KyvcԼDXdx6!탇ue6ø.h$_W~rDɭⷺ?Ո@o|K7J rO5jPE@ʋs^S(KYc/:D+řPt*ԥ .hu./nJu}ەo~Mnb\uȹ*z^KX)j(Q ~z-sp~4?#eN ='sJ&}i迒A`c[~E,.[iG~ ř%H ,i^)U%Tau)_VPܒsBϗ&򠑞\<^[4]+PUi*P$}]:u]~4uJ&m4:h[h&C&|)AwVWX`K, dL%B-kaCW^i˥K/k}ybul7AZC[Kկ!HJOR}7q&)JF=n^)U%ˀWuWGUB/7?#^ k:sdh>Fjr]iI>%OHɤZ9dh&CIMdS sl`ui ~_$a@8|;}Ȉ?^\|$rn՗^RzJv7t.@=eE9e ɇ엫O1ygS̑;۸{[g?;;FoOBy5oBSA>d/n'-ZϟM9Aˣ|u&7;peQH=묳gXr!BHɌ 6LhDwԋ}N7nhB#S `&M*)~s/\^J ˮw?>QWNƲ^}alkřPt*)g:ΓAˣiUKOnH}uL^Uu&C^/R90ƻVWmrL4XNo[xɵnU,//}jVǐ;$^-D=A#<@kZ^)՗L(U:hI9}mnW{pkyR:D=R|j&}<[kKU ]xA]矲sG}t^ѢF?8O-yoƺݦS^=Oe#.k[u2vXmYsJ^de[+-O\nT6h<# 2 Kco~ʉb}FIy\9ud ݦ*)7j&CMړvLk]1޹~[yJo_JP1Əj3%d"^l4cU?-)zhX4U#m+^*EIS'Y:R d`oW}é#Z^zZ߇!? ZN݌ t }1 r2(&顟~c&AASW1.U~ @;[+@UBE 0>I`Õ|LTi۸UġN/,3]xIUzD$0#ؒi^*EJS'Ys=-yC,4-1WeqA7Zܝ W(+p!@c:qu^d ut(Kϭx6{c f FQ/VusJq|y3M򃺁;{LU׏y͋mbNρaVR#V#ryzBߚhP 5z˶j!w yW^X|t`+<e ֍OO5^ySa*Xձ%yb\ӌ؀W x!4Ht77;@s:ÍI} 7qnLCU}Q sSdl7*yçaPt٩d@=}՗ \Cw\ >"CI ڠ]E?EwqU{)@Ly2xKnfU*og'XGM21 , @_\ч#=^'ڱxeUx7Y7q; !#%j=^9%/3τ_‹v=8L݋/N cq)僖WѶbʰ)2WOd6llk6m&ݩ`Avet/zzюٳg̎&}1`˃# 6t/h 'EWHOƼ)+)zKB/Zb,@+ֲY,[+9PX1aXy@U(K6%X2J2<d[^6 t\Fa}k,`_(AC!OAס~I[NIQY'Z/e(!u^zM`q{(bY,`0 ]Y^4A Ϡ<"QW4S-G;Rv?lq[po- JtԖեt xpyߜ f?fY,`0 `m9 Ƀ!O4# |Yc{YH5K I{i̊h.V$ݚ2 bқ!9P'A eH>5S3ԇ3_Tb[W4TQՆ#B\FIgg Zd xpiY' BJS>X8$ EJ\9~M' z}j/!h%эl0 f:R%mpҲB[)?2X&T AK9ӕNDȲItX n:.^nzk,`_G¼\"8A]Hc'XAƤ #_` S]m6dZC01l??mހ0%# 5k0 lV#1N h8-")"o gB?W>8C3-aY`t251f,@Uz @0"WJRJIò@'WW]WՆ. xIkY,0 qUYw q́J{5O_txan߽H ]I ӧ=^ڲߙ, /z+|G]u\C?|AO6?pwgO~Mt\XkyjO~?HdY`Wi t F\Á/p۠fOzcKOJGf[*y[RNe^Pv{P_f?F8g4sFt\k#5kV{yKvf %kAP";-pW_r[#u>oٯ1VWޤ$f7v;V^ӧOwoFlibh-9ZSX=# .tW\qE[,3[+x#l:'yJ9-Ok.F˾.˴liԯQ&c^;0ZwחT&:?^jYZ<ꨣܳ>ٸqo/Vt\h]+]k<7e u&rOD,}lWvxMܕm&!sSܴ} @)c֥b!*G@5e5+,]tEj xDyb ;pGۚ<;餓Jz6Yݠ2U2.~c:mڴY`gW\Bg  ;M|O_'V!g]9glKR~|U.4/Z7xK+U&yO?Ѷ=>G]>bA"Ae+a+2 vh /h ,a=b_hu^w/͋|mյx ysJnCYw$ <ܹsÊ ^4`k/rfΜV^l2j A>L}vC-Q=qSOMQLI#AYRItN͛S~>O8*6l^"Ss;Reh{u>C3l$/'6Muq]r~Rva9{2R[c'kcemV*gqxߴu99gVP'?[n y#hsu(߲eK1U> Xyݳ‚Y` 7܀"|Gޤ^~ūV{O]7W_}5 .T.Gϊ^vm׃,-+<@<~+ť8+ls)D^'tۻYz3t$]g+' Az '4n]̋/8w4ׯgfY KХӘ%0 R+ֽx x}z &b1X.`ҩ. #R臢}a{Ll3͢:#Dv6QF$_$,x$m5j+Z~g>o<[jӟ.5T2\j=W_l_uWq JrV>ADZn%|'(O>:MSKJ|M$`GSl^l53 =Nm`UIW.0 LR@(*DԊVP˽k>D:1F~ lgdɠy$/i)KL5¹7ίX;Oo* ؜W2}AU/w"d/ogdc9b5nқSOUwLCy(O=e—V_J>;#!r-uq{w7JFhx-@AAJHZ֟w?> g~+JH =aGH$JֶNdQ.o&LJ_rJ ȇ>dO>dXa%u]l'xU銇'8r?ϸ%KľV{~"u /mW\͗[ӳ_b{̧$h,0 7׳ 8B:e7gu-@ԫaSmϒV@7/۴YMn}v@-ZjJ\(pK4YNW \ xI.G$mOvJi[5 :M2NM2I f_xi2.i6}kڙt;sz;Lm^~yUۍ˖- rJ-J ݖë d,Ukzѯ[|Ug'4Pϔ@/mJ92RK?)KvD (Wh9)Z߷\Wn(s8;k_bEK2:2-1%e^V|ͰMʨp@װh[+I D@.l"AJn =xzYj}jKEfZߺ?ʶ,0j j'?=B@:$M!_Ԭ}EIgR6$7. xIkYzgzyˀI ֥i5? 񥀗>_Vʶ,0j 7wTڀ H>~_u߸gD}Ý?ɶ HXrm!-AOX~,'~Dcijx^fۑ;CekpkѢEn\ـWOCfL#Wi1J0,o7] ?Do_w/3bo~tdV /e047>\_e(tZMˀ85=ET ?:/=LJ?+3 _%@#(aZJUg~j7K/[_G0؀WլnGQHKg&JekpK&s>sXKwm@I,ЯŠI0.yJY,qeŭUj<ui%ԉ*G~:bx}c+]`t\;jr{g8\jp:,5 }ZW8O8)$ܖsl43b<_S݅c>?ҫ")e"H> TKNd~<73=Id}{׻U"[Ww3>#ϰk)ݮPч:ZfU4͗4}뭷ܴiӘxyu*CjkŴ,G?d-ːVȾG[?uK%Wi͙#>r#u?eib3f=2.Ni~~$>ǯ$^O^Μ9$7ؒlci'K9j?"u7scLR_Y~]eO|9_;c]akVO(,@0 e24AA.g `jnkzZm"ڴ֪Gj]3W|M%B46{]܄x#7)PYz Vg@y#3@ gc:d\,KMd/m, _AV&@*(TiBu`?510_c?uߴ&GO˥GQKyKU-6 _񌗟;@ikyMBO@T7Ս0?bd9n9Hs`̣x vt mŦs⸞֌:!׶!(ۈ .Տb=3UA+:s%c!7ׇcN>QrIXK?|RW:䵴Y`X*@#0. !.@P_V酨>y?Knv$lAOOļ$K;z?_p{>W.h{mۯ9VI|_|qǬs >Gۜ}VS MܑG,ꦻKbU}"ٌw(Y^cNPEgufA[z4BPjP#WJ c{G~ʮnow?9jv`|@J\_d9B %~I:[X#[@Ը$( o}{߫y㇓oJd0|²^: ?-ejpi/<0c mtK&ٟY]_˿K7}tmȨV;sY|韠oOlY`,@_v1Uv'ίx'LdQ?QnAn믿mXƶ_wnS|;ws3+ d}Ϩ{Y2h^(7%-ei@pC|K/oxq֬YCto56/?zlz 2{FOdo޼9m?4{!5eʔRq;bn} z62^)MzJК0yЖAO"L+ZXiM_O$:,nfIW݊פ+f f 7ד^PF@3'(i_hMz( TмX %;Q0UYۊWCY`25D#hY`(Q ǘt!N/N Lmvnc%*3#hPXaWP,QoKZfXˀho[+񊀦XAҀH6i8I#b /@IDAT)Ŋuc\#d,i xhYYg j'ȕ*҂uİ=Ё!*K6$+Wr,m x֪Y,лJ@J 2jS*FB|X!@dʝvClfɷɷh0 gVc) `XDn%m*[;_*U l,0y25y6fXka) B+ChhͿi?Sخ$>k['hQNC@zVg p޶'֊Y,08 3^A@*#Vm`FP?ؖQNQ VQ.Gx:Fg:.^k,`_q b0r4GrA]{4/?EjuGZmhZ^P4 t\F4֬Y,гx5 hX%= c͓4c,됮AḶ΀`,0Z q8Xf@+^Tt&<ÅrH+CYqC:ǯd^ 10'xe ffII45e0 _7CrN"Y& Ŷܾr}g  ơ/~ |rl{oٳݟSO=u??GnƍAﺳ>۝qno~}뭷>_qzw}{u/oK/tAiNȰ#wO?tP~?w9ߋu ~J?vʔ)x7נך5kܬYVrQ.xǿ'?I?I&c0 dKh E>%h l[^p?t+13SOKvM}#Po B#>n]r%MH&^Z~9访HtL #?6s̘Va˖-N_0^Nnzhtr[Y`wWi 1^48IѢ _]vrL.s\0;Xc2֤̓y3 x^{E8_dO Ѐ7hz v;"kKDb…+H hXg>,YX .r-!袋JdMǔkW^z F^zC_Mǯ41 f*=H E#\@JG2ItoU"fw;{q.֬~νaqKflUI X ΐ[駟xyR͐!_}k_XejSGckj^דO>?DK.茛>0oPò_ t~_wv{¸h# ~;:N:I7n:]x1hjYЋէэ}n-|9im۶axn[jikΜ93侧Z[|j~̛uH_( 4kӇrg@g^r)-6;aO+ҒW_Eŋ;h'~:L)ԇ1M@?+c-)Ɵ%k3c}[.xA[7.IA5ÚUAGk{Z :]dwٰw9`zx`3~yM&,0* `k^U pM۶кi]onP[Yb6M,1bF~ @Ց^lYrߖLҡϘ%//_q 1+>bcc9:\;j 4^mm|f_z{L4m(TH~]'jKwh'boyO?Fg3<w٤-IA_v'Ώmؐ?u\suc xd:NukAa?2q9e M_nZ'x)y\esaq?|'c$)^'g̘_17ov_!Fiӂ:*`ムHC<裏xM;aدɸ!g~@g=Fcϩc.WJl;έD/39e6qՖ+yuL{aּRH?z@5WCء.ec Mً2,6 j3^/I/X}.l :bzǭlוK["/γ1.0etCz P6j$]Fo M@Nh/ caF)S=9l5)M*4,O<:T]LifU:whY%uZSUf eݏTOtc;)^7Я[Y_q ` wU>/\bYZ+tkm5ZO=rW ˿>"EQ/: 8T!EM"@5 kv2߭Rߪ4ub[U1FY]%=bhF?ZI7{}Sn:t\l+3ƶ*hsJ_6VsVǥ.z.GMsA^k`yzX,_q @ |W&RZ[iJ@v咕VpS#C:gy*&B!?x5(}3& FrvjCM9ƀ싮C:6i?lm> RU>V:u#4t70XY_xU+-r`+y~խy,kZrkS|qXkӦZak~@ۺ{x ʧ b,^JF5/@p#L{o8-^#d:w״5A~40LmC0Xi6tV}짯s]{nAѢ_iSKqX]]A&wJ  K^lW0FMuE&<ΦݎAaث,WxU T#㰪x+U<8aeHͽƃ->15 |ͻؒ@KYt_Lo)@V{-d/TpK}k ʛ Wld:  .h'~&z0LuVJ0駯ߩt/OSdzWJg/mX>*`'ۨKk6 Rc :hq U}~7GMSeSQmZ %fn,@_Lf]ͧZWJ5IR-iiJqqB][WKU2 2^gd\L혚8)H2nf<ɛM*װm)WZ觯Ү:`_P(gpGkb>9]wKzs~C8tjxtFV^x!eLwuot^zij&8*(#x7dFB]w])*q~ `7Ct\r,Y.ؤoZJ92Kmߤ\zyYs"OqLޟ%[H&wYg38#\KC9|}L͚\{-rϗbN=hMMƠ[aK`i@7 Y缘qXVamPoԛmƭ7կk\moMFlI/v\ZbU-l?/Тl2VaQ?ۋ޹; cxr ēw9d^i&%|;n"؄)(~ޫ}5Eøq7ƘҟeMVBH˸'?Q!e1A5YүHvфGƔՍ7ؾfn-@Uj 8hw% @]_>ZH>83^\</~P:ekAmĎ|4ӀK#*ذb0W߬^ak.*uQxa+JnzGMfKn&+ǶtnqUMߐ랎,ͣe?ӳ.:=vM`MmoMh=,oJO5[]LWX{-/1L^S:hٚP]LmTZ[,\ْi tzL<(A^@m̌2o7WʤįЎJYpUAѧdRӭFlH]X40MG9 }9ѳ=qUGkzu`D&[|KMKB/6<):Xgk}h7ZXUl-(.O#Ak%m9/Ip4_'P> 7.6#Z[b{7P dL^ZD=ӈ _Wb߼ T=J5 xZ*r)ZaOj_vkϪ2dY*eժ^uUo-MW/諾/DݨUoO()]裏މk suMAk :yaֲY`4Rm5֪Y,л?(%IZKڪvJ xGtJ76M7SKT̗T&ɿ }}ݏc~:Zwgq'?:XKbݺus{{~}K/[> ,o<@{֪:Y~ð /zWسaÆnKӧO/ufX2-{wq{Wj*\̖0 ?OrHU-_!WJEw=; oi>v3R"bh֬YQA$Wx;EE|<&r?q_]]7_ݾ &oJ_}gߕV+xV,,_}-&rX9#5E .tW\qEgEÒ.*Qvdnsw^{7 ׄF! mKe+=PP7蹐tVjر,}o`2@ 2K׷9M7@ U(u +NOt?xɄ3g [Gu{gwR=37n"1έm޼9LV}n/ \[ ?d='C?/v۶}J>*mѠc!|hK5 XCA_[x뙖13>!.ʙF֭oך3gN,Z\k֭zni!5ӤA9Hxll742g-|vWZ4ʲeCy ϗye&ui*%htX6* _*J%Uô-{g2] +^iOf[蝷_Kjg2U5 C/by)~~/n,a=J'^GkR楎Lvv/Iό`K[:1Ԝ/r.'(mo֭xIYuaΝV)3V-egk6:U-c7[XY]vb73f8lP3sq7& Yiq{1l5Ak[@i 62f9bfb@̧wW]N[ocoF%8a}qœ:T/:5?N dvvԶt\,@XΑ\:w3μ٩kFӍ币o꤭ u;uu}?p<ҥKя^nk(7פβݜ_GW)*+Ž09~qi ^7UvW""\"=@Oe-˫]KVU 8E0Te:&B+RJa23 7^&ŋKt\hԫI /40lޙWmedY.-oZtRTi0ts2Z1ZabV7Ax>1K`C`Q1wQ ~d d^R.dqrlv$rs`4B=Ryz&B $,c9AT.&B=ҌCگk\^bkhUl7W^ vuGp-}CŘ[jM4:tGZ.u&)(\24$N q!haLpv}_vdY. 10p=U@6pH:Bdz4Hc//z**O)7'?a 1.HZ}V49= \[k'u9Q+ڔ<|2l@4)~J0NrH/)J,Acr*t֭ٺinyOo4Q'1cد!N}$BZ~vuɹ R''e =əO]8M^B2S*yôAJ_ xqLrqӏږrqɲ~ϩ9r[$JݸHHkA r jeH ]JMө^Uyzm#Ꚛw;XK] r3^=kEˋ}Lp]dyHYu]ҀKs LbA#M0/9E[B/dTxQM8G -;˫PȨ/kg77Tڸ*e6Ml+N%s4G=ǰU4^y] OMfn:o(NWXhݵ?ʆt[d:]:z%^rR25FgcǮN6@WVX\y!0]vb,/@Sj]#5gk6VkpLyӷ_Jt\i7j i/G!퇴 &oV>&z6;A_R]"'m)״nz̻nuV:m=tR_z7u|_qK.'"x"1]O-5[+"-cl 4A%B9KNL\!lHGvz+uA_ j\h't3,U'کr>۸[jt\<(-$7|sL_2o"mH ZO}ӑLk&H=t W#mЋt/muknnucSGXk{hi}V7u_V$*qbi/vk=R<c $Z]W[[73 xSYJY2oyk o$(xXI/6] 9 z4ƯĶ :.]W$y9)Wq |U7baMAfݘk=M2tD`oF6eɉl}p`dH X$V bG0oNn0{U|ܪ[U}LULķeҺT>?v[qԈE#!}NF9 ֟ 4(/f] ӹ{,ѓ6Υ5}LJG95suG~况c:7@A*/""^~je\<ֳ`yP :*_ȟ/LvTU*&~$a 6Zne?QZr6탈n@\#mQR?ߪ .|j`|9Bm |#s*'w "/r>殧/:DtR-UI tSSc9W׹zm7:Ưc/t V#鰫x;]C̛PgP?직|.W<, k, S@Y^P;z>$"7ʮɯ{,Vny"mD|0W&e$.pxb}D>~;FHLu5zj995su;6%9~'\ۺ<>lC3~ IAXr*[?]'~׋Ek@=xeRB=X.]nH79R;7]Mk> K}~|L \,%jtKEs2}s:DE'Շ]6ǷxstTgm5}zϝSc9WWף4%}kmFX'wz`|C>|` ̳|tvwiqWG@JWftEpvx3]pO8Q!oOK7ZIh 8q5"MQj? \ZyO11hJt->g7r)rϸ\_tRͺ [J\ˌ虓VWnї輜⟫QcX>)^'Ƴuc, *GՃ+, ,piio@)CJb=k=C]-ȲӲad1B4(R|H~c@.r}o~:xo<I+55[r:@)w>XABYqTBU^S@|6 vΑo)CoT4ީ0S:\4յ\>#u_].1V\i LeAr ]lwtO}srY[L̃LMxMkyĈz/;-otaۊ2C 4R )#7el~OٶIpcQuЩk#PApU~q/@M߲?.Sԏ3ET}|j>0֥TZco\}/쩤ބLm؆\.mۈ }ty1siM_){˟%65(4:P]uTǿ8~Vj- i? ՟?CP:KLA RW9^u.O+IWʧ~oN'T@p">#Gn4qpPYGA)RKjuD9;P.KuTMYdWR2^|ɶ\@e샟_¾1FOPjZgS:횫kHQ6h_17ToԼ}>V `*X k%F_~Xq#/W@(R yA)y@Q?"6:=[@"'zDGA){"R `V9e:q,(@ϱ_]B6 eC䞙Z4TmGuCIS~Nx+۬e#S\]@ÿc:q<&Ư""* oVz]b yV+r[ |0ap#a! (N‘AI6y6F+޶k>:s@>mY3[.PJg; sIR/z/t҂</,8j繀l6 Y =]F\ל΍ ?TQ2WWR|v9wpC?1N2dzխQF=kUwJۧxSu5CR]}u=@޾}۽~{`ǥKwv7oΝ;WmǏ/^to޼z]|~w֭jnMյk׺۷owwܩχ)ѣT{0_ݻwrJXb^tXya8 vAVp`իWdm_CA]nܸ1̹oo^tϞ=e:弬u6Çŋ9Xyu+8UД8ɫX4uu04x]ۓzi^jc7}<[GװȞAePM*kף?<1|+ƾ sRz1/+XN6*t_QEO7<;0p5ൻ1h=74yd4^|ݔIENDB`readxl/vignettes/img/geometry.png0000644000176200001440000017073613406366260016702 0ustar liggesusersPNG  IHDR iCCPICC ProfileHTSIBB D@JM^" l$@(1${YTp-`EWE\ bae],P& ~|y;wg2 , U + a&$&1I=$́=-xGFhۻ0UKIWSpElH);1pM@  f $ Hp$"ckiLL/d?TK$?3( [9<>䝐=,ngAVB6M.OrdX6x"Ak9۲ģ}BMEI mP CH#?%< <4^wA#l/3_(d8(C=¶,-Gy1#"5gY \hL*/ 2\ixN%Yr(3:tt8JTa@,S b}CM Q LcGapuD-dEc۹YQyGv&a+$R{'ȍiq|`1,)`~KVX@XxF[Kk @4GZye+{ZTimE&x9=p7< >`ŝqvL^D?b1h6 Ug" o.D t :  ݄ X @X62!pԁFpAµ ^ !BBh@t#E CD$IC,Cb مT""'3E }kTTFщ3ꍆ1t4 A@2zF_1YbΘ/%a[b%XV5*֍cq"NǙ%\Ax,sj ߏ-Uh-LH f %spDфf"18XCl"vI$ɂN HAiR,O%ےId>y)||E~JS3s͕[+GA\EbBqP2(K(j9=yyy}y)|Q IX_\eYGtn@{轪DU` "Cj*jjqjsNu301#X8¸4N{8Uu{>^K^^~]S_#ScF}M\\sl4ǫw_8;ZVg1YRf s@OK/HOK]oHD?V~}AFfC]Ɇ 9m6j5zolbo¸III=Sii53Y6s<ݼjhf90eBńTKo<*+UR: '&M\?uWk,=wmTlBl4ؼ5eۖ^-{eoaϵnˁ0aCG'GccSVΪΑΫ/\|\4|tutu=[gL&q']ߝ˽ۃӣSϓY멷wA>>B>}]}6a~~~*e6B fW8,i F> 35LF'L0^Q8?.DGli)SDD͏jGό>.'fmXXqlsbܴʸ~ $\NL%'& Nij4inL7>g3f85h2!9>@gV55e~lqݹܧũ6{|yeWA;2gFdΊϪ&g'g3-tf͙)s\s6 C{Eh>WuĦ=yyyf>:GyN\>e>=y%{x/صYyz.޿$sK/},~Yr勗?)an+vWV[eBN"뢒ϫ٫/lskR״u\}qݍ+?0yCFo7tľdffҰ-[m\^vܧfU[olzvv¸d7qw'{K^ͽE{ҩցUhഃW[VaŇ#G:>ftlqZvn@]z]w}b}牐 n m_^cIkOQN-?5|:`LڙG3M8{eJKs?zƋO\rTwrmC~?^{J}KGCS]]g]=-;o޸us[[ng~u' +/y?jO=~xыǢǟ{?=)yƾS/Sϭ/M_믶WWïWx /aG班?=ٗ_ g XB(zDxv8%5DvgO,I}^. Qb ߒw@ʈRleC0m& R pHYs%%IR$iTXtXML:com.adobe.xmp 980 424 -iDOT(}@IDATx %Uu/GhlPޚ&1B$> *Mn'|qLxhLHJܫ |hBJFvc4Qy)M7MwO:~gW?v6?k^Vsm߾I [+^y^Vn+mwBk'n \wGI|?nwQPdt۹s[hk<~B/d?ϻ"&%r''Ah[j))z`j3?@)R&>p7EOΐzXN!)zrJfw>Qn>'7S],L1F:l`n&.MXüfc^@bϿꗿ!}y0aFzC{){}Qj>(~O+SA$Ԣ OuG~|P>GȟWa>Gh?5+sAN+SAT#^_y}ԟʧSʣ=~;!n~o!M}c:Oʶi~I+SAT#^_yg||vOf0DA|Qg s#߲-k_lHBJS҇C]>}C/{?׿\)6r%Fxr`1vk~G}hh<>G:ˏ^Wyԇ}?$ԞawCY~uV6F{]c:4iauG}GHG{}Q>*ojycr>}Ua#G}hh<>G:ˏ^|,QQ?^_~ԇʣ>~auG}GHG{}Qþg0=C?ۗl1UꊵQ?򠽾auG}GHG{}Qj7.R+ꎵq>)#ş~#1gy=O8,`ݤע Jc6\΅7~/U)%ŎK|ӝ|P ş~(tOCC{Vߋ:m}ğIh˘oVCX;'=/)ןP?/||kB_!}\ﱧor<68`>߲1m0Ӊfy~h$+ ,١iIRzʣ~W~Tۋ\!߾'WcC}G^[|'0KW4>ԏ=ԗh/57S!ʣ/CCkA}~X0=R^?!|;Dև^_RwzӦMnҥ|b uXEeitוgW&?x8QI!zNXC{]uMMU_W]~,F<ٕah]uG{絛+?~W}]rGl{6nӷꗘ!]BywוahMF'rhRd誯+j*]ufٕ?f=G%GydXB]ahbZ,\dzcrC^ec\?W>[zkks1X^L>O{nG>9P?q[Hg#hiIeGb.ɼ)C .J{2E|B,   QFpӕYB jݙVgP#RxGok|d֨h{m1X_%hW~Mڣv/}jA~wdgw8d]QK|i)bd<!Hڛ1W Kڣ3F^{]0K&qg6I|axn^dL1$gPw^@rIrdˋޤߺmkKNy\[8ou^ЎC[C\YYL/} B9vR*?O-u_nY0*oPE0R7:x>bs.%mu /E41HGySh#屟OѻC~=ȏt~J. {%&Ȋ!?Q)>>C:HGySh#$U"OJJ #?Q)>>C:HGySh#mM|wߕG(tOɧ]!??G:c?%wՇG{HG%%kosC6 k:nZ|Uc!dZMB5`0jq~H:CG}]֭s]jη}Oc:Rp~HG{?E=ԏCz~ʿ&zoGd|(eI"'qnmtԉHG{?E=ԏCz~6OJ_MD?e̖.i=ԟT?}SiC8?w鷉R]=?d>}DL&K=SWP t NqR>RdQǤ[Tvڳc픾E}R>%}/EzJ_N+WJSjh/Ocwl$e\v8G)xFZ///5_//5_7o+/"ϦxZJgWߐRΗWgjšC]L[8kWd xr3ߨh{t>K-/u+/ 5 z"F ӶR&G1CDvem ?g"?أx>:3d2mq%4?|}Ͽy'+q=H\+47|>dTqY%]sk[@ b`ߡnLb%u]I0G{)xӄ:>>K]I8,YO Z:2S}_m(ZO^Q|/o+-9VIKq>4?mG{)|G #_ #dDŽ6Ǜ?u|B~ۗö>A{)+fA'mi 7%AϏbZ!}h9u1iϯIm >8k3?L??3= 2P>/'.4g|G}oRj)}Q0ϴ7m=\ӞߴOsFuFNG;lL{~Ĵ7mUolBM*{SBZJ_k$4߱m{t`r}k[͚%S>=pu'l旯Nh?z}g}qd}[cQi73XP7%2sPllۛpl]|8}':GWRK zYϖ͛CB~#p?;K a-pn}mPq$do+%Ә|?mn:>|Z%Szճ={]៸[&6z/~Cw/ ҽ؆Kg϶4;ggZ:؛Nr==<~;}-l6ȯcDʲNs:^;x<{`k[ FӰ9iy?#,\m{I$n]B} //1 `L=*ߕ'{[}%XI^l6*ߕ?90/%GJB]ȋHWWX1*e/Eo-1>^ a'k.y$zޒ<%wctl&G~w<?t-tƒ>o$Eb1\͛%'7R뛢k]ϧ&ԇ^s;zO%OU Dڮ;.dc!՟ "L u 'bt@b+]'I=h0i|{FsvNSct[}a'(4'3W'_s',d}8!kOh`_9QI?np׿\wq78Spw<{ٷxGq;#SHG{Ma &~aFBPjޑ>daguWVd>ʣmtԁ(HGyJGVfߒti[tЏ?Q#]ٝ^yZwZ7DYmK-͟?ҍhh~G:#?QG xCy.,CyԟG:ʋ~7>ο?aE_UӾq8t:4Coo_Rp~?'ŷ?} {ӠG|C+8?O?QP۷ #q7m<엔$FqApb)=8\>tÝi].]w WKӢ?@4qYhg%Kj~*^RtԙOS>4mU.||姖 }VMWjC|ѶԱb(HG)}Y{lFOzmY='.9Rwlۘ=e:_zF~zpPm mK-A'şUNn 8yC[q>]|?EStKȏ;wk v7jS߉ᏺR9|g2&}&ϦpC<>=?פP'1w EӞofgg4Bھ_Pf R0]J?OKw5c+N~={W;=?-݅zUtJS+otk?N 9߆;͘x_\y蘷+Ww;&c}ô',SShx'0,=NKٴc)w;#7\qOzFcj))R|m3iҟK;}$܉y=0EYޫ|vGuZ'7x~_zjV<<ҭ}хח_JJ zhP˓ҶRRKу?}T"$eB%M%w2MP?N|K[o«m>LYz]%}̽$J6weg9ݸvKw7#ũu2*$L0Gy.o',# C1Kћt U:|QS9?w_ğ/[uݪ&w4п࿮]RK#=05AydBB_Oo?Qt{2=!)zByd7MRK#=05r"OiA}]C_MGP|[m8xכ:&-uQw udoP7 Tuׇ.tkoo'W軟v]3ZE'/6Ms7mz8V9`\`i3䙦`·Њ= ŏozs_w1vi3V5:2>ßeC|:霚>/\.8f>ٸp1ݙ7gLwNOLlznPo qBlwiϞ+2sesر 6`plW|O8%K;Xlwi"e^%J%2cB5bFd0tS1+>fvW]eǟ.Ɓ]ߴ`&=Ϲx5Yq[s>_?S #8`ټa44"=/\{i/sg=-4 );~JǰeB6Ͼ{%9y}7IcjlK_=N1zqfƖi\7? MB]L+ Mp "V Qbӱ9va}sucǸ~r{n!Y|v˵pNOY\s\vK+˝)XKķQy?&?וGgLw07noQkfr$ 9!t =ߡӧu~xU~f⼕{]7.;i! 2HljMRsAzmUNT(i܎m[~7~N2X?Vf]eh}]lwS #;|bw?W#?2_h}}zXnyM7DFv&Z}]6NPV͡5 ')6|֗_z|1ϖ[oFMw>}ksfq_nu}'t7t޻곭rքzŠF4&aRW Rtk2+?S}ZJ#joj~>:~ڿmtk̡3q uOul`PIc4%/;40{A::?/ MYpdA|\7< ZJu?oιFߡ׸jw?V>}m ̑v~!(SY#_y}ԟOy0Gho_p\=-qg?JE5 gBl|휒̑vrR! k[+/v?'+>ͺSOɲ+)GZJ22Zɮ俬4"q~4$)q~2g[R7FI} l:L+`1ی5% I A>zA6!s'.r{ݮph0!鈩/GN}md^ 2})RP~׺}jnXl>֟!Z߻LPӹ\o[vAxڹ.]k8n* W-ֹ\_ I_RGKL4%GsL#Ri$ %>YӱM q߻WѾJhuCy] |zΗj{?i} #1VPFzLە?$ƾS`vj}p=A|BSQl'Mɴ:@⟻In>ZԂ4G5_Jʧj2wgT/9]_`方w\zY7˦#?m~_{8.%ᐏ́~OKt/6ykվiw>bPC}x:Q?~{枣]5GYWWO#=G:ʧ$ǏzjQx-e!?QG/a~Gb?ο;FW{O+ڵ7x_SOJZJ̞ZJJ?K#G})yk0γN#|+7Do}SF>yA~J((B'pF{e_:~i~c_dQ_jh)y|YMit~~]B} / /R4Z K' ]ptN׶1zlOQuտMƋָWF QGmK]{kwޯSR/?)ݨ ͪkc uʿ}!s~ʿ]tTux?W(~gE&ǻŞw|/EGsa:6a?_>X˺[ }}'*[N|[ t/nOp~㿍f+{aWʿŷ>/;'R-zm'w۝Q OU ON Q'0;EW=uuJ>EGw>o:EܿC}=fmmK-%'C'_|外RLٺZvgZ.+?m}v;՝s眦}CJ$}_{".ứ+:lGayhW}L>ѷD_WʣCCү;.YRa{1aBbwR;V͆j_{}m¡sOut+sJ{UӉ%umoCyyx3|To]^|ovO3?1ޤoyʣ m[tᏹ衻0wvkN=+$mm%~'-PK-ÐA]m}}qVwy{/E呾'W4>ԏH: $;]M? xql/](O#SO:Szr3p+~Կ>r3>[|ts\Oܽ.s|ǓiIFtY1ow6 XvV/\.-^7oJ};,z[{>\NGyзt^ 钜|Z>ozڔ]_{܋ o֟_(\$rN/S06 }pp˭bO^,q+^t[;ty>b2E}Zʐ{;4Oٞ)=u^d;#܊cݳ:+m.Dly}׿|SSq>OvG<ՑuE#q7m7:*Hg:ْac4VvJ__zj)(ߕ屟חߗ屟?T.ɴEF7%j'ʹF'u@lxltIԟ+&5dib(dِGbeM¯ʧl~OS_#_xtu]ԏ I{f #oOXn!9_A67D6. MRK?hC:}><1_hOHWXO%Fı$iLH?[+6-=77 A~c?o_A ?ұ7> 77/e ZI<\R뛢Oȏt|z v'-+7@!v }\rGb뛊H>&5$I$y%#Od=\t4U䂶YEF8u=&y{AhhU|7?Z_\_\OWΣ( !ne?G:O:?}7+3o(??> X?D|cN'p <:z͇,KU%8@\woJ2.Hjz){)=}QJ_RRRtԗ$KΧ^JwW__ySJ_RRRtԗ'~p#}<3}9/﫯2ה8}o. e.~'zA8I4rbE#/ŏt;ȈMZ$})/ <>/񗊁_H9r5^WZROl&+ ZROkWǧՆS,#]A Hu?ұt'vQnJ-%Y}im|]B-P Az>Z >J!Cek@>C]G{Cl C{C8z~hIo>?=A;MC6}76s<8KC{C8z~ug辝OL4{C4F#U:>u =?7~A֏Oq>_>4Nn$} ;0h/% [`9SsI ϮK<-zjRvS\Oa;$o/$O zO3J|p]9>'~OC=ӆ@'8HѶRo u4nt@LQ~.jt}"0[߽#;'ٚ _v8uSk-~ȡTh 1()#0:L7LT44?#*6nWC__DņG?t4Z8ѱ00pW?B& ApGu‹X_;x`1p>b>y mHagkUwNķE9M6;]?e2]`w7m~ >hMVE!%ayhftψ='Ӻ  |t֧tFx G]9~Kioԏ.PV}QP?+?|P_w}q~V9١a]֞vW;>ԏ=ԗL[' 9ꗼe+)ċh(HGtu~)|Q>?4[mB|h_ǵ2HW9SCծ]rZ|j*uhZ}*uHz,:?(ivh_ǵFyGiv:?SU9S]^vd^RP^jq#Wȟו~it\kԯZ<#]NMWZwi)~K{6tљu\kԯZ<#]NMWZwi)jWkku\kG~ցfV;ԒP Pm 2D}]b@6]FQȀGq ?8?O^6Cy@{HGy_C|d߻^NX XT:Q\;_pʀ[Bs?rDqUcP񝢗j(lh(_o~G%ϖ'>_p~Kc:[o\wJc GZ#?׿ 9ׯi uT00Rxh3/EG< D|S>OKѭ>P\(;S;r}" ќSǛ?WwfPR?5=?E=ig敲7X|J|S1]Ʀ?5=?E商)m))z[;u|_gWSSt3zSJOSSt tk_d>Eja?e?EG}]֟O~/E|Ɵh#M"@ D"@ (LwхD"@ D"E;wQ"A`G#x鲅.EyoT&˔e,y7323*d{ʓt5 of6>"0 9"qU"V$X;w|s29d ^Mxc:eꋵQb#W*jEu'EHwJƷ":'ر1'5)UikUZqf@?Pun ,ܡ.b##xh1 H8L  P١N%&v\Ƭ6H_yHbZAEaF}OYFW1V$XOX9*}Rߊ`|縪I`|+sBܡքTk$&ǶWbMjzΡl_661'ةt2O)*|Ĕ +%CƷ`|gt 6` &RQzh;Ƨ:$2z%.xT^a6U/wE9"VJƷ":G9*}Rߊ;MN5qվԶTނɴթ#}mZl-t)Vm&F~3.b#Cxž.!iw_+MxMU_dԆ36 . 8թτZ`#czԍ{ZPN ߺu+O 5 +դ/a?'9&}A߈9 P١N%&v\ƬJϼPoV^X;*,u 1OX$!±\`|粒#; :8bd%M|mA)ny&7{KA}O>cہ 3V$XOX9*}Rߊ`|縪I`|+sBܡքTk$&ǶC.\|y&Juoݡ~۹9NuK_RT?UA +;8 wf Jw*0+p &RQzhPKBJ M &JFu!v2C'T`|W`'3ߙ-(ݩ N&jEYikҩ㺻}mÅtЉ;W^잽_u+m&F~3.b#CxpQR㻄 `|gtD]BFFߡ5i&+_;ʫ|:7|)T$YZeIFL lfOX-)20 lf;%CƷlPwxhǰewZS.7kK6<6l-X巼8O&)sC'VX sCۊۢv.ޡ6Iq%/%AS\KLl.q;ԖƎ)m2oK,lOX(0-l;?ƷE\([TQKcZO<;;VGVaoJvU&۶քW*/5کQkmuWRl[w[`;qIvv@*҇:up<9"}C] 2jL`Sij4AVi(#}kmyb`x컖^s;18 )oEuN;ԚjmdvjCIm4Y9&;Ձ.q@)EY%ldOX.*]*`|P! .0K(rZM(=kySemeD|<*J0ݪ;Ԋ" +UO[`#W>)oEuNjq&tj_j[*IoAdTY呾m|϶K^D#PH!DWyeWyV~Ӿ:ӯ4Uz4IVeV~jQτڀfvݒ!ۀfv0[R:d`|05zɨy_Yv=^-$WZԆfkkr/X,/Γ 5~NjD񍈰V oDCmX&kVGģ|&1tiki3 ^/Ld#)oEuNDwTj)YygGU&لضq׾u>Äڢvnۊۢvn0s[Qc`|[4P^q OuVǛ]ɶm.5վKv{Z[]vw;N\yR"Mfu6H_Z[X;*,u 1OX$!±\`|粒#; :8IqWWO(lk"okǥ#2,<-XTFǙP+sD'W>)oEu0s\U0 9!PPkBuYcǫ&d=gP/Td [u>]bFvݒ!ۀfv0[R:d`|0rZM(=kySemeD|<*J0ݪ;Ԋ" +UO[`#W>)oEuNjq&tj_j[*IoAdTY呾m|϶K^D#PH!IX}M2jCPfOXY-'Y!j9 @5zɨy_Yv=^-v?ǒAw/a EmZiF&2ﺿۿs߸XI7,{( p5wԑy,]R2۹!Vn+J,o۹!mEEm`;oVl)cuI,K+C;\^ wKI*9ZiRmw-blOX(0-l;?ƷE\(V$LHg"?v#N/[#?ݳA>}w8 i>BWZ˘-:ooy E +?ƷE`|綢"h otSLF5;]wҔ*>*Z\v{CG|Tlwi o/je]D}-$FsCr\U0 9"qU"V$X;\4a6ɨMj^Gg݅vhzwiG^Jg!RcZsZb#YÄZ`#MxmԖ*NݸG 5T˘[w[ P rZM0sBjD񍈰Tkk5Vi(#}kmyb`x컖^s;18 )oEuNjq&tj_j[*IoAdTY呾m|϶K^D#PH!Rݒ!ۀfv0[R:d`|0Y &ɚư@+]k׾Zi|YǵV]mw 9"VJƷ":G9*}RߊPK>kv%u7|[AO($EtS#"Nh' u_-PN\y`dOXY,#A] @2҉5pxA#jIRm&&Im+kã6[7:LsZQd#'}E&18 T%)oxsW\qEW: p@m|=y{vUz7~r\?˝jwv@F?):O?}nY3K(ؘ"m{Sj"08|fxX]|*?nxjwctwǹ}̲wߕ}M6Ob=Ǜ"]'q"0xZ&oIFmR<[͗v_'hw\vR:U1--;Ԋh{²HM |}nNp6~C~'Z)%.@9Kn&w)!!Ѥ6-($w2K_w_;'@jݝÒbԎ+[ֻZw_ Tf4|&Z P+sD ^žL>+XB| ?yDo|cE>e8M:H#@GYWZUN&㻄hb&c}rooT|]a! 6g2D`PMFS`,c#ܖ=#?q"->6(Kf;$R4ʼnYy%iY|I7Jo nǾWY^tuZyj;hb]}&ur<ڞY* %}Nloy[-NGAkp7\*h'&#Gm|,"PxhewZSVGt=v[.;pڪgwmɻMU[lɄZQb#mOXjngCv8t3SN9}_.LnJ#ld@^nG,Ch^;6[jJ1~Y` ",@ ;&)*ѤGd}[6e:;in/w>ucL>nL[5A6Bc"]utD 6UGuv}񝄋 #6ƦEHU mhm#8L5)/!S(/-pt_nC-?n[S1/l-RbI(ƄZ`#mOXMw\|z]zWBLD<}WD-8w'9@ b[nq{;+_tLd[c=ֽw{뢯X? @}%@`C-kfM L MlĻm޸mڸmݱó.v{{;蠥nAO(|xQ+'گd8a;Ԋ(9 3Πo4o9j+*/b Ҭ^aBHr\U0 9"qU"V$Xw8wq@^@(SýB.c:i ;CÑ3@UL:kWc9jYũvةnS;wN  H+ PVVϙn%<&*Ĺeg֮^^/~Y}Yʲ1#@}ϨЗe%cFQ HD"8nk~.|zlG{~>n?5Gjf$+㪒P"Hθ$ԷH`3;(faSn;ɚ+G4TP/qh6JJQHHN PDf!|G홟btkB9$w{ќϊ[q١ElF<2*9-،JN"@}6C 8Tvwu֏F115W>q[8CbsUOв1Ɲ">۾8:ל%._Jig#+UV|4hg#@}g[QqԷӠ@o%4 SQU_١6Ha3qUIof$@}g\Ur[$\<~|ljj-qqww3cԾ}F%}}}PZA n=,֚ZtQơ˨"/68lKe=;"{^ 3IP&_" w~wNc˖-2y6ӦM ȢEdرmm7 'P~饗㎫1A!q7oZ{챸(g͚%wdƌ8az8wG-^x\verjxAacrEufAI`ZbVG [;Dozm{Ab䀾]|lڴIT o%\"+WY-*׮]۲o`8r{:\z{{4\pѸ\ I"0j,mN XQZ\}=.+.UWnVowɼѿxSam`OAm 2@ _?'\ŷn*->v!Ǐw,\) 3H ׿)"O?4U8{l8q^Z|*_#6lhSMbb wϱOc_~H mpr{M c;h F5?eغ; Tat%r\dmW$PWm5 K'߶?erG!C ==a/d׾5Yti@N <(5EAFvNNw;gJ \_;AׯO| 裏"Y 5L #\. t@u7zR:bA &A{Y_ (7i~jMxU|2(#7B| Ӟ䞰vBy sŊ2|RP{wf.9vdТ`k?5IP,mےWbϕnn6I[%q8(zUn24])M#Pю nuֆ  䞰v~7on' )A ǿcAw^3f̠ + @kӱ_jS~s\in==&u!L!vU4F.vO2`ޡM8oGB6 #V*E^km`ZS5L @ǂ:{ h;T9}ğ߃v~>ԕcmH`!xՁE~;/<~,}hcYm|_P*JzʷV]O|GD;՚v=5NL"{²_ {@#O>dU+ojuu؈GH0m9cߚV|ϕ #1AEC N8|oɯʽ|S.91]\z'#s?2w߮.,u{,= 䞰C@!c~< 2 ^zI;8[8 @=e 6m?5#3>L{{WmqQGPؼysG-ЇDlj:#$Ё@Y|'䬳r8nJsbjx h?5#q}kÎ;j+sɣ[r[]j,U7?7䶇7ϼfYt딗p7PJ,@ǩY #B_ضmdrE1S;V@[VPf͒k~x8xW izC1"r{DNH`T;:`$ o{&O\yumh4?jaYא;5BL8#{²_: xNw68cMo0oݡV1 ^u711m?upuG뮻NNҲ@ J؊S IY;Doo>%ѣC7,5U߳-ΜT<i~aNUFv6^1"Zb # 䞰vP+Ά^V>%ڐ7=PӾ񇣁o7r8 XL}`|r{ {Ri|1`/Cy!Ze֚W+7 _C}#Syap{dG Fy6MբX4[zj qwrOX Y۷ٳeݺƓּyfŸ^V} om6ۗ^qgʶXp\2DPӿ-]ƇJ ׿ j^Z{ڰVX!ϯuJ;by\i6$pHPǃ7+-i[ԽNX tƨRc\ 6'w91@ +B ǛoiU|޽2fL.̃_2A,@kcI&%?ƞ~r\ITȠ'0kr;[m/_. ,pѸ\nQ$pPhCmDq'1hgSͲZVjz씇oZ&QŃ=(6pݘPd #.oe_Ks;~.w hfΝ2a$;#"t@[B⢿wN)ߘK,L!FQ! Pm-ׇnǗ7lw[UO|=e'aQiO٣\k!yܡ3eV;/_sΕj_>q^ K ׿׬Y#_}rGZm!M7xUۦmprN O?-SLH:G ׿:k;CݫL ME2p=Pφ{>l;UkBգx#<{~CȧF`#G`o{Nuƍ- ҿST7C[~Kvj'N%߱Q,NԊQ##z6D yNh .ֆ(  qU9'CWs7H0DCfGSⴕ$m^12DmSI`5LXNXx¨;P i ρ` nڴHHHHHH`{UKSe۰ !]*25i>Wla$Ӟ*Oɹ1={ZM%&@0@Z'(=[ۉ\ۗ׮j 򇵍IAmI1OXVߖп(c п- ƽh<ۈNbV'ΦӸ:$ hg[FL9BHS]>Rd(c п- ƽ{[Q[{!P=)(5DĬ-K­mkGKjdOXWs7H0HqU9'COK1)#i޸&lш ѿꁴ1M);68uLiOx򴚜KLa\bK@"ӥE9B!0Ѵα=BB+؆:&Ŵ';n/xCe #֖-[dmL6M,X -c&m_~e9eP0/@Ǎm޼Yjy⢐5k|;ߑ3f5Lt@|~}re]&~zۑa0a͐v!Hc1kml>U{߸;%McvCSkjTpF cٳ'_YdIv;zamOCrֹKdʕ6e\ڵkrw ֡?ۛIu4c 8淫q:&ɴ'',LŃԡc:eg-[,|K<}v4iR@sΑgy&^kbr~~J\8_{52eJG?P0E!ivQqsN?UZA=wzGfkiԳa͠L6'uLiOrOX YJ(8/]4$Sv"R G@ǻ2=Z*\g;AׯO| 裏"?U$&\6 7=FwcA}ۼU%Z `M\p@HǶ(-Jf 1@ ~!K ep {viNԝ|8 g?5IPMX#gNJ+dr&H`8 믿.{l#<"\pAH=Z*>緦su|wgs\\FlERmm VQ?:Hl\e#?MFp|'&jmNM(mYhdBz(|3=&NY˗顢c̜9{!@&KY̙Sk׮Aott{jO?W omA?oGer;=ڑ@ Cj`hH_aڈvv=[wE'N im۶[Zeږ8l(-%ƽ=a/dK%L5k 'PاV@IACg,M6d?5#}(Ybh{~¼I[x 4Cmvxu@ N>hkG[!r̙\s~Z0Ubg{?9$@ ~!uǯ[y7½x|_q͘&r{2}'xB:*=p}J~~k:GPǟR~y @%&Pۡl@Z;ͳ:ԛN}m;˾2M۱8!wpJ e TPo۶M&Nl\QQmM9m}[g߇/ow9SNaWF9Ɣ߇֬8w;jZA%xW4OXFCQ&[ZX]|oqmkF?ƫMcF5H0H eu@w6l"'/o72soݡVK/q䰆an,׿$뮻Nr;QY$pv!Hbx 0mC^-Y}5j4_;kay wӘB?hz_Uʄ3',=Ԋg;g}[̄p;["Ngr{Moh=e\@;Ai6A?0=P=viO$jBSVlPռ[7r:_ã6w&Y4%򡹲+e൝RLR²Ư!wkpF eڡ޾}̞=&͛'>`w%gyf#ũo_}m#. NL R;o .+WSj%Ho^ /W_-=Xm+VWy #]&]'a%vE+N!foX;&zIZkKϴ/?>=/lg7Z5"=rxUdm27"Zb # 䞰/dG}tƛoYK#w^3fLHOSV|9wRtEN+ fg}3$\VRI&%:=0ܰa̘1C pwgxnY|,X@A?P0eayV=}q/Q [[C6=z6M|qdAMŚ&ձW[ j+.o_Kgh~r饗6!}:xv4|oٹsgҝB{-7\緶HyLnnvI;qG~Ae ۝?^#?<6ӧ*Ŀo.1|$0O!M7xc:գǤ \~yI'E]$eʔ)mE?oD ׿;6C#Bqu8 Np5kٷC~-ٽcڷLty{g)"Vk^aaΘPd"'ݻw c«py7Μ;C`炷~;s37n\u Cѿ;bP տڿ֧E"p0wj\#FrEllB. OAjYvQe"az6DT]=mP,Ƨ}SPǤD',Oɹ1={ZM%&@0@;(!rCԳalic:k=l]! QFA  = rN @  п=*o`@c;3k'Pu)q $m^\MS/]mlx;c= >rC',7Kɉ$пPRr" f%ůV&m6rl@OmѩM>Ж5H1H',9$z$@пA'=o|S Ϧ㸭6UvzӨP4cD؝`FA!i j`OXWs7H0HqU9'CO;ԭ&a Ȱ mD2+mP(O丢עvuڧNd51H',9$z$@пA'xBȇ(Ŏ3.QφG|3-F<akCPPCx򸪜пAGo9$z"ءV=kvM0%N[[N۶YǯmjzN_6Cܝֱ&:pD',Gɩ47!a#oGɩ47!aMP뜒׈Q+jE96৶&lmChRqz$U@  ={\U  jNbq<H8mByaӹ}Cc|xM8F7[>(+8$E* # п.*TW(qD Cj~؅H`z mD"evW=#GL8Jz ;5q GgdR%akǨ"F8XNXw7w=2i$8qCH୷ޒ]vaO0Aƍ<E\C~r繤hC`1ӆ:hjX|oQ=~*[XNŲs2oO|GtSej~=C]Ą+'-[ɓ}ڴi`Yh;- ʥ^dSxuɝwٔ !q[7oZ{챸(g͚%wdƌrdҿAa7wG-^x\verhq&\lf$pPPw!pmv 돗FkȢ{ef諼;egbr:Ey^䞰T`L>={O>d/e;w9/vX)mHF ׿mK.DV\iZUX]݄] ֡>vxX8D=nXF@CZBƫxNnYtl242U>1}Q6ᅮj_{ A=񀲸=cm666:ȧ  䞰^~e9+'|rߺuرc?>ΖŽѱl2?.(Vv)#PLfo4x)O?dΞ=;܂zjy7|lذSMar;h_ا1/\~$k!..t&IkjRXZ%k-9 sN#]}F)eLy//nSf(W_@ǩY5L8#{²_TL򗿬/WW^y<U~/c\pA%xŊ2";o'E9l@;m\q5ռԕ+wV6m$v@o~^㻎W^nVϕnnmpv!45lu)[~a,X0Le妹M# BS^ڠnB6u䞰2*"R^]|/}שGC%۷o³6s<3ߠp$q?qk2eʔ*~^`rC`$0j)D'xƣ޲𩿸^[W>l,ƷL:ķyvOh4zã>+t@wql@xu_q6D3kܓK=v>y,8S7 `E=i `!5]{ $Ӟ䞰PE+eW}&ʢ.Cn9w);톃@k?[ӝضm[u%\ 6\8> 'uĨ懸_YwqrUrWdȥ9ظz}ذnH8h~|Xx1-==a/d~ϔѼyp۷/c.C,~cO<<=%Fo~~k:GPǗ~Ys%c$H}phCmD~qNSlnsˢVk8N/-_,}m z${²_R%ߙ|3=ӧO0qzg8Z;w̜9eC ǿR9sTڵ+=U"B4 9㰟ߚnEs%c$H}psEllav"c\Z*W M":U 8PuG.x%Xm0N;pwwZZ#EKYVlm[ j`@ k0_{c<N}2zho~#ԧdݺuVA !r;~!ѿ[, @kG`5vòtl$@g4E8h4vU66[c)q2uA},ZXN>fL/oZ]r%2ea(I؝?je@ ~!P1{'|-×0_ Zá#2WlۡDŽn9}oMxKJH "t6y.cZVԦl%*}69q|t;~xTYt-rґ_G TYjܡ) 䞰C&l}߃}3$@aF3m9cߚqdJbϕ #1AE v2*");(J4Y|M1؉uw 'jZ Я6uO.=g,Q4Wo{oUBuv/|lJۃ8Bxh :Ȧ  䞰V;۷oٳg^y5o*3[}ve&D ׿=%v!45lu)[kۧVʒuq#wk;~hm,Hk=P'I1 .o͝~Y/qǏoI'Ԕgyk $Ў@;wʄ .3 F΄G!|~kꠟ""! v#+NȱXe&S_nG7MYdpuv#o1< iw @w\#E]$eʔ-uK?DC!CuI` P등Upaø`[e[[7ʮ}12rƎq=b2?`ߩ=u&xOXz֭[e_}pرcDYCo=Sɸqj0t!P{(}ۺsK"pp͇퐀HPh F5?ʺ;BCDauLiOx򴚜KLa\bK@"ӥE9B!0Ѵ=ٱ=BB+؆:&Ŵ'ﷶmjzncܶXi NaGhLB4kv)cRL{"\bӞп=&D@ \O$(GG52rDs|3Bl8 aCA  = rN @  п=*o`@cZw͎r i+{k;j?- n0:GuL@ڄ^12DmSI`5LX漇pa-)'dп F[RN!t,lĨIۢ=[`ᩓCZmѩM>Ж5H1H',9$z$@пA'=؝։y*J푲QeU Nٕ*BU]!kf6ў)AGQ,>1IvQhBX*XVSeG˛-,Z*Q#D;!v5O֯_=/Ai59;&´'oOɹ1=Pw!pm>2lYpÕI;Jka(}}'kڦ;)bB',/+yпSTJr)jĦ^עƵ~'?gF|]C?D\ imljDPY #<*o`rN @ T;$c1kml<\T{YhW_pVB<զ:ʶY8%Ӆ73jT [Ay4e׮}E12vl4ڨB#5BS^ڠNB6ulA9w п-(S#@` CsEZC{DoYavm M#nC0^m얧= jKqox򶢜%@4FmE9Kmi0@x 4UѪu;qG4Ld-^:H&] rr2wIW߮п# L ܡg1!nWiܧ\(CaC[x\q`IAmI1OXVߖп(c п- ƽhCmDq; ΦcwVSk~\8rƔj%A qU9'CWs7H0Dz7&eQkЖ5H1H',9$z$@пA'vl-mxto!tCFDF4 D+K{m\%_#^4: q-FY?uMC|1 ! @ڳgO/ Zbl=ӅmT+y_!iWsOm@і"u7@vh?\ڭc Y FV=&^(       {U̪(UYq[O]BmmڵkmF~Z>jh'Ӫvׯ W3g<%UVshE݊ ={XEΡw+2? $B|d6mTjwCYMdOXSi"@nB GߎSi"@nB jM [Ay CUhAķjn0ŴOX^WRogoϫ˹ѿ j.ڣ&zm϶c M#nCPxeB$z$U@  ={\U  Q/$j!\5 G!Ze֚A0|z/k^ՉNd z$U@  ={\U  )ߘT,!FQ! fm-ק~Ǘ[T;qq[/er;8;Ԡ#<*o`rN @ T|cR*!n^jhbRq:&ƴ'Uw[MU7/s?<ԪcSmC؆z$U@  ={\U  {N.0ۉP\sߔϟ:+7\s@R.[.h]Oq5B7NB煐?H<&DDi59;&´Xv ӼQ{~%,K6]L{L> NlWY#zI#[;)bB',/+yпSTJr)jn/k_+;+m\v<'7-ڡ@SX񳿔%4vEɥ#{a^9666l j`OXWs7H0HqU9'COjRvAL1kml<*h׷,U[O2TzrU{˴?)G;5Xy wӘPSk"L"d"п]-''G@tAڡ԰la=7W]e濖Xfp,&9NZ+7G#Cݏ1x򷦜Q?w? [SΨc~jvSvȫ2SQ]?jԩq3eҫdfaսӶδQkc㕽ѱ)+R8$E* # п.*TW(qD V[E)|W%Z^=jLΘ?o:)cL{"\bӞп=&D@ CO bTCܯӸO*}л_GGOm֢/ѹv"!!m'7lIAmI1OXVߖп(c п- ƽhCmDq'1og0o_^^ۙ++䧯²̺\3d xd[BݘPd"mE9Kmi0ۊr>` )ߘP,L!FQ! PmY({mlU0N_2T9/l,{`uS& z_Q76q4z$U@  ={\U  oLHD*!V[7>r*)sOشj^5nʱEM+~LDI}SPǤD',Oɹ1={ZM%&@0@;H,N!J!FQ^<|"Y;??w4lZLn[LNE*'ha 1n$z$U@  ={\U  u)X;MGn䖹i)^h=ǰkOGEx9a-(S#@`tj5L8!t+)ٶء.RPYNF YdNأ_t;V6ܡE qU9'CWs7H0D v2*")F>=_?X~$<[3QVw0Yrϲ?#͓C#v!u C~CԠ#<*o`rN @ $w[MXH#sȢeՏqdֿ;M#*[|^C8iD0d 51H',9$z$@пA'P;)l' QN쪽mZsPl;̹_kH(jOj:ߺXݮׯ B Ox򴚜KLa\bv; x6_ΎVPPm 2ӳe'TP?a^ }DtieǢm1s%\.+'U<{^]΍MHڡAljUw{ag7j۷Ku~=v߿_N8J:j~XCg Gx19 #<*o`rN @ T;$c1kml<*\NQ ;;*^>iLNu(W_@ǩYQF rJwSп+8"PPChj SڨB#5B&KjWMh;Ԡ#<*o`rN @ j.ڣ&z˂XL6Q6F܆a۳ֈ^)F rJwSп+8"CWlB4CsBu;qG4Ld-^:H&] rr2wIW߮п# L ܡg1!nWiܧ\CkrÆ(a\qamqRPǴD',Oɹ1={ZM%&@0|IENDB`readxl/vignettes/cell-and-column-types.Rmd0000644000176200001440000002250613406366260020334 0ustar liggesusers--- title: "Cell and Column Types" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Cell and Column Types} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) options(tibble.print_min = 4, tibble.print_max = 4) ``` ```{r setup} library(readxl) ``` `readxl::read_excel()` will guess column types, by default, or you can provide them explicitly via the `col_types` argument. The `col_types` argument is more flexible than you might think; you can mix actual types in with `"skip"` and `"guess"` and a single type will be recycled to the necessary length. Here are different ways this might look: ```{r eval = FALSE} read_excel("yo.xlsx") read_excel("yo.xlsx", col_types = "numeric") read_excel("yo.xlsx", col_types = c("date", "skip", "guess", "numeric")) ``` ## Type guessing If you use other packages in the [tidyverse](http://tidyverse.org), you are probably familiar with [readr](http://readr.tidyverse.org), which reads data from flat files. Like readxl, readr also provides column type guessing, but readr and readxl are very different under the hood. * readr guesses column type *based on the data*. * readxl guesses column type *based on Excel cell types*. Each cell in an Excel spreadsheet has its own type. For all intents and purposes, they are:        empty < boolean < numeric < text with the wrinkle that datetimes are a very special flavor of numeric. A cell of any particular type can always be represented as one of any higher type and, possibly, as one of lower type. When guessing, `read_excel()` keeps a running "maximum" on the cell types it has seen in any given column. Once it has visited `guess_max` rows or run out of data, this is the guessed type for that column. There is a strong current towards "text", the column type of last resort. Here's an example of column guessing with `deaths.xlsx` which ships with readxl. ```{r} read_excel(readxl_example("deaths.xlsx"), range = cell_rows(5:15)) ``` ## Excel types, R types, `col_types` Here's how the Excel cell/column types are translated into R types and how to force the type explicitly in `col_types`: | How it is in Excel | How it will be in R | How to request in `col_types` | |--------------------|-------------------------|-------------------------------| | *anything* | *non-existent* | `"skip"` | | empty | `logical`, but all `NA` | *you cannot request this* | | boolean | `logical` | `"logical"` | | numeric | `numeric` | `"numeric"` | | datetime | `POSIXct` | `"date"` | | text | `character` | `"text"` | | *anything* | `list` | `"list"` | Some explanation about the weird cases in the first two rows: * If a column falls in your data rectangle, but you do not want an associated variable in the output, specify the column type `"skip"`. Internally, these cells may be visited in order to learn their location, but they are not loaded and their data is never read. * You cannot request that a column be included but filled with `NA`s. Such a column can arise naturally, if all the cells are empty, or you can skip a column (see previous point). Example of skipping and guessing: ```{r} read_excel( readxl_example("deaths.xlsx"), range = cell_rows(5:15), col_types = c("guess", "skip", "guess", "skip", "skip", "skip") ) ``` More about the `"list"` column type in the last row: * This will create a list-column in the output, each component of which is a length one atomic vector. The type of these vectors is determined using the logic described above. This can be useful if data of truly disparate type is arranged in a column. We demonstrate the `"list"` column type using the `clippy.xlsx` sheet that ship with Excel. Its second column holds information about Clippy that would be really hard to store with just one type. ```{r} (clippy <- read_excel(readxl_example("clippy.xlsx"), col_types = c("text", "list"))) tibble::deframe(clippy) sapply(clippy$value, class) ``` Final note: all datetimes are imported as having the UTC timezone, because, mercifully, Excel has no notion of timezones. ## When column guessing goes wrong It's pretty common to expect a column to import as, say, numeric or datetime. And to then be sad when it imports as character instead. Two main causes: **Contamination by embedded missing or bad data of incompatible type.** Example: missing data entered as `??` in a numeric column. * Fix: use the `na` argument of `read_excel()` to describe all possible forms for missing data. This should prevent such cells from influencing type guessing and cause them to import as `NA` of the appropriate type. **Contamination of the data rectangle by leading or trailing non-data rows.** Example: the sheet contains a few lines of explanatory prose before the data table begins. * Fix: specify the target rectangle. Use `skip` and `n_max` to provide a minimum number of rows to skip and a maximum number of data rows to read, respectively. Or use the more powerful `range` argument to describe the cell rectangle in various ways. See the examples for `read_excel()` help or `vignette("sheet-geometry")` for more detail. The `deaths.xlsx` sheet demonstrates this perfectly. Here's how it imports if we don't specify `range` as we did above: ```{r} deaths <- read_excel(readxl_example("deaths.xlsx")) print(deaths, n = Inf) ``` Non-data rows above and below the main data rectangle are causing all the columns to import as character. If your column typing problem can't be solved by specifying `na` or the data rectangle, request the `"list"` column type and handle missing data and coercion after import. ### Peek at column names Sometimes you aren't completely sure of column count or order, and yet you need to provide *some* information via `col_types`. For example, you might know that the column named "foofy" should be text, but you're not sure where it appears. Or maybe you want to ensure that lots of empty cells at the top of "foofy" don't cause it to be guessed as logical. Here's an efficient trick to get the column names, so you can programmatically build the `col_types` vector you need for your main reading of the Excel file. Let's imagine I want to force the columns whose names include "Petal" to be text, but leave everything else to be guessed. ```{r} (nms <- names(read_excel(readxl_example("datasets.xlsx"), n_max = 0))) (ct <- ifelse(grepl("^Petal", nms), "text", "guess")) read_excel(readxl_example("datasets.xlsx"), col_types = ct) ``` ## Square pegs in round holes You can force a column to have a specific type via `col_types`. So what happens to cells of another type? They will either be coerced to the requested type or to an `NA` of appropriate type. For each column type, below we present a screen shot of a sheet from the built-in example `type-me.xlsx`. We force the first column to have a specific type and the second column explains what is in the first. You'll see how mismatches between cell type and column type are resolved. ### Logical column A numeric cell is coerced to `FALSE` if it is zero and `TRUE` otherwise. A date cell becomes `NA`. Just like in R, the strings "T", "TRUE", "True", and "true" are regarded as `TRUE` and "F", "FALSE", "False", "false" as `FALSE`. Other strings import as `NA`. ```{r} df <- read_excel(readxl_example("type-me.xlsx"), sheet = "logical_coercion", col_types = c("logical", "text")) print(df, n = Inf) ``` ```{r out.width = '70%', echo = FALSE} knitr::include_graphics("img/type-me-logical.png") ``` ### Numeric column A boolean cell is coerced to zero if `FALSE` and one if `TRUE`. A datetime comes in as the underlying serial date, which is the number of days, possibly fractional, since the [date origin](https://support.microsoft.com/en-us/help/214330/differences-between-the-1900-and-the-1904-date-system-in-excel). For text, numeric conversion is attempted, to handle the "number as text" phenomenon. If unsuccessful, text cells import as `NA`. ```{r} df <- read_excel(readxl_example("type-me.xlsx"), sheet = "numeric_coercion", col_types = c("numeric", "text")) print(df, n = Inf) ``` ```{r out.width = '70%', echo = FALSE} knitr::include_graphics("img/type-me-numeric.png") ``` ### Date column A numeric cell is interpreted as a serial date (*I'm questioning whether this is wise, but *). Boolean or text cells become `NA`. ```{r} df <- read_excel(readxl_example("type-me.xlsx"), sheet = "date_coercion", col_types = c("date", "text")) print(df, n = Inf) ``` ```{r out.width = '70%', echo = FALSE} knitr::include_graphics("img/type-me-date.png") ``` ### Text or character column A boolean cell becomes either `"TRUE"` or `"FALSE"`. A numeric cell is converted to character, much like `as.character()` in R. A date cell is handled like numeric, using the underlying serial value. ```{r} df <- read_excel(readxl_example("type-me.xlsx"), sheet = "text_coercion", col_types = c("text", "text")) print(df, n = Inf) ``` ```{r out.width = '70%', echo = FALSE} knitr::include_graphics("img/type-me-text.png") ``` readxl/README.md0000644000176200001440000002257513431612751013026 0ustar liggesusers # readxl [![Travis-CI Build Status](https://travis-ci.org/tidyverse/readxl.svg?branch=master)](https://travis-ci.org/tidyverse/readxl) [![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/github/tidyverse/readxl?branch=master&svg=true)](https://ci.appveyor.com/project/tidyverse/readxl) [![Coverage Status](https://img.shields.io/codecov/c/github/tidyverse/readxl/master.svg)](https://codecov.io/github/tidyverse/readxl?branch=master) [![CRAN\_Status\_Badge](https://www.r-pkg.org/badges/version/readxl)](https://cran.r-project.org/package=readxl) [![lifecycle](https://img.shields.io/badge/lifecycle-stable-brightgreen.svg)](https://www.tidyverse.org/lifecycle/#stable) ## Overview The readxl package makes it easy to get data out of Excel and into R. Compared to many of the existing packages (e.g. gdata, xlsx, xlsReadWrite) readxl has no external dependencies, so it’s easy to install and use on all operating systems. It is designed to work with *tabular* data. readxl supports both the legacy `.xls` format and the modern xml-based `.xlsx` format. The [libxls](https://github.com/evanmiller/libxls) C library is used to support `.xls`, which abstracts away many of the complexities of the underlying binary format. To parse `.xlsx`, we use the [RapidXML](http://rapidxml.sourceforge.net) C++ library. ## Installation The easiest way to install the latest released version from CRAN is to install the whole tidyverse. ``` r install.packages("tidyverse") ``` NOTE: you will still need to load readxl explicitly, because it is not a core tidyverse package loaded via `library(tidyverse)`. Alternatively, install just readxl from CRAN: ``` r install.packages("readxl") ``` Or install the development version from GitHub: ``` r # install.packages("devtools") devtools::install_github("tidyverse/readxl") ``` ## Usage ``` r library(readxl) ``` readxl includes several example files, which we use throughout the documentation. Use the helper `readxl_example()` with no arguments to list them or call it with an example filename to get the path. ``` r readxl_example() #> [1] "clippy.xls" "clippy.xlsx" "datasets.xls" "datasets.xlsx" #> [5] "deaths.xls" "deaths.xlsx" "geometry.xls" "geometry.xlsx" #> [9] "type-me.xls" "type-me.xlsx" readxl_example("clippy.xls") #> [1] "/Users/jenny/resources/R/library/readxl/extdata/clippy.xls" ``` `read_excel()` reads both xls and xlsx files and detects the format from the extension. ``` r xlsx_example <- readxl_example("datasets.xlsx") read_excel(xlsx_example) #> # A tibble: 150 x 5 #> Sepal.Length Sepal.Width Petal.Length Petal.Width Species #> #> 1 5.1 3.5 1.4 0.2 setosa #> 2 4.9 3 1.4 0.2 setosa #> 3 4.7 3.2 1.3 0.2 setosa #> # … with 147 more rows xls_example <- readxl_example("datasets.xls") read_excel(xls_example) #> # A tibble: 150 x 5 #> Sepal.Length Sepal.Width Petal.Length Petal.Width Species #> #> 1 5.1 3.5 1.4 0.2 setosa #> 2 4.9 3 1.4 0.2 setosa #> 3 4.7 3.2 1.3 0.2 setosa #> # … with 147 more rows ``` List the sheet names with `excel_sheets()`. ``` r excel_sheets(xlsx_example) #> [1] "iris" "mtcars" "chickwts" "quakes" ``` Specify a worksheet by name or number. ``` r read_excel(xlsx_example, sheet = "chickwts") #> # A tibble: 71 x 2 #> weight feed #> #> 1 179 horsebean #> 2 160 horsebean #> 3 136 horsebean #> # … with 68 more rows read_excel(xls_example, sheet = 4) #> # A tibble: 1,000 x 5 #> lat long depth mag stations #> #> 1 -20.4 182. 562 4.8 41 #> 2 -20.6 181. 650 4.2 15 #> 3 -26 184. 42 5.4 43 #> # … with 997 more rows ``` There are various ways to control which cells are read. You can even specify the sheet here, if providing an Excel-style cell range. ``` r read_excel(xlsx_example, n_max = 3) #> # A tibble: 3 x 5 #> Sepal.Length Sepal.Width Petal.Length Petal.Width Species #> #> 1 5.1 3.5 1.4 0.2 setosa #> 2 4.9 3 1.4 0.2 setosa #> 3 4.7 3.2 1.3 0.2 setosa read_excel(xlsx_example, range = "C1:E4") #> # A tibble: 3 x 3 #> Petal.Length Petal.Width Species #> #> 1 1.4 0.2 setosa #> 2 1.4 0.2 setosa #> 3 1.3 0.2 setosa read_excel(xlsx_example, range = cell_rows(1:4)) #> # A tibble: 3 x 5 #> Sepal.Length Sepal.Width Petal.Length Petal.Width Species #> #> 1 5.1 3.5 1.4 0.2 setosa #> 2 4.9 3 1.4 0.2 setosa #> 3 4.7 3.2 1.3 0.2 setosa read_excel(xlsx_example, range = cell_cols("B:D")) #> # A tibble: 150 x 3 #> Sepal.Width Petal.Length Petal.Width #> #> 1 3.5 1.4 0.2 #> 2 3 1.4 0.2 #> 3 3.2 1.3 0.2 #> # … with 147 more rows read_excel(xlsx_example, range = "mtcars!B1:D5") #> # A tibble: 4 x 3 #> cyl disp hp #> #> 1 6 160 110 #> 2 6 160 110 #> 3 4 108 93 #> # … with 1 more row ``` If `NA`s are represented by something other than blank cells, set the `na` argument. ``` r read_excel(xlsx_example, na = "setosa") #> # A tibble: 150 x 5 #> Sepal.Length Sepal.Width Petal.Length Petal.Width Species #> #> 1 5.1 3.5 1.4 0.2 #> 2 4.9 3 1.4 0.2 #> 3 4.7 3.2 1.3 0.2 #> # … with 147 more rows ``` If you are new to the tidyverse conventions for data import, you may want to consult the [data import chapter](http://r4ds.had.co.nz/data-import.html) in R for Data Science. readxl will become increasingly consistent with other packages, such as [readr](http://readr.tidyverse.org). ## Articles Broad topics are explained in [these articles](https://readxl.tidyverse.org/articles/index.html): - [Cell and Column Types](https://readxl.tidyverse.org/articles/cell-and-column-types.html) - [Sheet Geometry](https://readxl.tidyverse.org/articles/sheet-geometry.html): how to specify which cells to read - [readxl Workflows](https://readxl.tidyverse.org/articles/articles/readxl-workflows.html): Iterating over multiple tabs or worksheets, stashing a csv snapshot We also have some focused articles that address specific aggravations presented by the world’s spreadsheets: - [Column Names](https://readxl.tidyverse.org/articles/articles/column-names.html) - [Multiple Header Rows](https://readxl.tidyverse.org/articles/articles/multiple-header-rows.html) ## Features - No external dependency on, e.g., Java or Perl. - Re-encodes non-ASCII characters to UTF-8. - Loads datetimes into POSIXct columns. Both Windows (1900) and Mac (1904) date specifications are processed correctly. - Discovers the minimal data rectangle and returns that, by default. User can exert more control with `range`, `skip`, and `n_max`. - Column names and types are determined from the data in the sheet, by default. User can also supply via `col_names` and `col_types` and control name repair via `.name_repair`. - Returns a [tibble](http://tibble.tidyverse.org/reference/tibble.html), i.e. a data frame with an additional `tbl_df` class. Among other things, this provide nicer printing. ## Other relevant packages Here are some other packages with functionality that is complementary to readxl and that also avoid a Java dependency. **Writing Excel files**: The example files `datasets.xlsx` and `datasets.xls` were created with the help of [openxlsx](https://CRAN.R-project.org/package=openxlsx) (and Excel). openxlsx provides “a high level interface to writing, styling and editing worksheets”. ``` r l <- list(iris = iris, mtcars = mtcars, chickwts = chickwts, quakes = quakes) openxlsx::write.xlsx(l, file = "inst/extdata/datasets.xlsx") ``` [writexl](https://cran.r-project.org/package=writexl) is a new option in this space, first released on CRAN in August 2017. It’s a portable and lightweight way to export a data frame to xlsx, based on [libxlsxwriter](https://github.com/jmcnamara/libxlsxwriter). It is much more minimalistic than openxlsx, but on simple examples, appears to be about twice as fast and to write smaller files. **Non-tabular data and formatting**: [tidyxl](https://cran.r-project.org/package=tidyxl) is focused on importing awkward and non-tabular data from Excel. It also “exposes cell content, position and formatting in a tidy structure for further manipulation”. Please note that the readxl project is released with a [Contributor Code of Conduct](.github/CODE_OF_CONDUCT.md). By contributing to this project, you agree to abide by its terms. readxl/MD50000644000176200001440000002557713442230012012050 0ustar liggesusersc41a2bcd100169d75717bebfbf1b1244 *DESCRIPTION 649f255cd07b5c31b23b75c6e64e6e77 *LICENSE.note fd829f1e80e0a2fae9a78a400cc2b6e6 *NAMESPACE 994dcc81e0fabaed72a814363e309575 *NEWS.md 75aab0962392e3516bb1aafafb389c12 *R/RcppExports.R deac946a4d631957e08f5e7876f3fda3 *R/cell-specification.R fa1193df7511b89f9a836be71861970a *R/example.R 0de0a95599142f2c03123ccd8e7b1003 *R/excel-format.R d20ad654bc45bbcb19fd5432ad04c113 *R/excel-sheets.R b41b591e23cc4b5b5800a5f79e2bf7fa *R/progress.R d6fa50c1bd0ea0c544375715c9274120 *R/read_excel.R b4fe12876c37f8a22cde06e9701eecf0 *R/readxl.R 13d9edcda97dcff96a707ad1a4458439 *R/utils.R 1e192abda26e50fbc77cffd77a278b91 *R/xlsx-zip.R 92e5a6bd71a4176a1b6b2cf4c276611b *README.md fe671de7df866cbce2bd3ffd6f8938a9 *build/vignette.rds ab0ac8923cbe38018bf6dae9b4c12a02 *inst/doc/cell-and-column-types.R d945e641f9541a0ba07d3d2bc2ff4cca *inst/doc/cell-and-column-types.Rmd f6a9b5ca65be1792899d87793a71f4b8 *inst/doc/cell-and-column-types.html f732a6aa4fac11bc2020065f7f5bb15f *inst/doc/sheet-geometry.R 07709c0c944e233728040d3a7bdcb6c6 *inst/doc/sheet-geometry.Rmd e9056fae7e8389e40fd8ab2800e23789 *inst/doc/sheet-geometry.html 0926fd270eadb9855b99c4c8312e7580 *inst/extdata/clippy.xls 23e4ef54a85bdd4c9e485c56d12f8080 *inst/extdata/clippy.xlsx 5611040674e27c7429877740235d4381 *inst/extdata/datasets.xls 48fd08d3cb673d5b9269d3484764321d *inst/extdata/datasets.xlsx 5382767deaa7dc6829d3dd256aa5d43a *inst/extdata/deaths.xls b15f1da02c54609e8dc801f6ecc83b0a *inst/extdata/deaths.xlsx 8d6b4e4e3ccf5f0f48e6631c6e77a00b *inst/extdata/geometry.xls 2c09dfc57d528730a928cbb653c056d1 *inst/extdata/geometry.xlsx e73472900abde41511cb648f705435cc *inst/extdata/type-me.xls d65b3129744db5c2d2404d2a6db33c82 *inst/extdata/type-me.xlsx 6d5db03c6496c33919c36449d0ed9abf *man/cell-specification.Rd a10172b18f9fa0394e3d241c2c167dda *man/excel_format.Rd f42c358a304701fbd39426e0b8dd518e *man/excel_sheets.Rd c044a37e3e9f3b4345bd43072c410573 *man/figures/logo.png d42cc1e0d638d814b3c45c7e5bbecd06 *man/read_excel.Rd ce10f811bacb05b0a2f3b0a3c103f0f3 *man/readxl-package.Rd 953d99864dfdea591fe4a60f0c05a25a *man/readxl_example.Rd 8ab364897a1e08f1e74e95eb947c6d6f *man/readxl_progress.Rd 56c8849b362361d83147c5e8c8ced374 *src/CellLimits.h 7994014a4d61217ccc3c2c3f743a3378 *src/ColSpec.h a5252d8e911a4bdc12ee5ecb6997e8ee *src/Makevars 98e549b110b1ad7a555bf1a66f3c364b *src/Makevars.win 970f47e86f0d6afb1339242eee34a46e *src/RcppExports.cpp 780c4541df9ee130fa787cfac16f16b0 *src/Spinner.h 750fd667fa81fb0dde7a81a106a4d7aa *src/StringSet.h 0f7669206c788f029cdd13bad0954e59 *src/XlsCell.h 39d8268338203a53765ae6a54bca3c53 *src/XlsWorkBook.cpp 55fe53711ad8bfb3321c6e6424c9125e *src/XlsWorkBook.h a45ce0eaa10d34a462a713069982d805 *src/XlsWorkSheet.cpp 36bd996205c1bd700e8d090275e419c2 *src/XlsWorkSheet.h 270e287d32dfaad21901e2b51a51ccde *src/XlsxCell.h 20fd110043d22525e8fd43deadc89462 *src/XlsxString.h 22f61de0951154bfc9f29fdc2d92d8c3 *src/XlsxWorkBook.cpp 6e53616973b105a725a8350ae68fd456 *src/XlsxWorkBook.h 0eb0948cdfd7914ac8e975b88981a8fa *src/XlsxWorkSheet.cpp e98642ad10dc9d0460d79d5f29c79187 *src/XlsxWorkSheet.h c9c7fe34bc48765864c4be957ae3c6ad *src/cran.c 584a26d22d1a2877902049073bf2bb79 *src/cran.h b62f027fd2704ade2146e32059ee04f4 *src/endian.c 8dffe282ea163cb13925dc6cb401789e *src/libxls/brdb.c.h 203d9f88d2001824a0d1f30533b196f4 *src/libxls/brdb.h 4f03e8fa29fa5c6a42b1f89d8e93d571 *src/libxls/endian.h 42bfb9dff9c732b1c04fa040f03dde02 *src/libxls/ole.h 4b9ce895f89b3020c54487ac20f35935 *src/libxls/xls.h 6f6fa9eb48186e08e46de2c421172571 *src/libxls/xlsstruct.h 62c5beeadb1ff5aef03b65fd4f2b7cb0 *src/libxls/xlstool.h 5aaf9fae2727fe42dc2f8902d291bad0 *src/libxls/xlstypes.h b777f96700a0063ae551f67b0d40d4be *src/ole.c bf00317ebc127cd87c244312f7fbb40a *src/rapidxml.h e64ccc20a07cf2a5e52b952b86cced83 *src/rapidxml_print.h 6f029f09bc92db4168e1a03f7c2c6b7f *src/unix/config.h 4ffb96847d87f6ca83896a3c4ac6bd37 *src/utils.h e39c10faad9f39b392908513cb3d4350 *src/windows/config.h 30a624f1c6e25ecf38169ba5db7478e3 *src/xls.c a4fa1f4aaf909c2cca886cb38b8f6f79 *src/xlstool.c 86f39b74dcb1f2752b5e552f93270617 *src/zip.cpp b476f5c925f76e9a5575335ad78e9690 *src/zip.h 0dfaed66bd540d66787cb4722364f05c *tests/BIFF5-LABEL-record-string-read-mac-10-11.supp de4e8210833469e2bbfc55c4732dfb6c *tests/testthat.R 922e1b072fe9cb41c4658fce2968dcf6 *tests/testthat/helper.R bc3e1e9692f94b0d144309c01a4c2f28 *tests/testthat/sheets/65536-rows-xls.xls e59465f8c061b98bdd4f0531997582b0 *tests/testthat/sheets/Ekaterinburg_IP_9.xlsx 871728146cf4816b9a6004e2928d088f *tests/testthat/sheets/biff5-label-records.xls 1761922bdaae72328538d663d0a5c8c4 *tests/testthat/sheets/big-texty-numbers-xls.xls 05cb100c53ef68cd1a43754b5641bcc4 *tests/testthat/sheets/big-texty-numbers-xlsx.xlsx 84ea0e12cfece13f32cd53393b1cbf83 *tests/testthat/sheets/blanks.xls 2326f0ce9d460b8649d560634323fa86 *tests/testthat/sheets/blanks.xlsx c55690e743eade41976644a0b23695ee *tests/testthat/sheets/dates-1900-LibreOffice.xlsx e83ef594e0329bf76d7154943092d251 *tests/testthat/sheets/dates-1900.xls 43d781a0cb52ea4269fb6bb116cf601f *tests/testthat/sheets/dates-1904.xls be135d229f0b590f4aeb0eaa704dbc78 *tests/testthat/sheets/dates-leap-year-1900-xls.xls a3bf2c7cd37e42b118d9381c336ea709 *tests/testthat/sheets/dates-leap-year-1900-xlsx.xlsx dcda845475b5c300c824d77070905a71 *tests/testthat/sheets/datetime-rounding.xls f18c554d21d6030464a9e61674401759 *tests/testthat/sheets/datetime-rounding.xlsx f66016baabc20498646ce81c1f3ed3d9 *tests/testthat/sheets/embedded-chartsheet.xlsx f049fb3ec9e2796d2a4a8000210ebd98 *tests/testthat/sheets/empty-named-column.xls 1b918ba29f95b74843c972e34c085ef0 *tests/testthat/sheets/empty-named-column.xlsx 460210968158a448d21dc39c981081aa *tests/testthat/sheets/empty-sheets.xls 06cc475fedb91946f39a944c51157544 *tests/testthat/sheets/empty-sheets.xlsx 023d95a4d81afac24ace7fc4331a6405 *tests/testthat/sheets/geometry.xls 5115e40c775e662e0b41f0381bfecff5 *tests/testthat/sheets/geometry.xlsx c5ee7a75e72c268e147c29c7ef8417ff *tests/testthat/sheets/inlineStr.xlsx 4ff427a21bff4b6554eb912f09641563 *tests/testthat/sheets/inlineStr2.xlsx e33da78d404624fe45c75bb9835bcbb0 *tests/testthat/sheets/iris-excel-xls.xls e36f0efd232ddb381f8f0e2b99e4a39f *tests/testthat/sheets/iris-excel-xlsx.xlsx 3d73cb718f643ec4dedbdd28a8f2518b *tests/testthat/sheets/iris-google-doc.xlsx 2f2c978a2c02d12c9cc2affd9e84e883 *tests/testthat/sheets/list_type.xls 080134616946e8d11051f620c774b96e *tests/testthat/sheets/list_type.xlsx c1d339b9adffbbdf2d5d33eca44b155d *tests/testthat/sheets/los-angeles-arrests-xlsx.xlsx c8c1bbc40404d69152fd26979b9ba014 *tests/testthat/sheets/missing-first-column.xls 55361e605b3ee9aeb6c4b7186c11af1a *tests/testthat/sheets/missing-first-column.xlsx d238ed1971af2bef9f9e688548021f1a *tests/testthat/sheets/missing-v-node-xlsx.xlsx dc2e78db47889ed44188dda631ef6f9b *tests/testthat/sheets/missing-values-xls.xls 936ca3ae00df9e5e4c03b2dd2fe13dbe *tests/testthat/sheets/missing-values-xlsx.xlsx 21804fc504d15926b10c2d80ac2d4e8a *tests/testthat/sheets/more-than-256-unique-strings-xls.xls ecade93c944867a7ebce36ffe1ad3cb7 *tests/testthat/sheets/mtcars.xls dfb3ab964bcdca0c607299ad75cfca49 *tests/testthat/sheets/names-need-repair-xls.xls 84d82b7cc9a43c74ea76a29b66c084c1 *tests/testthat/sheets/names-need-repair-xlsx.xlsx 53d2098fac7b05be9c5c8c886c5c17f3 *tests/testthat/sheets/new_line_errors.xlsx 79dc66e2a41b6dd1acfa45de9809979d *tests/testthat/sheets/no-styles-or-sharedStrings-parts.xlsx f72877544ed6f11e54894e4592a3bf36 *tests/testthat/sheets/no-yes-col-names.xls f9423633559011b1dc6c691d28902c6f *tests/testthat/sheets/no-yes-col-names.xlsx d14b4277cab901eb5cd2e58da5f08ef3 *tests/testthat/sheets/nonstandard-xml-ns-prefix.xlsx e9cd3a21b26b47b07b8e9ed467761add *tests/testthat/sheets/numbers-as-na-and-shared-strings-xls.xls 002e8c20d48b625d319adc601e0be5af *tests/testthat/sheets/numbers-as-na-and-shared-strings-xlsx.xlsx 5967109e8d2521e09f55a79f8c5f4688 *tests/testthat/sheets/richtext-coloured.xlsx d802b682acb1bd26d12eef808ebe578d *tests/testthat/sheets/sheet-xml-lookup.xlsx 4053196f672a653f7ce4c4a17ed6567b *tests/testthat/sheets/skipping.xls 536e6f6ec2869ec25c8043fccc33bc43 *tests/testthat/sheets/skipping.xlsx 20161b97bdeff4f736b0220d03e711c1 *tests/testthat/sheets/style-only-cells.xls f16cfbc1b4bd5e640adfa174daf540cd *tests/testthat/sheets/style-only-cells.xlsx dcbf8a23bb36b795728cc8ba40a289a9 *tests/testthat/sheets/texty-dates-xls.xls 9ea09b5ced267700276e0fffd0427673 *tests/testthat/sheets/texty-dates-xlsx.xlsx 9e30d0ffd1d2e651c56c6461705af21d *tests/testthat/sheets/types.xls 1561c772f89e2588a7f598b53f178aaa *tests/testthat/sheets/types.xlsx 28be769168dbbde4867ea977753c0a6a *tests/testthat/sheets/unnamed-duplicated-columns.xls 5336b3590ab4b9289a0c3c3697aebd46 *tests/testthat/sheets/unnamed-duplicated-columns.xlsx 1825419b3b022662f6e401e5d8df2181 *tests/testthat/sheets/utf8-sheet-names.xls b2d6a9e15fc0aa6ec3c0696894eb30a2 *tests/testthat/sheets/utf8-sheet-names.xlsx 9c208352616040860ef78dc07337d61b *tests/testthat/sheets/vietnamese-utf8.xls 3719fd55116ccf36bedd4d4ab0d345fe *tests/testthat/sheets/vietnamese-utf8.xlsx 3091acd18bce1ad4b4ebf3a6b0e25b16 *tests/testthat/sheets/whitespace-xls.xls 78337792e9720d4f3ed495b7a218f6f4 *tests/testthat/sheets/whitespace-xlsx.xlsx eaa32df15ab8c71c2d01fdba645d0338 *tests/testthat/test-coercion.R b9fa076eb041e935c2150dfca212fd0a *tests/testthat/test-col-names.R 978871755634be4c7b5d47eb724bb908 *tests/testthat/test-col-types.R be158a023e9cd331f763874c6081b243 *tests/testthat/test-compatibility.R 6ad12b226a3ff40a2ad78f130bd16a22 *tests/testthat/test-dates.R bfdc0319cf2debe8f669b6ce2d6f5350 *tests/testthat/test-empty.R 4f598859d92c33799cb24100f7ceca68 *tests/testthat/test-encoding.R 731f68be117d12670d4941be7ae35de4 *tests/testthat/test-example.R e90265bb695e2f3b5231f2c49803a0d5 *tests/testthat/test-formats.R 14e0192f6d8176c134788c9c690ab5e6 *tests/testthat/test-geometry.R ee4f3a5803f5b277c191241e27198c81 *tests/testthat/test-missing-values.R 45e037357ff417c4cb8f4a00821bcc3a *tests/testthat/test-n-max.R e4bf14b17cfa7e6ee1e3507558bacdce *tests/testthat/test-problems.R 83fedf38fca8e3833b240fbf8ca9aac1 *tests/testthat/test-read-excel.R 247a453126cd6cdefe25ff436e5f7e68 *tests/testthat/test-return.R 3730b174b110107d9e5107e12652afc1 *tests/testthat/test-richtext.R 2d83792dce93e3a26b2b6ea7008ea660 *tests/testthat/test-shared-string-table.R f97b0cb90620fce2a176a74e0dcd0deb *tests/testthat/test-sheets.R 660107bac33be46fef19bf22e06d8359 *tests/testthat/test-skipping.R bd2a4c4bac4d55c885b024ad0a8f5a5f *tests/testthat/test-trim-ws.R 0bfe5b195ed73cffff8ceb301d4b400a *tests/testthat/test-xml-namespaces.R d945e641f9541a0ba07d3d2bc2ff4cca *vignettes/cell-and-column-types.Rmd b73bf56cf20c6c2d59980e6fa982178d *vignettes/img/geometry.png ebd856db4309b0aa1135698e389477a6 *vignettes/img/type-me-date.png aed3fdcd83583160d78554f33d8f9238 *vignettes/img/type-me-logical.png ce2fc419cbb48dc8cebfd5703305548a *vignettes/img/type-me-numeric.png 87ea0b91c80b9c6225a81877732b2ccc *vignettes/img/type-me-text.png 07709c0c944e233728040d3a7bdcb6c6 *vignettes/sheet-geometry.Rmd readxl/build/0000755000176200001440000000000013442224515012632 5ustar liggesusersreadxl/build/vignette.rds0000644000176200001440000000037413442224515015175 0ustar liggesusersuP 0}E,"z?]F7ܺbIvgvfwsB,bl m6wcM Jٝ'(n;q~R"+S,G ,p/ZkjU56Q}6ZM(>d[J-3Qg 7HbE 4üڨ4ɞxeO1 ؏)C=f7?2 readxl/DESCRIPTION0000644000176200001440000000562513442230012013236 0ustar liggesusersPackage: readxl Title: Read Excel Files Version: 1.3.1 Authors@R: c(person(given = "Hadley", family = "Wickham", role = "aut", email = "hadley@rstudio.com", comment = c(ORCID = "0000-0003-4757-117X")), person(given = "Jennifer", family = "Bryan", role = c("aut", "cre"), email = "jenny@rstudio.com", comment = c(ORCID = "0000-0002-6983-2759")), person(given = "RStudio", role = c("cph", "fnd"), comment = "Copyright holder of all R code and all C/C++ code without explicit copyright attribution"), person(given = "Marcin", family = "Kalicinski", role = c("ctb", "cph"), comment = "Author of included RapidXML code"), person(given = "Komarov Valery", role = c("ctb", "cph"), comment = "Author of included libxls code"), person(given = "Christophe Leitienne", role = c("ctb", "cph"), comment = "Author of included libxls code"), person(given = "Bob Colbert", role = c("ctb", "cph"), comment = "Author of included libxls code"), person(given = "David Hoerl", role = c("ctb", "cph"), comment = "Author of included libxls code"), person(given = "Evan Miller", role = c("ctb", "cph"), comment = "Author of included libxls code")) Description: Import excel files into R. Supports '.xls' via the embedded 'libxls' C library and '.xlsx' via the embedded 'RapidXML' C++ library . Works on Windows, Mac and Linux without external dependencies. License: GPL-3 URL: https://readxl.tidyverse.org, https://github.com/tidyverse/readxl BugReports: https://github.com/tidyverse/readxl/issues Imports: cellranger, Rcpp (>= 0.12.18), tibble (>= 1.3.1), utils Suggests: covr, knitr, rmarkdown, rprojroot (>= 1.1), testthat LinkingTo: progress, Rcpp VignetteBuilder: knitr Encoding: UTF-8 LazyData: true Note: libxls-SHA cef1393 RoxygenNote: 6.1.1 NeedsCompilation: yes Packaged: 2019-03-13 16:01:23 UTC; jenny Author: Hadley Wickham [aut] (), Jennifer Bryan [aut, cre] (), RStudio [cph, fnd] (Copyright holder of all R code and all C/C++ code without explicit copyright attribution), Marcin Kalicinski [ctb, cph] (Author of included RapidXML code), Komarov Valery [ctb, cph] (Author of included libxls code), Christophe Leitienne [ctb, cph] (Author of included libxls code), Bob Colbert [ctb, cph] (Author of included libxls code), David Hoerl [ctb, cph] (Author of included libxls code), Evan Miller [ctb, cph] (Author of included libxls code) Maintainer: Jennifer Bryan Repository: CRAN Date/Publication: 2019-03-13 16:30:02 UTC readxl/LICENSE.note0000644000176200001440000000303313406366260013507 0ustar liggesusers# libxls libxls -- A multiplatform, C/C++ library for parsing Excel(TM) files. Copyright 2004 Komarov Valery Copyright 2006 Christophe Leitienne Copyright 2008-2017 David Hoerl Copyright 2013 Bob Colbert Copyright 2013-2018 Evan Miller The included libxls code is licensed under the BSD 2-clause license: Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. readxl/man/0000755000176200001440000000000013406506420012304 5ustar liggesusersreadxl/man/read_excel.Rd0000644000176200001440000001411613406506420014671 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/read_excel.R \name{read_excel} \alias{read_excel} \alias{read_xls} \alias{read_xlsx} \title{Read xls and xlsx files} \usage{ read_excel(path, sheet = NULL, range = NULL, col_names = TRUE, col_types = NULL, na = "", trim_ws = TRUE, skip = 0, n_max = Inf, guess_max = min(1000, n_max), progress = readxl_progress(), .name_repair = "unique") read_xls(path, sheet = NULL, range = NULL, col_names = TRUE, col_types = NULL, na = "", trim_ws = TRUE, skip = 0, n_max = Inf, guess_max = min(1000, n_max), progress = readxl_progress(), .name_repair = "unique") read_xlsx(path, sheet = NULL, range = NULL, col_names = TRUE, col_types = NULL, na = "", trim_ws = TRUE, skip = 0, n_max = Inf, guess_max = min(1000, n_max), progress = readxl_progress(), .name_repair = "unique") } \arguments{ \item{path}{Path to the xls/xlsx file.} \item{sheet}{Sheet to read. Either a string (the name of a sheet), or an integer (the position of the sheet). Ignored if the sheet is specified via \code{range}. If neither argument specifies the sheet, defaults to the first sheet.} \item{range}{A cell range to read from, as described in \link{cell-specification}. Includes typical Excel ranges like "B3:D87", possibly including the sheet name like "Budget!B2:G14", and more. Interpreted strictly, even if the range forces the inclusion of leading or trailing empty rows or columns. Takes precedence over \code{skip}, \code{n_max} and \code{sheet}.} \item{col_names}{\code{TRUE} to use the first row as column names, \code{FALSE} to get default names, or a character vector giving a name for each column. If user provides \code{col_types} as a vector, \code{col_names} can have one entry per column, i.e. have the same length as \code{col_types}, or one entry per unskipped column.} \item{col_types}{Either \code{NULL} to guess all from the spreadsheet or a character vector containing one entry per column from these options: "skip", "guess", "logical", "numeric", "date", "text" or "list". If exactly one \code{col_type} is specified, it will be recycled. The content of a cell in a skipped column is never read and that column will not appear in the data frame output. A list cell loads a column as a list of length 1 vectors, which are typed using the type guessing logic from \code{col_types = NULL}, but on a cell-by-cell basis.} \item{na}{Character vector of strings to interpret as missing values. By default, readxl treats blank cells as missing data.} \item{trim_ws}{Should leading and trailing whitespace be trimmed?} \item{skip}{Minimum number of rows to skip before reading anything, be it column names or data. Leading empty rows are automatically skipped, so this is a lower bound. Ignored if \code{range} is given.} \item{n_max}{Maximum number of data rows to read. Trailing empty rows are automatically skipped, so this is an upper bound on the number of rows in the returned tibble. Ignored if \code{range} is given.} \item{guess_max}{Maximum number of data rows to use for guessing column types.} \item{progress}{Display a progress spinner? By default, the spinner appears only in an interactive session, outside the context of knitting a document, and when the call is likely to run for several seconds or more. See \code{\link[=readxl_progress]{readxl_progress()}} for more details.} \item{.name_repair}{Handling of column names. By default, readxl ensures column names are not empty and are unique. If the tibble package version is recent enough, there is full support for \code{.name_repair} as documented in \code{\link[tibble:tibble]{tibble::tibble()}}. If an older version of tibble is present, readxl falls back to name repair in the style of tibble v1.4.2.} } \value{ A \link[tibble:tibble-package]{tibble} } \description{ Read xls and xlsx files \code{read_excel()} calls \code{\link[=excel_format]{excel_format()}} to determine if \code{path} is xls or xlsx, based on the file extension and the file itself, in that order. Use \code{read_xls()} and \code{read_xlsx()} directly if you know better and want to prevent such guessing. } \examples{ datasets <- readxl_example("datasets.xlsx") read_excel(datasets) # Specify sheet either by position or by name read_excel(datasets, 2) read_excel(datasets, "mtcars") # Skip rows and use default column names read_excel(datasets, skip = 148, col_names = FALSE) # Recycle a single column type read_excel(datasets, col_types = "text") # Specify some col_types and guess others read_excel(datasets, col_types = c("text", "guess", "numeric", "guess", "guess")) # Accomodate a column with disparate types via col_type = "list" df <- read_excel(readxl_example("clippy.xlsx"), col_types = c("text", "list")) df df$value sapply(df$value, class) # Limit the number of data rows read read_excel(datasets, n_max = 3) # Read from an Excel range using A1 or R1C1 notation read_excel(datasets, range = "C1:E7") read_excel(datasets, range = "R1C2:R2C5") # Specify the sheet as part of the range read_excel(datasets, range = "mtcars!B1:D5") # Read only specific rows or columns read_excel(datasets, range = cell_rows(102:151), col_names = FALSE) read_excel(datasets, range = cell_cols("B:D")) # Get a preview of column names names(read_excel(readxl_example("datasets.xlsx"), n_max = 0)) if (utils::packageVersion("tibble") > "1.4.2") { ## exploit full .name_repair flexibility from tibble ## "universal" names are unique and syntactic read_excel( readxl_example("deaths.xlsx"), range = "arts!A5:F15", .name_repair = "universal" ) ## specify name repair as a built-in function read_excel(readxl_example("clippy.xlsx"), .name_repair = toupper) ## specify name repair as a custom function my_custom_name_repair <- function(nms) tolower(gsub("[.]", "_", nms)) read_excel( readxl_example("datasets.xlsx"), .name_repair = my_custom_name_repair ) ## specify name repair as an anonymous function read_excel( readxl_example("datasets.xlsx"), sheet = "chickwts", .name_repair = ~ substr(.x, start = 1, stop = 3) ) } } \seealso{ \link{cell-specification} for more details on targetting cells with the \code{range} argument } readxl/man/figures/0000755000176200001440000000000013406366260013756 5ustar liggesusersreadxl/man/figures/logo.png0000644000176200001440000005615313406366260015436 0ustar liggesusersPNG  IHDRX?gAMA a cHRMz&u0`:pQ<bKGD pHYs!7!73XztIME 80$4[ZIDATxw|\ՙ>3Ֆ\dbllc0bz@Bʦ$m6nv6 )lL%4 ؀qEό{3I,~LKϜ|G0Xw{oLw@'6W0ɾq_.b<#i#Npނ|ؙ{Tepw7?~^u<%q<o G`5 8" josRw4 wB:2ʶ-T1|q_h~N+@ڐ:;wl#f6{<[VǾEmB]`ر-NǓ@\oxK@C=q[zlc[<8}s!5&82D Ƕxp<}UHn6?_-PC 2-B-l8hkG8qh86?ݭ2<ŠCoo/X%K  dx'hnnhaSO=Mr%b>hz͓mfmq x:3^`+q7skmڵp8L4ڋx,㦪ٳfQ]]MQQn`Ypm۶H$x9x`?Ͼ23S ql'Cہ''${q{kQ\DEEE\z̙3۴xɧ [!bj$l ::vF3$3:Ŝ96˗,d̞=@0D4hCwxmv^=&z(ʳE.plL!Fu&6?0=33jJY-zoHϵf`HD7F-2/Jr~֯_c=ƎvgEyN-bjxe8x'44ص_y.@իWrJ BAAq V#x^mgW55 ݻfXcql}䷀Omopb7d'<%'B}4mI~/1k_'??{yt2OQs)a[m6n(|eW𘌥 FW:.R3-['e=T.^8T9LOq)Ԓ%9F6D X:OߟTcVi maJP6KoB晣?h6[sEQwzZ<?Yj{)tw0m'@ > hG!agfJpg;܄˭@wuum(Vc.qd}2h(Z =эu%G()-uu?G"TCflT>Z< '31;_m~B@wyj̯/9뇑f HͅtyjL*-6\1:G[ҽ`eF"0m5birvwfY=po-c7jOW.G8x MD6L.]Hc_zzmDoocxB؞GB3wDd2i @T."Y VAqin[OK0=DT$ IvA5fQ-VWtyBM8[iv g`{ 15K>rNmATZ'V6 %W}-މmKTTj]t-vJFQ'!mX/r{f~03@bKu+fɜ)(i[%eP6 \m(@FJ<ÿaT[J>ĕ^}qlk$ z;9`3UW^S]ڈL=։Y9 ,6oiQ' 5ON0g%b}qm~7|5l+jLaKɂ O~%ں$|;Pm5D"AeE(ΫG?)+W23lٱUL%+`ѽh L:g`o3H{(kVb{ &NJQy-h[\w)- gncL%7S wsEv0Xf +W"raGyC[8 uY32d*@7Nn۸!ԳTP*| qcF Mo~!]ZUbixIV-'X\ƫʁ]t',p{Ti$M 5{iRQ^NYu'FAp16jXesmqyT=@xAglco_c)֢F - Sbm-8p!TviKzzzhiiAJIaaa +Դ ѓ᱒!Wdb_5Pu!а%M$ڎ-m,Ye as4dX`# /uFH@ʱ\luB V38ZJTػ- `j$_ nQœ xߝn~7X eH0>0\)"3gTw몆m[л#b%%sKJ ϡMx=IMY/\AeUp^cߎH}+ P^ze˖aYr*%f\Tjo.` xm~aXjѧSIJKKYx1dPNE44T(**"Izd=Ǭ]Ajа9<o~N/²lZ[XCea/H$B$CMt❧P%zM58^@I<nDeQ"tn߭Il_1EhW]7n7!zM\ͯ,?ZJJKd2ݳO"" ނ0:8,wyɕu3xϹk$?nUnz.MjTH JU~_EEmIT6(o[-gS<5ʴB`J_ +$1 B<Ν(=;}_7 )-+ =g_y%~ f2YV _מw&_OVQYɹkMظak/˟Cxdւ@\,AkdJyIB}ӼDȘ< d@x#%T2KF`M7( ?'CۗDe%^/wawn|W Xhh= ]q|k~~=_F!eNʠ}̞tp+pj0U rT2<[U~,=Ci2&vvNy??x^Hn;G7gõϩaղ%>UH)DJ9d}ڵ==K/eَ#)R S3JJXw;ʏFԈ 7O%MZݕ_d2>%Osk;ŻN2F^@ B bȅdMxǻIqq1p8=Q̶xʶx#P]FyGU]sB,5=;tGhM%ޣGq55Il9eX#4!_r ~Dr|x+$>;KzL9sxMtvt(;>b,5>wk o,m|`0ȵ_7gbPB_OqasfKPU] 򚫳5g;n[ k(k L):k-B%h=W_{ 91(b (C疉Kٳ%KPYU+[`=]r`[, vFafח K pap_nEg~)*q o~k]i ,bY))) l/3.-1p< X++I<'r.[Xmؖ 7W]I&$SyRD|_Ÿ|>կquhm,\q.+7}W‹/jȰ!?pbIU,ZpMTTTp~_}7L+|sA~_˟Mjj̒+p'm9Df_WM ? /"]]v-wXhlhHR\y=pg)љU?Oe8!\83.erbapΚ5\w moͷF(/~s{H.$MM-=]\}\yUWT P $/lg?)6/sWy@B=4#+IX ߯N"Gx2 ::;4 )%1n22d)4WR=~ԳǑΥm\0H&N5<$ 5DPQQA8&" 7VL꾟:8Ujl5>dx|~hoovŰ&Px2BtR2c RpbU¶m<.p>xQ"  %͸\. 'B'-3k,n$_q> G`NRFE<# YX!p<di i2g=i:eѣGOORM43Ϥr ֶ<s%C^RN ۶`BH< B9z(i:px2P0ȁ0M38^&Xfm0Rimmm_F/ԮP 'V_!@?lgst]#3w݈e XL&Cug:q< i(,,$LSS#2`^ ]Jmm-UUUh--0cGD)Aw]lxY ǹͷvjӲqiZ6twD8b477c{9$ĺ8oQ-P 8$Ⱥb@sss3q]VMЗaVt'!-eƍΌ3FXg TUUKGzTjh$m(v?'Hu MômRa (8_q< $ PQQACCX@ ۊQ_7B@GWQT?v!i̬50Źmg+q<X&Iqq1p)mIEEtzPw6LdkT*e%X{2D 4e#T!t&a莀GN<F#5%d]=Gx7D{8ޮ*P._ Nx^Dv!plIn6‘7> D\bH, [Qִ%R)J 1l*Gx22ۋ#N&)%d&(ݑ^աpIތ:F߹S iV/.L&C(…N8hĥC  HPWWG}}==XRLgg'BRM4LjnNڤS) ===R)tMCJئT/#ha8h[טW_Ϝ9sصkHYHR?OxRFR4lF0$ m, Bd2XEqq1^vGX{AիCXBϥ1 e"xv i p'H& xu-LFTUU5 K KO4EIqW\ql۶5kPS[iZ$I<j26<$Sim?! lK*;a[[p`0H8p$N6l%K?>?8Bn\.0H$nR$TfڛHCGd9s&%%%x>B>XZ[[ B!Hv?O(,UX7Ç?!-9SDQ4Myb9'efWm^7&Rӱ$#@AcNy1O86m-455x<ί~+~v#¥5d2dp8eqG BݻEH:er/D3gD"Lg-o:::Xp!e \O^^/mcZ62I%iBsS#@e˖v::x"gIGz±ٳs;? TTTꫯ H$]W+~/maN/4:{1c&۷hoov[3Hb1U)#6)/+c&Pi#uZ8Jx<9UP!tJkF0T]!lLpQRT3#'I,A4 ˅!jŬq'L$VJf'r_B CN8h Ņ)((X*Ķ,,0JqEy 9^а47]]RTTD G׳4xߏ`gk2]>|X-Re2R\$̠k+-L3U#?6˖H)IRRXX.3!qF F&/zt,5TH$6 $Rb^ ,~.a9<# .W\\Lii)MMm3fG6˖$IlV^`M2TgM'cZ U `0:4h0q"N5ҭjN !]8JB|xtKax"-!u73gFel&LT5;kXt h˅ۍ!*DmX$0 8r躎r!bD2W#8FRsaZ6H`0QAaJ J)Fc\{yd g(3Et*I"cZ>;Yl9sI$|NRBI-k[ 6c_6)6S] {zzpgtu&Nw^@H3twwSZV˲ 0,bVx+/'nfh-03 D(**"4M|>xBHȎl·)/%dm:& ɤ{q Gk@g! DF{|$ 2L7Q標2/tM+C.\|ac:ṕlx۝ 9^8`VՅ =hFqq1iXy#AdŪVBL$cWE8f8 PT*E4% eu G۶sFz)e.V2c[U\HFB{G~Z[]`;|p _۶Bix mW!0%wwwd[WGey C}72WS_] ) cJA$aƌ|>K˖q' Xt&%g@YzۘU,4\.7vbӦMJ y#|pӜ8rH70 .:\͎ m4vء*TThGDݥl~u缸BX5 ԇR!ٳ!H!>#)!Ta{MM x{2)q[QZZJ,#L1Mw8$ y1J(R#|BpUB)%tZ5vv*@4p3)DuytE"C^86>2 N#DXb%LWO(I1Cq5WM:ƶmR4ZI/./GE^ɾ_]]+UH$躎fܹ\e?wzm#Վ43 -SRqwevb?o^VW>wSZV;eYMwA"sׁ;E*Vqno fN-H|Ƴx[oöm~.qxs.q#Mm|%RZZȦ]adgEQ ߿s"G0l|{Kaɾka,bM%tfQ-/<Ȟg.8~۶ijj" ^Lh۷Çe߾}O/b Z< sTChP4aO>ATQYQA{[;>͆ vO`|IVX]Q]O={eYCo(v{gz#40qLkTj<*J8<~=k׮UU>I<^/nmx挏*waB;%fvBoT7En"c&Pm]7DwZA٢R=o\ ۇuzl#&H[ +IEev6(4R-HG]). $hLZ&Y,. ʜ^uOBqva-p u@=ȾmV˷:Ư>@KwlF.nCeqiBֵ ׌i ۖhӰfcfp1=!O~/;vp8vp8vp8vp8vp8vp8vpœjbpOvp ˲I'IO34<&m>Viƃ̦<"tkٶ+iZ6}׮kx\3M:c쭑\-\F"cKxjG[#<l $YY1B |x\:-M ٴH,5\Jt]cɬR-ᬹT04Ao20j]MtE:g)Ͻ 8#ú$]W}7 %3YIJhWa*Άuۭr2> xoK֖ˏ\HTFq:-%>egrFM ۍȓ Rrᒙײ|vY6U H)U5]c,Y̿9LK=-a+|=uH f񡫖lĴ (׭ȏeKt]ʡv~׭M2* SR kdhg* okC* xeK0-M{bl>ơRJjB[AmYiٷ'䯞&4+A@8NHI,QI@R^gb %eSYKP{8%k{_B]EA}4eI{bEB^h8 ˓m6$s5킅X/]^=[n`!ΘeKh"#g<Q 4E˖RWQvfbIhe+ْ+V_x6AKU%]]j0 B>t2q"ܺ%W ZG!h鎱aW3E~td.b)2<.3xŋj^\[#W/G:H单Y[,^!v?w6I`K( z8o~5t URY T:$R&zeVWR_UmKzhb}ےŵ|e- ˇT`Y m E*8tD|{^Z l[">˭8oZMÖ}L[viW yeK+i0RǷq;z{dbgCۍ͇\˶YwL*!FaCUXYW1H|t{X=}Qxn[| v5taْ g/nt c.}C|{+N:m,QBuXYcjv4$iM=+V?D4z]_aۑܜzb.?"rBHhSשiC? 8A.j]X=MK.ss5KZ>ˁ:&rx]+ƿn#pw}^o9]|,S޿dK\>7F޾i8}N[- !C~j'm7␗[έGΉ)=='!͝x\frCFMp#ʋ[s"4ev!߰zE~UGMf_Hkϧ :zRӔX"7(RR[cלףq z]j6-$+7Bz3ڜ5{Dl;;]m&"Jے3gQQ})W i5CJIMIP d|\5 Z]¾V6hS[eAl;ZCu+p`IrΩE4Bg8M}-7 [PF+w7MG;{&s* |ԔWU–`*B7%!/vv˧[m(%* t2wzX"5,D2KFV ~nzDe;8 y%Ku1h:vXr3cp4rt֖f$%&u ;SP o wa !s3,YBmYׅK( r”ŪA erd:/9t4A8"gy4kw.O.Nr~)>@2b$Uu >?]Ej>Z-<(<˙wib xP_h)iuB96v{cA)#FJ{PRVqatemo^SMr+;yrG Cڳ*: Ð8.Be-d MYqX:7iBĶn?R h6U!(a9l|x0M5MGM/),}|ahLTS^{Sl)){Yh!؅m!YI9Bd c\X>gϫѭy~ glv76~qO8-%o>>W,yvWx!Ӣ%\n\]:cιO28FEMp=ٟTfO,͚լ[1D[r:tn}ΨïMbKƮl/(VR]4HZ^ג[4rz9gU41,V&sC?lΙ_ɺ3j{^"-ٜd).k"sXlIY]|^8CԶdnU!t #[GMxj{Cn1`K=UUIA}1+W,=q%D±d^U!w"[4"PZ MS5p,MSW,@d#YwF 5GHfve!z93Ĥ XP*7Mϝ˵fu~|[RioJnKD;lo>*޺v&x~o3a_%׬[[b1m?ݍ] 4wx,) y +) yP oX9fIfL) rlJ-QoXɻ/Y01 )/18@YȇcKQ m[.`r7o9g* 4)Y6sWQ`ْǶeTlP+/9q*:;b_rp{pM@uqe!nuCzf g3)Ֆ10>y*B>W&FyvO&xi_+xriB ]p׃/&Oi* aX@: /W`pS[㦳pZNp%AeJ9fXRf땫t2^wiMozf~~(`KeCMfL/qŸ V ԖPSG:|7ܞf2@$إk|,]+NKqzpu9-%?b/uO>xRȖmrܥJeM=-8[Hf,zynO3t׎tdXV1('7TO뫋~.Z2e<-%qG^=ێU4!ry q9,)V̘za* ;ҹTڴhpv}QcI~a;nHv5bgXdt_) To&d{@ [l#/sK&6%33fmʰګe/{0 tƢ'"ʨK8 ۱NV=[41( x𺕀4x۲o^sHB{|I#=SwPst`eDnG٦Z%dߙ@11xoBhTT"sjqxorΜ{`0쉭|ۦ <?xSztc!47t<#?P$f\ dNgؖ6+}x"e`ΜI`30Ш/-u5wv~p:!wobJ=OOY}Y #p0ʍ_F`Ov~lnaJI@#;ϵÈloIɟG8Ϗj[ 5"OjbՖPGm^& -|W%_dG1@vC1ݜUItFda 1?x'_:p Tx=ʉm0;?ǻ0I5ME:ύwk:cdgru\9D͑bZi; nl0l9pB Kf w;!Tvk&z}_F UB>e; }lҘ;?v^p R b =Jr:J@FRMJ%A*cc| X1cNuۢe6HT㷁?*xp఺x_O혎;mSqq)p7_lěS`!ma?_p/]ܫ(>NmEŀktK,R>i@tvۣ,Ex11iPB. |X:cqZrj!XS=X*=Np18;~P=m3?vYz:25)SffqlP Tc3ju8D1yNǶ0Lo\+ж t\ǶLo0,8E>F\B~]oȯzm|TXOctM鉏`D_xǁsFmq!%.]m.d<nˉkԟ߷QoϺeqnA&@jyKxù|O;/^m=cjcg?T*ۚ 5jQVy)^Wq{ ,*{;@WYds m#VP`Wqߦ}&WóTv󋵨E.wNz P=eߝcQRT!QvHA*:Z%;?X>7,qQӿmeqm)s xӴ㪙Xt`A U 㟀n/>lQa~`6Rm1uMb"]X0[gVnv5vŶL5ƚU$5%Q6_r)Էgʆq5/=5pN=fSu;hMq5< s ynw3z}鏽j;yagPS3c  #S(%ѕ!R*Girx}lɺ5?>H"Û[@{<Ŝ,ˮlXr t).p܂2P8an8jn*)t,h$ГHsZ{K"maIG7 (IT&U30x2El{Qw[8GLV%>^T[6Q_йdi-[n^9A2Ըuۊ%`;y13c,jۢ;؝DPR[$sxC~ř&34uuKʟ^DPY`٬2v7uFRis&7 {'P *dtqZ͍5g~|<O޸_9Ē^7WF6v3 ,]{[xCh csc[zߣ湿e~C1`!7V_C5j~ܷl5 183jK|7WwpʹDS* <D:[S׌3 LbQVnW}D~QJ!ǹ|I̲,3ظʢdG;Y2'啃ض9k}dB;Q 8.5ozo[ʃG afY"?!W=ǥry#v ~kHKشM఺x :)DXnbk铖i۔5A׭C\rF-#xg) <_RjK(>Vs}յ_gPF -ވOx{€ϝǡ3K|-vV̥_<8r|m~ϣym(NXNl[c[x _e ލ{xڅ4t8=,f½SaS7Q#@NEErSb61cVE߶&u l`rRcCx*3tA5n~ Gt[!B `FI"?Ol=7=`kX&T!uKbM7~!73^}%)Tu|5tD>n\=[7fڑ6kUbMdetvNa7=~=Nm1ǶТJB>ںz. RSO6|ne^(/i; cm~f& Gж'Q-fB\: gWͥ'7ŜzbIU #&' Cw[\/<(%Dw_fgwzuh2X;`|=>tn8#H8mq.SͶ-Q X]_Ɂ!"fi_+gϫ靍l=ܑحٌߙ6GжwUc:+ tG|ek S_UȜtDypAr~6YcKAesH>v[ mY|ki 9!ss;˘[Qg~,V_׋JjyRM7w[=w[KgAu1W, ZY&ǫ]}I7pPu&նhE/q2ϙ}-lPSd,D256ih('z?fv81`E &ESg%clJ̞E0Ks,DCQnW -ndlRR[/eos g0,̒ /i}i!`"F]B8*{6_Ug&#M&̆|BKf*pʹ$3|~/!"4ێvODc1UΦEsn~` v98&hKqC׸:Ľ9e[* #vJl~N2BO4?Se[`F18XұM3OmPMOmQJ5vl~Gͩ-Bv?wl~A%d86<p>08ܞӗŕ+4jRr:t(&< d6e.|p78G@͏1jql~SGѸRd+jĽB7Oq*4?~*5 n[0mעǣ-Z}o,"2Fm yPTWN9Oe q7#@uT8qTx;G9ByrGӉo@eZPBv;p<VWVr8V㵒8B}%tEXtdate:create2018-12-11T13:56:48-08:00x%tEXtdate:modify2018-12-11T13:56:48-08:00r|IENDB`readxl/man/excel_format.Rd0000644000176200001440000000307013336631200015240 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/excel-format.R \name{excel_format} \alias{excel_format} \alias{format_from_ext} \alias{format_from_signature} \title{Determine file format} \usage{ excel_format(path, guess = TRUE) format_from_ext(path) format_from_signature(path) } \arguments{ \item{path}{Path to the xls/xlsx file.} \item{guess}{Logical. If the file extension is absent or not recognized, this controls whether we attempt to guess format based on the file signature or "magic number".} } \value{ Character vector with values \code{"xlsx"}, \code{"xls"}, or \code{NA}. } \description{ Determine if files are xls or xlsx (or from the xlsx family). \code{excel_format(guess = TRUE)} is used by \code{read_excel()} to determine format. It draws on logic from two lower level functions: \itemize{ \item \code{format_from_ext()} attempts to determine format from the file extension. \item \code{format_from_signature()} consults the \href{https://en.wikipedia.org/wiki/List_of_file_signatures}{file signature} or "magic number". } File extensions associated with xlsx vs. xls: \itemize{ \item xlsx: \code{.xlsx}, \code{.xlsm}, \code{.xltx}, \code{.xltm} \item xls: \code{.xls} } File signatures (in hexadecimal) for xlsx vs xls: \itemize{ \item xlsx: First 4 bytes are \code{50 4B 03 04} \item xls: First 8 bytes are \code{D0 CF 11 E0 A1 B1 1A E1} } } \examples{ files <- c( "a.xlsx", "b.xls", "c.png", file.path(R.home("doc"), "html", "logo.jpg"), readxl_example("clippy.xlsx"), readxl_example("deaths.xls") ) excel_format(files) } readxl/man/cell-specification.Rd0000644000176200001440000000510013172305601016322 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/cell-specification.R \name{cell-specification} \alias{cell-specification} \alias{cell_limits} \alias{cell_rows} \alias{cell_cols} \alias{anchored} \title{Specify cells for reading} \description{ The \code{range} argument of \code{\link[=read_excel]{read_excel()}} provides many ways to limit the read to a specific rectangle of cells. The simplest usage is to provide an Excel-like cell range, such as \code{range = "D12:F15"} or \code{range = "R1C12:R6C15"}. The cell rectangle can be specified in various other ways, using helper functions. In all cases, cell range processing is handled by the \link{cellranger} package, where you can find full documentation for the functions used in the examples below. } \examples{ path <- readxl_example("geometry.xls") ## Rows 1 and 2 are empty (as are rows 7 and higher) ## Column 1 aka "A" is empty (as are columns 5 of "E" and higher) # By default, the populated data cells are "shrink-wrapped" into a # minimal data frame read_excel(path) # Specific rectangle that is subset of populated cells, possibly improper read_excel(path, range = "B3:D6") read_excel(path, range = "C3:D5") # Specific rectangle that forces inclusion of unpopulated cells read_excel(path, range = "A3:D5") read_excel(path, range = "A4:E5") read_excel(path, range = "C5:E7") # Anchor a rectangle of specified size at a particular cell read_excel(path, range = anchored("C4", dim = c(3, 2)), col_names = FALSE) # Specify only the rows or only the columns read_excel(path, range = cell_rows(3:6)) read_excel(path, range = cell_cols("C:D")) read_excel(path, range = cell_cols(2)) # Specify exactly one row or column bound read_excel(path, range = cell_rows(c(5, NA))) read_excel(path, range = cell_rows(c(NA, 4))) read_excel(path, range = cell_cols(c("C", NA))) read_excel(path, range = cell_cols(c(NA, 2))) # General open rectangles # upper left = C4, everything else unspecified read_excel(path, range = cell_limits(c(4, 3), c(NA, NA))) # upper right = D4, everything else unspecified read_excel(path, range = cell_limits(c(4, NA), c(NA, 4))) } \seealso{ The \link{cellranger} package has full documentation on cell specification and offers additional functions for manipulating "A1:D10" style spreadsheet ranges. Here are the most relevant: \itemize{ \item \code{\link[cellranger:cell_limits]{cellranger::cell_limits()}} \item \code{\link[cellranger:cell_rows]{cellranger::cell_rows()}} \item \code{\link[cellranger:cell_cols]{cellranger::cell_cols()}} \item \code{\link[cellranger:anchored]{cellranger::anchored()}} } } readxl/man/readxl_progress.Rd0000644000176200001440000000143113406506420015775 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/progress.R \name{readxl_progress} \alias{readxl_progress} \title{Determine whether to show progress spinner} \usage{ readxl_progress() } \description{ By default, readxl displays a progress spinner \strong{unless} one of the following is \code{TRUE}: \itemize{ \item The spinner is explicitly disabled by setting \code{options(readxl.show_progress = FALSE)}. \item The code is run in a non-interactive session (\code{interactive()} is \code{FALSE}). \item The code is run by knitr / rmarkdown. \item The code is run in an RStudio notebook chunk. readxl uses the \href{https://cran.r-project.org/package=progress}{progress package} under-the-hood and therefore is also sensitive to any options that it consults. } } readxl/man/readxl_example.Rd0000644000176200001440000000076213070523305015570 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/example.R \name{readxl_example} \alias{readxl_example} \title{Get path to readxl example} \usage{ readxl_example(path = NULL) } \arguments{ \item{path}{Name of file. If \code{NULL}, the example files will be listed.} } \description{ readxl comes bundled with some example files in its \code{inst/extdata} directory. This function make them easy to access. } \examples{ readxl_example() readxl_example("datasets.xlsx") } readxl/man/excel_sheets.Rd0000644000176200001440000000106413336631200015244 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/excel-sheets.R \name{excel_sheets} \alias{excel_sheets} \title{List all sheets in an excel spreadsheet} \usage{ excel_sheets(path) } \arguments{ \item{path}{Path to the xls/xlsx file.} } \description{ List all sheets in an excel spreadsheet } \examples{ excel_sheets(readxl_example("datasets.xlsx")) excel_sheets(readxl_example("datasets.xls")) # To load all sheets in a workbook, use lapply path <- readxl_example("datasets.xls") lapply(excel_sheets(path), read_excel, path = path) } readxl/man/readxl-package.Rd0000644000176200001440000000317313431612743015453 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/readxl.R \docType{package} \name{readxl-package} \alias{readxl} \alias{readxl-package} \title{readxl: Read Excel Files} \description{ \if{html}{\figure{logo.png}{options: align='right'}} Import excel files into R. Supports '.xls' via the embedded 'libxls' C library and '.xlsx' via the embedded 'RapidXML' C++ library . Works on Windows, Mac and Linux without external dependencies. } \seealso{ Useful links: \itemize{ \item \url{https://readxl.tidyverse.org} \item \url{https://github.com/tidyverse/readxl} \item Report bugs at \url{https://github.com/tidyverse/readxl/issues} } } \author{ \strong{Maintainer}: Jennifer Bryan \email{jenny@rstudio.com} (0000-0002-6983-2759) Authors: \itemize{ \item Hadley Wickham \email{hadley@rstudio.com} (0000-0003-4757-117X) } Other contributors: \itemize{ \item RStudio (Copyright holder of all R code and all C/C++ code without explicit copyright attribution) [copyright holder, funder] \item Marcin Kalicinski (Author of included RapidXML code) [contributor, copyright holder] \item Komarov Valery (Author of included libxls code) [contributor, copyright holder] \item Christophe Leitienne (Author of included libxls code) [contributor, copyright holder] \item Bob Colbert (Author of included libxls code) [contributor, copyright holder] \item David Hoerl (Author of included libxls code) [contributor, copyright holder] \item Evan Miller (Author of included libxls code) [contributor, copyright holder] } } \keyword{internal}