pdftoipe-20130124-src/0000755000175000017500000000000012100161615014212 5ustar otfriedotfriedpdftoipe-20130124-src/compile_on_windows.pdf0000644000175000017500000024271712100161615020620 0ustar otfriedotfried%PDF-1.5 % 4 0 obj << /S /GoTo /D [5 0 R /Fit] >> endobj 7 0 obj << /Length 1707 /Filter /FlateDecode >> stream xڝXm6 _}:=˖}@?tחv.CQàĸlIHQv쫂Jb(oI,g3M.xGzd,EŪ\|v~S0pK7WNMDl` rݫjZU]nQ O<|_A(؁4̳~KoZOI7EZGEܮo MvtR}m`QsJQ>ο\!]!O0g)NKXϭWJ endstream endobj 5 0 obj << /Type /Page /Contents 7 0 R /Resources 6 0 R /MediaBox [0 0 595.276 841.89] /Parent 18 0 R >> endobj 8 0 obj << /D [5 0 R /XYZ 27.346 825.923 null] >> endobj 9 0 obj << /D [5 0 R /XYZ 28.346 785.197 null] >> endobj 10 0 obj << /D [5 0 R /XYZ 28.346 800.223 null] >> endobj 13 0 obj << /D [5 0 R /XYZ 28.346 718.521 null] >> endobj 15 0 obj << /D [5 0 R /XYZ 28.346 591.428 null] >> endobj 16 0 obj << /D [5 0 R /XYZ 28.346 269.602 null] >> endobj 17 0 obj << /D [5 0 R /XYZ 28.346 182.913 null] >> endobj 6 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F43 11 0 R /F16 12 0 R /F44 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 1 0 obj <<>> endobj 2 0 obj <<>> endobj 3 0 obj << /pgfprgb [/Pattern /DeviceRGB] >> endobj 21 0 obj << /Length 999 /Filter /FlateDecode >> stream xVͳ6#7I|rK3yI:Mgr; #wlCh v߿]AG7t~X1F$z)""<J}_߯ Ω_n3Oq|(HsmTtE?ȢDUAI*]'bâU+B.{fЛQiQڍƭ ;T;]O*TǮndeSМ{$†\luFnʍIPOHbX9i>XcϨn8ȦA4J (]=!cV/&sd n74V!2 ]Xbj~Ǻ,K MtB#V˱Q'm;|&wDK)5skpks9%^A7ԩ0[^*SD?eD f$Ï;ޙny3=O 2JwsuM+leoһ0AXV+LIh]wRRXY'aϺ,iC?XUC[.M5Vz#؟7Cf)'}ue x(F$;w*DY7&lp=άBioթGU8c eӾx^%_umw;\><c 1';LKSe(N@7tK> endobj 22 0 obj << /D [20 0 R /XYZ 27.346 825.923 null] >> endobj 23 0 obj << /D [20 0 R /XYZ 28.346 785.197 null] >> endobj 19 0 obj << /ColorSpace 3 0 R /Pattern 2 0 R /ExtGState 1 0 R /Font << /F16 12 0 R /F44 14 0 R /F23 24 0 R >> /ProcSet [ /PDF /Text ] >> endobj 25 0 obj [500] endobj 27 0 obj [514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5] endobj 28 0 obj [543.8 543.8 815.8 815.8 489.5 271.9 489.5 815.8 489.5 815.8 761.4 271.9 380.7 380.7 489.5 761.4 271.9 326.3 271.9 489.5 489.5 489.5 489.5 489.5 489.5 489.5 489.5 489.5 489.5 489.5 271.9 271.9 761.4 761.4 761.4 462.3 761.4 733.8 693.2 707 747.6 666 638.8 768.1 733.8 353.2 502.9 761 611.7 897 733.8 761.4 666 761.4 720.4 543.8 707 733.8 733.8 1005.8 733.8 733.8 598.2 271.9 489.5 271.9 598.2 761.4 271.9 489.5 543.8 435.1 543.8 435.1 299.1 489.5 543.8 271.9 299.1 516.7 271.9 815.8 543.8 489.5 543.8 516.7 380.7 386.1 380.7 543.8 516.7 707 516.7 516.7] endobj 29 0 obj [814.8 321.4 546.4 803.6 631.6 1007.7 814.8 856.6 739.3 856.6 749.7 642.8 792.3 793.1 771.4 1092.8 771.4 771.4 707.1 343.1 578.6 343.1 707.1 900 321.4 556.1 597.8 514.3 597.8 519.9 353.6 578.6 597.8 276.4 308.6 565.7 276.4 919.3 597.8 578.6 597.8 597.8 395.4 443.6 417.9 597.8 533.6 790.7] endobj 30 0 obj << /Length1 1403 /Length2 6029 /Length3 0 /Length 6987 /Filter /FlateDecode >> stream xڍx4ֶ Zhчu{NDc0D{ !: G'JM=5k={_{p (!mHZ$(i PD&0пD&Pw ;ؔh P<@"H\ Re'-xD@QDJHWw#S[7Pp `@v`*Bp!}#*%$%vA "dy^0#{B(t.?8F0_C= ` p@aB<vPw:PC E Ht%!~!+C8ap(@WUKv`8 {ap-{`>a sEQ0/B`ڬSB@hѯ)ܡL}3{eCa*dy@5`0&h(PRLLG_|\~HW=4f|P@  B`gǘ1X1>(TL PSQ H H .. guoz`؟GF =  L&GƆ :HP\@!,{Gpo?_v} 0z@cfCCM 6^ 43# @P0o qKK!Q_L_>A1~g]ikE`wwF(U;oH4&G:X(@#1vxc0^u( !ABÜ^(0x l୬vF'E9g9jgM)ؽ37W11|Qwnrz>Ko]P`qI0&NqDfckb:s.#rPr(9%gMg@)ub?1ge_E?"naakhimn_Qfo؋J:*ytIPXJilt.86? ےD<to>~QY>b1.Dr99ڑ&]t(ZߋK \֞Bka/4?snLK ||(gv7]auZ/yҌ%qmPO! dpYG& &*bZYd5OB^TA~^[Cyɹq#Y#mLBsp)rRJ/L/= iI>^?@^~KMD[C!a+·6:\a'gZS=~o#IAB]CxtjdwL3_vpm{7\RI +D[-Z'=O,ΤmZ}j9pQᦨ M5.)B;S8$PmxC BѾh.@Sk9BqQ/ 8DU⇧ȇBfbo}]_n[1(hE[)=h(4O~Whru%n-rEK9R=͏D=IG5A߆$9?0aa2VI=*jI> gQyEmzɬgX_$DPRMi? Rpc.G}yahPeYAVY;8Ϫq+ԫwPFOJgu9!}r\?o"epc o*ItBYϋ5:$JCT&ȺEּdTZa륕*7eN4PJ+Wv$#%pMgkV8׳®Ϧ,Tu憜zHd 32Ө-Aч1n/N(h1ܬš[ rWËIlƥr'ur)3a➤2z TY|NաHZf}kG$2E' (>5ANF\tl_㇓~YYki;3P\J>k5/^[B%Rjn\t[74.91$}/!U,n9c%'pñX`;h4b5y|dI!OKhBpu %Ydm cV}[ 0d+NvaeM z%(CXX2Z'xP;>qVNi)7"5?(?1FzuE .O} ):p@}|j]) ج2Yg[|'?ES2Œu<{K >L4X껞v'2wK=Lտ9,LCOӠ*M<8HqKYV-)ɱqCX?զ }bjjx3rwSWUf@K#[a,!>.ع./jJ> 7!汫brԋ߷j~89n71Ii+ϹADi.F@x$wvmX6XDf'TkFKjYǴOu韝{W Ǭ8ȁ W{.amXd.ȩ{7[_k@ Oڏ:wA@B礱*w3"!,*d:G>GbMty/#xxH"OKa)5dEI"8tgX$s*8xĒjO&~1~i_<>>*[G,4qr%-B}S;f~seBЗB%*[tS.T3oԝZ̊ {D>7qFY-b U>$յZ[r灻(Bqb^2aL[@{Ȳ=Hud2'8Iɏ I3[ɻlكh;!حiTެEGaeW%RO?4 ~Z6J]$l~8fM/8r_:6GT_*[k)s|f /B S(`xηiꆌ9F@Be -tAjk ؑT/tc˃Hd|MZzdH>.Ef쇒*4N2DO,yݬ&9+V0Uwb֧=۫nXV^/Oka,Jzg=a1a_zMgEIKݞ6jўtz_3 zTFaSu$+RS"sE=+  A\.{YƟ%]Y;Kmp̔%+ydYq,b&Wn^y?HF;;sIQ._XtҎg"u;"rt a#n9hBix:ì{̚Q}zʷ(csR\S6~M}̀o׏<#rSI9HH ^͔m{*BUEK8'f-zB m)t\"(IXŢclsqayY5W/L%4d=K_,Jh!Q"䑲Yw迦O%Tku6b%,b]Z EJ6O]lGI;<'ҕskr;co$׎^t;(<"h["WH] iEt:Z=K&Ij}7śuР<ɚ{81%]Wv*wO{*j,rk,ו/NYL.i ~D"d>{mJ=s6O(oi<AG6V^8UDo|I!Ҋqǎ7M]3w^r#_= _w_Ub}#rȾc魖bw±\' LN }plHlプ:0B*\WtEo#̫zf9$^[ڕM=dV0Y ?4C!RL2 1Zt+%!.T ߳b, F<˃(v Z1SJ%^O!{ZN?㡏5+#;|ݺsj\b^GbfȻ5u#s,KL{,vƂTf"S"XflIL{iԼ|1 _{s"g,y ZtͰ3Pس Kc*u!{T#wbzAB/𾏢x9;|y4GX=#[lg\_YeE~h{۟[ML3%פR;s!LnPSO.K~xZU[^l:DxBFIC%2`Hjx^xYv56KߴYշ{?Z!NJs˕ssc {;2Sd՟=WE iƤ ]Z%u)r:Uzj턜7:83-nN|UNѓg\hԗ`;Hr0q/h,ӇZ=w^G9XpG+fvPh5b-hk ~jɗa˂ifAgќyK"'krTUGO(νʨPꥪ޷GKI:$g̬WxҒe` Y%WDS8pHG1R&v#SYSSĘG&5 _+,/w1r^+/_=}b+Ք6_:Q8U9dS'8vd`'=b7eTo F?liG:Vt?V^.}|>V6L+Vi> endobj 32 0 obj << /Length1 721 /Length2 20029 /Length3 0 /Length 20610 /Filter /FlateDecode >> stream xl5:yǶm۶mm{=mm;77OjuzJ'UdD^fLtLqe9&fFF#= 7@b`ba!88z9[YX(MZY9lܭL,.nnlR13Z̭l" ZRJ y5-@ kebfbF0wpg0q7'w7sv@NLUH\A^ & *07JՅݿϲ5e?QgX0LLS+W= ÿt7wm?\GC*?h7[[y#;33@`gd_/ \Ar43UrGjs#$_?"gfjffύ:z#I2jKj7q0+YzK`k9#Wg+O#ʃ_-vcdб03Xq2蚸9;ٻ[r߅dfif`bV'V4W N37cFwFj ^l1}3QT Q k I_ֻR[C5:M ҜehᵱH]2lŠ@p66v[{w@QDB O5="?y#Ga{k;uTTgDW'aD_tpC !(sJDtC_qNqƪOUddF`I"qn3?wO=IL.I{<iG-J0 eZ;&$n|WyVsړsKLELpdb0Ѝn73g[W Ie=/3nؕF~N]FK+񦭚ԧu,\?>.iYQP; ~(TVT\&|6TVDI>y4=ù$6kE*<ܠ_@T_V<"Uطg <"z3&Cؚ&Ii d6wSL(Qi n ˄@ OW_Ju`pg[P/p; (\&;W ^S%m "Osh.Le0knJ6&65AI +-dUSMjBɸR9H gT (. }JI~Dۗ#1tno<8uyw3һu>/oY(/--AMaWG鸱$NsT/i|«R0~%! 3MepjI赩x1>WƟ\dUUsm]ڄ8ØbUNGQo9K/N~c>)W;3nV&]<эO;ob7o4ɠ'2"b&~^-(5jc.=}7n@7!㠈raQ`v6/kdDa(l賸r… [/I @u)]rx;w *ANE40|!X)ʕ{a|q`[T0e⻺i7wλ M.k-Wf85lzSRaCb6ݿ` d!u3%5^0Έs 0*\k6cq .)p4arƮPE hr odK)[V 'jo5yXpxr]ʼ|^OzRdDŽZbE) iK#*Ը3(&j_bx*hc a9ΑÀ2xRk{N T^; ]npi!LFKrvגO5~o˹0"Ar3yPv=Eƍi\Wg?ū:›4jYL)dˀC#e$${Mc{aW޲c\}CN{CzN@=vA,}ڻOGZhDLsGd@0qW,#ZFq^j#4@o.w:=+K(i&1He{ɮDaDOdY(< (CTc(rCp J2`Gӗ2͆2&VAWtqb ?Jn&'p%pQJ};ƥBR:f48>pvN8zOJ.1B?Ӓ A 9ոvr}WUF7KL,Q-` U%8qwG%^:SfL|(=:YU$U9T(pIb1s@@A8ݏW"㤀-n^ -vױT׺sqyE`Oj̑ړS`7A&ts+ÈEL¶.0F3gi}2_d@:YYp<$~X >47Z޵QvHC|gL,e8$7;M:Z U$$5S$P"; D:R5?hy W./It+sNEOWk뚡0.JpAV|>S(/tu|T*0O)v|45O&r[/+ dsT)A, gBLoU%RL= 6 _.%Wh>}ɪNEPypB2O*Gl9{)h\K>8A*O1hl)}%eR}clM>?NyqP B`JwgmA)y#gx3ć+n"Kۍ'ԯ 'B [ڪ_ ]zK?ћ U9w`}xbYMWdֿw,pjg1&QIBe h(0˒.ynK)bIuJS#o$@8t%a͛}r8uX[\avDAqp*fnI:jhXb$m+2ٔ &;`XիdsAElWV }Qjԛ}\vx#3?&UJFST,Edw{hEďqEFsȠ#T9yvVG_go>Ŀ#=̀y[k4KfhBZX]~YeNV͜H朂|a[ koOn9C^OyhD>We9XfEɥicS&+y~bP\6̴N>,m?)kӪ~h!4RZ=Oc/`}s]TѸvŽ}ˆ1B _qqDJ̀ӿ :z1 _5z^c=]3xQ7ŔmAn?>P "IԒR"ap=VL٠ר{X }Fj"Pݽ[|K  x1xǃGZN ֥G;=#Rx3,9cFʾ=IA8|zA8$hl&Ba`9jA΄B:\ #}ImZTj]f/k7\#h2>ͷU|8} Yi/ L |OgE2]dj pOlԦźQqBN),F{ `5 .N[uS˞ $ wRsY,MY'v9eBD#٬F")&!Wp8p>:5H ~ZKmVC 58| xM Jleiolq?ӥeƙ,SCf4~)S0,f9*V; 啱Tڑ r`Is(rMMfg S:K^a!|;fShJҊ|ϴ" qp?o9uOTZ V7"]iHYҗ2Jߒ _bL[J ÛLבɚ_h\T7(D,TȑFAcLiDvlz(cҚ.py)!TԐÝg"iݻ˙|Dn&i9"_ɼ (LI,j {S iFπhy<<~)k.;ap_kp'|T8$ O##Gg%`!{آ F[B"RwDX$ܡz#}˹X ]!㭍Fzo'JqȪ zĢz7;j ߵv5~CνDmqaA u`3K Iar{ёt*^HAZ0saR|nj9 ٿ0h&ecu `:p28Aw;=k&RKgA!ftL8HnI}y7V>8nl0 `_8$b5%i)(J4&4p+uK[SF/ϰk]roO><& Uzp~~' my<1.t$9 .DJ2@`pݬ絍/BȏD` n`y@ƪ;mFhh JkK`$o.yQBME'7Ԗ|0 $/gwјXXY6mo ijBu~x0 N-rjzoKĢ.41.?1öutaP2Ɖ+Ce![FZ(dbc}`g'8Q0j|,=yb%BW^MWBh5H"M9Wnabͤ2%;+]o(%r|͛1jPw o=wm pAn(ɗ;o"lD߬uے |8+v>$M Sl6 \ds/3^ғV'N%(!=|,)[T@q^PSJ:9H跗83WK@5]9"╏PԣRǪ Hί_;QvG:]!rVڇfk?2fĜS*s/͔*wlE",En:T,"Hkm0i8]d}Wʜ h2 ȔE(ݠc]ԇ7T\y6>ɇgPeB9ϴ7VS~fꔳƛҢNa&. U%-ʚ4o\G&1%ϡsu<'m ^eeNpkKZ˱K W1}7|1yzZ54G 5AdDa,)B0k3}\GnpaՀ&fi Nqn$[M0^vMjL⵽ &\0;L<,X؋!"U8B 'ZOkl9mĦ_Dq; &n".)vZǥ]e<)>N$+SY9t}KpʓelXPXaXVߜj☃+f%r}]G ;^\f w7 5>.c+^~{ x:X"24tGk}ї+fJvQ0 mpl;^0pь|zN`+TEkT7*^`E.)^"uۖwZѺEB[lV' uGaQv&=51=gx2~0ژ4bZD}ۆFVy:Y,.ո]-fA'I ѡ1K21 -LV9Y8խ]5DۋNuhX*ȡ(:&l:{M%ziw钲l%a MkTey{Mɥ@2꣧0^ql6R@,t:24RA| Eѓor|7g U&yA}P&>u@wHSfşj7]%_I>,T"MK <NkhMbI-)ǿqY 3 q,xtLÇ6rBÊpOjUe5~}ءy@Mg˺fFG0M c;N둵YI{g8y5 yg'4s:ğOIy&~-<Ëh6qpLD >:| M4k7k` Nc8KTk4|WBH0 itbz  O'/BҬ)ڭ3ăx;Pa@+FT>TSD4w6Gq<1E*t !e tV~iGI~18ΈG|j:JY7tz, ~Hf k;R.͵+n<^ N$e)/j8.%P]Pe̘Rסo\׵[7wM֣[:}='3|a!.BY}UUwJ%H7̽A4R:4fc_Un.H|0XdOoA%@uz-W7y& ye~:oI TM:I O8*ʌRk`M 9p!".ag_JR"GEF+r:1E LpM;gYNӽO1YcU,x|`qJ<8䄨or|ةO`JhnKH$t~B Y޲^|FjaDMڪ %P5$ } H,ZI\aMg=Cر ) {veNZ.D&jNNؿ ^ޜTSfKjR3$Pn.v<2b>e ]?<15vFd.pL!=I[PE{@6N]1YBU4\Zi.xO"g0ZƮquePbWPt#LmRR`pЦŘ5^].*y P+vVr$$'.fa<šXX?Q1AG`vQLEAs*ؤlK w%áTلlzA5̫M|ftvlp7r" Q!5 #C'b4v:B#:Rn0og I5yֹEމ pmrt,0ޔhYi\D{'4ca;pLp# e>LÞR7OQѬ}/q3iS} ٚ`n e" S'b@ϳpvun+Z$1yP*=r/ N(YFRۛ- {-qeaΓRcK~"`a `I N\kV{M98*>)cYBS`f]YVZH& _@Er\EݖFt.aJUe~XB {'L胼a 2uRt:㑥W:S'%c ˤ@a~ ^&Ne{\qR|~G;)bY}n)l[V : $ w;ix]5M쫋u}SJ]/lsPVEEf֙"#[n \۫,0TSkYĩmWU4oֺsn벨ǤLڭZ-zr"LBX(-6ڈ(A n: GAq}I?mTR%9o0p!)fyjQ^,ߒ+\&Q:ˤ̝̾V}?ItY3^f5NZp ]s/890Fֱ Fr鈌9;{$75)y@lb֟-N@'NDq=aj{6"5 4#A C%=NT#{"7#Ej 6gfϾ+˳@!6:ӻ{p{C[XWX\=`-*p /}*uI+?V]:)xjX:j#Xjp8VK"ULOLOd~%=TWT' {<\ ) 2DA̢Xw YlP%(%ZI ZŇClh5~}7GݿZZO^LDlrKĪ=P7.sHEs_N푅%Υf;2[雼*+;ʙr u-M2%"g.|LLJ!VXq0uO~;ްnYIڬb$&(O;I^ I "Gr뛢sbMϻXq^ϋP<$!+D;l+Dx?^DJ03đ }*y-zNZaF^~^_ p9Go+`=T)EZc˵lDyMJnM)`GtǒEI hb;!Mi\]X!rE\8 &v*.9>6ZCD;qv#2Y B/'k #q}F \49OXW??8qs%"21TW{(դe}!hiHMe(;~r!!"$7raٕ#XK+~$m$^.$;-5Ǔ%) McGw,W[U΁9:&m7D Й5^lCah߄I4L 4i7[H=?x"p*l)OvqW] e t "/W;l(sNf}wY.JNr*~H>_b%d_tTV~ZIQ}7 (gLH }[m>x+Y@K2:SGX\0(\<U:{W ^(҃v¢jeHd/}9vuK_LRj_'|OwGv~rU/T򂭽:=z~viͺ Is),L73@ u{(|`姫?NNgz:ZdTja6!_;>~lE&j5y䅢dqeZO=Pfa}Ź2(TwߪҴvmCb.ҟrD9WE;vh  PlL[ؽ?0]Y #j䏂sV.KrI F ByDahdĝSlZ>0`TbNAJ(,X5OvIzl|71~Bl6/w 9-w8޻G6~4 c1+Hs Hh󳿳zGm{Fn׃fXx_8Z .ĥ?|zӻU5ށ{RB)[x\.]U}jvWB^9Y  ࢟|?kvkiFG4rQ}YS_sϗ)> pZBVK}D@ i]+/C\~ g䧑²,˻-WJ-b4 35v3_X.(@߰`::Zha3eL]JrR7vR0W,4IypU_N>HD|Vq=2[TjMMz:2Xggd-CmH+FHS 9BUiZf%ҝxI:Wc P7J,건5$ h2o;˖uSH1RbsXd7'n=בsLWG-o5]`ZJNKrۡN]Lc:b~N5Wr\J[:+vnV@rs~540iI-0{yd aUSu1wlͿ QrԄV ӎNeS3oWEk3 Yg1>ǣZ=%8Zdz Qo&~:&6WSҎ"5_U7lH#@AD9s@20|{dxz?,lnA@t.y#.6a3"uKw$!TARMߖ7~5? h241,"KL]b :%VWƵEʒmʺ7鍧4jԦ3O85˱O/Mo߶Vhm2X:.K;? - $Tͅk,h \-АmwmB.UEh#Gp*4+4Qƭre:y‹)fW.lS\91&nE7W f >YD|+sKNΧB&zU tjGVP]yJ5ۻYVtdV7fwvM~lbmե{!o״ Xqsb !&*Qgޤk}zѭyV)6}11e>cTEwse Zʞ9g{ R# X)Bؽ#@NeF{rTPc7)|AKI~$сolHooJ<'7V^eФgoBmmN*0D_<{i[4Y+`\ԩ"]nˌ8NظugRRN9ifQm^DE܊ wϱ`W̎b=TkǸN. 5m6-72.oIBs$kfvXCd\/E=_h=3Ar촾W5&exHn ocۺpx Шjq-ܡhPP)ҽ~cC춟gvjtPKMDqKX`E^_b28n偒bEކڿ$;:d8HO9 c6U՞@T={LjJj v{ҏBzJ+&fM~ s :w;@R?7 1U=IS( 'YL:XQMⓜ',Ă1c-U|]@JmfCOAX:b$NtqMAc*y֯:mdbMs$F)4M3UEuUWN TH/GmS?Ķ'Q BT{)0ݵVz)7M3#^<<.^3vN|1Z": e5 @%kxvҼo{B7t V>QO{r3 B4 %l Ѯpl:vSb %fh}[yT;GGCNQL#K< #!8ݮZ/(.KUیW2KN95k19Xv:aFkT-'障ڭ$KYVŷ< &6LR/Tm憚ݫڄ3*,x6 mۏ=/&;ԬfeDGMC&<1#[CR X9W?ݺdB/*EI;\F\v_gڦV NU;>$ő) * Z腺sGn0D~y1n#Zsqk#ƶ=ǟ3D<5CN]LF Fڙҕף]4~]V{"Ys756ޠ?7Op߆{{ӣ ! "1J4QM$Gd\^5+2ZsT(mx S. l&r`ϖqP|xGX]3 (_h~ Ln[1 VE΍R> ®~`țs;}C qb*2vC[LT·S f,2{\&6DA++2}Pρ9 uQ)_%@ s~!|5ԋ7G`N.ȕw$He r^cI6Anl1Ⱦc0órSL:lBu$YZPyW'Ue _ ?ӷ o;LͩP!M>fOQskI\q}\C{Fϴ N\<\5J!"m_<ͺPxpS%m 6*aM~†YR<.Z4*Tc\v]eiWQ4KxúCaih*dR](?wKןFogǬlrp¶2cB8Gkޣ˥}֤ ؀6:F:#b1 Dzfd5ۯا.ՕޚIL#DVVfy8Q=5cpH5 ʘV+8A*$$# C-yx2C% m['4νJ‚*4ϳ7Nf+5yV\6b,Xi=K|NA`QO 2YVdXdx@-44j̻jkg'_ Ծ `Ŏg:;PU`'~H/x9J_ahqK_6X7UR?&^ a>ǿ7>|#_y@!d)s76t'!{e*W Z ҧ2+FA_ځIV;_?-[6U@Im1Lo8)`wōgX:%:6i S] g7i(ƈ~R>Ҧ cbKl լu|d/ѥ(Z72jcejB~e0$B&)x;Wl4B*O21E)ta?z#pi2iZJs _NnEN+I1[m$銒H$T9vh"C1yʫ _ʕÄa!B}]5/w(׭K.4k(k(Ւjx,5Ք= &rǺyj~V֨{/-2{0h/ՒTOoOلWDV}^[`}T;:`'q(: Ἅ Ҷ%#1)3%O0{`2|JBj.<، 0k6gͿhF:v)ȼHȃʠ4 t Qevt;K;&m2LlYm(bưˌFh&^ <'i/))5Y3R>hI ,YM|nP:MtZ6x2CX҅DtSAu )=bHla>I~|6z1ut-d~ {kMW O…&=%e'ZUS܄5nA O2@P]a^v<ے&Ufe}\Yy> endobj 34 0 obj << /Length1 738 /Length2 13221 /Length3 0 /Length 13802 /Filter /FlateDecode >> stream xmxcpݲĶĶ&m۶m;۶1m;7gSOFWwսz:+{؛021pDٙ~蘡IIM -l M8j&%{# dghaf 0G P60pY۹Z]]]]\]x)M&!9y Y1 @ bhma02u29}[ ?l]M3uȈ( *D蕅iNMU %J:[fd[9 M,lśjcr@CJ_okkY#@d`G S1@?6p6K_2pp71p˾_ѫUJ迩[llgk? O:z!EiA1 N?f[#;c [3_r ,o`q2Ύ- ÿH:%(hEefb033~r?p\MlZsgLLMז팸-S[B}E g+gUV~_k!Y ^b)c^H5ę& Y~)&0zS׽UŲ1uN__ d9t(Ac/C܎_]x!G5٧F5)2{[ څ&3/(? ,ڴ >s深irդ|Go8pt(/z-aۄ42cGf[/Dr҇fQYr~.j[*Gl6X[mI´2#RkU+tO+ͬ9Heɉ/rug\zXC~?ԅ|(DEHoCuOP2_i|@FU2l} 'ԒQcE2]s^dž D8β$4ʚF(M玌ubDlCȶB1C k$ J 9/SeQG*Aº^T::bv O7)Iq85!"D7MړyLࢦZx؝=H$}4ާ+,7tm ?\~0w/vwkĺ]̠O0绢)/2*uW`=v'\#?@cnk }N# d6^Dyl,R=k?dV߁B5QP]W3_Xԣe^`V덃wrP̐G4_j101e~I%p m3J֕eC8x'Ek^+b"(ݦ} 4cwuU9f (VLۡ r;أw A"`g’ļ[W4X(#ZzEτs3Vv*c=3+b3x#^(H|3,nAq0*atT P4,T_!>YB w*%^-TkUVY-D{ OT~x#BP7 m]ځAdL('4ʀmƈ t.aYS!Ns1?jYơ|@!S^J'w>Gɪn{QTlHl)rszu|8 v""p-p$@ [VQoO><02Zwh#6|P(,zb@SP!)~+'iS&4AWV>l7ծL6ڔʇCRgĿ\T)O`|.㹫ehځ˞3|x.Hj>ݨRk?dϒ)雉]ڒ?V8lA4,lq(ueA[x+x 5įFFe?X?ǏVy(S띬쀾W C/^sآM SDHA*u]0)ޓ>0\G&,l0HAkKv'.>0tUR-h7fzD+ᴶփ."2[. ̜g0POTcrjF#y屗B??E`re @ p%e=^[Yz2j%yigY` ʗ=3bzR7B(;@K~}"TP.!=ex(AmSit7~gl2F$36:t 7O@^IZPR_ud`k *$yD‘<T`zr&0ֹ"F8L `<▰XTnnU틊 7_&E(6AzSQEC{sxwqض>d0ubq8!>Q3"kݔ}vo ,fЯr3[3*@R d`܆ȒU{#~9)s12+|~rS`o)P1ܶ[Sg Ek|gMSN ͦԅU\׉wQK^=: wzp_̳yF՚2KHVt{A)M% x:tZi<~ő ɆAkkA[}9ι-ɭl7oXI~20ˋ!SHQNm5=wmU0=wn,C쨯L t{:<7³`~Bo  :i(VDV-!:|KFS8\wUTYo 5Z8>&N8>7 ='qʢ,P^,_8d.K~QtB*=zKGtҞ+`Xz<%O<3fUno8!6spdC壙j SCeJO~6q/T&D/-Sl5XA@>L -M02]>]r#3ޟ**lW"=ػ8B/M(9Owo|J:uF!ET /jҽF7^x@(pR9,|Xu(P{90 %կޅoC-9i C)(.D1>Y/K*~lx< '<lrݦc7lFVд!.e3~PNvp8^xUy9)uysUZW#Ӊ񰸟SǤ@ ")!&Vv;W T0y90JIio9DKz8U./H Ijt:{eRԋ<$2]17 *g$OAUUSjd4ilA#\Dv6>qK|ZB.c:m nfxM^8$1 ^u%IՖx"X ս|fUC~ʛ8H9n)\{HYT@V6lg42`*!b6;-"JsZS.*ܮ,`11ոtE96袐5e:#,kIca1L q>i.7 ڊ޺[H}Ù7cA>U1"MMzTͅFZ!~F-MH 0@t1嶹TWh]N 0tv.+@T+ExQSٲiRoP^h3<_䎌uDEu* RW `uEq&<)$h/Jj@ h==н%4.`?VD(}^=}A%^#\n QBM{{ o_ਖ&ᦱϲE߲{  ~؆7-9Kxj$$a xCoj<ߺ t}"!j6OyTTL8>NZoo7Dey._w*-ud;J1Q¶dl|x@fX3:~,U'sH6Ed`<>i t;ɩ[`&,Q\s:1cޑyjc*|C$V#5I\gY5_T^\ RdojX c=W9qP̎gՒE'!*Dw$VJ BسފXЃO!}曐}#rͯ`k1/}NhP7; =Z\>B6,H."n|ԓak+ފޭBDflG@p%|3˸T37 )~%wCj_22j|ZN=-+w hi\&f9Xs8״~D$DŽWwAD6M6@ԑ8nX]MN <+/s򾌜їEhLO/K䭙!D8}O!Q8:! ރ*mS. Ҕ֢ܿ( "]Ud ~<6W!}DKsA̧2y fӏ7䖢9$B D(vv;ϢE!l]8pDyJ.DF8g\޽1xTVP;!(0䱡ļ"GE6yvdu:|]Ӄ{%]eH]Ͳ/!ü#& 3uA^U^+8ɡpܲd5Kp-E U]K΋h;H]̅*=FguC*8@d nx9ۧfCLEÚ`ҳⓩߕ'w&.GYiD+(`F[O ;7Tj*KHZoE _s1CAa̭t *༌Y$N }'y\7\ETLb!>ymP&ZR$(^hS>*r&OvtHP| Hf3 5UbK78\Bdt$F+ճȌ[uB!` ;2";tpmOM㽩eYWX|. H:5VXtUCTlSǹ6Ӂ'icŅ"+!4/ѹ?iYl lӍ:$cD\fyL߮LA-W$l VPoS"<8| XÈMD{1bߠP#'`,:;mwLp^7E.ՙ\zʅ^&ٮ䌧zbkB]X=UYvnD>ZKOlJ'* D/~UuQ`;3 3E_-gn7T#3l*gvJeҜȱ`8Op !P\Gk-<=V7M-^~FΡ,BS3j׬pW7ˤЋrF>ijc6ijŮٹ RQm='ԉf݆W̔zٟ^V"- F+{ #k69ڟё!"06ihdRMƝƬ48LTuH; #[NncsOh9u212Yl̬.(5$+1/@yh+<UhWxseaTFxJؼ{!ϽU1d_sLݜ2P#iQE*RNS \nYw5Cx.%k(2'ֳ{Z<%=DyHHm|:LCzasXfJ^!%uL=䑴yBH'\?q|߮"v40j@pG2AXh( Stuc/5Y)G U;GM&v&'W381mm1;G=5:LMW ZuI2CmFG-`udn~H=+֝}[=ZQ-"։ ^-H3VM".r8e)i k\j_.۸O'vRou.ZY۾n$I:FFlm89^ ]in4+#+xc,1)7 !3L$i7fr`wX/;V>kp{[׽MyO{~|٫20k!Jx[3T:ل$9}H}>j狂QIJgtm,dhs0{ 삷d'-eGñ"Z4tTa!^#TSn-sS_n SĘ*?Ɏ/t#¦#_1QEy Oht8\Л9+O^IEzY)Ӵ6Ga/rDI~h )61Dt e{S܍ FaNY'':X,(5u?p$jAU@gLɡ}]G)f$PryԬ&Al NwJMI)&& YIubq/}uE@gp) -ȧ}A' yNwMnj 廿FQ WGPGm$^0o?&P4 ܎L_;bx&\GnihlI 'έR=g[JW]U^H*P])l4|Rw\4#~(ZO8r xXt9: .Uetij6k@h֔F[o0SI"M7RD?g>Ÿ#_RPB6T#-ȭQ2` %$b.Ƥ-a16'"DhWfw"23 Q@#T}E:+>6+R #1|fWQU\SKۄ$\W0bv[v?K vtcx e{k$F%l<X(/tLKdĒXo6{ܦAVj 0%tM9EV%6Mۅ֒QZU3U-I4Aq i4A-Ё66[=[H=^ sӅ˩8h "W[ 1?'W|-2a#;f/sHywݿ7I7{H;; '+l偌>v=MhBqX:kFcӈ $I;ZjxgQYM}3SMf R/V6n}#QSƎI)+؊:|Y"-;iSpԑulT|}%<[9Tm[Mحז8o 0lon쓊,'E*C]Kv͹ a4;Cs34;|fͧ:fyK]ަB[ ԚJҌ }p+woAڑ;/UtQmap8ʸjm.R0OÏZNz50.ϛzS]s3{5ڀ0ltn|rTO~os Mk 2Ú gK!*ބɮU} (i8N=u?bxe[#$ESp"b H4: 慳pCxҶw@Al=P͹wmUU7sPu^<9=.WG)hQ(DZ ˂T^u(uarp~gt1 V~'%KQ!u dؘ2 Ka&$_*kzn[*n) 7\U{Tᤲ+VRFƗ8MG$LwVO=NNluqvISli1RWJ mz<.nk #Ʊu9M4(j3ɓh*:`,1-+d,*|p:7 ob/%Yl`-Zˠ T]Ɨs6˃>ڛ>~,Roիp87笝6"h=%a}nE~qʝg޴Ŷ.WŠR@95j<E b  Ṯs6u5,P[bՁ^'ϹbH5Zx.v!cIVj$10qJ`CۏµAeo(5d&͈,e㿑G* ̆g 1c8&NrE5T(W 뻪kE^qK̕יar9JCfKSv cSJݓq87QVᦒzrrvG[29Ե\%M$YkSHdHF[Υv'S2"6=K|sy ޼$1q=]^/KTg烃\ f>imC!7uqX\%B tyquҼ\\6c[8lca^Od;=YT<Ó.R6ZPfb-RH.۱A- qOvxQ ]Ǚ3'0t]Eu{NuN_1 {+L-s֔3qqVy6"$tf v# sG=.MSUe#ӯX=+qYY,MKJ yT_x ifK\B%;}l 0^' D0E!>GF.MM~%45Js a >VUȀNEiۏ45z \d9"WѾBaT@WL79e;M]^X3NP] >&ւf<?ůBC(QAx!>t Yf ̉!V^qO^wZ`Cre?b ~((g~l,Sۖw@>)sIRu{~DHXO5Hz;7ޟuIxW PQ$yHgB#`h|JKԪ $!Dq5#AƺOW8W}omRH˾U(XƘxWrNer=3![yjSf/WMkc.tq QTLg@* ρߞ3+\HZXLA(ٶ{\n#^jog"ggJ5vʞ_u!YE61ǥ 4tx XjmP)>!zXAG2-_x|h_cƅ\vCo3ͨoQne-5dPʬ!LuPݠBsut4Q5iD)wУ~) -B/[^8]q^;~[j wI[ / MO6QBo8j:BID|߽fZ2;sQ`*N4x5mzɂKFuΡ7^jo o5Xl0NnI\ts94ѵƗ`%,BC #o^W0HvbW/fy}H0;RnVA?&/VA|G^ן<ثrKH6Y97KʯD>$mwB M4e,dk4c ϭk߷ .I2ݷIG{rSzQ \淪?01~(Q$tdUƠY)pitބ Z-ưŲҲ+0sN[$ū_hVF3IJ\rlj7/ZeO"{vDY݆@Aj/-e\k7eD3}<#RgE.mVs-huD@AS"%Ȑu;݈iS'tQ?6&zz0S5~h]Gm1rj[KythZ>gZ8|nF(uH"Lh(HQ K҅.6X渠+3Xi?^WAdr/VvstB!Y`k#9>T +z䷙X\gѧqcz+je<iL~F45aJ%.]p\lnwA ƘCT퉬4tXY >z4tOPp&GK,ܕTχm$n&@3 N|?\ D dE5gIVF`•\YH)dCrK6D[R\WY]ʼ41 mUs<:4ƭР#m,oNv^?\p0٫h [ ޾G-F'Emh (T=AU73ZPyMGZi*2ލ̝|{ T}9Q?IF3F&W'Wvx_B/br˯^p4 YScmjzۼѰV~ S:k"M(B"Pm'-40;klw1.ڊñ9[k&@NoI_KV+Kz||މyjKAlM`EB X Cۂ+2Q2)/p,ɓtp6sNJ>P)JSxghUA#~PQ็w_֩OrJXW.[3)keޠ 5D8t4+6G> -]1eO)8gnRR6ZyrE!ErV- &8E+W2P_&3}s^A-ue_dZ;#;>f_4ɶH@# s"KSDُg匨恖Oɥ\iCPNO]<-Qʀ5@CXcq&1ƒ'DRu 6J 0E1 ޏl;wrfxx_z[`m >Z%/O*LjOQ6j?F2kOH# ^|t1@}9k>2І{ۊΫOF/ R %,f`ndKRRۗB+HG{YɔR84 l/s.AO|t1GP6oIZ\yҼ) vgSIr;_^b%93"DUfR,'d endstream endobj 35 0 obj << /Type /FontDescriptor /FontName /CRLBGY+SFSX1728 /Flags 4 /FontBBox [-234 -322 1732 898] /Ascent 707 /CapHeight 689 /Descent -193 /ItalicAngle 0 /StemV 50 /XHeight 450 /CharSet (/H/c/d/e/f/i/l/m/n/o/p/s/t/w) /FontFile 34 0 R >> endobj 36 0 obj << /Length1 725 /Length2 31333 /Length3 0 /Length 31843 /Filter /FlateDecode >> stream xlcfͶ5ZU]l]m۶l۶m[]m{s7֟1#GVFd.RBQ;[ge{FZF:.2#TVل fb P2020B=-̝FT -l,vvFWWW~W':G>LL&S kBLV fbkh` w10H[:PLqFvDo&3uȈ( *D蕅imA9;kv4 2?FC3 [h&akj`OSr )&]e lLBv6.&;cG[ws'P k_ $ Cpp71pGogGL62&.6)7GVFg*^ZZXPRi[#;c [3?z8_iytrߎ0?_@aC ڹ{210h,&Nkhbon&w#e;# Ԗr_ 0}eF-$!sc+{e<7X yw/w$ bM`'t_+|ktAUldAo䩦X2sk$Jy:Vm(uȑ34aMg̓ ސb? 4@:Bezsi"K,/mv_L:iDPF̺WTuFD/%6U۬f=4lk'JVѳD EQ:qeνqgT7ؘ Tz )#eZ l$ӝ'tI<>WJG|-=uG+md|r1e:udzMi_mU fl'|']ne`JH"oϫIZ.i3]u^t=Q:YC*:* ܥ- Q>YK Ghj4#Ry4eɱ^5l:OA_Cb/4t{u80eK0 !LϫT6JZ_tWڝ^z^;kvLz[~{Eh;#8-:}bo<钁QlK$X-%A}Kr:1T U]a%&#3gm'iAHA P)=)I{\*T'ˌl=TEZ$tO⸓FBLbY!aTc h"A:.NMd겗_ :xY3 &WmQo]nց27ak}RPM᭢<ÖFT1^`.o=z]Gd{|^hc bjmDT *k! {cHi_ {{;Msk8ᔤؐd%& NUx.7֥~d-櫳\ֵ1Ϙ=q}5袑e`Fojs7P Ni1H2@[5 q Y 6K~gumXm 5n* lrKRL`6>Zj==HHNk XF68UPrB/(ec/k. ]:ҵTd,Cf^ hjL)Yу;EwִaQ@kxeaSZx`&PG^Ϥh'KUڙ N&zҳ@K؛N/Om˷oթ+E$|!@p$Ks妗A9aj8[Ih]m%gle85c?8QNO0!?]cghaFנ:o5Dp$ZղK\fP&8}Nw0eUOg`^e_H RJ[ShA?}1_7ԝ,%P+Xy;c0Q_ej@K@\_&cc̓hK{ -@DŽŬFfFDd/8cM+}2*%0LO<*K&YS&J9&ɹgdB|x\YLP_= Qd a wJΐ99i,)~^'A2}_@ךBNMqgz,81p_F0nӂJGKζ8`9`SpP~>晪7҈doFW3Џx6S˳w5 U瓦֪mDq^Gd>Fug˻U"/r%Vv 7XOa}FӛMKޖ$a(- v-ͲKCaN#Ms6UyUOْ5Oc811*ՙ_P2=1I|G*WZj.vZ7JGfFA+Hߺ8eo3)4Eo64MTbR%^>jB{h-pʁ݀hݦ@r( ZT!OiB觷, Um@1jBx*ߙO@7V7Ѯk|k/K*|BoMq՞2{v0w)m,EX~AEppcP i+vW۶e^+ #D ZM|?nȡY3䁟JRgMjF+8RvNbńplYܴ蹧x2!tRĬn] mTga-ݩb =S2c\񝩣+`M9)f7举L-s6*'٫Uvվ3e_ LG hUuVL(Xު?3_TXdkAW h WI9'&g:aP,RZcJs-ޛ-7W''@W⺟md;ڄ8.Z}=MM5)٧l2QIoن m𤑵. ovׄDQU! d` k-)FBBu< Pΐ8FgQ:Qh>W1=CA3sA5]RVꀔ2rdM)j_5T>YCb;B!٠Et_r_R:D5 vHO\aU 3L3`Xu*=(Zzh&7.6K?wc(ggj;xK"gfWͼ[͋!{m43jf+63um*/:_ED;.7*=Ǎ@R㱌nlQ6(.*M?"İTUr()ͬn"c[DpE-tr?qФ5$ٵ_Lu^szTF #9:\R-BK]Pj[;3E 2Ss*&̷J\Pf!S7MtPVu^& 0({QE ֆ [I PѮI4AR /a4o(.fťD8 odπc=Z~L&_lyJx +4н"KtxHH4OŸַUqTu5W6OOTnݛ bRS-rQLj{Dlbם%`7 i8Xb2y'̑?3q0h:>U {'EӒP*ޖ>v#2"!!{^Sbr|yFqi?[BZVk*R©;bRwX{RcZy #=L;nd{1BԎMVH],)t$,$'~0> ڬ2 ^(("OB nOREVM@ ҹn9̉iO?G<"b͚!TXJuYF0wAh%lh}I qTLTeq؀z0-9iѻ a ҿLWc>&"{]W%:Ћ99Tvt8)W*Y2rj=NɅ耥mJ܆22(L"Pb dӠ:d㥷2k&G\rO@P"M1BڼcfaEl.`:9<_WԴte(1+컰 S݌ժ+k.5kKq@s4'-|N;Y} a]YpSWEHFDƻzf2v?jCM[p߷<$K}g'"<.Z+>5RjNuFD'd~z+>=˒Qt $7"P](B1Z#Jvʇr Ԡw~|oͪcITP=1U!5dX9;e/bBMw 0 +Ylj[tTW3xx-r`(F%Ó{HݴMԚ͓l+6&[MNe+aHh׿ʇ;ȥ4 PSpy$Xe :c ^W74V)8t:OҎ@"[i s;1K*+iRblZ(Ϝ\gͅp0Z wՏ+yi>|몹/z@+nv?w XnW)GeyFw YT=Y֘;̵!~sa+NfnmXj Q/C9ҭ]bt*F<+wD"9s<+iDtyIof(}7;ͦHI(HJpӑ$H拧w*<x v8c,@X\r 6*,J$)7> 7DDpIk*G ѕ~vì6/qehmNjS ]nuکxD6Q\JI_=l6\ 0&jo "cEij@-Nƿ?'o,{i[_eOa) #}Eg!Z2T$Kqv`\F :cЏDg*=FFZZp1oڗy@k#_ק nNCE{pԚ;V+[0Ce2;Q۪Ez~;5B?t<UB !" CudMy_|=A(jGX̷n|GZ=D0[4H1k$$yrq<@2BX7 ;Dw ' Y{l/s0hiߟn5R|*hn-{;%@i1T*8xgKCY}wNݴfwځFR Ixi{kuhtӗ{ɝ|L[MHku:zZh+=$5 %7 V[LQ́ &ra˖iT@@T2Ռ{qf"e 5N]h_p\V&riJ7K؃ ;r~%s͞3 8=Ӽۨ^W6# AU1#nDqsކ%d4KX~:wx'jSS,)k)GGŏ8C3u*K zC:W:Nq8JGQan^_{hssH+tȣ 8sB>i/yY|L>^PMc#`։/׽6㇋7<뾮wBQL;uiLF qx"U(a2J\|/si{B+;kiA>;ciwlY Ѭ߁At.2q!!G1-.ߊB=N %_IRj_~Zo+uw7KI"V(`fHZ̍B&7>"ZX-Чiꏼs{WؐxF;]>أt!†T,p\;Ɣ"JF`lW]wQ3#qш.Aۋ9Jpryk|#bPZzŋmeؕHhi^`q9<Gի}uKxKb,NaOi uz.\r5Jr30M"ݍ JJ )=O4]ڇ,=WY\"io׆O⋺M12}E ѧţA陠(ZT?ij ljtWF0s YE$@%c$#_K4y7?/V rNw ]<3Cy @яcR#Z=qdV'G?WH,}xr~.Qv=z={uIUh-P,lM 08VY$}|az6:BKw FG`♿b.f976ys9ɭr& =ɟF#+&Ye#̺P;tWn7zT݀$$eD9 rz׻C$o i6150r4'[|L^Tf^&EŲ LBs=p!]@oJE}%onXCz,NV,-ۏs[0@} D^mpŻQ_m4nH#,R?oTj H8ɟ@R |(ODǷD]?_Aߗ{Jyq4q^x$kz8ut#S;FǛ#ޮ?}uPJXs,Ë6dS:\itX<ǾjqxN㛑xGGrm-B1O0flV#' fR^:JCmlwyhPP9c=g f`6͢`jIduhfNF.PGT5NAyӫ|OLpˌhkJ̒8R*;ݥlYL|*0!7\؋vC~)ӷ0HsA4$K61 W{xѳ@|<+ww#HqCI?~.DK8zIv^Lm¥y%[?g}!r#FNݎlpS1zj>pY'y=F d {ة7| NCS2"ݘ,XNWl]ߎaG!%6'MWG3y /UﺤDbRbWȋCBW03\/餜)C+o! a9PsE RWQ-mvЛbI^AjOO芁pthcPTSbYe-,u2ԕQwJ*-6q60%dy.P8Srè|! $ I4IԟQjX7QĐcV]N3 Cْ<ÑK̽/.7. 1`eoOduH܀N+6DKpe/^dlsED\B<-.‘AW;-lomM$ltrR*蜯)O!BY\d id;;5ucBCa=tt+lUhG} p:9fv,O VbB׊+\\v_N\pFPC7o8mC2;%,I;@O*gC~E"\ 2o%1*v8R4zƳ %ЋD_p}"MNHQQ%Nj^w&w-~dݰ,J 7PDzس{t "Iz 2 y~7Q4 w=8%`r\qƭF,8]ndt"`DʳwXm)Π*K?ttDb|Y!ey4sZcT 06=?X ޯ*Q18?nd2P8e=@2J%.cu)>Gt v6;%Cprұȯm"b4TvA< zuh (h$ECBydtYۇ{ 9ku L+`6oxFJОwPUT=m┝G-P X` _$[ &䨉 ;U(Uvh^ ~Xu;xR#䐀!AIwV+rHq:pcfY`wRU b|z+W< FL95[/<cҐPNMVŮ2!9D_H_bPx tT[<3u'Q"L9;!ACo0/ET41` RmK1SOtfT>ҍ]la5;'oap\ Od{HEF0xXaQi8ӚV;jS&`%2u#H\<#]H&b,_AMPoU{EkH%k^[C=K}Ь!q%Aڪ{Xu=_Uס3>䝑Zx8)J٨D9hmoJ||871-X D)[nMvg ʑx~YS͟ @6_|$X K9p*[8㐗b%M0m2 #?TQaU7BNKG"c8}5ᡕ nb;%6Ez-pO*R֣ðbٟ oH߆G1B䲯P"x$,aP+<@;Kgp\/@UzD]7$@zЙ͕sKCÁ:3IP'悢fA58"3mSDY'GWz/s "9bKԤYT .rwsl 2ʪ8w!_(F{I\~[^(Rڏmz׌ rxN*4z}Kwئ݁U2̈́Ep G֖Z: n(c 3/qP^<;Y(WH+tDcQpY0Xp%m/T J+TȀ[nylR.<0&,C!S(0/nvylfzLy%4:wb5X[.E])RѰRD[eiHXTN:qALL1'v o*bd+X*p˵ٟ(=zh1k;5VΧֹ1-OY>W/"FE J.m6gӅ{`=kVzE&uLALP;&1E_Բz[l%6f:ocPAx\.϶0Q:A.ή< ?Z mxu[#6Y  @E yCu CH=JhF<؞9 z|_WhqM5CܽR2Y]۸K!ͪ)* 9Sj3 :*Н4n|W*A,={¡o<{ZSsb`D%/< a,V40`C?ʺUb2Yv4*};^ƊœDguT&ƏKjVo0`V5&P(cQڦۣN&N:~nJq' =18aɉՐl`qT?09T 7sjeWu̻-D4 W*EY)Wu!W8g@j:ڌnM~KW ްڙpitWm3yeqHdnB鮭"o  m04+*Nlk ErGa\a]%?Xn寸5I!/#3Via*\sύ N@ 5NЕd9(| 3Pw2ǰ6:WUfzOy9C\>Ƅ' |p0վR*5=֐}Ơljx"Ysm5چk`cТT {8^զN%qYj Ŋΰ/ 6Lv &7Z"\L[B 5-Q@7;Ufc_~Խ?Mw0&ʪ6=F:WYKdKui.^6%: 84dn4mAϷT?J"PȪ3 Xmh$(1lǣ~ PHt}Ʀ-9&A*.Bĺpۜd3Fj52؁+(H~'sm!DPI8$BpaGE 6_Jճw(mX,u6q/QBVqI>Df\hi%:e8dˋT϶K.jgmcȞ#i?sZx-f\QHHM a*#~CÛ0AQvsYFSz_x`/Qs'w2K/nz$Fxuvo]IYfϏmANeNֲ .dJJ5 o a$؊^V혹ɷSa]H2& '5j.K%"=/Fp"HTwmOZoOYQ'~+wV>i}NV 2uQe~y|>;6S%/IBą4uC%ȼO'@n:CZy*: Hh 68~SW[7t uRgi:D$MM_H [5M"=ڟeḞlpTTQ])]%i!b2\H7h\Z..5O7=M}<1yٷ%iC&h"FI Eʌ;<^+9f:˘~cpUntU-U6O!+L]%R<pod.&pu>qij,=ui(9X껃Lȯ\f5Y{)g5@. Q8ڴ-ԃXх-YL 6k1|~,l4(|M[~smR}l?.?1mKµoLQGgcLpޯ/CItxٗ rVwod>{n4}UOF3`]xmAs:m*O#_o+&*XYhҨ\B>zWcs 3=pRzb?2^O- y;ژ.}YODW8PsG}ipa Osa;5x`U#ce6J 4KKPGcY? n 47_dſ_]xJ8nQ. uch\,6h2rEiφ(̯Ͳ"^ dDw=#t'~iTpa{{7IJ D4s?U5ƪNAt)2{`4#MO`*f2Ѧ{Dii,| -'Ϸ\km w5#{1q@9E&᎞eVXlY 9C ʃi@9{g69żӖݰ@Z7\P;q-iϜD=iI]:mzh0X-n(܁okeYєa{ -{+izYcu[5Vӏή| E(| fw6 U RSiA(NI3\m J%rɦQTAl)]F (UxT]Bu؃@e(o 8`Ldh,7YZoYل)ٲY#k2xm[AwQG{/1G6,Eqa#TQ ;{s]i gyBԺAⳊ2{J R~V>yO̺m G=aYbdcjc^8 /;^E, cktϲ[ vIa>evM ȁ,bje(}˹d5ehk]_5Xg_92S(E(TCj0Æy9'V a+K3%h !~|w%%P*`\v }Q{%=QN 9҈˴) 0fi6wQɽ0BnjI+/o'=P(qzWt)qB[IۆWkxxY1h2F>hVXwP$U(ʂ"Of.Ay p+eaʫ Mj46iiK!iu2/ .&?k 7t!.31Yz(OÆO5V)B|0f:C/xkf{`q5S Q07 g0-+T FY,;uˆy!~5p ۪URwwB5٬ƽgfЄxx=xWǷ^"Գ3jL5fL#6.9,o | JGFKC2_/2LH11M%٤Ce.V@D:<3֗W&P ?f^}W-rq:Ra.:,SvV*J+" o) &Z䅾T]:Z1  ^3VSqlLC~<`NU̧?+v}<ڏ\''ٌNԉc$ cZߕb@Mm \ߛ*Ԗ12lyW`6@z6wh,_b+*Ic̲XK @fVP#{J䬎/dj,'< 4hD*k6?i)NAE`#+hm[?;?{B\PmO%qUόK$&2Ҿ?i>㌇>. XB=ibq͟頍diԉ:L bqoB8gdǺn]!I<.$'2ڹ$ xD2yceon~\_}<רC&ØV?m bL¯1D3DQCUkDr;"}= 8_i7`APT6YT)Z]Y*{ZJtzoaS&O Px"١VͿEHԫ˥ -3ۘ:Q=٩4 6KȊuZ#,K9"#z ,* -%wcIXs7;kDy[$RGDEov!HUMczx m% S!dhbQ3AzdcxrLR1" i:}É=4H'ڱYSO( to& nTXÅ(t!٢ WЅ&ʫ=NPE}ʕ<:h/DQΠdDw/ B˝dL$CLkmbij+^c=b8ۓ8I.f~Ks[5/@^m<6S|hlF䇜3Y{msf!P$Ҵ_+f'5ذ(|䜘GY*̄52xnS53nPKKPgb/rخW=Cp~ֳpY~pNUՍr>IcL6b lpn8zpd\.{ 1]H6eTLmIeYѱx7R O4Ji&}w5uWGR J?ܔql`ү :ZBWBUU]Q e1ҭ1R g VDJ{YS=s8aԣ ;C!-I|oeBoMnTWErk$4!s cG.S; f BZ7A6/9dn.5&slrWLVz%=ʍ; FTa˳?k-:|W^ ˑn2py]w"trCB7wfo2[-:\_N=8[ݘӺk~%Yi窝t~"Kxɢ:(r]70WAl"8A mڔvA[|;fwmLG崭,Q:Hb[]6q 9"A֊NL h`N3A͒U)gY^2%B)}p~<.@wi8#U/Wz^;_"]4Gg`'oo;j"~_`gi4\}RM` jc(]Nl/hn@,rq\:~Ta=ZƣAwLg2.~NJTOV]NOΖH/Q[hZ^CFW~H/+H| 'eIXOCM15$|a.9e~`"OBX6Hd6|G ;?˟͔NGFCbJk.QrZG$:.\le"~ynRgPӅKkԸVzC16-'63)3**EovH呋f;bVKnXhϊ["?rLa[ 4(V P#id\Eap)pU`gu=h+˥ 2=ܔ2f40O*ˆȸsUd򪤨N8O[1s!Q;ޝaމt鍭Я.1qɛS#HYZ?f$&A%&6B,n2%zڙd8=u]jPE-h94m^-Ǽe&o]Z2i$VK8!Qk|dAAwPX:\20a2 ͑ց%5wciDq:=s|&%lPB/.,G89NmmG}[ _qR&>pm W:}isVfGf(үpR\oe.}:n`x8H c 8кJoUmͱ_W8)eXM̰n#}w u1Wk^RguD"{ 5G¯-5?< G@m;Ebct2%̞DNc;+{rq?Ihe]ñ]aeLD ׷1XœWo򓖪v45цC~$uCbf.K9 DȪD"}e'G$rfbW}.' r; ڰM{._}dGuKfQpЬ LH+v) M)~\BRVehs"# -+GTC.My)ʥtY~3!ԞҜwzu+]ʊ_ǭ` r ꂽ Xduf%PO<Ǐswۨ4=w O.g^"V4|NxH (*Vy?0/jkcK?c> Y:lj7pu?! A18?V>~(l>X&juE;gK!+h}тnS3nĄ|`T!.5 SK)򠉄ÄUdg"::y */fRgN[ui̽`iRlGUxڦ2^nZ?T.]=)u?mz~5"`^K !"ty@~vhf,Z<o0_u"q NmU`F{j'ɶ4%h<@\!8zb#Bw݇Q^ PC nr t+_9h)rzm@]Y ͵P".u8H< {#ʂkCYG=ㅌjԝCts7x̂B: L*NPE7.hΜ5O1tϜ%_Хk)ҹpy]'}ňNRd3߳8[._ʦE~ՙt'UCa 7Ick[vݑoÚU^99sUN.|/W9R6[K< 'Q'1͔S-24hA ȝOIZv.Y#ބjx5IQYo!0Z7J;[W(lD|0ejZ[H |O{X b9Pɳ`ζeʵj9uU?`6 H [AX?83].9a+&u+ CgfMA8TĄ(g@ s7cz;P$%%r4wZ AD 6)l*ݣ?R_3 Gr2CRY嘌Ƥ& 33tx jN~>?-ST-DT,T?IռlAάP8gHM|. U6xH~4(^#{[)DWC}w^~0U+zi^:q#`JFמW1kv)} ~j E #zc"vMS A,<(Td!P}SЫA0 ә#VHB dԙE#A Y<~ }۠} 3$Ub &yeq6q/:.+Ǹqf**QtA: r;5s Fh`E)UFl]!`9b Pjk^2\mTr"x4Q[l1RKؔh}2Q(!qKv)\E3BM޶Fqi,f͢$L ؔ}vg:"h,` HPғ_IMr+'%. nfĀKjFX}Xv6l~RrOIOX)=6h:o h(8-t$!{&ǿpuq\"m6ղl_d~ԲFW- "!s b|t{A-FJP] JVr m 2Zci (2)R9G_J5J'Lrj6̠W7bI։(y1ÀޘY ^Eұs>&GlȢOf,B3d1aa!߬iʡx}Sj6U2Z0w3[;nh*Sl!\{  mPPo׽n5psz#DcpC)+Wld%ƥTurNG1u{*vwMtT0Jɰ"Y)]1;5L>z svL`Ÿ55q0dTXo@fF/YF娕s 7( f x錴񨭟`[N}@yjca$ Uyk /x we Ns 2O0iSd5m-\C9]bt%iY;Qɀa QUy7IϽ_pA-B/1hhSGlʎ tZbQV=AdM{0GF˧iZ U0|zIIcx!)7) 9/#b.jrɉk2"Q 0Gznҷ] xp횘+Aׄ#rB:Y:gU"I^6[Y&2%S`y2RKfً^Am%sM6wOOѣV*ů6R t.q"t~e@QM:5y2u~ʵJͣ]omO{REmOIDu^;#gSH9Qw}n4tUFxVM\@9̱5Ҷﴕl$Xr== ]b7*Hj_wDT c$T1<(㑩P>XwwޯV bĜ a0qׂ tNe*d( sg^C`wRȫ6z,yc*k+ 6TV%J2--mu(/7WҝoM۵uacЩ2$E.|n-FugG~ Q& 7ԣA{X3Vq_ S)/Vtx'|1ho 'ވWy]=mFo]S}.4.{ @i/,5l& gT'&qv|tuN)O2OMVd/Ӻd'5׃-oNԅ0JxBptEAwH ьbH nVL=$DkqUZR~P Yprgq=`_g]jrjRS,z2`8(2_JT,`|cBm%#п]ۯ'=mMTI(I~SEϥK`:7OZJf ZOI(oPTw(z!\m4ay1TFdvm+X^&~SP287WTvu4 dzn1wH) "*HM1/vىL1}K!zsFS5 iMO@gl}3 u &yqM^vwzc rc%]G)n ]1T:GwghOT2pyr#0l)bM-*Ak2t2ZiٯCYjN ]2X "#C>G ^"$I?m++!G1qz/`a4[MU( ŨnQu7j,ʂp;vr`M?mm#=  +l%nCM*ꗯ{&fTv44+${s+sJF]@pe 6c|/H$'J`cQ9Zg XY.sdo?:p&\͛bL?Fjpf )plW`*6αC4ѭ=FIa>ħkI{L)jc{QqHǰ2Y1|ɂ3 L( roO#ús5UjIT)Pb@8<%YJvݴ56-f jQ{< kɸ a9m2g 1z!fp?&]1v{Q񮭍-2,$b g*8[zIƼ!{hԼ/N ˾4{!nz]c8Q65isUTDpу7YR޲lşwf~ڦF8n!&桜_รo3Gŷ=:K0 =oز)s)D۠D`rFx!;e8drgM:r<$M(;!,evG3oÒBaUi}͚#6E>3{ 5Gr2)w//+3'qZG'hʕ}?ᤛ`.vt>E^h~!ɞ=: 80h_e('WҋoV3R g.`YYNo=bfи.30~#Kb=h/Zn!3qFKs0htfynQyȵN\xyʬR8Rirب0 TeD qlf nhO^/Z1(G?IŝM&Olm6ܥPRՌԝ65׌FBP*ieCN^val۳itAz- b}8W&O|Ŕ{ Mhf'|]I"ֆ؋Fbdt!SҵagG;*I gAd&O.ѐ >V)_*oT53&ْ6u(`^>7K'Rp.8Y40'FYqg5t\Wm:{A .m&f9!7G6|qȅa&SQ-wy7'{;*T}_rõ4eѝ[5۶8¯V|r؁Iʨq[PDZ{(Iq餽]#ⴾ6oj\Flbc@bDrh OKPj dBUsi*؉EEv%^s5]0kT2mw,N(gYHD+ԞDSC3pphn}4a%!rb .Q TҪѢh(7e룑-S= l.bKyJuv[dézD0Z0Nի0OMX\A0v8,j9S {i4KD:nɶ 2:mfKzdh7%ĩ HTtCzJӠ}NKM yOIds\Ia)9 LWS~LqRbt>+DjPD3[,_*+>V0dT>.# 8Nn8kNiC`Tc@ǭ1,K M@SS T G^&|:pծU>Qqai2@` uJ)e;ܺ~?M!4HkmH Gb'Q.FͷjQ眮8CB]lKǢ]ѼFG/ׂJ%$aܐ.rUUCRwU.ޢAӉ;D'\ޖ"ў)L MS{4lz!>M$*V\,*r.KQ.@xEz3FD,=,Qx_c#b \YOY9!Fv*p~1PE<:-w_*e / Ol"!Bް el}0 `UcֱF_`%0Uɇ{f#&G[CVf_zo4u\{hmYhŘn=/`kEFُր/̎lhڨiӃ³- eY Iu@&#[ 邞te"gBmMD)z4gjfXX, Գ*ăþ,P ĽYӔ+9-/C>Y W۟*_ӭ\:SW3Uz@kljzu2|ch<@yİ.G+ yTufWqT N|+#ƣI1 9̥Bښ\^uL9gf+#QogŚ5|c<_ j0glƅ8>N`%& 9+OiU;\T{A:zίBfH棯,fgzƋ@l8ve6joIcmْ!-pW-"#9~D\ Rd"eVX^"23]35ԃ0nR[7BW߿"jZGw*3Ye_77.RTaD}aGCB\G9|6!xb^ (L4  xWۆ1Qn <4]㙎*S&COTl8{E%lN"x2|4|p<Ũ #&xVGHPn%b$!w"R|dF<*EAXl\XԽu}8" b;,kOkpO[x}Lixbz9}EU͖ŀ9s к#Û<YVBn,Oc,7~Gy6D+r=G^쑏^X={@664oE/N]"B)qOrh!k\| 3ق+5js0Ys_7 ?VՃ D0Yrs%^Xqt^̐ΞbWt|4K@bbx_J.Rkw8H_:!WSRã 2ejuw' %a#f\I7-ÃsE皶ϋNXHgcn3hUݯV կPXfq3q%˔]B{>s}eYf &l\AwPF~ZYR4!E+%dWqR&x<7u:U-JnJ?sX- /.<幙>97M9K5+.ybٍ!HN m`1]|):ӂZjdmH̭ք{VȜjML?0ݪ Ax%6uIL}v+*Gг;j"!r`J'KDpA 3}sݩH(p w.|u[DXRìA0QKdrws;=:9l(3LL^MbPؕ1rXML?6) Χ ')G^E&z찻ȴ$eUPE}rUHC0؜,%JwwAl1{ whRܴqՠ#R*NעmN- kcnwiO=|AD24 `vJN P+.1';Gu^iѭÇEZoCGQ#1SvͰ# +~  &KfH n[\#9z }v!ks2혈ǝ.l7ϳoڂe,q Mx!V􍹧yS3[ SA=ymHGJ2J\ǕvD@ײe3]hjMao'ׯXNByN' Ԡ]}AjJnE˱ ڀ}F$oс'tu9$9n4VLj:hV] %|sd/؜k]wGi.Zvਭ},qW߱|z\c)MLV'VCmr#[ԓFSl˧J!rfL#vIBNgE:4ӷ;9{VvUj͵87PrKQ[l[:djGMYc-Y@ҕgh Ŀ6x+Ûx"]y000jvyHM@NN]<$kQJ1j@ޫֹvgCU1G+ɄӶQ'Gvyqb~rׄqmڅqyUX} liItP\eǂ-%@|n Th^uH$SN9Z ZA3L~rS25>-H%^: Ѕe0S伹;U6]RAPMOQCР{ ]>8iV-NջELLXgޜQ"Nv{3=BBFإUiW5op9itjaZ~"$'s JM(W @EWt]ɔ6US/ SO /DPe敏y20}ڮ/u2ϸ?nb`]].*,.#x^9= `cwE'-uOc<:筻_dC\]D%=Duy`#L6?N81(R+@/b=஡O*SF@>[L*8+yeWY-!¸c iimHon}cm} zƯUebLjNuz!2㳫ƻ@DUu) #(khk.ܛta'\l {=M_9~pʬ$UlaINQXdYyXpC9D3d lj;6XaTx6V kίza,)NdžT|pZ g9a;^sQSv<(\\qOI39ӄ' T i&FOh:07on\dQEx`d:V1&y"INF2ɠYIPXAsE{-PxZڽoei#rC.sT_u Xv5A#ЃkwuK\^ %q2xl\a;R/Twh5JV۫kj/XZU|⋌^r%}&= ^:79iu% jy 'W6Dgt8Q[Hg]kh.g!;@E?ݴR pG4W!jy0. n'58ܣUz[j]sf'-hG 8(/a*ML-fGx kۏV5dBX@ȫ1;i_J.c1A@q "2蔤Ї~*nc{bۤУi~{s-AD`z=mTj$nmaf?hVKM\1r{P5sihOe{_f|%,PWP#JB\AsG-K޴>sOrM'}="sse P9ug Dѩ I(!^EV.X%iiAH w\y*EmkkA{C}dO4vbb'.iK" z&ؐlm{V|| endstream endobj 37 0 obj << /Type /FontDescriptor /FontName /LLDBJW+SFTT1200 /Flags 4 /FontBBox [-202 -360 1341 829] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 50 /XHeight 430 /CharSet (/A/C/F/G/I/L/M/O/S/W/a/b/backslash/c/colon/d/e/equal/f/g/h/hyphen/i/k/l/m/n/o/one/p/period/plus/r/s/six/slash/t/three/two/u/underscore/uni2423/v/w/x/y/zero) /FontFile 36 0 R >> endobj 26 0 obj << /Type /Encoding /Differences [28/fi 32/uni2423/exclam 39/quoteright/parenleft/parenright 43/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon 61/equal 65/A 67/C/D/E/F/G/H/I 76/L/M/N/O/P 83/S/T/U 87/W 89/Y 92/backslash 95/underscore 97/a/b/c/d/e/f/g/h/i 107/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y] >> endobj 24 0 obj << /Type /Font /Subtype /Type1 /BaseFont /GFAWRG+CMSY10 /FontDescriptor 31 0 R /FirstChar 15 /LastChar 15 /Widths 25 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /BaseFont /TZVFHZ+SFRM1200 /FontDescriptor 33 0 R /FirstChar 28 /LastChar 121 /Widths 28 0 R /Encoding 26 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /BaseFont /CRLBGY+SFSX1728 /FontDescriptor 35 0 R /FirstChar 72 /LastChar 119 /Widths 29 0 R /Encoding 26 0 R >> endobj 14 0 obj << /Type /Font /Subtype /Type1 /BaseFont /LLDBJW+SFTT1200 /FontDescriptor 37 0 R /FirstChar 32 /LastChar 121 /Widths 27 0 R /Encoding 26 0 R >> endobj 18 0 obj << /Type /Pages /Count 2 /Kids [5 0 R 20 0 R] >> endobj 38 0 obj << /Names [(Doc-Start) 9 0 R (Item.1) 13 0 R (Item.2) 15 0 R (Item.3) 16 0 R (Item.4) 17 0 R (Item.5) 23 0 R] /Limits [(Doc-Start) (Item.5)] >> endobj 39 0 obj << /Names [(page.1) 8 0 R (page.2) 22 0 R (section*.1) 10 0 R] /Limits [(page.1) (section*.1)] >> endobj 40 0 obj << /Kids [38 0 R 39 0 R] /Limits [(Doc-Start) (section*.1)] >> endobj 41 0 obj << /Dests 40 0 R >> endobj 42 0 obj << /Type /Catalog /Pages 18 0 R /Names 41 0 R /PageMode/UseOutlines/PageLabels<>1<>]>> /OpenAction 4 0 R >> endobj 43 0 obj << /Author(Daniel B. 2011)/Title(pdftoipe on windows)/Subject()/Creator(LaTeX2e and pdfLaTeX)/Producer()/Keywords() /CreationDate (D:20110513103435+02'00') /ModDate (D:20110513103435+02'00') /Trapped /False /PTEX.Fullbanner (This is MiKTeX-pdfTeX 2.9.4052 (1.40.11)) >> endobj xref 0 44 0000000000 65535 f 0000002508 00000 n 0000002528 00000 n 0000002548 00000 n 0000000015 00000 n 0000001847 00000 n 0000002363 00000 n 0000000061 00000 n 0000001959 00000 n 0000002016 00000 n 0000002073 00000 n 0000081163 00000 n 0000081003 00000 n 0000002131 00000 n 0000081323 00000 n 0000002189 00000 n 0000002247 00000 n 0000002305 00000 n 0000081483 00000 n 0000003913 00000 n 0000003680 00000 n 0000002601 00000 n 0000003795 00000 n 0000003854 00000 n 0000080863 00000 n 0000004059 00000 n 0000080516 00000 n 0000004081 00000 n 0000004639 00000 n 0000005208 00000 n 0000005514 00000 n 0000012620 00000 n 0000012845 00000 n 0000033574 00000 n 0000034012 00000 n 0000047933 00000 n 0000048180 00000 n 0000080142 00000 n 0000081548 00000 n 0000081708 00000 n 0000081822 00000 n 0000081901 00000 n 0000081937 00000 n 0000082084 00000 n trailer << /Size 44 /Root 42 0 R /Info 43 0 R /ID [<3BCB36B2CAAA940180E85685610187F7> <3BCB36B2CAAA940180E85685610187F7>] >> startxref 82370 %%EOF pdftoipe-20130124-src/Makefile0000644000175000017500000000150112100161615015647 0ustar otfriedotfried# -------------------------------------------------------------------- # Makefile for pdftoipe # -------------------------------------------------------------------- ifdef COMSPEC # compiling on Windows? CPPFLAGS += -I/c/Home/poppler-0.16.5/poppler \ -I/c/Home/poppler-0.16.5 LIBS += -L/c/MinGW/lib -lpoppler TARGET = pdftoipe.exe else CPPFLAGS += $(shell pkg-config --cflags poppler) LIBS += $(shell pkg-config --libs poppler) TARGET = pdftoipe endif CXXFLAGS += -Wno-write-strings all: $(TARGET) objects = parseargs.o xmloutputdev.o pdftoipe.o $(TARGET): $(objects) $(CXX) $(LDFLAGS) -o $@ $^ $(LIBS) clean: @-rm -f $(objects) $(TARGET) xmloutputdev.o: xmloutputdev.h pdftoipe.o: xmloutputdev.h parseargs.h parseargs.o: parseargs.h # -------------------------------------------------------------------- pdftoipe-20130124-src/pdftoipe.10000644000175000017500000000704712100161615016116 0ustar otfriedotfried.\" EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .\" TeX users may be more comfortable with the \fB\fP and .\" \fI\fP escape sequences to invode bold face and italics, .\" respectively. .TH PDFTOIPE 1 "October 13, 2009" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME pdftoipe \- Convert PDF files into editable Ipe format .SH SYNOPSIS .B pdftoipe { \fIoptions\fP } \fIPDF file\fP [ \fIXML file\fP ] .SH DESCRIPTION \fBpdftoipe\fP converts arbitrary PDF files to Ipe's XML format. Note that \fBpdftoipe\fP is not related to Ipe's use of the PDF file format. PDF files generated by Ipe contain an extra stream with Ipe markup information, which is necessary for Ipe to read the file again. If you wish to convert an Ipe-generated PDF-file to XML format, you should use \fIipetoipe -xml\fP! \fBpdftoipe\fP is meant to allow you to take arbitrary PDF files and make them editable in Ipe. \fBpdftoipe\fP does a pretty good job on drawings, but doesn't handle text very well. Ipe's text model is based on LaTeX, which is just very different from the text found in most PDF files. .TP \fB-notext\fR Ignore all text in the PDF file, convert graphics only .TP \fB-literal\fR Allow Latex markup in text objects. The default is to escape all characters special in Latex. .TP \fB-math\fR Use LaTeX math mode for all text in the PDF file .TP \fB-merge\fR \fIint\fP Set the text merge level, an integer between 0 (the default) and 2. It determines how eagerly \fBpdftoipe\fP tries to combine consecutive text in the PDF document into a single Ipe text object. At level 0, only characters consecutively rendered in PDF are combined. At level 1, more text is combined. At level 2, all text is combined until a path or image is drawn. .TP \fB-unicode\fR \fIint\fP Determine what should be done with non-ASCII characters in text. At level 0, all non-ASCII characters are represented as \fB[U+XXX]\fR. At level 1 (the default), some often used characters (such as bullets) are replaced by Latex equivalents, others are represented as \fB[U+XXX]\fR. At level 2, characters that are not replaced by Latex equivalents are included in UTF-8. At level 3, all characters are included as UTF-8. At level 2 and 3, UTF-8 is set as the input encoding in the Latex preamble of the generated Ipe document. Note that this only concerns characters for which the PDF file provides a mapping to Unicode. Characters from embedded fonts without Unicode mapping (such as symbol fonts) are always represented as \fB[S+XX]\fR. .TP \fB-f\fR \fIint\fP First page to convert .TP \fB-l\fR \fIint\fP Last page to convert .TP \fB-opw\fR \fIstring\fP Owner password for encrypted PDF files .TP \fB-upw\fP \fIstring\fP User password for encrypted PDF files .TP \fB-q\fP Quiet mode (don't print any messages or errors) .SH AUTHOR Otfried Cheong .SH REPORTING BUGS .ad l Please report bugs at .I "http://ipe7.sourceforge.net/bugzilla.html" .SH SEE ALSO .ad l More information about Ipe can be found in .IR "The Ipe Manual" , available online at .I "http://ipe7.sourceforge.net/manual/manual.html" pdftoipe-20130124-src/readme.txt0000644000175000017500000000773612100161615016225 0ustar otfriedotfried Pdftoipe ======== This is Pdftoipe, a program that reads arbitrary PDF files and generates an XML file readable by Ipe. You can report bugs on the bug tracking system at "http://ipe7.sourceforge.net/bugzilla.html". Before reporting a bug, check that you have the latest version of Pdftoipe, and check the existing reports to see whether your bug has already been reported. Please do not send bug reports directly to me (the first thing I would do with the report is to enter it into the bug tracking system). Suggestions for features, or random comments on Pdftoipe can be sent to the Ipe discussion mailing list at . If you have problems installing or using Pdftoipe, the Ipe discussion mailing list would also be the best place to ask. You can send suggestions or comments directly to me by Email, but you should then not expect a reply. I cannot dedicate much time to Ipe, and the little time I have I prefer to put into development. I'm much more likely to get involved in a discussion of desirable features on the mailing list, where anyone interested can participate than by direct Email. Otfried Cheong Dept. of Computer Science KAIST Daejeon, South Korea Email: otfried@ipe.airpost.net Ipe webpage: http://ipe7.sourceforge.net -------------------------------------------------------------------- Pdftoipe is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. -------------------------------------------------------------------- Compiling ========= You need the Poppler library (http://poppler.freedesktop.org). On Debian/Ubuntu, install the packages 'libpoppler-dev' and 'libpoppler-private-dev'. In source directory, say make This will create the single executable "pdftoipe". Copy it to whereever you like. You may also install the man page "pdftoipe.1". If you want to compile pdftoipe on Windows, please refer to "compile_on_windows.pdf", written by Daniel B. -------------------------------------------------------------------- Changes ======= * 2013/01/24 Applied patches from bugs #88 and #112 to fix compilation on newer poppler versions. * 2011/05/17 Built Windows binary and included instructions by Daniel B. for compiling on Windows in the source download. * 2011/01/16 Re-released to clarify that pdftoipe uses GPL V2, compatible with the poppler license. * 2009/10/14 Changed to use libpoppler instead of using Xpdf's code directly. Generate Ipe 7 format. * 2007/05/09 Applied patches provided by Philip Johnson (bug #160) to support latex markup in text objects, and to handle text transformations. Improved text transformations, and added -merge option to better control separation/merging of text. * 2005/11/14 Generating header correct for Ipe 6.0 preview 25. * 2005/09/17 Fixed handling of transformation matrix for text objects. (Text was incorrectly positioned if pages had the /Rotate flag on.) Added -cyberbit option to automatically insert style sheet for using the Cyberbit font (but of course it has to be installed properly to be used from Pdflatex). Removed silly dependency on Qt. Added conversion of some Unicode characters to Latex macros. * 2003/06/30 Added recognition of Unicode text (results in a message to the user) and escaping of the special Latex characters. Fixed generation of incorrect XML files (unterminated objects). * 2003/06/18 Added -notext option to completely ignore all text in PDF file. Added man page. * 2003/06/13 Packaged pdftoipe separately from Ipe. * 2003/06/04 Fixed handling of transformation matrix in Pdftoipe. Pdftoipe is now actually considered supported. Added option -math to pdftoipe. With this option, all text objects are turned into math formulas. -------------------------------------------------------------------- pdftoipe-20130124-src/parseargs.h0000644000175000017500000000410512100161615016352 0ustar otfriedotfried/* * parseargs.h * * Command line argument parser. * * Copyright 1996-2003 Glyph & Cog, LLC */ //======================================================================== // // Modified under the Poppler project - http://poppler.freedesktop.org // // All changes made under the Poppler project to this file are licensed // under GPL version 2 or later // // Copyright (C) 2008 Albert Astals Cid // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git // //======================================================================== #ifndef PARSEARGS_H #define PARSEARGS_H #ifdef __cplusplus extern "C" { #endif #include "goo/gtypes.h" /* * Argument kinds. */ typedef enum { argFlag, /* flag (present / not-present) */ /* [val: GBool *] */ argInt, /* integer arg */ /* [val: int *] */ argFP, /* floating point arg */ /* [val: double *] */ argString, /* string arg */ /* [val: char *] */ /* dummy entries -- these show up in the usage listing only; */ /* useful for X args, for example */ argFlagDummy, argIntDummy, argFPDummy, argStringDummy } ArgKind; /* * Argument descriptor. */ typedef struct { char *arg; /* the command line switch */ ArgKind kind; /* kind of arg */ void *val; /* place to store value */ int size; /* for argString: size of string */ char *usage; /* usage string */ } ArgDesc; /* * Parse command line. Removes all args which are found in the arg * descriptor list . Stops parsing if "--" is found (and removes * it). Returns gFalse if there was an error. */ extern GBool parseArgs(const ArgDesc *args, int *argc, char *argv[]); /* * Print usage message, based on arg descriptor list. */ extern void printUsage(char *program, char *otherArgs, const ArgDesc *args); /* * Check if a string is a valid integer or floating point number. */ extern GBool isInt(char *s); extern GBool isFP(char *s); #ifdef __cplusplus } #endif #endif pdftoipe-20130124-src/xmloutputdev.h0000644000175000017500000000637112100161615017152 0ustar otfriedotfried// -*- C++ -*- // -------------------------------------------------------------------- // XmlOutputDev.h // -------------------------------------------------------------------- #ifndef XMLOUTPUTDEV_H #define XMLOUTPUTDEV_H #include #include "Object.h" #include "OutputDev.h" #include "GfxState.h" class GfxPath; class GfxFont; #define PDFTOIPE_VERSION "2013/01/24" class XmlOutputDev : public OutputDev { public: // Open an XML output file, and write the prolog. XmlOutputDev(char *fileName, XRef *xrefA, Catalog *catalog, int firstPage, int lastPage); // Destructor -- writes the trailer and closes the file. virtual ~XmlOutputDev(); // Check if file was successfully created. virtual GBool isOk() { return ok; } bool hasUnicode() const { return iUnicode; } void setTextHandling(GBool math, GBool notext, GBool literal, int mergeLevel, int unicodeLevel); //---- get info about output device // Does this device use upside-down coordinates? // (Upside-down means (0,0) is the top left corner of the page.) virtual GBool upsideDown() { return gFalse; } // Does this device use drawChar() or drawString()? virtual GBool useDrawChar() { return gTrue; } // Does this device use beginType3Char/endType3Char? Otherwise, // text in Type 3 fonts will be drawn with drawChar/drawString. virtual GBool interpretType3Chars() { return gFalse; } //----- initialization and control // Start a page. virtual void startPage(int pageNum, GfxState *state); // End a page. virtual void endPage(); //----- update graphics state virtual void updateTextPos(GfxState *state); virtual void updateTextShift(GfxState *state, double shift); //----- path painting virtual void stroke(GfxState *state); virtual void fill(GfxState *state); virtual void eoFill(GfxState *state); //----- text drawing virtual void drawChar(GfxState *state, double x, double y, double dx, double dy, double originX, double originY, CharCode code, int nBytes, Unicode *u, int uLen); //----- image drawing virtual void drawImage(GfxState *state, Object *ref, Stream *str, int width, int height, GfxImageColorMap *colorMap, GBool interpolate, int *maskColors, GBool inlineImg); protected: virtual void startDrawingPath(); virtual void startText(GfxState *state, double x, double y); virtual void finishText(); virtual void writePSUnicode(int ch); void doPath(GfxState *state); void writePSChar(int code); void writePS(const char *s); void writePSFmt(const char *fmt, ...); void writeColor(const char *prefix, const GfxRGB &rgb, const char *suffix); protected: FILE *outputStream; int seqPage; // current sequential page number XRef *xref; // the xref table for this PDF file GBool ok; // set up ok? bool iUnicode; // has a Unicode character been used? bool iIsLiteral; // take latex in text literally bool iIsMath; // make text objects math formulas bool iNoText; // discard text objects bool inText; // inside a text object int iMergeLevel; // text merge level int iUnicodeLevel; // unicode handling }; // -------------------------------------------------------------------- #endif pdftoipe-20130124-src/parseargs.cc0000644000175000017500000001015112100161615016506 0ustar otfriedotfried/* * parseargs.h * * Command line argument parser. * * Copyright 1996-2003 Glyph & Cog, LLC */ //======================================================================== // // Modified under the Poppler project - http://poppler.freedesktop.org // // Poppler project changes to this file are under the GPLv2 or later license // // All changes made under the Poppler project to this file are licensed // under GPL version 2 or later // // Copyright (C) 2008, 2009 Albert Astals Cid // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git // //======================================================================== #include #include #include #include #include #include "parseargs.h" /* #include "goo/gstrtod.h" */ static const ArgDesc *findArg(const ArgDesc *args, char *arg); static GBool grabArg(const ArgDesc *arg, int i, int *argc, char *argv[]); GBool parseArgs(const ArgDesc *args, int *argc, char *argv[]) { const ArgDesc *arg; int i, j; GBool ok; ok = gTrue; i = 1; while (i < *argc) { if (!strcmp(argv[i], "--")) { --*argc; for (j = i; j < *argc; ++j) argv[j] = argv[j+1]; break; } else if ((arg = findArg(args, argv[i]))) { if (!grabArg(arg, i, argc, argv)) ok = gFalse; } else { ++i; } } return ok; } void printUsage(char *program, char *otherArgs, const ArgDesc *args) { const ArgDesc *arg; char *typ; int w, w1; w = 0; for (arg = args; arg->arg; ++arg) { if ((w1 = strlen(arg->arg)) > w) w = w1; } fprintf(stderr, "Usage: %s [options]", program); if (otherArgs) fprintf(stderr, " %s", otherArgs); fprintf(stderr, "\n"); for (arg = args; arg->arg; ++arg) { fprintf(stderr, " %s", arg->arg); w1 = 9 + w - strlen(arg->arg); switch (arg->kind) { case argInt: case argIntDummy: typ = " "; break; case argFP: case argFPDummy: typ = " "; break; case argString: case argStringDummy: typ = " "; break; case argFlag: case argFlagDummy: default: typ = ""; break; } fprintf(stderr, "%-*s", w1, typ); if (arg->usage) fprintf(stderr, ": %s", arg->usage); fprintf(stderr, "\n"); } } static const ArgDesc *findArg(const ArgDesc *args, char *arg) { const ArgDesc *p; for (p = args; p->arg; ++p) { if (p->kind < argFlagDummy && !strcmp(p->arg, arg)) return p; } return NULL; } static GBool grabArg(const ArgDesc *arg, int i, int *argc, char *argv[]) { int n; int j; GBool ok; ok = gTrue; n = 0; switch (arg->kind) { case argFlag: *(GBool *)arg->val = gTrue; n = 1; break; case argInt: if (i + 1 < *argc && isInt(argv[i+1])) { *(int *)arg->val = atoi(argv[i+1]); n = 2; } else { ok = gFalse; n = 1; } break; case argFP: if (i + 1 < *argc && isFP(argv[i+1])) { *(double *)arg->val = atof(argv[i+1]); n = 2; } else { ok = gFalse; n = 1; } break; case argString: if (i + 1 < *argc) { strncpy((char *)arg->val, argv[i+1], arg->size - 1); ((char *)arg->val)[arg->size - 1] = '\0'; n = 2; } else { ok = gFalse; n = 1; } break; default: fprintf(stderr, "Internal error in arg table\n"); n = 1; break; } if (n > 0) { *argc -= n; for (j = i; j < *argc; ++j) argv[j] = argv[j+n]; } return ok; } GBool isInt(char *s) { if (*s == '-' || *s == '+') ++s; while (isdigit(*s)) ++s; if (*s) return gFalse; return gTrue; } GBool isFP(char *s) { int n; if (*s == '-' || *s == '+') ++s; n = 0; while (isdigit(*s)) { ++s; ++n; } if (*s == '.') ++s; while (isdigit(*s)) { ++s; ++n; } if (n > 0 && (*s == 'e' || *s == 'E')) { ++s; if (*s == '-' || *s == '+') ++s; n = 0; if (!isdigit(*s)) return gFalse; do { ++s; } while (isdigit(*s)); } if (*s) return gFalse; return gTrue; } pdftoipe-20130124-src/xmloutputdev.cpp0000644000175000017500000003541112100161615017502 0ustar otfriedotfried// -------------------------------------------------------------------- // Output device writing XML stream // -------------------------------------------------------------------- #include #include #include #include "Object.h" #include "Error.h" #include "Gfx.h" #include "GfxState.h" #include "GfxFont.h" #include "Catalog.h" #include "Page.h" #include "Stream.h" #include "xmloutputdev.h" #include #include //------------------------------------------------------------------------ // XmlOutputDev //------------------------------------------------------------------------ XmlOutputDev::XmlOutputDev(char *fileName, XRef *xrefA, Catalog *catalog, int firstPage, int lastPage) { FILE *f; if (!(f = fopen(fileName, "wb"))) { fprintf(stderr, "Couldn't open output file '%s'\n", fileName); ok = gFalse; return; } outputStream = f; // initialize ok = gTrue; xref = xrefA; inText = false; iUnicode = false; // set defaults iIsMath = false; iNoText = false; iIsLiteral = false; iMergeLevel = 0; iUnicodeLevel = 1; Page *page = catalog->getPage(firstPage); double wid = page->getMediaWidth(); double ht = page->getMediaHeight(); /* int rot = page->getRotate(); fprintf(stderr, "Page rotation: %d\n", rot); if (rot == 90 || rot == 270) { double t = wid; wid = ht; ht = t; } */ PDFRectangle *media = page->getMediaBox(); PDFRectangle *crop = page->getCropBox(); fprintf(stderr, "MediaBox: %g %g %g %g (%g x %g)\n", media->x1, media->x2, media->y1, media->y2, wid, ht); fprintf(stderr, "CropBox: %g %g %g %g\n", crop->x1, crop->x2, crop->y1, crop->y2); writePS("\n"); writePS("\n"); writePSFmt("\n", PDFTOIPE_VERSION); writePS("\n"); writePSFmt("\n", wid, ht, crop->x2 - crop->x1, crop->y2 - crop->y1, crop->x1 - media->x1, crop->y1 - media->y1); writePS("\n"); // initialize sequential page number seqPage = 1; } XmlOutputDev::~XmlOutputDev() { if (ok) { finishText(); writePS("\n"); } fclose(outputStream); } // ---------------------------------------------------------- void XmlOutputDev::setTextHandling(GBool math, GBool notext, GBool literal, int mergeLevel, int unicodeLevel) { iIsMath = math; iNoText = notext; iIsLiteral = literal; iMergeLevel = mergeLevel; iUnicodeLevel = unicodeLevel; if (iUnicodeLevel >= 2) { writePS("\n"); writePS("\\usepackage[utf8]{inputenc}\n"); writePS("\n"); } } // ---------------------------------------------------------- void XmlOutputDev::startPage(int pageNum, GfxState *state) { writePSFmt("\n", pageNum, seqPage); fprintf(stderr, "Converting page %d (numbered %d)\n", seqPage, pageNum); writePS("\n"); ++seqPage; } void XmlOutputDev::endPage() { finishText(); writePS("\n"); } // -------------------------------------------------------------------- void XmlOutputDev::startDrawingPath() { finishText(); } void XmlOutputDev::stroke(GfxState *state) { startDrawingPath(); GfxRGB rgb; state->getStrokeRGB(&rgb); writeColor("getTransformedLineWidth()); double *dash; double start; int length, i; state->getLineDash(&dash, &length, &start); if (length) { writePS(" dash=\"["); for (i = 0; i < length; ++i) writePSFmt("%g%s", state->transformWidth(dash[i]), (i == length-1) ? "" : " "); writePSFmt("] %g\"", state->transformWidth(start)); } if (state->getLineJoin() > 0) writePSFmt(" join=\"%d\"", state->getLineJoin()); if (state->getLineCap()) writePSFmt(" cap=\"%d\"", state->getLineCap()); writePS(">\n"); doPath(state); writePS("\n"); } void XmlOutputDev::fill(GfxState *state) { startDrawingPath(); GfxRGB rgb; state->getFillRGB(&rgb); writeColor("\n"); doPath(state); writePS("\n"); } void XmlOutputDev::eoFill(GfxState *state) { startDrawingPath(); GfxRGB rgb; state->getFillRGB(&rgb); writeColor("\n"); doPath(state); writePS("\n"); } void XmlOutputDev::doPath(GfxState *state) { GfxPath *path = state->getPath(); GfxSubpath *subpath; int n, m, i, j; n = path->getNumSubpaths(); double x, y, x1, y1, x2, y2; for (i = 0; i < n; ++i) { subpath = path->getSubpath(i); m = subpath->getNumPoints(); state->transform(subpath->getX(0), subpath->getY(0), &x, &y); writePSFmt("%g %g m\n", x, y); j = 1; while (j < m) { if (subpath->getCurve(j)) { state->transform(subpath->getX(j), subpath->getY(j), &x, &y); state->transform(subpath->getX(j+1), subpath->getY(j+1), &x1, &y1); state->transform(subpath->getX(j+2), subpath->getY(j+2), &x2, &y2); writePSFmt("%g %g %g %g %g %g c\n", x, y, x1, y1, x2, y2); j += 3; } else { state->transform(subpath->getX(j), subpath->getY(j), &x, &y); writePSFmt("%g %g l\n", x, y); ++j; } } if (subpath->isClosed()) { writePS("h\n"); } } } // -------------------------------------------------------------------- void XmlOutputDev::updateTextPos(GfxState *) { if (iMergeLevel < 2) finishText(); } void XmlOutputDev::updateTextShift(GfxState *, double /*shift*/) { if (iMergeLevel < 1) finishText(); } void XmlOutputDev::drawChar(GfxState *state, double x, double y, double dx, double dy, double originX, double originY, CharCode code, int nBytes, Unicode *u, int uLen) { // check for invisible text -- this is used by Acrobat Capture if ((state->getRender() & 3) == 3) return; // get the font if (!state->getFont()) return; if (iNoText) // discard text objects return; startText(state, x - originX, y - originY); if (uLen == 0) { writePSFmt("[S+%02x]", code); } else { for (int i = 0; i < uLen; ++i) writePSUnicode(u[i]); } } void XmlOutputDev::startText(GfxState *state, double x, double y) { if (inText) return; double xt, yt; state->transform(x, y, &xt, &yt); double *T = state->getTextMat(); double *C = state->getCTM(); /* fprintf(stderr, "TextMatrix = %g %g %g %g %g %g\n", T[0], T[1], T[2], T[3], T[4], T[5]); fprintf(stderr, "CTM = %g %g %g %g %g %g\n", C[0], C[1], C[2], C[3], C[4], C[5]); */ double M[4]; M[0] = C[0] * T[0] + C[2] * T[1]; M[1] = C[1] * T[0] + C[3] * T[1]; M[2] = C[0] * T[2] + C[2] * T[3]; M[3] = C[1] * T[2] + C[3] * T[3]; GfxRGB rgb; state->getFillRGB(&rgb); writeColor("", state->getFontSize(), M[0], M[1], M[2], M[3], xt, yt); if (iIsMath) writePS("$"); inText = true; } void XmlOutputDev::finishText() { if (inText) { if (iIsMath) writePS("$"); writePS("\n"); } inText = false; } // -------------------------------------------------------------------- void XmlOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, int width, int height, GfxImageColorMap *colorMap, GBool interpolate, int *maskColors, GBool inlineImg) { finishText(); ImageStream *imgStr; Guchar *p; GfxRGB rgb; int x, y; int c; writePSFmt("getCTM(); double tx = mat[0] + mat[2] + mat[4]; double ty = mat[1] + mat[3] + mat[5]; writePSFmt(" rect=\"%g %g %g %g\"", mat[4], mat[5], tx, ty); if (str->getKind() == strDCT && !inlineImg && 3 <= colorMap->getNumPixelComps() && colorMap->getNumPixelComps() <= 4) { // dump JPEG stream std::vector buffer; // initialize stream str = str->getNextStream(); str->reset(); // copy the stream while ((c = str->getChar()) != EOF) buffer.push_back(char(c)); str->close(); if (colorMap->getNumPixelComps() == 3) writePS(" ColorSpace=\"DeviceRGB\""); else writePS(" ColorSpace=\"DeviceCMYK\""); writePS(" BitsPerComponent=\"8\""); writePS(" Filter=\"DCTDecode\""); writePSFmt(" length=\"%d\"", buffer.size()); writePS(">\n"); for (unsigned int i = 0; i < buffer.size(); ++i) writePSFmt("%02x", buffer[i] & 0xff); #if 0 } else if (colorMap->getNumPixelComps() == 1 && colorMap->getBits() == 1) { // 1 bit depth -- not implemented in Ipe // initialize stream str->reset(); // copy the stream size = height * ((width + 7) / 8); for (i = 0; i < size; ++i) { writePSFmt("%02x", (str->getChar() ^ 0xff)); } str->close(); #endif } else if (colorMap->getNumPixelComps() == 1) { // write as gray level image writePS(" ColorSpace=\"DeviceGray\""); writePS(" BitsPerComponent=\"8\""); writePS(">\n"); // initialize stream imgStr = new ImageStream(str, width, colorMap->getNumPixelComps(), colorMap->getBits()); imgStr->reset(); // for each line... for (y = 0; y < height; ++y) { // write the line p = imgStr->getLine(); for (x = 0; x < width; ++x) { GfxGray gray; colorMap->getGray(p, &gray); writePSFmt("%02x", colToByte(gray)); p += colorMap->getNumPixelComps(); } } delete imgStr; } else { // write as RGB image writePS(" ColorSpace=\"DeviceRGB\""); writePS(" BitsPerComponent=\"8\""); writePS(">\n"); // initialize stream imgStr = new ImageStream(str, width, colorMap->getNumPixelComps(), colorMap->getBits()); imgStr->reset(); // for each line... for (y = 0; y < height; ++y) { // write the line p = imgStr->getLine(); for (x = 0; x < width; ++x) { colorMap->getRGB(p, &rgb); writePSFmt("%02x%02x%02x", colToByte(rgb.r), colToByte(rgb.g), colToByte(rgb.b)); p += colorMap->getNumPixelComps(); } } delete imgStr; } writePS("\n\n"); } // -------------------------------------------------------------------- struct UnicodeToLatex { int iUnicode; const char *iLatex; }; static const UnicodeToLatex unicode2latex[] = { // { 0xed, "{\\'\\i}" }, // -------------------------------------------------------------------- { 0x391, "$\\Alpha$" }, { 0x392, "$\\Beta$" }, { 0x393, "$\\Gamma" }, { 0x394, "$\\Delta" }, { 0x395, "$\\Epsilon" }, { 0x396, "$\\Zeta" }, { 0x397, "$\\Eta" }, { 0x398, "$\\Theta" }, { 0x399, "$\\Iota" }, { 0x39a, "$\\Kappa" }, { 0x39b, "$\\Lambda" }, { 0x39c, "$\\Mu" }, { 0x39e, "$\\Nu" }, { 0x39e, "$\\Xi" }, { 0x39f, "$\\Omicron" }, { 0x3a0, "$\\Pi" }, { 0x3a1, "$\\Rho" }, { 0x3a3, "$\\Sigma" }, // sometimes \\sum would be better { 0x3a4, "$\\Tau" }, { 0x3a5, "$\\Upsilon" }, { 0x3a6, "$\\Phi" }, { 0x3a7, "$\\Chi" }, { 0x3a8, "$\\Psi" }, { 0x3a9, "$\\Omega" }, // -------------------------------------------------------------------- { 0x3b1, "$\\alpha$" }, { 0x3b2, "$\\beta$" }, { 0x3b3, "$\\gamma" }, { 0x3b4, "$\\delta" }, { 0x3b5, "$\\varepsilon" }, { 0x3b6, "$\\zeta" }, { 0x3b7, "$\\eta" }, { 0x3b8, "$\\theta" }, { 0x3b9, "$\\iota" }, { 0x3ba, "$\\kappa" }, { 0x3bb, "$\\lambda" }, { 0x3bc, "$\\mu" }, { 0x3be, "$\\nu" }, { 0x3be, "$\\xi" }, { 0x3bf, "$\\omicron" }, { 0x3c0, "$\\pi" }, { 0x3c1, "$\\rho" }, { 0x3c3, "$\\sigma" }, { 0x3c4, "$\\tau" }, { 0x3c5, "$\\upsilon" }, { 0x3c6, "$\\phi" }, { 0x3c7, "$\\chi" }, { 0x3c8, "$\\psi" }, { 0x3c9, "$\\omega" }, // -------------------------------------------------------------------- { 0x2013, "-" }, { 0x2019, "'" }, { 0x2022, "$\\bullet$" }, { 0x2026, "$\\cdots$" }, { 0x2190, "$\\leftarrow$" }, { 0x21d2, "$\\Rightarrow$" }, { 0x2208, "$\\in$" }, { 0x2209, "$\\not\\in$" }, { 0x2211, "$\\sum$" }, { 0x2212, "-" }, { 0x221e, "$\\infty$" }, { 0x222a, "$\\cup$" }, { 0x2260, "$\\neq$" }, { 0x2264, "$\\leq$" }, { 0x2265, "$\\geq$" }, { 0x22c5, "$\\cdot$" }, { 0x2286, "$\\subseteq$" }, { 0x25aa, "$\\diamondsuit$" }, // -------------------------------------------------------------------- // ligatures { 0xfb00, "ff" }, { 0xfb01, "fi" }, { 0xfb02, "fl" }, { 0xfb03, "ffi" }, { 0xfb04, "ffl" }, { 0xfb06, "st" }, // -------------------------------------------------------------------- }; #define UNICODE2LATEX_LEN (sizeof(unicode2latex) / sizeof(UnicodeToLatex)) void XmlOutputDev::writePSUnicode(int ch) { if (iIsLiteral && ch == '\\') { writePSChar(ch); return; } if (!iIsLiteral) { if (ch == '&' || ch == '$' || ch == '#' || ch == '%' || ch == '_' || ch == '{' || ch == '}') { writePS("\\"); writePSChar(ch); return; } if (ch == '<') { writePS("$<$"); return; } if (ch == '>') { writePS("$>$"); return; } if (ch == '^') { writePS("\\^{}"); return; } if (ch == '~') { writePS("\\~{}"); return; } if (ch == '\\') { writePS("$\\setminus$"); return; } } // replace some common Unicode characters if (1 <= iUnicodeLevel && iUnicodeLevel <= 2) { for (int i = 0; i < UNICODE2LATEX_LEN; ++i) { if (ch == unicode2latex[i].iUnicode) { writePS(unicode2latex[i].iLatex); return; } } } writePSChar(ch); } void XmlOutputDev::writePSChar(int code) { if (code == '<') writePS("<"); else if (code == '>') writePS(">"); else if (code == '&') writePS("&"); else if (code < 0x80) writePSFmt("%c", code); else { iUnicode = true; if (iUnicodeLevel < 2) { writePSFmt("[U+%x]", code); fprintf(stderr, "Unknown Unicode character U+%x on page %d\n", code, seqPage); } else { if (code < 0x800) { writePSFmt("%c%c", (((code & 0x7c0) >> 6) | 0xc0), ((code & 0x03f) | 0x80)); } else { // Do we never need to write UCS larger than 0x10000? writePSFmt("%c%c%c", (((code & 0x0f000) >> 12) | 0xe0), (((code & 0xfc0) >> 6) | 0x80), ((code & 0x03f) | 0x80)); } } } } void XmlOutputDev::writeColor(const char *prefix, const GfxRGB &rgb, const char *suffix) { if (prefix) writePS(prefix); writePSFmt("\"%g %g %g\"", colToDbl(rgb.r), colToDbl(rgb.g), colToDbl(rgb.b)); if (suffix) writePS(suffix); } void XmlOutputDev::writePS(const char *s) { fwrite(s, 1, strlen(s), outputStream); } void XmlOutputDev::writePSFmt(const char *fmt, ...) { va_list args; char buf[512]; va_start(args, fmt); vsprintf(buf, fmt, args); va_end(args); fwrite(buf, 1, strlen(buf), outputStream); } // -------------------------------------------------------------------- pdftoipe-20130124-src/pdftoipe.cpp0000644000175000017500000001115612100161615016534 0ustar otfriedotfried// -------------------------------------------------------------------- // Pdftoipe: convert PDF file to editable Ipe XML file // -------------------------------------------------------------------- #include #include #include #include #include "goo/GooString.h" #include "goo/gmem.h" #include "Object.h" #include "Stream.h" #include "Array.h" #include "Dict.h" #include "XRef.h" #include "Catalog.h" #include "Page.h" #include "PDFDoc.h" #include "Error.h" #include "GlobalParams.h" #include "parseargs.h" #include "xmloutputdev.h" static int firstPage = 1; static int lastPage = 0; static int mergeLevel = 0; static int unicodeLevel = 1; static char ownerPassword[33] = ""; static char userPassword[33] = ""; static GBool quiet = gFalse; static GBool printHelp = gFalse; static GBool math = gFalse; static GBool literal = gFalse; static GBool notext = gFalse; static ArgDesc argDesc[] = { {"-f", argInt, &firstPage, 0, "first page to convert"}, {"-l", argInt, &lastPage, 0, "last page to convert"}, {"-opw", argString, ownerPassword, sizeof(ownerPassword), "owner password (for encrypted files)"}, {"-upw", argString, userPassword, sizeof(userPassword), "user password (for encrypted files)"}, {"-q", argFlag, &quiet, 0, "don't print any messages or errors"}, {"-math", argFlag, &math, 0, "turn all text objects into math formulas"}, {"-literal", argFlag, &literal, 0, "allow math mode in input text objects"}, {"-notext", argFlag, ¬ext, 0, "discard all text objects"}, {"-merge", argInt, &mergeLevel, 0, "how eagerly should consecutive text be merged"}, {"-unicode", argInt, &unicodeLevel, 0, "how much Unicode should be used"}, {"-h", argFlag, &printHelp, 0, "print usage information"}, {"-help", argFlag, &printHelp, 0, "print usage information"}, {"--help", argFlag, &printHelp, 0, "print usage information"}, {"-?", argFlag, &printHelp, 0, "print usage information"}, {NULL, argFlag, 0, 0, 0} }; int main(int argc, char *argv[]) { // parse args GBool ok = parseArgs(argDesc, &argc, argv); if (!ok || argc < 2 || argc > 3 || printHelp) { fprintf(stderr, "pdftoipe version %s\n", PDFTOIPE_VERSION); printUsage("pdftoipe", " []", argDesc); return 1; } GooString *fileName = new GooString(argv[1]); globalParams = new GlobalParams(); if (quiet) globalParams->setErrQuiet(quiet); GooString *ownerPW, *userPW; if (ownerPassword[0]) { ownerPW = new GooString(ownerPassword); } else { ownerPW = 0; } if (userPassword[0]) { userPW = new GooString(userPassword); } else { userPW = 0; } // open PDF file PDFDoc *doc = new PDFDoc(fileName, ownerPW, userPW); delete userPW; delete ownerPW; if (!doc->isOk()) return 1; // construct XML file name GooString *xmlFileName; if (argc == 3) { xmlFileName = new GooString(argv[2]); } else { char *p = fileName->getCString() + fileName->getLength() - 4; if (!strcmp(p, ".pdf") || !strcmp(p, ".PDF")) { xmlFileName = new GooString(fileName->getCString(), fileName->getLength() - 4); } else { xmlFileName = fileName->copy(); } xmlFileName->append(".ipe"); } // get page range if (firstPage < 1) firstPage = 1; if (lastPage < 1 || lastPage > doc->getNumPages()) lastPage = doc->getNumPages(); // write XML file XmlOutputDev *xmlOut = new XmlOutputDev(xmlFileName->getCString(), doc->getXRef(), doc->getCatalog(), firstPage, lastPage); // tell output device about text handling xmlOut->setTextHandling(math, notext, literal, mergeLevel, unicodeLevel); int exitCode = 2; if (xmlOut->isOk()) { doc->displayPages(xmlOut, firstPage, lastPage, // double hDPI, double vDPI, int rotate, // GBool useMediaBox, GBool crop, GBool printing, 72.0, 72.0, 0, gFalse, gFalse, gFalse); exitCode = 0; } if (xmlOut->hasUnicode()) { fprintf(stderr, "The document contains Unicode (non-ASCII) text.\n"); if (unicodeLevel <= 1) fprintf(stderr, "Unknown Unicode characters were replaced by [U+XXX].\n"); else fprintf(stderr, "UTF-8 was set as document encoding in the preamble.\n"); } // clean up delete xmlOut; delete xmlFileName; delete doc; delete globalParams; // check for memory leaks Object::memCheck(stderr); gMemReport(stderr); return exitCode; } // --------------------------------------------------------------------