z˩H:kBtDmBB K>``wJ6 ݀w܋`[ t/mW= o}PnM@iH6jh|p@to}c}羷X:WͶsxS=g @: fk@WnL6b ̻=IjY}pխ`[1 9*.iKn7Aw*D4=>_F_vꤊwJ! >GZUZ4Ѐ 4M h#FA44ASF&iLADLG=3HhDD 2hOI6SzM=OSzoRz@QH =RRE4bF&yo*6)dCGz@h  h#@ѣ h24dʞS@FF'FM<B& a2MO#&Tzz*zL~2S=A?R3P @?wHӢPGPR-?z|게QOV? Bm)(c*R>Ŋ)iBZ0c?~ߟlܩWm 8͡jg Jjlbr񻜩deJ HXWhDI߯81`̥Sn¼e 34 0hI ²o1ښ6L/ ȫ5O_QLb @XS5Q(b??`6B" 1D7*:,@@n^nY֎5h!J@h[ RU1`QÂFGhCD!t1A0~ֱB:3ý!srU2c`d_v'( 9H(Z??y^ #Hި$x*q@e c?*XAZ?ԿAX=!5]MFoSOH @(]|EÏJՇ(4|լk8j}~:t{!Nd? .֠)nc[E@ |\vm&K"~M+݂ @ovo:> ^p9HwJ8BSm׻@>!utgp9qg(S|]Vޜ ӍWaTA7{%fu_N __ YQ P}: A#{ʨޣۤݭ`ߥ ݅JrHVȂw`qcp?ay*T/ϔ'%Υff>v}]qPgݾ(/{'ŧ 4 ܄zk ;N|%6pNttDw~?3CГ$*7f_qB!Eh1Z?ROϠq)SA?m ']tHfbX9雎%HA/s)'v] A~?|nuFI <+m=XSJݔۆ?;ͭI--\`K#0 \ (Qd(GNRcZ堶5- ̚" Z\;dʍddEhhqX"HX..闋#fx;7~~?A?kB ?X`doCG{2ΫHE$*.{SybB#7GC\C#RSӚKMʣ0aK[ꛧ(?IQuˎ^G>B8lO0<{ OR׬p?17(I|@'M$+ǂ+/L0=RH@|d =) ϢV\>PN|(.DJsd-AB+GNxzά r1z3Cwo;l AHb6LB@X| WyB~P+I[Gή޵f*rgyE+_9pEa{O.b",?"7/Tͺyq- tt,=qJmRBU];Lz$I*YiGH܉yP."J EJFARHdsѺzZg [H@oqfbtY#&jXw:TFtShX{}8 "Q׈b( 2= x[ ꂁcDC?9bg ~}}Eּy뮮zv:{/5Fv"zcֈZ.! D~H@%Kh+clTm+8wwiףvM3" o;/wn>?-N|1AnGvuࣆ %KKE}h= ZsV!OCj[ɿJ̎Qހ6|VjP/&K'ζᥬD(mtQ)DPj@ yc[Oή>4ykܽO9ҰNq v9MD*B)?k˶k ԓ6,@A3a"w/ʛ}O[1 `AF(Rk@i]@aTZ"!,mY"$LP^$>S{`P4|lJůsQ1: WFNPЧKmsbI(ƍmZصTkAkm)M>~Zh׿7r]661~ۛIF~ݱ|4%&SY*2]eԋd6jrdfı2c{_~aƽ8uH@|q؀{Uܱ~)#TREAsD߱^Ƃ:N COsPHW3p,)0 fNWmU5UPKUS)_68=|'Д>6MA_ұO0ɲ- ft:`Z0&y@dƒyo<5QyH`~`fg5,2蛙͜nyo$i>*zC4Akɳv=h Q7 FUW# 0?B \%9 3cF1 sI=jϹUeh@R]3wg* 3UX,\`}D&]0 AF8DDpD$TLewe4QE~߻ H'*o\ܽfȓÄi<.QNx{'͏?SRUHG!󴀛FWxLLθǑt" (8*l!IFKQ<6sLqIif# 44A\y,DT|H[zڵR KO-W%5Ѱ᧡g۠ [{,Ir6F.(2 DwB"Ga1nP`19A&8EV#c2, kH'(G)=.J/Q\J4I4nl/_̪^@άTI$(g(B$UV %+X/'+tFS #̢Y ICaQ,+Y׵3Ch+Ɗ"3M:Pt?>}Lϫ̟u\Zd D*O@T=EH:V뱃iz'Oqb+a8n|BM'(F3hTz\ي$:#BAy"sF% *"X4 \JEڼ1aoو3~>U'U!A^']#}lW+f"ٺ !Q_}ud)zR&Tpj#-z +%zVfQ^] 2 $C$?Zii^Ѐ]XZ2х5ls 讑esR4ֲծov*- #Lny5`A&KY$p2N ~QUDM?jya@s,+oϲm~O} 6ݙF*!9ALNZ[Ǐ3:S~)s1JCY^$Fg!ԯrA@ 玟euSF]%VDPT (dpuH q[ޞAb>;خ|=(䋟nqJ?n_҉ UATbŵ@SLEs 8fKED "ꉗz-˝$ѧK`J@oI :@/ Gʵ Db/~1ր H(R?( 睵7BkYk8< Bd~By̩' `l4_(^!itkSk0dǑ~3h9bpr j/$v Hޟי!$A[? QO4YqDmvqi`B)&(PV3G/*U&`I$8RFUf!<&;_Ä?ɦ휂F??d<>8}z#2O8:dLNQ-(pSH47ۡH-盕NoG_$7|>N*%MNwh:'Dd:f)TKX4H1`"`" F &2RfbbLI _s"Ęn(D``c,hD`AD$ Db@tb!㻇8w&HLdb  b"J$#  BR1D $E DDDF""  DDMb(DcF "1F01Db)]ݮs\F"(.\tRE!D#҈d؁"#$Cq($b("( K DIb`" (ђPF#hF(`b(F1F"0$C 1шF@@Wp X a?_ok掙~H>o>ת m)*(k[66+Xlh삊(||_=Y'|k?1wݐNb*  cc*{7^1Al(DHI9-(x DO2f0I|$E^ȉ 6͟+oƤdudO(k9Y-gJrp[ᄡn;"6l1q&@b*Շ-˂JnY}@EӌpȈEu;˼XCqh}BIT: :Y5_amμT)ar:qwiohs˓^t?P%2]3Gon:i7Ucn]o#zX2^~}_n/3ùk$4z'k)e1Z" WgV-I{>H41K-wG:Hp62|-y:7s;fiUTTu[Ə<~1 e:qH4[1}FrGQTl <.=\u.,#31`9;szғwCAci;V[gwVG e1TR1}WUWL#gӭKr<.BwHIZo`f>!)0X>_e_sΦNi"[i) Zy#X3Z^AoSʭxcY 6 (]UEC]nkm&nPh;^\H4~t<$t6*j1Lno{./ߦ4°v?a(s%']k:@ީ 6*8f$G h;os(8i8È:^>ꯩCT $!w!.3wkm&:Cs)8P<8pڀ棜JD?>8Co.Q Ƕ@ y$KSR(")TW @O2H0MǯqL>Ԏ?bq=l1w@6$@?чNwN|BWcxvO` dL/njS잃~9ˌk5|XyB)~(?(uB ќ DNX,螾S2N E(!7&Jk~j4gY"᷻_y%[}ӹ6JBG0"w =w>Y ;L / :N@C>h~iq=*s!ov=tb@ogW9[lw:AGVD;ɥ|x'wyN}}&m,՚ߎkPIub'ۆXD@)ctGlgSD"(T@"Uw{ñA$pL3wGOFDDMeManB&.Tm[Md$fZEj`e  ,ء4A5[4Z% 2Q 5!ɓD\2%%PCD14RF̥4DI9ur?R툉}+Jm5Q,dTMj_tӺƃ Q6iDc!&N2C =09z/!K!keƋYHk#Ahmob"TUl)SdFLͣm&k)4) i[ 5da0QI"(DH4e46a(4Вcb$lId#6f1A,ɒhK12IvQi &6)Li*5slk0i d-&Moq)6 I)RJQIMI+m1]ݲY2ieȰEJR DfS2BSfȠ?Dq IO;v]z)_&M=$z>Šx> hW]@> 9JppjyvUJ't=VK8Y!"'$B}4 ܄df"h: 4G 6 Sv2SG(e(POJJ+'O9 q0> uvY(APu%fhݶ;햝LHtžbNАNx$;u&J#v)Mu}`O9?4Ad3xj\ :`62Ri!8 A{5Gu#ÎioC D {asц ,a8Ⱥ9ݱ_~[(q C m0tj(LC@Q^!>N@݀j:4BNPPb  J!O]UTс_B D<T|y=@|Á)&)G4Cߎw7; o3CJ>/4t XC$Q+wdML>j1U|* 5>b`EK$|ܯ $({WѴ>SeP%:r}v0 VT*A4(y"=t^#og|D쎓a9<"v ȁ|L5ݒPV".@ h쾬\u̞QAv:0xعƻ:ݻ@ P~zb)H4DDBl'sNf/f rrNX8 H Y'I>a5qA}Fd 77P-`mXt'<"qw*THet>j{xny-u .-.%/?S;[DT_YfjSx"֋-J4Š(>Ke4en'"3er;CxqpIj/jyV]ơĢ&Oc+ǯs0<a%`CrP ǎ$6AQJo´_\[lD&WIL˽uܛg{/">0r.6~QW!hڢbP~HbxrΦCETE-,He[0qlǥ\(`p BX|LP"56W˻iC& (!Ʌ>OF39`=¿iy}ƭEC]ýKR$Q/(_A źIxci6^ܠAAHP*P$\/_g>шd){w }\.ǎAPWX1[և #ђao@JTV [F \[b# .oF](xs:2yLޞ=kQ,_Nr4^j3mMj)D"-y4%FbA3s뒽NM 0 A џ! #f/ZfI?Pה!BR\  /DyO>xv>GI\Fe@(Z0I4!*,CK <@XTC b!1q #(tU˺e@զļl;t0{ ^ocxv92v&?C??:-sC#@VQ2{[ナFk`p1@1x&zIQv홂}!#dC@"1†~}wvoܢFS=.!P  G߆C@AP@FHbR se vPTFֶ*G S?3"s맋4=<0O3D  {Tbd ., ^Z+XynA7}<_aoY BcX@9~ՂN*{fp6ޠ q 7f Vj%+DQDe}sXeX94OVFπBc,FO2i`0:FYoPoJsOx*8/Px!14J0 Gğ(ttO| aܘ0I2Y},́A󂁅$At}=vu;PD=寿{~`N㧬`$))Y@>Ż^ 'lBNw; 1}ԁ";/w{(08;㵆LFj)hB1 9Kp" >UeBDJb7/ߡn/F[q"@"­'JdBN_\!%B~-;iqJ#Ki SF` H=1! ;%fElޥA܄e2 $, 7wY%QU 20a0StF n.zZ_Z9ZJ ڟ 94ɯ`H\rPdngx/>"~sg{z`^9J_/qdH0z+l"`^& Qᡭ&'] C)*KxFު{$,,?Imv7[Нb@F Mzd4*$R^\4 \pG 6'pb|u$[<|T@8ݏDԒĠWE@Y7tB{;KceKT.)2da臣߯BG_2|]++1Bd9e% ora[@++ #MmuK5"qn/2,_yEB.hekGp9Q AB,vu>_B:AKO[+S$O ݱ^BкpP 53{M\#9Kէaғױ`(1B0T`aDyo<ȭl> WS\D,Uɖ |@BdTHP!5좮=jNo`ϱƻ[ u:ݣ(}ɓbdaݡZgv"*s(2'\*;Fۃ#.R+^QGj8IC[>4t5,ɣ I8fuVAJ :R:[ C)}S}Xp|dxg߰{ù%$J|rvilB !D)zOk^ *@U-3A)d`)8+ A3P"zu;gNO2_r!Т̲S-P93!YG0Gꦛ(]51- $d(sDx@O+8Cףǘ )h|4fG_?;ăOGt{v:%EfYx 7TҬdD@sC_@e҄ƪ<9F7DG-DƽK*`b> wiEnۆK0`JY BP@<0&3DKLE. -%2T{8KI I$VUR!=\z*  Wt[Z %Iymk߸e |~wT *unm]k)kQK5W޿;7b?ϽdgA }. / Q`A<[(#( f/#j9ZpSn*C@_^`}zb8d=z\-qH'Bg @!9~q9n{A 0՜Dו9{JYz"@M%ONF#X@@\&9U!PFGͣ`HVTBA&A-X>^_% `׿12Y \AG`tڗJ]lF=/S!Dǃr0JLjWT@ 蓁C&7r3cz 0>lOթnEJ}g}68a8tƸxK ,U* +IJ9ZTDo4r8L@GG~:1m]U烄9??Wy Ne@\!KdÏRړy?}ajZf&(c;pGęr-Ss_rry਑mC7׻H%-6KAd;*~>nVM40+V&TX]G@b[؃$8f|`rXk`Q| $;!ƠBE$B%i=y߅>s>MT%LXnx1%KwcYQXdC"U~A*TBg|ts0md@,6, ҽS#E0(wUfAQR%cX1 0ւ̛h*mC{" n ` ^rB(#_o-Bz˟Ftd`ie)YRDښ%i@!5$U BP҆nuiWǻ+g8t9wס΍SO I\J'.=03׮ߡgD&  !2c荰nooёCl-G(%Aȧ&%=;g :jhJ{-MEmbթ)VX6XJ"(3zۦΓн]F ;YRwG):|uufΕ%+k9cR"9eΐDSQeYnERC`Qp8*"IAN D-9.DTIP<ݻ UV((_ g"dl5Ri%J$(̻4d4-ȀH@L>=ur ]7:j;T"R%dqN߁||>z=m t B}os~AHgE)=iw Nkp<2yg∀`uʄ@UU(Q*H~1VW5 n >#( {}XEDv:d"UGE"BJb=I{m>Ϋ# ΨRX:A8 ٮ^*4g$F- "OL'[Pe` Ar7V^OzV|fP0k~h*;CްGjfyv}Pu@&1jt[ېyo|k xG)]ӚJŽ  A oPS'``#4oVvJ6 0PaF SS}ԧ9#hhb~\œkeOO~7;6 8 0b:X40GT fptqMkifPkT7H8R gPU2J6& ȴhR . :sI  L~ O/n)O\_OЇ/'??[к; ׮ {SH@X,ÀQN3#wTF%֬=zx¡EోTεCvBϰ(ľ>P3h͘y( fH#+I*!IП;Y8&gHaega9!ҩ\Kh ŗ@BM4 Bpv!xZMxR5rElb3n0GQ76ӂ3`PjD1=P~#T̢4B{vBnO"&g&m._ޛ2ǏkD!{(7\1C 9 =Q08FB:5a[I(oS5 1鮎ޭjB"eT!aEq{h1u.֘ʌv2A = ;pFk`a88 }~}o_LQԫ!%Sy-:HG@D'CBϰ["zэf?N5s61';V֏1sA2Љ>{$}yMXor*GU-ܪf$I !_5xiR>Ŧ-?A*RA,p󮜥[0i-ΟT'2XW EqLk[&*bRW3=ޕJ>O)#C)x 4Q^BiMX  t`ĐD $|k"F"`VIF1ky{XN;O<"(;X+5In,dH$4LRϝ~Xꆮ,btGkΥ"i 8^v!X(޷k\CE9`q齅A iJ F7g`54 c]$9 ; Gu6td 4t=IorMֆys.,&:ȲnaR@pCKgNdO+o|+bdk<Fްu}}HDZO vg`=~nj1u| Wo;hb$yXc6u'U\D$OWCXu{:"h\qT;jtYs2p|cO\mC `ɘecݩ_A" 7}[KEKw MșO7,dgC܍Re^z D8-~Dw&iBrުUJrz)w}zXVA̿!71q8**ӠJ[ҭZsY;_G$u"BxOEp2ܽ]}As^z]/#r9u( )~q0ĦW;570a5YoC'a NfAİׄZFp@x5+*q}?egBc[FaMT( EG QQ2r-3'-`bkǿyCfR&(bP|'*و#a 7fDY{:E"RRI!XA E!Yg`~ax1)"XhPG|W]bϥRt51TsVڎV#akc$hJgQ)\^G66Us]hu/[A?6:c~T7_x]'`> )pHaHi/e]P+_|&ri|k@YuP$j t]|d(1#@#cGCG};0Մu"f.ކ xx8O` 5ȇ!(vH2>\(Q QĨV:(H@LiŘᇍ:F@Cj>L=Rc,C~h5P JJBR,yXvWJ$zGDz 9^xycc_ `I'8m|beKZMF~[~fhOFAЛRz"6)'ncȎ1{/PRcBCYBVnϤ\FbyӚ 1΃̄:$G%n pT7ˉqua6\R1HY^|7?3>BIJm/! j5 ᨤ9!ˍ |mhd"%j$Ё=;+1$ZB>\cm  !jޣXv(ɄDy@8f/T~﮷>#(gk|:q|' EwoY_[w_͎f/a?0JSV%P[@׌;O\+Vo6"p(z|JҠXA`^[h"U:BFzϚQYZdkحGcЏweQ@XS{vClsNnŵrt&cuf" T**$@' <*'S51 :QcXUqyG=(E;Ͷ#"{VrfqeEC093QBAA t@"IԀTy C4|SbrwTJ\Y qcoSYfk[/x|͇ LpH~κ|ՠxBN5&@BuQg*JV0;TU@4 hs奪&AdF|g><lDFExl姚uTNߟʟ~{nppg׽ÆP` "EBd2Ze$Rպ;i%||kQ"\ɂMЪIa8{EQ8A&9cd#TcHt)Ɋ9 %ͩtqSլD(ÅV\J._H $̱%*z1aH*r|HDAy8dC EjՔ(!R* Rf%f;V2W`Prä72 *L WvKK\A=E>>hCƖc{mۺ"w'(]01s)WwBTCK6]JaYtM0E4Ҭ"dd7qpHYFN! VS- :3qMߣ,HdFavV:zʒiwk/%R)R 1םZu hz!˃X6@Ih?ؾt?k@^:`nǭFRsPe5GE3*R0Yn`Q#5,.^$H7`3~@!koHn7~5]Gy{mk}ba$_%e1[@?oվM9E T[w砿$SU!79!2dPHY/{Q,wNXN*.2 !f^d %T OسPU}Ԕp֜"-.ΐ!At1s$j=!/$)};!,<8%J%؅ .0 |?3X"*QĈg0S2ؕ([G=& j-ڵ)I ,tPWF4EYh%>*K꿃*+8?8 YiuB||e7W}퐰@H<~h˳t7*A+잢*dOz2(Q7GiFk_8AIWZ6M:o{ uO&ꂷ;Bm'I0Q~MIXφRllClRLTou{Y!bs+HhDz(u9@2^( T0rpdp_D"hQy0A;GPzb8A0yAza]A=dGI@|VN0 Ft(/{*(HaCw_hXl 2M7H0Ter`h2`Y@+U _.qRNET#Uޱs keltH⼪hc#Aq䈈D@1,/^5 L_{jVs;'*DYkcԴCEFCBAIaВ, B)6ɑ?T~/Tb[r $z1*-~46&u<,u{:C`9{چkMgΐE8z0^90g QPAJXQ* k]X39<}L!o51tDfZքޣWTVƾ\w_!]㤁T@mtic(VTJ>*:e-yԨtNOK~Y}XfbLUmNHqYa+Ʒq~}  ( 8H"b$ LQ,%ske Uk:nDMM>|RuskC,Ɓ:J J4+ !j]yT{;mA]-^l!Fv!K QR  ơ^;A.FM-G]Krz*>(F%S 1b+C]cpVʎѓ;,8⬼K-~D z{{ E-q&r̬%~ h%LHJ6 eI_nޭÛ@c7JL~h;HD;!dcQT-p8Te7<[n;Bf۹ǘ҆߰͑|ny(0ʖZ h0u8H&~t+" %`A'0%m,~ p`T>%-GΐBMo(fPAdzLVr x|bir1,'&Y'~+! @A-MTâa9rVbяF/VsE52m欖9E-pn21Ȩأ0Wҩ)͊}fBʓ`v@5(&Q- G^Qef̙@e\ل @ o,TN݃ྎՅr\KYBLPAz%٘y,$W]sRE&DGu*+8jIj!h@HBR ߈t @iD&򦾦f߮Lx GőG(SŦDEpxAA~Rh V %D @hMwqʮn2RR% D DǟZF%(JD(C';cI! UTggc_]h/1i3U @F CF~oO^!5"hqYQۣ0A1`sΌ!8/JIXrSic!IâefJA 6s #b3WH :KCR`E&$%P 8#i^3j[e[8^E!^$5T@!\]qYz n{>Ko6w_{  "fpܹ`H8MJG|™, GH%F/`ݖ(m@(ccB}?(#d`hO||iN1WR$n$D "B7H8 í Ģ"dxD2.J)5QlWl0=bÚCL K9!K,%!EUU;\=^Sx3Ж9>Hؾ-Fig$CeDx%bLF`|z@ U1~o0@w2-U s`;B;\{V♕=gY AW"m E[ziCclƁXWR?YyW6uA (RNU1:VgGE \+]8FO:;.1 ʥrSծ:be$w(7+o]ɌZ@`ޢ#"dMALoEE1dV@DyZѝ{gɨOXCz&&8{xNӆ3&4p`!B8A{l2wtVfKW]. I03vΐ#Eyt?Bþdd04?C4:w!Q`SRGwP5=&_ʫ7 ~\YČfa* ]hxnB_6 mcـX A/-X ڐ䃑w`"dPp;B'u*~ q~)4i QVm &H;U\A }3`QbKH<0d8n-1I'w]՘Coۄu U}7'W-g4A" q2۔7h IP3Cn. D6%`#C`Gj(!u}Pg<Àlm HS1ۘD%rQbeD}⁊fDgEQy%.PD6[Dd m0w0rACc*QVC2(  {$Fgdx!lghĔ3FLJD Z.oJ6qz 5x?^ ))Ii[6:Ns ;hˆh aO]3Yf '@ @fDg̴tܳ(ЄLߥ❄v<›RqU& @o;Ƣ`E^WZ.LM| RI*i|W8" 'ЪE Uauaan 檸h\c gU@% dgZːGCDI]-[7gx ($T8(loM̛ yɀl:Y~(_VO$.J>{fwo 6伓J:LIrgy e V\eKKȼ P$mXɝxj@8 QKDLt_l~ҫ&>^}8F19CBD܍o[۟jF0Z\)r{  Bn@; Q\ .Ƃ@/1"P$=_I:"3 psQwɛRP3^Ilڱgiąt :ƚK9~-z=UEU4X4*L/$48BL8}GF(ǽkw(%>%Hr7v 5e&r˶;;q2hh0dh #rKGrʉb|YY|:oFL)߮vW1Ig&cbH5˿ckj P) $0M0WxZ3&c;Hs[60$P(&sPnm\%I4Bw8 y:qFeQo_| ie$rah^Kw3-bA d2hsN0` ]^SS:s7oX82#0 6/CNN~:Ui6?c a,Bл궷 3*(ñٻ [LؗA)NS甛\F٤>aoI~F$O$ز3q+Lb3 6y,ri^PQ )܊`АS0Bzh:@@D@}JF{5%<ݎBjBB򳥕I:5FP#i" jX餐MT &X[rrݑ % ~L@p>ƭLO~]e 9T$ѐ/(~j[ TCԵQbd3KG P: w=*tEQ&\uQ!"amK_W]@r8o$$";_P޾)uӇYjzs"_qhlW1c5Q,iĬc+p Xx>d])کe Vcg²BT׸3)kf=(fRз*BRdzA5 'mEhYNTp`%?H9# Vw& }L7ݝxOO-ʐ|_%mQMYMae9voU4g1SEֲۥxG~i,VO1) +>C(ޘi%DH{W<0B|L +L#5vD_w&(G7l #-!džBS DD '3:x[~EԖtj-)1FLe@vO9N29{|i*IaAt*"sAB?jW%[k҉YD޺ K?Gd<cbK`&A93{#9TAR1t E*+Mjypa8 0o 1'᳥'@V7aQ#Ҋ2R7`TIHO7c@ҫw n"ʂgn$S!ǩ.D<2 ;`WzӆF7(N8`av7ֶ"2@EԎ>._Vf~NAV`lّ("{Hޗ]5~.CC >{Scþ/|~S*9")A 5P1d9d<0pYLg5`}!Y -{ $BCZ#͏iLSbx 0F6aH)WxNvaBH˄0 9 Wr):y{o[I-˕lD((`%(4y~p0Fn#~*QCsh.qoayQ -܌M&s@tÂᗹ0B5VK@kC,d f9 H2NTH^'QHn & jf @E`kx#igDɹ0_)zS1EW+ށ 1cq.G<۳lʤu~7]ePM{Wִ=Z=3{j\>^"L"cK sgG"@ ۤ~Ah}1,A0_ i=piU{ ]tx`V`Ns,Z^,0P&?wS_& ݔIr^?|,9\i m0e; M\oBKjMp jP5]6%{U`ҀAAʦ_v'ɘ"r숢 -B!+@c/Vd7iBMBaXM^ZYPYs@imi(p `!\8AJd|^&}:k&O~ =0k v8i!^Fhj/Zt1Bf`QDbQOXٴκy_]šbI덦ڧ gbyjW J'˫K!(OJ,a v,wj$Ev >6~G[Jf(LWJ)i% rdPeR}5/~ k\6Z|X6Ơ`?_ R: $IeErEq\Q*0wǢՀ7DDR!5l(@σ`^@?H Wg0Y_{,D v*$c]ٹE8uA =^Y'pE1us?>NrMfzrP|ب5^Oōą?M`6mF4Lx~E!GD7TSa8A7GG$3v Y%P^!L˻.FPI:[$1"Tf\7E5l Gn BKǑs :1\QI(ttޢڬbMyJx @姼}#֫x8BK̒:Ky$W.E Dm ZQ,I+Ɯ!pQs׃ѝ|i+k7/-XҷxEG5癕#Ljh{cdrBڪ[] s]}@h XMj$-A4tgf~t޽>597Lҝ`Bgi] Jp\@B+^c` %CH #jJ@T(L完f*[.$e . 땞r DjBs&|' (e\H_Q$ )\[0+TG_u uyH|^MB1Fap6`@洣]^U?u^7άg>.CGd cɂ]Bʤf~+,RZ~5A( N-(|;ƵK<#=fиЉ*,F躯*5Q# \o/w 0/SC eR|'A4AP@^jnp# z@BG gB$֮xZ!VY "FJ,*aUoR5,&d7]X@6@ep&2gDAdv)%jA\f'K`Xzh z wGGrTQ)_$"0 (v T1 CbH9}Dކ[$:C3$&]U mצq%G6q#"d}|&> ~HKQ p2 #, f΢0P4^jy'J ]aPP!Aʋ<1QL;!B )U/-"2"Z&$B9[vV!ΡY?U\( X0P<G韛55z_*(_9bM1S<#Ҟ]HTxOw\mJ_*hu,l.PfG&FB4QY~ ĐV|βYdTB6 ;(ȤT`ڏ *1}=Oa>K/&wԉK'^l3dH<#Ͷ~Ndw('$n"tNrlGnKbo9dhlDXqG $@@2 bfpaB8/ }°L/_P јgb)J]XT Cmsy؟yZ]Wרil\ш5;e3ALavۓȤVAmN8sH'S_p?8Za9ޞ6a H J+k 46V3ւ=}.P4 ؘD(Uأo!ٿK)4M{5f긦Ȃ]8P&^6q92L6xN3H)wx(wkFPȯFlGhJA5B!JN]dKijb9Ezϥ PLl_;!5 ]ZQPcGF)ԍtMw?L4*byA|3 m֕E-X/ؠ"KFϹCFW7lUŠ,cHrKfۨPGШ_j;L(X]Rk܀Sz?]gFR ă U\ |Bj\P)H 2tDL*X䫞J .O*B1x.QV^1: O+e7޻dmTFQBb1˓RXdD( wrf2 ˃~g\gpӈOb4ˇC`D ǐ^ UR \!sv,$ v3]LQEDDVwGǦ )p2b9X4b f&9Hl&(c[2Q='zn.`2 &&ΜV8UvxjaFnUVc "qAB_xxu 4&~vS,<$8+3HW4cS]êz.T50ô!qaڴk6 TF6Dv?1ncy6n(.f.2G4ĥPE H-Qh1!Q$qKMp%}no`1 V6!`EhHy?{ +eq !'4Tn:`7eI%`fɹw4V̀؃T(SYzn{NZ/3n ,DBHͼ@eQx:U~?ybEPiA%'$ |zrQ\%eh $d&*ҊPRHND*+j % HH <<Ӳ/ +`߽\>Uq"U+~:SZTRh>V@AJ`ϔI#3zX*1S:ӹ.@H)[7CŻ F"ܹL p 0!)ڡD9hkl;[ %Z/8hPRu؆" +eL*ٴ:|#usB!kd(MFDSv  uI R+hl=5i$h%T|zz<^];kțTDŽB~ԠR#*FQH:9稈:-sAXGCG\j92qvVP2s&$8gQH,b,Zt">&hBv[ץwB5>$ză䂱[i8X. BPG Q$ł9D_+DWYDkϵ횩9bGDOتAn"0wĪNSPƴz= 31u8! nUjH*YN xz75IvLxb GĠфm~@ƥܷ:!BƉB@D9 +6d^fue1!9Cth_±s˧,dH?dY~L~Q7b>~%(e#\i$C׋&x4ι@8ժɍG ^eg(->p,dl(BAK!K>\^,_MY &tj^sL=68E eu3eTd3& ݶH 8'e:)p(?I Lk@퀆_]Bva;V$M/ze :dEiX`MX9tN#A FT_U0g1]-iOS2l{Q S#D2(&/N8LIqEځB0## 1Ŷ ¡iJ ˮ%bBBDX"E3NؖIs[ܓƛ0f)Y٭-#r{jyB^c.#]dN mPܐ)2(qfqqxZX8iBa H[+E~y?_o0+F27tab[:y8E0+C4-x\{=ldUW2\0(t"`.8@Q<0<#=RQ\,\q[ۘn7A/?5@rOOPЁwnT VC?jIC}8FΆ ;b>;(gf `!V!D[o_tuI 5Qݠ 3ސ<,}dY?鱯YC8R@pHC5S5hNpŠ6`{05@)>\y]fʚ #٢2c^kbdòF`"?#1rP"=A5e4H$hbνOxFCF_j!@›1<8RP#aVȍ$D{e5(aa~c ;bI:FcFtHpC#rIz0 ]ྮ~.";/-~z0c/0PX_o8.kyy~}<FuOii5{F~5} ]0.g˨ wkޅwOcͻDU?ط&M &l]0(^5qDSɌ)AxK-Ь@)Јz aaU$;~گ?׮:GGSB3]:q4Uvhh5aӴT('jSla72%MJ u$duc#AcQG=7w`XE@lAr# *}q1ٞ$3laԨ(jϑ%j 3 (A>XՃ3(@0nfmeC3{촚ċQوSQ7\7BeJ! QҲB6¾9'DM@z6!=-rs92@T@7Pu~|O)" A}0*h}~dgCBYS FA@U背?n."PH49Cz:&ZF&eg0{t˯y9َX} [s**"0RP`C9BeXDk`q~׹Yjyj_hwYtӞc>hNAUL`OTD"hE pv1?yR> t{29ZVxkI$ҒßYN`{;;-ܐ TV/Waְ\=`Ci >]q)Blw.<鬤 jQfɞCOw 0!7n%h n ġ7QgA_2{ -l 9pJt-^K@- F؀άoUb&HH0|:gL5]1tkMBy#[3^0sH(gD\@Z9ɏ}0at5n R^+|5.vj] C1%nyB[JX!͡}d cft/rk58 1A/dDP\?~L6Ŵ[LnaRXeˆYȇ1^OL#E* ܈QW9҂B}Li +6Q{m%t!!U_ls0N5@(\*Pn0k1pEDrRIń0xM+֔HʎпTH"mzG41>5 %%HWwءJ4?TI86tv5'NC'{ = Ld1\3* 8f[#(l^i r.U#r &+efYpM+v0\eeIué6T]BË,CPWhNk4ovr$$'6Ut׆ˈÚ8AZq)5.n@xAtu 35xTm4?ωOs`xG(1P_L]Vg.t\3@*gXc z.՜#g_ 23hg)oфUVGLesz80~\]h 3t+Gn{RB w(Yg ]tm+f#%'ώXnyR(M "*h0k /_> 3yxZ5s.MfT"wv9@VDLmHKD0Z4 e3  JMPXPH\v ҍL>ކdd=g)[c+[^mpӴ#.<_OF`26be"G rX .(5(M0C_k" }w*4f)jB'p0\rpd 0!"?yd pV;top`~$Gݙ'JqYN;;O)jT S~qlЬse kbN]L̓p\` jN:#bEQbV}ݵ!a~XVx4QdpHTEj[{g'jPgNoqaAM5a/CgOJ5ţP`oR~HK&P$?\8DK_ɇ3(W%-X v~DJVr2iɁg%M/Ff 47!I`J@L<nj p 2۲Dp*MqL v8jY֭@ԫCo)dL*lɰtLx0kϼv1{00_k?iY !fPP@,7׆%.h3rxMbOQC-cPN0HrB R"+{H~zzbC*`7tBoRS~n2@2:0ba aE x>DU5 w`p }$ GO TqFɗ?1X6hh!I!V",$!I;ƚk^0dfTТ̀or +;2KDp9ٯD H):/CIIրUa檻B+GLP.@8=.:1+&PTtUaRIL%6/ΈY_Xh@‡\a!vܘ[򫿒˕0SHf ]-;kDHPvcK dɜ ` aWXb200[ٽRg=7 )5fɟ@bL8FfToLJU43vJ!4w:$, Bp->5VʼtW0oE Up=HhU< 9du$fTV:U+g<;-#W\ Bd "& ^\c}F!plTrQAl5<_e"/_U?ی5!=|b:ܸAAx'B(f"$%vBmxՃ%ڷqf'Ƙ%Pt<.䥡P2 f0S MT,:8vH4CA Y<`3?;*M& qNm֮;a0&(:0UW{7jv 9Q>zњx|Zp淧*'=+[JHO[w@.C°F;;re+ȕiRT!yת ɽbvtѢ`Uvlf^WrbF{HHm Y·*)r$3N6 H1߷ΡPÿ-IoA+SgrDLUu mr1q}Ī7d<Ռ b6TwI{h*:Ŏ> Xb)PI 8D2f^I$QhXh*{N]+#bw B gHV!:˸&Vp g;a-,QGQJ QU[)U98g}FAYqrFJr F 3$К^h5.I4v)K_~AWcY ',I2m jfp}D@وB9a@݅7θ1dUU)3R'4S<3~J]` Q&Ȓlb9ySɌ{a ޟ4PZW7F-P^l@f1Fm%k@wsF#bK"F$#jn؃``5He@t+(? A$ YDt7 J*:]ռSA[@C u' /a97A730]؆4kR}Uv37Q($*BuM *'{ 5 ICIJ2J25|kȝa@H賐T5Fu=pq-b G(|0?R }AD zzc ο?i82%>ν. 3܈]l`ȅ$/;&ԭWxY7Pfb1&O2 y֓_$9+ 3a 'ʻ݋B)0Qꊗq lͽJ{OK(rRM+]{DĊ:}քiE@ 7,9s|ҙ y:U׈5;~Pv6gY1be]W˅܉n @6pp҂P9F$`2"H( sR>͸)o_ ?{#:4%f`' UB0hԠ?BڙyCG> zH Iʭ\.ܟY"_T ".E\V5wbOyֹj7_|N%] g *y)!W7q#* 4Equ,|b*X Z vp+up X4ևt[ۣp|;7ɸ"}Gģ-oƎ, %H2H}n>iIB`p=A}g{ lN(~e2 3R;Ef!]i1ER=thOtNFͿ3,x#`׭h?6611WR70 by:(n8 rթJXBdbt׫wYPt:5K^^wQ"Pm>PhuM]1]v:ݦp\D/wW}jOKexi>!X|{u>~=tRK쟮Hd|kw~>w?]2(\ I_)ukZVYMBAVY~= xo6;3} `n3OY9HJ1.kOM ƺE.-ZP7%554$m5^l"1<^vY#PFRnk@'AI CAUY*1CCxNFF12|W~ :R]RmV&u:l <vƤª!IIC=r?lpĂ8 #J/Pǭj몧z{C @`H8W἞ +x5̨ŭJ$.}JB=tjH" k4Fm**Ƹ(g쓚ry5|C0PKSwֺuxUKd#xЯ~h"iXwp]3gSq_Yk*ݭS{W u7}!^y'Fώ@qɹ&xz}HƁ1f+!"85~l=xe\LC/?9|#FHj(4:߼lg:ܛȢ} o8>C',t`b(c ¹;a^S c#]G`3͇Buq' ͟wfJw۳{w`O=V*׷w$`G등2xdGt9BL9S(]\>n}NwAxƒ:WXQn׿Hu#rns8#ɯ5xVbPp"w.K|JFd$ƣO/X@:/p;cpJx/#CםW!cU}uEh~?| *!ػAc=kl`qڞ[t$M޹w;9?M莈?U{>EDrGo σ޽xyhtwTtUHX%%-lPh4A$2r *uhNn9"k.C__CIy/١~{yW4 ^h :%=竻fVѿEヘ̘rOw}23ԲgӝsNshH`+**{/S++ke EK;ԋL Yŝ#۟"]\{ttc=|$yj(N.Y|)Kuĩm_=`-:ٽ6=/<Ǿ +G8j&+ڼ)O7kuw-~񊬓F{'3$ǭQЗFTLA t$}[@iydML&H]JkHobإ8P3C"XR ۓF"~rz.9~NR+טP&nnrph1WLedd*ȧ+Łjv*P'+.'XhXHKZ ǗĒA*bF8@#T $M6MεCLhh(5F 3ъX#ؚ >GedzSf p&f >3uFǙT;v zvc+/N7hHޱΈ> R@@CBp hgmPS `JXP`guWc 3Z,_Z/ݩhR$t:TjfGAP" }G48ovJߝOg j¶,cc>?j󩯕 4%$15ډ"10)uC~CXA~pd ume%CIh~•x^ oJ?~^qE?vbfrW^x6pp{6Wqf(8#.]=ȩ,OnjA2B/b[Srz2/H>! T\xowW]%WdXNJ"o7 H -xzd_kW*YJ(4\)dZF7:e9I*ʰH9+e#l"~~?TKzEBC \Q#+zs wiUH{7Y44U]4bLnfx++_?7HQfU4&^^l߭| w}y0o^Գt;Y#:lF:A(zUoWuzF5!iH1^ptAcTp0(XᖘƞR6'>Ԕ\Ũ!\wlbxj!5伮G\I͑ VpXF%ƅbŏ+:"D&>\]LaZ$ʓLЋi.8N9Z""w\WM3_:%GM_p+/ިttubJ$W2h.6*֡4* 9'-썮&wzt}:A!V؋-I tmdm53p簅1IYwd3q5g{m=-/%b92M9!( NrE+8ƶ̵cmRRk~wy `u!%xޗ*>cI`-BL O~b|X됈ȡEPrg1EQADҮTޑ͸%o_I8vfk/?Pߚ`IC-94J}=yɈC]WE  ~}rR_+8AOp\&+13^Sr/JMH]3&RrҍQd}CH~k '3W}ADd~ `b}}ϣc5< b(z3(B BfDAi0Ӂ26#0i(r)%{ P>`!2dQc`EHTS8vmF!{8TWjFSd{aus 9|I4%ݬ8 !M;sĉN .H~{A$<}ྫྷ|.]2u>I`lnE* 0zam1_b.?wsB+={nt(2RMJCEDV-}^q@OAY犄wPX$~?ÏT$ @d Qd1a Z`|1sȍ  .犨"*ՌV D֔LvgIdk'gE@E9e]u'!-K  &D"02夽̼X]ߓժwI4f&v̰y#&22(MKBĪ8F3Z P^|:q VRI(})J ? THrYG)W-`\F XC {ќ=2kGbyA.7 0a(X5Gq!n%PE3y"; ON]1RPkN˲4;!Hx\@~Ӛ(3,@ PD0INVl[ûtm=9?#y'!ysIJ=/V51r gv@.*)x*Vʢ5uS7KSčO<̪o$ N0DD 5Lj0qM5=1RBqr\rFt<,`I0[F.:ee!a;Wi]. ޤRDzc?Aaf">ik  lI@|wB'CgLjk z9 "a'JM/HxZցkHJRϥ5$Sߘ+k:ֻ di]3`savEEl6}~gO;ӄRa+3)T4\`EVGd&$#(D-f;_=gWL:`(:#%Վf;Et~k~lC{Yΰ oQlYO9-݃2A\~dNk/'@'m` edRqY$s 2.k]bW#&*bz{,F (S;;!Zf*&`iE.ST+ծUAz8Xyp.=]Wu6@${| kHXFO튬֘(ܭe}QXgTk=cj҈$R7m .PEh]Ej 7bEtdw\Wm $HY2]qύH!Iƪ2Eo?QxQ)4{{:0®>ow=lv6=GL (yn[6Rž  pNrr"&~ @.DUp#7ݠx@oGs}mk+SׁI)O$o7NM.{^1!3//Q \V?  W ñZn.$,냽aySHN-8BA'A S3`<}$ʪ0 G *~$W{337ޟ :qN*̿7KFݵZoߗ;"X2(׻*vE(ID *DeAB4P*`~枠_~קӽxt} D R#()He dDm:#0AMpl/sg"=>ʞaҰO,H3Qco@`kc;4H)B,[QA~?xw >c,EOxkV/{g.o28j2ދ@ȡ0'nS";M~]|"8rT|_G=~*(8qzQJ(l=>(()OL~3#6OjODb#o?,{㎓äH-n?6 \~jnxF?]͏W{OcbE4CaA "yK3(S?hP`401'Tv@#|vO~M/_eW.֞nG(lnyTQa._<'|Gu)܈=g~}FW4pJesJEA ut>gGxkx(jG@$2Gov/tUD-݌{~ޏ?nSuüB>觘y:=h=g>t,}Gkq!=LG *vJPtA ™9y!RPİ9X;)4AKT;{oX';~{NzCo(}rRu|w_ CxֿMH{ k~j$IJ4R[~1qP"">(M\d#3y 1$gޚh/ wM,B"2h Hr3O'Wa7rxeKc/UDm3, Vf9>+jCV&siXRQT)hE-4DoGDPCȋuduT a%RĕTBVoBES`9;#h@@@v72" RT<|qYw򒃋ؿ.mY'L4ėn}Vm\AGu,pQqS }Xԫ)Y5So(Dɰ T?Ň k(`͋g맚Hb+P vФ xx> ؏,d$A/k"*xN6zXs 4t=ͽ]TLz͆5Q!1yaA'kt+D$A$w\H8':>Pe0e 6cJ2?'4fְg\6*2x?PDUl>GU^[9D+Pbw9\CO<4O' 4MٗF|e*2ïB=}HLf&!$QD7+@`j; ;'ӴOyw@}NMr2'#>=׶v.}58W=Nd*߯K V%oJГuNnݻ e: %3`o=qokGw4&gmgR^8CѤ7B I~ucyrXTZcќWpw~a{F$3(Q$AObF2'B7K,P*-A}Fr`tA!㽒$`Yfè#c ~'q9TԆ#Z B##-ڐjd#$lPH[$/+ uvLZ:1tY,Qn$H_u=Gw8RדV|X]e:&;V $CLzEiKK&$V37J):(X[A9kP3 ߫La >*F`:kHpmq#w%ק^#.(@Z_zr~C~~|[+GHNjAFr:k<ͦ$+q - ̃J! tzHGH(KGL2 3A^)py&UwZ8:Fې-# 0.i(pވ9U!'lbVuU8$!Fy\26$Bm7UJ<^`C-I=viG-KzFB/!>I~;Z1h׃|Znn(3ZZJ/C@&%k8&z`) \#.ٲKN3POrKpxU*(u_C~'0Ds\HqQ̦q?PQnsSVfk#WdG >G/+hf]SACQ!>65j_Eߨq@d A,[,2KtQ!*L֙`L +w!_)@Nÿ=tz Ǘ8Dg5BN>he{zXMz=m~@u:/ PwGa`we˓z|=sM@qCc{mڼ9UYlj?$v͐vbF8H|ݗr-&;lSc,/%L=SDEDs },\.Dy:Kz_7>Guwyi6 i#F%ܨM" jIwz+@9np5t:Vsi 1K |O0Yu2f7q_tl9D-kb!}R&О'T .Xr^&3ֽ.ÿ6ʝpPAcp|3ق*Tu$Hp{4f/0pQ1 s㜖ϊ3ڎ:JPrr4tZ!h,^uWXP=IT4Xj=1!}p7!w+IX<_56ŕgg?m8YF_t $>]N8Pq`>N@ let|B02?E(BH'|RnAt֙H420p8K,"Fͯ/HUC4szX{;A߈I=@' &舀|׹VyQ`條Qocȗ眄%G|=$Gr˦ky:d&cAQ T/ U D#8f38bj^&(mmMۡaOK3yf2q& @'ad4p @A$D}wߛDFLC#VGN`(G4{y­C%2ـhzCjΪ;ܵ~v'Asՙ0wA9;zsx|ǽxt' :^Y(;+}U;(1ʑE9d` |Q2pCr;\.)%WCE~o74~/Ѻ'c+ wD^eiݷѓ-+iڀ` (@]@] pE&p"%ΜEsUB=ĸ%¦HN"D'8$S^_m8wNԂ(#@h A#7X3@F̶:fT&:uzbcÚvKYdUG~TU#q<ɻr S )h֩ӕy9=s7ZsY <'n7ŠB f\7GlQ<3,5)]ePѤ(fU[b7i$irN$Uݼf B5G!/>9mD#z/,:C@ggc?  S g:$!g:qbl2a.o'Jh:zu:-Z*\*<,X!wװPBz)^4DȠClwR7*W7TyHG )~|G`)JGss`1ыf; thUyq׷P* 73>9 h1*E!zDH[*$>݊ѦAuA2Vv' nH@]Eb0|X"|łek|q˅bE ohEChœzykN4B/~ϖ##F>瓨G1eE ̡@%ދ&E=~"(@Ht΃ y m>6#~(9p? /8U9=T,P]v.^l宂wA'W)0$ HP Doy6`<ϷpfWVPɪq >΁*)B>oMh td}&bN3n=p/F $g&Mbŵt2YMPtu($ t+2潸㉶pE6Lƹq cY쿝ѐ{"inΩDH!{z1Z4:)O)gLjCs@>P$3RaxBO{z.g6iCLD-f R,1\mcȄ t%5039MmXp1 Oʣ,4qW JT1*/Eus[sTsZƃY*J_Dj [0*}opAz42^٢/"c/U FИahؼi-^2xIJ(e[ `Ca<ls+Ņr_!'d)** @ qB!(]=s6eWB-hsy97 J(x%UxpDZDN``nDk O' t#̚"hԃ$ vB 8g;RV5jC(:&ܩ7J5 bL< ^9D@Ĕ-?_RYO/~?!*m.j[@H  ($9q֦?O S.E/9ZWɦ(9G}e1SG?ut}n&?*OR|w$>e?CPT{q}`@ ZvRGa_JSW zǒvI_pW<i2?-Uk~;4EAϖȂܛmW?!U;S:`z`@^z{ưAŀ}r-%.o|.OGKUY8}|?7{_o#/O|Pf+ _{{e@ :;~og O$Me KUsKXցTp("HA.?իlC-)+PiAgl# n.FAu8:lXAz-bi{CbfȠ|Y-8vB :l*1Eu9˧¹]1SԈNcrތ h(8[$&$ /AC#qq(J (!7c@N2Su`٠TL~>G `$)L4TPv a X Cb+G~w#8(!\Hj@E(vV FBL5.o(&Q /K )e@%1%Pxp~[tņ _yxJ@ʟ?V 8ԣ8 p:_o5UԾ5_;*j}3)9pz"3:kI;.ba  +,bj'o,ܯIj&]!o@V|7KpIw(/H(H"qQHC?Loh܈A@m!(v֙JF dWIMTHhݜ#w87UyhazҝrU [֒(q3 {d 3蘠,Яc!8L{BLf%85|(tM6!tAi!v;`$3z2M)(Z"u\?f{x8h! ~U 9<;p((GLQdIi ,b{i9)a2q>Ik1wp`"SIMȨ[B:|Vet3$+v~$~.^ /z]lvC6 FYo6< бЕ;z++jk)U,jr]֦*e`(Ǿ 2 >BCȏI~χ͇?}_iA'g8XK gZL"V(3 UI;q)ao=$ b4E6gHډWa p"?7$^EU ; f( B$XO@K *PS,# !*B (̂#RsBd C!$DP AZU@*xngwݛkǒy!>;<5byMISXTlkO2S<=>q::}w| үt:;0AuM`$!!}[y/=?OlOAX>ԜU$ aY*l$UT~fG*}05:;@S$\.J Xgw"Tp 5;FמYi@/M9A;Ku8g<`THN@X/Pi6ȅ.$wރN|O C&=g~abg,6*4Ax'9;A;091J"rje={H4(@ÛTYn==!>5D ǰW~CQ 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796

/* New getargs implementation */

#include "Python.h"

#include <ctype.h>


#ifdef __cplusplus
extern "C" {
#endif
int PyArg_Parse(PyObject *, const char *, ...);
int PyArg_ParseTuple(PyObject *, const char *, ...);
int PyArg_VaParse(PyObject *, const char *, va_list);

int PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
                                const char *, char **, ...);
int PyArg_VaParseTupleAndKeywords(PyObject *, PyObject *,
                                const char *, char **, va_list);

#ifdef HAVE_DECLSPEC_DLL
/* Export functions */
PyAPI_FUNC(int) _PyArg_Parse_SizeT(PyObject *, char *, ...);
PyAPI_FUNC(int) _PyArg_ParseTuple_SizeT(PyObject *, char *, ...);
PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywords_SizeT(PyObject *, PyObject *,
                                                  const char *, char **, ...);
PyAPI_FUNC(PyObject *) _Py_BuildValue_SizeT(const char *, ...);
PyAPI_FUNC(int) _PyArg_VaParse_SizeT(PyObject *, char *, va_list);
PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *, PyObject *,
                                              const char *, char **, va_list);
#endif

#define FLAG_COMPAT 1
#define FLAG_SIZE_T 2


/* Forward */
static int vgetargs1(PyObject *, const char *, va_list *, int);
static void seterror(int, const char *, int *, const char *, const char *);
static char *convertitem(PyObject *, const char **, va_list *, int, int *,
                         char *, size_t, PyObject **);
static char *converttuple(PyObject *, const char **, va_list *, int,
                          int *, char *, size_t, int, PyObject **);
static char *convertsimple(PyObject *, const char **, va_list *, int, char *,
                           size_t, PyObject **);
static Py_ssize_t convertbuffer(PyObject *, void **p, char **);
static int getbuffer(PyObject *, Py_buffer *, char**);

static int vgetargskeywords(PyObject *, PyObject *,
                            const char *, char **, va_list *, int);
static char *skipitem(const char **, va_list *, int);

int
PyArg_Parse(PyObject *args, const char *format, ...)
{
    int retval;
    va_list va;

    va_start(va, format);
    retval = vgetargs1(args, format, &va, FLAG_COMPAT);
    va_end(va);
    return retval;
}

int
_PyArg_Parse_SizeT(PyObject *args, char *format, ...)
{
    int retval;
    va_list va;

    va_start(va, format);
    retval = vgetargs1(args, format, &va, FLAG_COMPAT|FLAG_SIZE_T);
    va_end(va);
    return retval;
}


int
PyArg_ParseTuple(PyObject *args, const char *format, ...)
{
    int retval;
    va_list va;

    va_start(va, format);
    retval = vgetargs1(args, format, &va, 0);
    va_end(va);
    return retval;
}

int
_PyArg_ParseTuple_SizeT(PyObject *args, char *format, ...)
{
    int retval;
    va_list va;

    va_start(va, format);
    retval = vgetargs1(args, format, &va, FLAG_SIZE_T);
    va_end(va);
    return retval;
}


int
PyArg_VaParse(PyObject *args, const char *format, va_list va)
{
    va_list lva;

        Py_VA_COPY(lva, va);

    return vgetargs1(args, format, &lva, 0);
}

int
_PyArg_VaParse_SizeT(PyObject *args, char *format, va_list va)
{
    va_list lva;

        Py_VA_COPY(lva, va);

    return vgetargs1(args, format, &lva, FLAG_SIZE_T);
}


/* Handle cleanup of allocated memory in case of exception */

#define GETARGS_CAPSULE_NAME_CLEANUP_PTR "getargs.cleanup_ptr"
#define GETARGS_CAPSULE_NAME_CLEANUP_BUFFER "getargs.cleanup_buffer"
#define GETARGS_CAPSULE_NAME_CLEANUP_CONVERT "getargs.cleanup_convert"

static void
cleanup_ptr(PyObject *self)
{
    void *ptr = PyCapsule_GetPointer(self, GETARGS_CAPSULE_NAME_CLEANUP_PTR);
    if (ptr) {
        PyMem_FREE(ptr);
    }
}

static void
cleanup_buffer(PyObject *self)
{
    Py_buffer *ptr = (Py_buffer *)PyCapsule_GetPointer(self, GETARGS_CAPSULE_NAME_CLEANUP_BUFFER);
    if (ptr) {
        PyBuffer_Release(ptr);
    }
}

static int
addcleanup(void *ptr, PyObject **freelist, int is_buffer)
{
    PyObject *cobj;
    const char *name;
    PyCapsule_Destructor destr;

    if (is_buffer) {
        destr = cleanup_buffer;
        name = GETARGS_CAPSULE_NAME_CLEANUP_BUFFER;
    } else {
        destr = cleanup_ptr;
        name = GETARGS_CAPSULE_NAME_CLEANUP_PTR;
    }

    if (!*freelist) {
        *freelist = PyList_New(0);
        if (!*freelist) {
            destr(ptr);
            return -1;
        }
    }

    cobj = PyCapsule_New(ptr, name, destr);
    if (!cobj) {
        destr(ptr);
        return -1;
    }
    if (PyList_Append(*freelist, cobj)) {
        Py_DECREF(cobj);
        return -1;
    }
    Py_DECREF(cobj);
    return 0;
}

static void
cleanup_convert(PyObject *self)
{
    typedef int (*destr_t)(PyObject *, void *);
    destr_t destr = (destr_t)PyCapsule_GetContext(self);
    void *ptr = PyCapsule_GetPointer(self,
                                     GETARGS_CAPSULE_NAME_CLEANUP_CONVERT);
    if (ptr && destr)
        destr(NULL, ptr);
}

static int
addcleanup_convert(void *ptr, PyObject **freelist, int (*destr)(PyObject*,void*))
{
    PyObject *cobj;
    if (!*freelist) {
        *freelist = PyList_New(0);
        if (!*freelist) {
            destr(NULL, ptr);
            return -1;
        }
    }
    cobj = PyCapsule_New(ptr, GETARGS_CAPSULE_NAME_CLEANUP_CONVERT,
                         cleanup_convert);
    if (!cobj) {
        destr(NULL, ptr);
        return -1;
    }
    if (PyCapsule_SetContext(cobj, destr) == -1) {
        /* This really should not happen. */
        Py_FatalError("capsule refused setting of context.");
    }
    if (PyList_Append(*freelist, cobj)) {
        Py_DECREF(cobj); /* This will also call destr. */
        return -1;
    }
    Py_DECREF(cobj);
    return 0;
}

static int
cleanreturn(int retval, PyObject *freelist)
{
    if (freelist && retval != 0) {
        /* We were successful, reset the destructors so that they
           don't get called. */
        Py_ssize_t len = PyList_GET_SIZE(freelist), i;
        for (i = 0; i < len; i++)
            PyCapsule_SetDestructor(PyList_GET_ITEM(freelist, i), NULL);
    }
    Py_XDECREF(freelist);
    return retval;
}


static int
vgetargs1(PyObject *args, const char *format, va_list *p_va, int flags)
{
    char msgbuf[256];
    int levels[32];
    const char *fname = NULL;
    const char *message = NULL;
    int min = -1;
    int max = 0;
    int level = 0;
    int endfmt = 0;
    const char *formatsave = format;
    Py_ssize_t i, len;
    char *msg;
    PyObject *freelist = NULL;
    int compat = flags & FLAG_COMPAT;

    assert(compat || (args != (PyObject*)NULL));
    flags = flags & ~FLAG_COMPAT;

    while (endfmt == 0) {
        int c = *format++;
        switch (c) {
        case '(':
            if (level == 0)
                max++;
            level++;
            if (level >= 30)
                Py_FatalError("too many tuple nesting levels "
                              "in argument format string");
            break;
        case ')':
            if (level == 0)
                Py_FatalError("excess ')' in getargs format");
            else
                level--;
            break;
        case '\0':
            endfmt = 1;
            break;
        case ':':
            fname = format;
            endfmt = 1;
            break;
        case ';':
            message = format;
            endfmt = 1;
            break;
        default:
            if (level == 0) {
                if (c == 'O')
                    max++;
                else if (isalpha(Py_CHARMASK(c))) {
                    if (c != 'e') /* skip encoded */
                        max++;
                } else if (c == '|')
                    min = max;
            }
            break;
        }
    }

    if (level != 0)
        Py_FatalError(/* '(' */ "missing ')' in getargs format");

    if (min < 0)
        min = max;

    format = formatsave;

    if (compat) {
        if (max == 0) {
            if (args == NULL)
                return 1;
            PyOS_snprintf(msgbuf, sizeof(msgbuf),
                          "%.200s%s takes no arguments",
                          fname==NULL ? "function" : fname,
                          fname==NULL ? "" : "()");
            PyErr_SetString(PyExc_TypeError, msgbuf);
            return 0;
        }
        else if (min == 1 && max == 1) {
            if (args == NULL) {
                PyOS_snprintf(msgbuf, sizeof(msgbuf),
                      "%.200s%s takes at least one argument",
                          fname==NULL ? "function" : fname,
                          fname==NULL ? "" : "()");
                PyErr_SetString(PyExc_TypeError, msgbuf);
                return 0;
            }
            msg = convertitem(args, &format, p_va, flags, levels,
                              msgbuf, sizeof(msgbuf), &freelist);
            if (msg == NULL)
                return cleanreturn(1, freelist);
            seterror(levels[0], msg, levels+1, fname, message);
            return cleanreturn(0, freelist);
        }
        else {
            PyErr_SetString(PyExc_SystemError,
                "old style getargs format uses new features");
            return 0;
        }
    }

    if (!PyTuple_Check(args)) {
        PyErr_SetString(PyExc_SystemError,
            "new style getargs format but argument is not a tuple");
        return 0;
    }

    len = PyTuple_GET_SIZE(args);

    if (len < min || max < len) {
        if (message == NULL) {
            PyOS_snprintf(msgbuf, sizeof(msgbuf),
                          "%.150s%s takes %s %d argument%s "
                          "(%ld given)",
                          fname==NULL ? "function" : fname,
                          fname==NULL ? "" : "()",
                          min==max ? "exactly"
                          : len < min ? "at least" : "at most",
                          len < min ? min : max,
                          (len < min ? min : max) == 1 ? "" : "s",
                          Py_SAFE_DOWNCAST(len, Py_ssize_t, long));
            message = msgbuf;
        }
        PyErr_SetString(PyExc_TypeError, message);
        return 0;
    }

    for (i = 0; i < len; i++) {
        if (*format == '|')
            format++;
        msg = convertitem(PyTuple_GET_ITEM(args, i), &format, p_va,
                          flags, levels, msgbuf,
                          sizeof(msgbuf), &freelist);
        if (msg) {
            seterror(i+1, msg, levels, fname, msg);
            return cleanreturn(0, freelist);
        }
    }

    if (*format != '\0' && !isalpha(Py_CHARMASK(*format)) &&
        *format != '(' &&
        *format != '|' && *format != ':' && *format != ';') {
        PyErr_Format(PyExc_SystemError,
                     "bad format string: %.200s", formatsave);
        return cleanreturn(0, freelist);
    }

    return cleanreturn(1, freelist);
}



static void
seterror(int iarg, const char *msg, int *levels, const char *fname,
         const char *message)
{
    char buf[512];
    int i;
    char *p = buf;

    if (PyErr_Occurred())
        return;
    else if (message == NULL) {
        if (fname != NULL) {
            PyOS_snprintf(p, sizeof(buf), "%.200s() ", fname);
            p += strlen(p);
        }
        if (iarg != 0) {
            PyOS_snprintf(p, sizeof(buf) - (p - buf),
                          "argument %d", iarg);
            i = 0;
            p += strlen(p);
            while (levels[i] > 0 && i < 32 && (int)(p-buf) < 220) {
                PyOS_snprintf(p, sizeof(buf) - (p - buf),
                              ", item %d", levels[i]-1);
                p += strlen(p);
                i++;
            }
        }
        else {
            PyOS_snprintf(p, sizeof(buf) - (p - buf), "argument");
            p += strlen(p);
        }
        PyOS_snprintf(p, sizeof(buf) - (p - buf), " %.256s", msg);
        message = buf;
    }
    PyErr_SetString(PyExc_TypeError, message);
}


/* Convert a tuple argument.
   On entry, *p_format points to the character _after_ the opening '('.
   On successful exit, *p_format points to the closing ')'.
   If successful:
      *p_format and *p_va are updated,
      *levels and *msgbuf are untouched,
      and NULL is returned.
   If the argument is invalid:
      *p_format is unchanged,
      *p_va is undefined,
      *levels is a 0-terminated list of item numbers,
      *msgbuf contains an error message, whose format is:
     "must be <typename1>, not <typename2>", where:
        <typename1> is the name of the expected type, and
        <typename2> is the name of the actual type,
      and msgbuf is returned.
*/

static char *
converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
             int *levels, char *msgbuf, size_t bufsize, int toplevel,
             PyObject **freelist)
{
    int level = 0;
    int n = 0;
    const char *format = *p_format;
    int i;

    for (;;) {
        int c = *format++;
        if (c == '(') {
            if (level == 0)
                n++;
            level++;
        }
        else if (c == ')') {
            if (level == 0)
                break;
            level--;
        }
        else if (c == ':' || c == ';' || c == '\0')
            break;
        else if (level == 0 && isalpha(Py_CHARMASK(c)))
            n++;
    }

    if (!PySequence_Check(arg) || PyBytes_Check(arg)) {
        levels[0] = 0;
        PyOS_snprintf(msgbuf, bufsize,
                      toplevel ? "expected %d arguments, not %.50s" :
                      "must be %d-item sequence, not %.50s",
                  n,
                  arg == Py_None ? "None" : arg->ob_type->tp_name);
        return msgbuf;
    }

    if ((i = PySequence_Size(arg)) != n) {
        levels[0] = 0;
        PyOS_snprintf(msgbuf, bufsize,
                      toplevel ? "expected %d arguments, not %d" :
                     "must be sequence of length %d, not %d",
                  n, i);
        return msgbuf;
    }

    format = *p_format;
    for (i = 0; i < n; i++) {
        char *msg;
        PyObject *item;
        item = PySequence_GetItem(arg, i);
        if (item == NULL) {
            PyErr_Clear();
            levels[0] = i+1;
            levels[1] = 0;
            strncpy(msgbuf, "is not retrievable", bufsize);
            return msgbuf;
        }
        msg = convertitem(item, &format, p_va, flags, levels+1,
                          msgbuf, bufsize, freelist);
        /* PySequence_GetItem calls tp->sq_item, which INCREFs */
        Py_XDECREF(item);
        if (msg != NULL) {
            levels[0] = i+1;
            return msg;
        }
    }

    *p_format = format;
    return NULL;
}


/* Convert a single item. */

static char *
convertitem(PyObject *arg, const char **p_format, va_list *p_va, int flags,
            int *levels, char *msgbuf, size_t bufsize, PyObject **freelist)
{
    char *msg;
    const char *format = *p_format;

    if (*format == '(' /* ')' */) {
        format++;
        msg = converttuple(arg, &format, p_va, flags, levels, msgbuf,
                           bufsize, 0, freelist);
        if (msg == NULL)
            format++;
    }
    else {
        msg = convertsimple(arg, &format, p_va, flags,
                            msgbuf, bufsize, freelist);
        if (msg != NULL)
            levels[0] = 0;
    }
    if (msg == NULL)
        *p_format = format;
    return msg;
}



#define UNICODE_DEFAULT_ENCODING(arg) \
    _PyUnicode_AsDefaultEncodedString(arg, NULL)

/* Format an error message generated by convertsimple(). */

static char *
converterr(const char *expected, PyObject *arg, char *msgbuf, size_t bufsize)
{
    assert(expected != NULL);
    assert(arg != NULL);
    PyOS_snprintf(msgbuf, bufsize,
                  "must be %.50s, not %.50s", expected,
                  arg == Py_None ? "None" : arg->ob_type->tp_name);
    return msgbuf;
}

#define CONV_UNICODE "(unicode conversion error)"

/* Explicitly check for float arguments when integers are expected.
   Return 1 for error, 0 if ok. */
static int
float_argument_error(PyObject *arg)
{
    if (PyFloat_Check(arg)) {
        PyErr_SetString(PyExc_TypeError,
                        "integer argument expected, got float" );
        return 1;
    }
    else
        return 0;
}

/* Convert a non-tuple argument.  Return NULL if conversion went OK,
   or a string with a message describing the failure.  The message is
   formatted as "must be <desired type>, not <actual type>".
   When failing, an exception may or may not have been raised.
   Don't call if a tuple is expected.

   When you add new format codes, please don't forget poor skipitem() below.
*/

static char *
convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
              char *msgbuf, size_t bufsize, PyObject **freelist)
{
    /* For # codes */
#define FETCH_SIZE      int *q=NULL;Py_ssize_t *q2=NULL;\
    if (flags & FLAG_SIZE_T) q2=va_arg(*p_va, Py_ssize_t*); \
    else q=va_arg(*p_va, int*);
#define STORE_SIZE(s)   \
    if (flags & FLAG_SIZE_T) \
        *q2=s; \
    else { \
        if (INT_MAX < s) { \
            PyErr_SetString(PyExc_OverflowError, \
                "size does not fit in an int"); \
            return converterr("", arg, msgbuf, bufsize); \
        } \
        *q=s; \
    }
#define BUFFER_LEN      ((flags & FLAG_SIZE_T) ? *q2:*q)
#define RETURN_ERR_OCCURRED return msgbuf

    const char *format = *p_format;
    char c = *format++;
    PyObject *uarg;

    switch (c) {

    case 'b': { /* unsigned byte -- very short int */
        char *p = va_arg(*p_va, char *);
        long ival;
        if (float_argument_error(arg))
            RETURN_ERR_OCCURRED;
        ival = PyLong_AsLong(arg);
        if (ival == -1 && PyErr_Occurred())
            RETURN_ERR_OCCURRED;
        else if (ival < 0) {
            PyErr_SetString(PyExc_OverflowError,
                            "unsigned byte integer is less than minimum");
            RETURN_ERR_OCCURRED;
        }
        else if (ival > UCHAR_MAX) {
            PyErr_SetString(PyExc_OverflowError,
                            "unsigned byte integer is greater than maximum");
            RETURN_ERR_OCCURRED;
        }
        else
            *p = (unsigned char) ival;
        break;
    }

    case 'B': {/* byte sized bitfield - both signed and unsigned
                  values allowed */
        char *p = va_arg(*p_va, char *);
        long ival;
        if (float_argument_error(arg))
            RETURN_ERR_OCCURRED;
        ival = PyLong_AsUnsignedLongMask(arg);
        if (ival == -1 && PyErr_Occurred())
            RETURN_ERR_OCCURRED;
        else
            *p = (unsigned char) ival;
        break;
    }

    case 'h': {/* signed short int */
        short *p = va_arg(*p_va, short *);
        long ival;
        if (float_argument_error(arg))
            RETURN_ERR_OCCURRED;
        ival = PyLong_AsLong(arg);
        if (ival == -1 && PyErr_Occurred())
            RETURN_ERR_OCCURRED;
        else if (ival < SHRT_MIN) {
            PyErr_SetString(PyExc_OverflowError,
                            "signed short integer is less than minimum");
            RETURN_ERR_OCCURRED;
        }
        else if (ival > SHRT_MAX) {
            PyErr_SetString(PyExc_OverflowError,
                            "signed short integer is greater than maximum");
            RETURN_ERR_OCCURRED;
        }
        else
            *p = (short) ival;
        break;
    }

    case 'H': { /* short int sized bitfield, both signed and
                   unsigned allowed */
        unsigned short *p = va_arg(*p_va, unsigned short *);
        long ival;
        if (float_argument_error(arg))
            RETURN_ERR_OCCURRED;
        ival = PyLong_AsUnsignedLongMask(arg);
        if (ival == -1 && PyErr_Occurred())
            RETURN_ERR_OCCURRED;
        else
            *p = (unsigned short) ival;
        break;
    }

    case 'i': {/* signed int */
        int *p = va_arg(*p_va, int *);
        long ival;
        if (float_argument_error(arg))
            RETURN_ERR_OCCURRED;
        ival = PyLong_AsLong(arg);
        if (ival == -1 && PyErr_Occurred())
            RETURN_ERR_OCCURRED;
        else if (ival > INT_MAX) {
            PyErr_SetString(PyExc_OverflowError,
                            "signed integer is greater than maximum");
            RETURN_ERR_OCCURRED;
        }
        else if (ival < INT_MIN) {
            PyErr_SetString(PyExc_OverflowError,
                            "signed integer is less than minimum");
            RETURN_ERR_OCCURRED;
        }
        else
            *p = ival;
        break;
    }

    case 'I': { /* int sized bitfield, both signed and
                   unsigned allowed */
        unsigned int *p = va_arg(*p_va, unsigned int *);
        unsigned int ival;
        if (float_argument_error(arg))
            RETURN_ERR_OCCURRED;
        ival = (unsigned int)PyLong_AsUnsignedLongMask(arg);
        if (ival == (unsigned int)-1 && PyErr_Occurred())
            RETURN_ERR_OCCURRED;
        else
            *p = ival;
        break;
    }

    case 'n': /* Py_ssize_t */
    {
        PyObject *iobj;
        Py_ssize_t *p = va_arg(*p_va, Py_ssize_t *);
        Py_ssize_t ival = -1;
        if (float_argument_error(arg))
            RETURN_ERR_OCCURRED;
        iobj = PyNumber_Index(arg);
        if (iobj != NULL) {
            ival = PyLong_AsSsize_t(iobj);
            Py_DECREF(iobj);
        }
        if (ival == -1 && PyErr_Occurred())
            RETURN_ERR_OCCURRED;
        *p = ival;
        break;
    }
    case 'l': {/* long int */
        long *p = va_arg(*p_va, long *);
        long ival;
        if (float_argument_error(arg))
            RETURN_ERR_OCCURRED;
        ival = PyLong_AsLong(arg);
        if (ival == -1 && PyErr_Occurred())
            RETURN_ERR_OCCURRED;
        else
            *p = ival;
        break;
    }

    case 'k': { /* long sized bitfield */
        unsigned long *p = va_arg(*p_va, unsigned long *);
        unsigned long ival;
        if (PyLong_Check(arg))
            ival = PyLong_AsUnsignedLongMask(arg);
        else
            return converterr("integer<k>", arg, msgbuf, bufsize);
        *p = ival;
        break;
    }

#ifdef HAVE_LONG_LONG
    case 'L': {/* PY_LONG_LONG */
        PY_LONG_LONG *p = va_arg( *p_va, PY_LONG_LONG * );
        PY_LONG_LONG ival;
        if (float_argument_error(arg))
            RETURN_ERR_OCCURRED;
        ival = PyLong_AsLongLong(arg);
        if (ival == (PY_LONG_LONG)-1 && PyErr_Occurred())
            RETURN_ERR_OCCURRED;
        else
            *p = ival;
        break;
    }

    case 'K': { /* long long sized bitfield */
        unsigned PY_LONG_LONG *p = va_arg(*p_va, unsigned PY_LONG_LONG *);
        unsigned PY_LONG_LONG ival;
        if (PyLong_Check(arg))
            ival = PyLong_AsUnsignedLongLongMask(arg);
        else
            return converterr("integer<K>", arg, msgbuf, bufsize);
        *p = ival;
        break;
    }
#endif

    case 'f': {/* float */
        float *p = va_arg(*p_va, float *);
        double dval = PyFloat_AsDouble(arg);
        if (PyErr_Occurred())
            RETURN_ERR_OCCURRED;
        else
            *p = (float) dval;
        break;
    }

    case 'd': {/* double */
        double *p = va_arg(*p_va, double *);
        double dval = PyFloat_AsDouble(arg);
        if (PyErr_Occurred())
            RETURN_ERR_OCCURRED;
        else
            *p = dval;
        break;
    }

    case 'D': {/* complex double */
        Py_complex *p = va_arg(*p_va, Py_complex *);
        Py_complex cval;
        cval = PyComplex_AsCComplex(arg);
        if (PyErr_Occurred())
            RETURN_ERR_OCCURRED;
        else
            *p = cval;
        break;
    }

    case 'c': {/* char */
        char *p = va_arg(*p_va, char *);
        if (PyBytes_Check(arg) && PyBytes_Size(arg) == 1)
            *p = PyBytes_AS_STRING(arg)[0];
        else
            return converterr("a byte string of length 1", arg, msgbuf, bufsize);
        break;
    }

    case 'C': {/* unicode char */
        int *p = va_arg(*p_va, int *);
        if (PyUnicode_Check(arg) &&
            PyUnicode_GET_SIZE(arg) == 1)
            *p = PyUnicode_AS_UNICODE(arg)[0];
        else
            return converterr("a unicode character", arg, msgbuf, bufsize);
        break;
    }

    /* XXX WAAAAH!  's', 'y', 'z', 'u', 'Z', 'e', 'w' codes all
       need to be cleaned up! */

    case 'y': {/* any buffer-like object, but not PyUnicode */
        void **p = (void **)va_arg(*p_va, char **);
        char *buf;
        Py_ssize_t count;
        if (*format == '*') {
            if (getbuffer(arg, (Py_buffer*)p, &buf) < 0)
                return converterr(buf, arg, msgbuf, bufsize);
            format++;
            if (addcleanup(p, freelist, 1)) {
                return converterr(
                    "(cleanup problem)",
                    arg, msgbuf, bufsize);
            }
            break;
        }
        count = convertbuffer(arg, p, &buf);
        if (count < 0)
            return converterr(buf, arg, msgbuf, bufsize);
        if (*format == '#') {
            FETCH_SIZE;
            STORE_SIZE(count);
            format++;
        } else {
            if (strlen(*p) != count)
                return converterr(
                    "bytes without null bytes",
                    arg, msgbuf, bufsize);
        }
        break;
    }

    case 's': /* text string */
    case 'z': /* text string or None */
    {
        if (*format == '*') {
            /* "s*" or "z*" */
            Py_buffer *p = (Py_buffer *)va_arg(*p_va, Py_buffer *);

            if (c == 'z' && arg == Py_None)
                PyBuffer_FillInfo(p, NULL, NULL, 0, 1, 0);
            else if (PyUnicode_Check(arg)) {
                uarg = UNICODE_DEFAULT_ENCODING(arg);
                if (uarg == NULL)
                    return converterr(CONV_UNICODE,
                                      arg, msgbuf, bufsize);
                PyBuffer_FillInfo(p, arg,
                                  PyBytes_AS_STRING(uarg), PyBytes_GET_SIZE(uarg),
                                  1, 0);
            }
            else { /* any buffer-like object */
                char *buf;
                if (getbuffer(arg, p, &buf) < 0)
                    return converterr(buf, arg, msgbuf, bufsize);
            }
            if (addcleanup(p, freelist, 1)) {
                return converterr(
                    "(cleanup problem)",
                    arg, msgbuf, bufsize);
            }
            format++;
        } else if (*format == '#') { /* any buffer-like object */
            /* "s#" or "z#" */
            void **p = (void **)va_arg(*p_va, char **);
            FETCH_SIZE;

            if (c == 'z' && arg == Py_None) {
                *p = NULL;
                STORE_SIZE(0);
            }
            else if (PyUnicode_Check(arg)) {
                uarg = UNICODE_DEFAULT_ENCODING(arg);
                if (uarg == NULL)
                    return converterr(CONV_UNICODE,
                                      arg, msgbuf, bufsize);
                *p = PyBytes_AS_STRING(uarg);
                STORE_SIZE(PyBytes_GET_SIZE(uarg));
            }
            else { /* any buffer-like object */
                /* XXX Really? */
                char *buf;
                Py_ssize_t count = convertbuffer(arg, p, &buf);
                if (count < 0)
                    return converterr(buf, arg, msgbuf, bufsize);
                STORE_SIZE(count);
            }
            format++;
        } else {
            /* "s" or "z" */
            char **p = va_arg(*p_va, char **);
            uarg = NULL;

            if (c == 'z' && arg == Py_None)
                *p = NULL;
            else if (PyUnicode_Check(arg)) {
                uarg = UNICODE_DEFAULT_ENCODING(arg);
                if (uarg == NULL)
                    return converterr(CONV_UNICODE,
                                      arg, msgbuf, bufsize);
                *p = PyBytes_AS_STRING(uarg);
            }
            else
                return converterr(c == 'z' ? "str or None" : "str",
                                  arg, msgbuf, bufsize);
            if (*p != NULL && uarg != NULL &&
                (Py_ssize_t) strlen(*p) != PyBytes_GET_SIZE(uarg))
                return converterr(
                    c == 'z' ? "str without null bytes or None"
                             : "str without null bytes",
                    arg, msgbuf, bufsize);
        }
        break;
    }

    case 'u': /* raw unicode buffer (Py_UNICODE *) */
    case 'Z': /* raw unicode buffer or None */
    {
        if (*format == '#') { /* any buffer-like object */
            /* "s#" or "Z#" */
            Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
            FETCH_SIZE;

            if (c == 'Z' && arg == Py_None) {
                *p = NULL;
                STORE_SIZE(0);
            }
            else if (PyUnicode_Check(arg)) {
                *p = PyUnicode_AS_UNICODE(arg);
                STORE_SIZE(PyUnicode_GET_SIZE(arg));
            }
            else
                return converterr("str or None", arg, msgbuf, bufsize);
            format++;
        } else {
            /* "s" or "Z" */
            Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);

            if (c == 'Z' && arg == Py_None)
                *p = NULL;
            else if (PyUnicode_Check(arg)) {
                *p = PyUnicode_AS_UNICODE(arg);
                if (Py_UNICODE_strlen(*p) != PyUnicode_GET_SIZE(arg))
                    return converterr(
                        "str without null character or None",
                        arg, msgbuf, bufsize);
            } else
                return converterr(c == 'Z' ? "str or None" : "str",
                                  arg, msgbuf, bufsize);
        }
        break;
    }

    case 'e': {/* encoded string */
        char **buffer;
        const char *encoding;
        PyObject *s;
        int recode_strings;
        Py_ssize_t size;
        const char *ptr;

        /* Get 'e' parameter: the encoding name */
        encoding = (const char *)va_arg(*p_va, const char *);
        if (encoding == NULL)
            encoding = PyUnicode_GetDefaultEncoding();

        /* Get output buffer parameter:
           's' (recode all objects via Unicode) or
           't' (only recode non-string objects)
        */
        if (*format == 's')
            recode_strings = 1;
        else if (*format == 't')
            recode_strings = 0;
        else
            return converterr(
                "(unknown parser marker combination)",
                arg, msgbuf, bufsize);
        buffer = (char **)va_arg(*p_va, char **);
        format++;
        if (buffer == NULL)
            return converterr("(buffer is NULL)",
                              arg, msgbuf, bufsize);

        /* Encode object */
        if (!recode_strings &&
            (PyBytes_Check(arg) || PyByteArray_Check(arg))) {
            s = arg;
            Py_INCREF(s);
            if (PyObject_AsCharBuffer(s, &ptr, &size) < 0)
                return converterr("(AsCharBuffer failed)",
                                  arg, msgbuf, bufsize);
        }
        else {
            PyObject *u;

            /* Convert object to Unicode */
            u = PyUnicode_FromObject(arg);
            if (u == NULL)
                return converterr(
                    "string or unicode or text buffer",
                    arg, msgbuf, bufsize);

            /* Encode object; use default error handling */
            s = PyUnicode_AsEncodedString(u,
                                          encoding,
                                          NULL);
            Py_DECREF(u);
            if (s == NULL)
                return converterr("(encoding failed)",
                                  arg, msgbuf, bufsize);
            if (!PyBytes_Check(s)) {
                Py_DECREF(s);
                return converterr(
                    "(encoder failed to return bytes)",
                    arg, msgbuf, bufsize);
            }
            size = PyBytes_GET_SIZE(s);
            ptr = PyBytes_AS_STRING(s);
            if (ptr == NULL)
                ptr = "";
        }

        /* Write output; output is guaranteed to be 0-terminated */
        if (*format == '#') {
            /* Using buffer length parameter '#':

               - if *buffer is NULL, a new buffer of the
               needed size is allocated and the data
               copied into it; *buffer is updated to point
               to the new buffer; the caller is
               responsible for PyMem_Free()ing it after
               usage

               - if *buffer is not NULL, the data is
               copied to *buffer; *buffer_len has to be
               set to the size of the buffer on input;
               buffer overflow is signalled with an error;
               buffer has to provide enough room for the
               encoded string plus the trailing 0-byte

               - in both cases, *buffer_len is updated to
               the size of the buffer /excluding/ the
               trailing 0-byte

            */
            FETCH_SIZE;

            format++;
            if (q == NULL && q2 == NULL) {
                Py_DECREF(s);
                return converterr(
                    "(buffer_len is NULL)",
                    arg, msgbuf, bufsize);
            }
            if (*buffer == NULL) {
                *buffer = PyMem_NEW(char, size + 1);
                if (*buffer == NULL) {
                    Py_DECREF(s);
                    PyErr_NoMemory();
                    RETURN_ERR_OCCURRED;
                }
                if (addcleanup(*buffer, freelist, 0)) {
                    Py_DECREF(s);
                    return converterr(
                        "(cleanup problem)",
                        arg, msgbuf, bufsize);
                }
            } else {
                if (size + 1 > BUFFER_LEN) {
                    Py_DECREF(s);
                    return converterr(
                        "(buffer overflow)",
                        arg, msgbuf, bufsize);
                }
            }
            memcpy(*buffer, ptr, size+1);
            STORE_SIZE(size);
        } else {
            /* Using a 0-terminated buffer:

               - the encoded string has to be 0-terminated
               for this variant to work; if it is not, an
               error raised

               - a new buffer of the needed size is
               allocated and the data copied into it;
               *buffer is updated to point to the new
               buffer; the caller is responsible for
               PyMem_Free()ing it after usage

            */
            if ((Py_ssize_t)strlen(ptr) != size) {
                Py_DECREF(s);
                return converterr(
                    "encoded string without NULL bytes",
                    arg, msgbuf, bufsize);
            }
            *buffer = PyMem_NEW(char, size + 1);
            if (*buffer == NULL) {
                Py_DECREF(s);
                PyErr_NoMemory();
                RETURN_ERR_OCCURRED;
            }
            if (addcleanup(*buffer, freelist, 0)) {
                Py_DECREF(s);
                return converterr("(cleanup problem)",
                                arg, msgbuf, bufsize);
            }
            memcpy(*buffer, ptr, size+1);
        }
        Py_DECREF(s);
        break;
    }

    case 'S': { /* PyBytes object */
        PyObject **p = va_arg(*p_va, PyObject **);
        if (PyBytes_Check(arg))
            *p = arg;
        else
            return converterr("bytes", arg, msgbuf, bufsize);
        break;
    }

    case 'Y': { /* PyByteArray object */
        PyObject **p = va_arg(*p_va, PyObject **);
        if (PyByteArray_Check(arg))
            *p = arg;
        else
            return converterr("bytearray", arg, msgbuf, bufsize);
        break;
    }

    case 'U': { /* PyUnicode object */
        PyObject **p = va_arg(*p_va, PyObject **);
        if (PyUnicode_Check(arg))
            *p = arg;
        else
            return converterr("str", arg, msgbuf, bufsize);
        break;
    }

    case 'O': { /* object */
        PyTypeObject *type;
        PyObject **p;
        if (*format == '!') {
            type = va_arg(*p_va, PyTypeObject*);
            p = va_arg(*p_va, PyObject **);
            format++;
            if (PyType_IsSubtype(arg->ob_type, type))
                *p = arg;
            else
                return converterr(type->tp_name, arg, msgbuf, bufsize);

        }
        else if (*format == '&') {
            typedef int (*converter)(PyObject *, void *);
            converter convert = va_arg(*p_va, converter);
            void *addr = va_arg(*p_va, void *);
            int res;
            format++;
            if (! (res = (*convert)(arg, addr)))
                return converterr("(unspecified)",
                                  arg, msgbuf, bufsize);
            if (res == Py_CLEANUP_SUPPORTED &&
                addcleanup_convert(addr, freelist, convert) == -1)
                return converterr("(cleanup problem)",
                                arg, msgbuf, bufsize);
        }
        else {
            p = va_arg(*p_va, PyObject **);
            *p = arg;
        }
        break;
    }


    case 'w': { /* "w*": memory buffer, read-write access */
        void **p = va_arg(*p_va, void **);

        if (*format != '*')
            return converterr(
                "invalid use of 'w' format character",
                arg, msgbuf, bufsize);
        format++;

        /* Caller is interested in Py_buffer, and the object
           supports it directly. */
        if (PyObject_GetBuffer(arg, (Py_buffer*)p, PyBUF_WRITABLE) < 0) {
            PyErr_Clear();
            return converterr("read-write buffer", arg, msgbuf, bufsize);
        }
        if (!PyBuffer_IsContiguous((Py_buffer*)p, 'C')) {
            PyBuffer_Release((Py_buffer*)p);
            return converterr("contiguous buffer", arg, msgbuf, bufsize);
        }
        if (addcleanup(p, freelist, 1)) {
            return converterr(
                "(cleanup problem)",
                arg, msgbuf, bufsize);
        }
        break;
    }

    default:
        return converterr("impossible<bad format char>", arg, msgbuf, bufsize);

    }

    *p_format = format;
    return NULL;

#undef FETCH_SIZE
#undef STORE_SIZE
#undef BUFFER_LEN
#undef RETURN_ERR_OCCURRED
}

static Py_ssize_t
convertbuffer(PyObject *arg, void **p, char **errmsg)
{
    PyBufferProcs *pb = Py_TYPE(arg)->tp_as_buffer;
    Py_ssize_t count;
    Py_buffer view;

    *errmsg = NULL;
    *p = NULL;
    if (pb != NULL && pb->bf_releasebuffer != NULL) {
        *errmsg = "read-only pinned buffer";
        return -1;
    }

    if (getbuffer(arg, &view, errmsg) < 0)
        return -1;
    count = view.len;
    *p = view.buf;
    PyBuffer_Release(&view);
    return count;
}

static int
getbuffer(PyObject *arg, Py_buffer *view, char **errmsg)
{
    if (PyObject_GetBuffer(arg, view, PyBUF_SIMPLE) != 0) {
        *errmsg = "bytes or buffer";
        return -1;
    }
    if (!PyBuffer_IsContiguous(view, 'C')) {
        PyBuffer_Release(view);
        *errmsg = "contiguous buffer";
        return -1;
    }
    return 0;
}

/* Support for keyword arguments donated by
   Geoff Philbrick <philbric@delphi.hks.com> */

/* Return false (0) for error, else true. */
int
PyArg_ParseTupleAndKeywords(PyObject *args,
                            PyObject *keywords,
                            const char *format,
                            char **kwlist, ...)
{
    int retval;
    va_list va;

    if ((args == NULL || !PyTuple_Check(args)) ||
        (keywords != NULL && !PyDict_Check(keywords)) ||
        format == NULL ||
        kwlist == NULL)
    {
        PyErr_BadInternalCall();
        return 0;
    }

    va_start(va, kwlist);
    retval = vgetargskeywords(args, keywords, format, kwlist, &va, 0);
    va_end(va);
    return retval;
}

int
_PyArg_ParseTupleAndKeywords_SizeT(PyObject *args,
                                  PyObject *keywords,
                                  const char *format,
                                  char **kwlist, ...)
{
    int retval;
    va_list va;

    if ((args == NULL || !PyTuple_Check(args)) ||
        (keywords != NULL && !PyDict_Check(keywords)) ||
        format == NULL ||
        kwlist == NULL)
    {
        PyErr_BadInternalCall();
        return 0;
    }

    va_start(va, kwlist);
    retval = vgetargskeywords(args, keywords, format,
                              kwlist, &va, FLAG_SIZE_T);
    va_end(va);
    return retval;
}


int
PyArg_VaParseTupleAndKeywords(PyObject *args,
                              PyObject *keywords,
                              const char *format,
                              char **kwlist, va_list va)
{
    int retval;
    va_list lva;

    if ((args == NULL || !PyTuple_Check(args)) ||
        (keywords != NULL && !PyDict_Check(keywords)) ||
        format == NULL ||
        kwlist == NULL)
    {
        PyErr_BadInternalCall();
        return 0;
    }

        Py_VA_COPY(lva, va);

    retval = vgetargskeywords(args, keywords, format, kwlist, &lva, 0);
    return retval;
}

int
_PyArg_VaParseTupleAndKeywords_SizeT(PyObject *args,
                                    PyObject *keywords,
                                    const char *format,
                                    char **kwlist, va_list va)
{
    int retval;
    va_list lva;

    if ((args == NULL || !PyTuple_Check(args)) ||
        (keywords != NULL && !PyDict_Check(keywords)) ||
        format == NULL ||
        kwlist == NULL)
    {
        PyErr_BadInternalCall();
        return 0;
    }

        Py_VA_COPY(lva, va);

    retval = vgetargskeywords(args, keywords, format,
                              kwlist, &lva, FLAG_SIZE_T);
    return retval;
}

int
PyArg_ValidateKeywordArguments(PyObject *kwargs)
{
    if (!PyDict_Check(kwargs)) {
        PyErr_BadInternalCall();
        return 0;
    }
    if (!_PyDict_HasOnlyStringKeys(kwargs)) {
        PyErr_SetString(PyExc_TypeError,
                        "keyword arguments must be strings");
        return 0;
    }
    return 1;
}

#define IS_END_OF_FORMAT(c) (c == '\0' || c == ';' || c == ':')

static int
vgetargskeywords(PyObject *args, PyObject *keywords, const char *format,
                 char **kwlist, va_list *p_va, int flags)
{
    char msgbuf[512];
    int levels[32];
    const char *fname, *msg, *custom_msg, *keyword;
    int min = INT_MAX;
    int i, len, nargs, nkeywords;
    PyObject *freelist = NULL, *current_arg;

    assert(args != NULL && PyTuple_Check(args));
    assert(keywords == NULL || PyDict_Check(keywords));
    assert(format != NULL);
    assert(kwlist != NULL);
    assert(p_va != NULL);

    /* grab the function name or custom error msg first (mutually exclusive) */
    fname = strchr(format, ':');
    if (fname) {
        fname++;
        custom_msg = NULL;
    }
    else {
        custom_msg = strchr(format,';');
        if (custom_msg)
            custom_msg++;
    }

    /* scan kwlist and get greatest possible nbr of args */
    for (len=0; kwlist[len]; len++)
        continue;

    nargs = PyTuple_GET_SIZE(args);
    nkeywords = (keywords == NULL) ? 0 : PyDict_Size(keywords);
    if (nargs + nkeywords > len) {
        PyErr_Format(PyExc_TypeError, "%s%s takes at most %d "
                     "argument%s (%d given)",
                     (fname == NULL) ? "function" : fname,
                     (fname == NULL) ? "" : "()",
                     len,
                     (len == 1) ? "" : "s",
                     nargs + nkeywords);
        return 0;
    }

    /* convert tuple args and keyword args in same loop, using kwlist to drive process */
    for (i = 0; i < len; i++) {
        keyword = kwlist[i];
        if (*format == '|') {
            min = i;
            format++;
        }
        if (IS_END_OF_FORMAT(*format)) {
            PyErr_Format(PyExc_RuntimeError,
                         "More keyword list entries (%d) than "
                         "format specifiers (%d)", len, i);
            return cleanreturn(0, freelist);
        }
        current_arg = NULL;
        if (nkeywords) {
            current_arg = PyDict_GetItemString(keywords, keyword);
        }
        if (current_arg) {
            --nkeywords;
            if (i < nargs) {
                /* arg present in tuple and in dict */
                PyErr_Format(PyExc_TypeError,
                             "Argument given by name ('%s') "
                             "and position (%d)",
                             keyword, i+1);
                return cleanreturn(0, freelist);
            }
        }
        else if (nkeywords && PyErr_Occurred())
            return cleanreturn(0, freelist);
        else if (i < nargs)
            current_arg = PyTuple_GET_ITEM(args, i);

        if (current_arg) {
            msg = convertitem(current_arg, &format, p_va, flags,
                levels, msgbuf, sizeof(msgbuf), &freelist);
            if (msg) {
                seterror(i+1, msg, levels, fname, custom_msg);
                return cleanreturn(0, freelist);
            }
            continue;
        }

        if (i < min) {
            PyErr_Format(PyExc_TypeError, "Required argument "
                         "'%s' (pos %d) not found",
                         keyword, i+1);
            return cleanreturn(0, freelist);
        }
        /* current code reports success when all required args
         * fulfilled and no keyword args left, with no further
         * validation. XXX Maybe skip this in debug build ?
         */
        if (!nkeywords)
            return cleanreturn(1, freelist);

        /* We are into optional args, skip thru to any remaining
         * keyword args */
        msg = skipitem(&format, p_va, flags);
        if (msg) {
            PyErr_Format(PyExc_RuntimeError, "%s: '%s'", msg,
                         format);
            return cleanreturn(0, freelist);
        }
    }

    if (!IS_END_OF_FORMAT(*format) && *format != '|') {
        PyErr_Format(PyExc_RuntimeError,
            "more argument specifiers than keyword list entries "
            "(remaining format:'%s')", format);
        return cleanreturn(0, freelist);
    }

    /* make sure there are no extraneous keyword arguments */
    if (nkeywords > 0) {
        PyObject *key, *value;
        Py_ssize_t pos = 0;
        while (PyDict_Next(keywords, &pos, &key, &value)) {
            int match = 0;
            char *ks;
            if (!PyUnicode_Check(key)) {
                PyErr_SetString(PyExc_TypeError,
                                "keywords must be strings");
                return cleanreturn(0, freelist);
            }
            /* check that _PyUnicode_AsString() result is not NULL */
            ks = _PyUnicode_AsString(key);
            if (ks != NULL) {
                for (i = 0; i < len; i++) {
                    if (!strcmp(ks, kwlist[i])) {
                        match = 1;
                        break;
                    }
                }
            }
            if (!match) {
                PyErr_Format(PyExc_TypeError,
                             "'%U' is an invalid keyword "
                             "argument for this function",
                             key);
                return cleanreturn(0, freelist);
            }
        }
    }

    return cleanreturn(1, freelist);
}


static char *
skipitem(const char **p_format, va_list *p_va, int flags)
{
    const char *format = *p_format;
    char c = *format++;

    switch (c) {

    /* simple codes
     * The individual types (second arg of va_arg) are irrelevant */

    case 'b': /* byte -- very short int */
    case 'B': /* byte as bitfield */
    case 'h': /* short int */
    case 'H': /* short int as bitfield */
    case 'i': /* int */
    case 'I': /* int sized bitfield */
    case 'l': /* long int */
    case 'k': /* long int sized bitfield */
#ifdef HAVE_LONG_LONG
    case 'L': /* PY_LONG_LONG */
    case 'K': /* PY_LONG_LONG sized bitfield */
#endif
    case 'f': /* float */
    case 'd': /* double */
    case 'D': /* complex double */
    case 'c': /* char */
    case 'C': /* unicode char */
        {
            (void) va_arg(*p_va, void *);
            break;
        }

    case 'n': /* Py_ssize_t */
        {
            (void) va_arg(*p_va, Py_ssize_t *);
            break;
        }

    /* string codes */

    case 'e': /* string with encoding */
        {
            (void) va_arg(*p_va, const char *);
            if (!(*format == 's' || *format == 't'))
                /* after 'e', only 's' and 't' is allowed */
                goto err;
            format++;
            /* explicit fallthrough to string cases */
        }

    case 's': /* string */
    case 'z': /* string or None */
    case 'y': /* bytes */
    case 'u': /* unicode string */
    case 'Z': /* unicode string or None */
    case 'w': /* buffer, read-write */
        {
            (void) va_arg(*p_va, char **);
            if (*format == '#') {
                if (flags & FLAG_SIZE_T)
                    (void) va_arg(*p_va, Py_ssize_t *);
                else
                    (void) va_arg(*p_va, int *);
                format++;
            } else if ((c == 's' || c == 'z' || c == 'y') && *format == '*') {
                format++;
            }
            break;
        }

    /* object codes */

    case 'S': /* string object */
    case 'Y': /* string object */
    case 'U': /* unicode string object */
        {
            (void) va_arg(*p_va, PyObject **);
            break;
        }

    case 'O': /* object */
        {
            if (*format == '!') {
                format++;
                (void) va_arg(*p_va, PyTypeObject*);
                (void) va_arg(*p_va, PyObject **);
            }
            else if (*format == '&') {
                typedef int (*converter)(PyObject *, void *);
                (void) va_arg(*p_va, converter);
                (void) va_arg(*p_va, void *);
                format++;
            }
            else {
                (void) va_arg(*p_va, PyObject **);
            }
            break;
        }

    case '(':           /* bypass tuple, not handled at all previously */
        {
            char *msg;
            for (;;) {
                if (*format==')')
                    break;
                if (IS_END_OF_FORMAT(*format))
                    return "Unmatched left paren in format "
                           "string";
                msg = skipitem(&format, p_va, flags);
                if (msg)
                    return msg;
            }
            format++;
            break;
        }

    case ')':
        return "Unmatched right paren in format string";

    default:
err:
        return "impossible<bad format char>";

    }

    *p_format = format;
    return NULL;
}


int
PyArg_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, ...)
{
    Py_ssize_t i, l;
    PyObject **o;
    va_list vargs;

#ifdef HAVE_STDARG_PROTOTYPES
    va_start(vargs, max);
#else
    va_start(vargs);
#endif

    assert(min >= 0);
    assert(min <= max);
    if (!PyTuple_Check(args)) {
        va_end(vargs);
        PyErr_SetString(PyExc_SystemError,
            "PyArg_UnpackTuple() argument list is not a tuple");
        return 0;
    }
    l = PyTuple_GET_SIZE(args);
    if (l < min) {
        if (name != NULL)
            PyErr_Format(
                PyExc_TypeError,
                "%s expected %s%zd arguments, got %zd",
                name, (min == max ? "" : "at least "), min, l);
        else
            PyErr_Format(
                PyExc_TypeError,
                "unpacked tuple should have %s%zd elements,"
                " but has %zd",
                (min == max ? "" : "at least "), min, l);
        va_end(vargs);
        return 0;
    }
    if (l > max) {
        if (name != NULL)
            PyErr_Format(
                PyExc_TypeError,
                "%s expected %s%zd arguments, got %zd",
                name, (min == max ? "" : "at most "), max, l);
        else
            PyErr_Format(
                PyExc_TypeError,
                "unpacked tuple should have %s%zd elements,"
                " but has %zd",
                (min == max ? "" : "at most "), max, l);
        va_end(vargs);
        return 0;
    }
    for (i = 0; i < l; i++) {
        o = va_arg(vargs, PyObject **);
        *o = PyTuple_GET_ITEM(args, i);
    }
    va_end(vargs);
    return 1;
}


/* For type constructors that don't take keyword args
 *
 * Sets a TypeError and returns 0 if the kwds dict is
 * not empty, returns 1 otherwise
 */
int
_PyArg_NoKeywords(const char *funcname, PyObject *kw)
{
    if (kw == NULL)
        return 1;
    if (!PyDict_CheckExact(kw)) {
        PyErr_BadInternalCall();
        return 0;
    }
    if (PyDict_Size(kw) == 0)
        return 1;

    PyErr_Format(PyExc_TypeError, "%s does not take keyword arguments",
                    funcname);
    return 0;
}
#ifdef __cplusplus
};
#endif