BLENDER_v227REND 1SRdSLSSRscreenSdSS$SdSST^` DATASMSDATASM$SS`DATA$SMdSS`DATAdSMS$SDATASMSdSKDATASM$SSKDATA$SMdSSDATAdSMS$SDATASMSdS,DATASM$SS,KDATA$SMdSS,DATAdSM$SDATASNSS$SDATASN$SSSdSDATA$SNdSSSSDATAdSNS$S$SSDATASNSdSSSDATASN$SSS$SDATA$SNdSSS$SDATAdSNS$SdSdSDATASNSdS$SdSDATASN$SS$SSDATA$SNdSSdSSDATAdSNS$SSSDATASNSdSSSDATASN$SSSSDATA$SNdSSS$SDATAdSNS$SS$SDATASNSdSSdSDATASN$SSdSdSDATA$SNS$SdSDATAdSOSS$SdSdS?FDz@PףWDS$SjR3SDATADSC$SdSDdCS, 9DIeCC(BDC?z?TDATA$S>DSdS??? ???? A??FDz@PA Aj?I7>}GCHB? A|T B?=CXXDATASOSdSSS$SSN`Nb``,eeDATASO$SSS$SdSdS>+>o?// /   Rv4RRDRLYDATAh4RIS SiR =@lnZnDATAS>DS4RS??DD$?N4.>l֣>?D$?%N%D??%H 4.gY?̺o> Wx*"+> )s4.>00 DATADSCRSSDdCD1MCC(BDC?z?DATADREDSSSLOAD TEXT FILE/tmp/ingo/projects/windstille/files/blender/obj_io_modif228.py l DATA$SOSS$SSSS>f>o?)H) ) H *=ISdXDATAS>dX$S???=^F?/ ض????^F/ 6?>f>oՌ<=8]2?h@l@^F/ 6??g@|T B?=C=^F?/ ض:: DATADdXES$SSAVE FILE/home/ingo/projects/windstille/files/blender/igel2.blendnd| DATASO$S$SSSdS?yXp@AHM/H//H RetS$S,e,eDATAtS>$SS?w?w3&+X??%w?w3&=??4A?? yXp@Gŗ4w4>6ʀ@@j?UFV>P BP֟r}P>t¿w4(@5?55g@|T B?=C>4.> V V DATA$SCtSSDdCD1MCC(BDC?z?SRdSLSSRscreen.001DSTTTDTLTTDATADSMSDATASMDSDSDATADSMSSDATASMSDSDATASMSSDATASMDSSDATADSMSSDATASMSDSDATASMTSDATATMDTSDATADTMTTDATATMDTDATATNTSDSDATATNDTTDSSDATADTNTTSSDATATNTDTDSSDATATNTTSSDATATNDTTDSDSDATADTNTTSSDATATNTDTDSSDATATNTTDSSDATATNDTTSSDATADTNTTSTDATATNTDTSTDATATNTTSTDATATNDTTSDTDATADTNTTTDTDATATNTDTSTDATATNTTSTDATATNTDTTDATADTOTDSDSSS?FDz@Pףd$TTDATA$TCTDdC˄3D(dCC(BDC?z?DATAT>$T??? ???? A??FDz@PA Aj?I7>}GCHB? A|T B?=CXXDATATO TDTSSDSSdDATA TOTTDSSTSg=Ρ>o?qqdt T TDATAt TD, TzCAzCA A@FB= A DATA, TF Tt TAA Y YCA A@CC #<@ T TDATA, T]D TOBL!TDATA,D T] T TME|AL$TDATA, T]D TOB`A|TDATA T>, T???55@??A0??5>5?g=Ρ>o$[;??cYAYJ@5>5??cYA|T B? #<C55@DATATOLT TDTTSTg=S=o?w}w}5dTTDATATD<TzCAzCA A@FB= A DATA<TCTTDdCJRCۖzDGhICC(BDC?z?DATATB T<TzC̽̌?zC@ #< #<`jFzD OBzC̽̌?DATA TGTT?DATATFT TAA>l>lBA A@CC #<@TDTDATA,T]TOBq= @L!TDATA,T]DTTME|AL$TDATA,DT]TOBp=A|TDATAT>T???55@??A0??5>5?g=S=o$s>?cYA~2bA5>5??cYA|T B?=C55@DATALTOTSSTDTg=+=o?w}w}d,TTDATA,TBTzC̽̌?zC@@@ #< #<`jFzD OBzC̽̌?DATATCT,TDdC@CdDGhICC(BDC?z?DATAT>T???55@??A0??5>5?g=+=o$gV>?cYAL³90A5>5??cYA|T B?=C55@SCT<SC1|T>f4T>f?@dd??< d=fff?=fff?Z@??//backbuf//ftypeDATA>f8,gk :hDATA,gk8T>f'VbkDATAT84T,gk'VL!TDATA4T8T' |TOB|T5L!TOBCamera (T3&=??????w?w3&=??????X$?%.?/8?Dd??)d??>)d?????OBL!T5bk|TOBPlaneL$T$T?????????????$w?%w3&=?DOBd??)d??>)d?????DATA$TOBbk5hL!TOBMeshek??????????????$w?%w3&=?Dd?? #=?>=?@???OBh5bkOBLamp ^?@?????????@?????? X$w?%.w ==['@?Dd?? #=?>=?@???MEL$T2ekMEPlane'I<%T%Tl%T@4???DATA<%T&TDATAPl%T/????DATA %T*MEek2L$TMEigel2fkDktgke ]3m?P::S@5 @S@DATA$tgk/?RZ>l>fZd?RZ>lھd?> #> }W?ϞB%ƾGjHRZ>l>ZRZ>lھfZZ窿^.t>iGWϞB%ƾO"߇-l>ϻm?l>Zl>ϻm?lھV?A`V? @V?A`Vyvl>RZ>?dfZl>RZ>ZZK>.Y)?^4>e->dUԢ?lھϻm?l>ZZlھϻm?lھZVA`V?51kVA`VQlھRZ>?clھRZ>ZfZZK.Y)?[YAA4پe->~?4eW> ]۠RZfڞ?y >~cY?I#?j>Q,UY?LlN>Y?S,fڞ?y ׾-Y?I#?jӾSUY?LlN>YU&? uq':ς?\ς?GHς?\ςk!~4eW>o]`Zfڞy >U{KYI#?j>YLlN>Y?SUa,fڞy ׾cBKYI#?jӾYLlN>Y,a, n< e=ς\ς?% Jς\ςͷF"=>)\?&#*$fZj>I#?Y?UQ,2~)\?=>fZFRj>I#?YSQ,g ")\?=ؾfZ$R >yfڞ?GI$4eW>~?Z`$ >yfڞ-odjj4eW>~ZR$$;'?BI\x $O\&&p?l2=ؾ)\?;*FfZjӾI#?Y?USjӾI#?Y ׾yfڞ?G gQ ׾yfڞ-dԬ?et獤_ޫԬeY$,3Tb?Oy,?Ҥٿ'@IZ$=??$=?Zb?ob?KA`?oUňKA`?Rh@rhV?ՉV?rhV?!>rh?~I:.rhE?M=rh?u5VrhV?*g>=)G?^Tg'W>V-?:nm=Q3A?f7CHYm˽Q3A?ʓD^۾V-?\vQ!=)G?"LB`0?/ϥ>B`0?~4X>B`e?E5W B`I?E9XB`e?`Ɠ#B`0?_A:?_85?=Y2C?_)Y?ZBB?W=?(E{)Y?ZoT==?(E{85?m%ʿ_>V@=(E{>Vnq=(E{`,T(:ҿ_`,X=?(E{>V>pF?_>V F;:?_`,?\=?(E{`,go ʿ_)Y?۷>T:ҿ_N>eK)=(E{85?C=(E{)Y?Zp;M?~!D?]q?~5c?7:UJ?~5c?b-eJ?~!D?4qɿ~K_ĺU~K_-e-~By;9FM̿~By;3F?~K_>Nq?~K_y>=MKM?~By;"H-H?~By;晔@qɿ~5c?dV KM̿~!D?#FIe@~!D?a~5c?aN>ʁJ4>ʁu="CI ʁu=O"ʁu=CI ʁ5ʁ𧆿㝾1п1M6{oA>1пT 7@>ʁ𧆿Huh=H%AT1uhH%_uhDz$ ^:"~u pIuh=Dz$ kd[9&&9 UUd; @C>0>_m]Bh @=Q>*OYQ @K=ı ?JA^@S>o ?Z @K=ı Jh @=QQd; @C>0^m]U@S>o LtF @ rS"@WKWJ8@F}l'\OQk @MMiH @: %?!PQk @MM?韊Q8@F}>N'\Jk+@V_>ОOS>o ZOZd; C>0m]Uh =QOY[ K=ı JS>o ?LOZ K=ı ? JA^h =Q>*[d; C>0>m]BIM>'P8F}>z\PQk MM?mS+ q ' ?دi? [?92t?HZ?vu!&̳~Ic??w ]Te?U?xnLi? [?9>2Lbe?U?>xnL[Ic??w> ]t?HZ?vu>!&̳_G?Q?vu>̳!&_?y@?w>] &??>nLx[i?5F?9>2Mb&??nLx?y@?w] TG?Q?vu̳ &~i?5F?92 u?.? u?ZB!? $?It?oUѭf1?=?f1?HGHIt? $?B!?ѭUo?P>? u?ZF?q>?B!?Uѭo`?*l?f1?GHHF?}?It?Uoѭ u?P>??ZIt?}?F?ѭoUf1?*l?`?HHGB!?q>?F?oѭUE ?2<>y?%^?&?vZwLi?>i?23bt?m£?!\?{?4vcJx ??>ca7? ͯ?zџ=FΆ?Vd?g(5?x ?TZfG<{??Jlc£?mt?$i?>i?3b2&?<>e?wLZvY?<?e^A>y?2?B!Uѭ/?P>? uZZIt? $?B!ѭU/f1?=?f1HG B!? $?ItoU/R u?.? uB!?q>?Fʿoѭ.f1?*l?`HHKIt?}?Fʿѭo. u?P>?߿Z7?Sv p9W`=x ?>c2?{3vc(t?m£!>i?>i23b@e?<>&vZ?y%^sM>y?2eؿwLZ/i?>i3b6£?mtۿ}˗{?޿Jtc?x _cCV?GQf=;Ý8tHZ?vu>̳_Icܿ?w>]eؿU?>/nL[i [?9>[͋LbeؿU?/nLIcܿ?w]TtHZ?vu̳~i [?9[͋i5F?9u@2GQ?vu4L!&~㪿y@?wu T&?xi5F?9>u@2Mb&?>x[㪿y@?w>u GQ?vu>4L &_>?&?[xnLw>y@?? ]vu>Q?G?_ &̳9>5F?i?Mb2vu>HZ?t?_̳!&w>?Ic?] >U?e?[nLx9> [?i?Lb29 [?i?2U?e?nLxw?Ic?T] vuHZ?t?~̳!&95F?i?2vuQ?G?~!&̳wy@??T ]?&?xnLo ?5?o ZZ ?S?0]3Ud>?dZZ0>S? m3co ?5?o ?Z0>S? ?m3]d>?d>Z ?S?0>]3m S?0>c3md?d>0S? ?U3]o 5?o ?0S? U3cd?dZ S?0c3Uo 5?o ZFʿ}?It?.oѭ`*l?f1?KHHFʿq>?B!?.ѭo߿P>? u?ZIt $?B!?/RUof1=?f1? GHB! $?It?/Uѭ u.? u?ZZB!q>?F?/ѭUf1*l?`? HGIt}?F?/RoU uP>??ı ?K= @A^JQ>=h @[0>C>d; @Bm]^o ?S>@OZL>O@UF}>8@X+(M?MQk @XN\J ?i @n5 J i @n|]MMQk @ZN\F}8@RX+(O@o S>@OZZ0C>d; @Um]_Q=h @[OY*ı K= @J u.? uZB! $?It/U/Rf1=?f1 G It $?B!/RU/߿P>? uFʿq>?B!.ѭ/`*l?f1KH Fʿ}?It.o/R uP>?߿ZZIt}?Fʿ/Ro.f1*l?` HKB!q>?Fʿ/ѭ.9> [?iLb[>U?eؿ[nL/w>?Icܿ]vu>HZ?t_̳9>5F?iMb2u@vu>Q?G_!&4Lw>y@?㪿 u>?&[xВ?&xВwy@?㪿T uvuQ?G~ &4L95F?i2u@vuHZ?t~̳w?IcܿT]U?eؿnL/9 [?i[E 2<>yڎ^sMܿ&/Zi>i63b@tۿm£1ް>޿{vc(x Mc27Sv p9WCVGQf<;=b;x ^2_c{޿tc£mtۿA˗i>i@3b6&<>eؿZ/Y<ܿ㬿>y2i?63beؿ<>&?/ZwLܿy?ڎ^>y2e?Zvi>i?@3b2£mt? D${?,lcx ?/ZfG<FΆVd?ʁJ ?$d 1c M?MQk HVKF}>8ح^Yo>bI`1o ?S>Z0>C>d; Bm]Q>=h QOYı ?K= A^J ı K= J Q=h Q*0C>d; Um]o S>L矾bI^1F}8(R^YoMMQk KJ $d Ϝ L@1}>B*?>VL@1}>B*+6S@Vh3/?q8S@2?}DL1}>B*V^L1}>B*?>+^2SB3?uj&2=S?2kB.,@g?r k.,@g?r ?7|ar?I@r ?zGr?I@r zGf?^ @?_[_@h??[__?h?@__[v2,@K>h?uJ.@=~߾G?`x ?ܾ[.@ܞw h?K>v2,@9R_@h?Ϳ?_?^ @Ϳ?_?h???[.@an߾JF_#lr&-v2,@K>hR_ph?K>v2,JuR$?ae."xI.,g?r ?kzG.,g?r kzGfrI@r zGkrI@r ?-Ȩ|ar ?I@r?zGr ?g?.,@zGr g?.,@7r I@r?k"n*? Y?@"n*ZZ"n*? Y?@"n*?Z"n* Y?@"n*?"n* Y?@"n*Zh??[??Ϳ^ @?_?Ϳh?@_?B*?1}>L@^+/4?nS@B9n/4nS@;ApB*1}>L@^V>Ϳ^ @Ϳ?[?h?Ϳ_?Ϳh??_r ?g?.,|a7X=r ?I@rfkzGr I@rf↸r g?.,fzGkv2,K>hRu.an߾JFx $ae.)t]hK>v2,pR_?.??rv2,K>h??R_9hK>v2,@u򿻵ܾ[.@In6?# SS B*?1}>LVB*1}>L+>n6# SS]EDATADk*e !(! fe! nm )I#" 0-$yz%!"('MN(!he&qt )!uv#I+ il))&li+ ,@ -A!".  /@ ,I YZ0   TSO gf) M  !% mpM# E -H ( 2! <91A ( 3A UV/H 4!1@=5 ! $6#! 3H  $.(%7A418@7H,)0IJ'`]9A*%XWRAtsN#O)+ ji)N 8H85%(EF2)}:AQR9Hda4)qr((;A*$]5AB:I* @mn;6(<,>&<"@#L>!?B? ,$@@<(B!>HA# %AKB (ehM#on <! @ $!,!BK"="-"C"(#= ##vwK!#|y$$  C@$-.F#$34%/0%%56FK%z{K%(&&=*&efJ#&klL'C)''JKHB'PM(NOH(TQ,(gh!(rsJ@)lkN")rqA)=) *xu,*KK+ijJ+pm$,>, @,E,$!M-E-?+- D- H..DB."#EA.'(/A/ L/VWI /\Y I0  0)*EH0Z[IC0_`1@)1 A19:G 1?@D2DK2 2;< %2FGG@3B+33L"3 E4XU !4abIJ4LA4$5Z5\[!5=>GK5DA$6,6!6LJ7C7  A7%&E7+,L8D(8I812F878L9LIE9RSH+9]^I9cdH:BCG(:HEE:}~K+:;noJ);tqA;L(;@<+<<,<=&*="=#-=)>(>>A>,?-?-?D@@!@ D@1$AAEA/$B!B%BIB3 C$)C"C'@C  7D.MD-)D2DD8E 0JE#$,E&'.CE*+7F./%F23$EF678$G:;2KG>?1)GCD5DGGH:*HKL9HOP'-HST(DIWX4LI[\/I^_0EIbc9(Jfg(Jjk&!Jop+DJst;$Kwx*K{|#%K~%IK: L6LL3+L4CL;,Mhg $Mpo,M (Nkj$Nsr)$N(OSXO !PVUQ QUT $QY[PRP\^RWVP S_dX(T`_S Ua`THVbaU WcbV XdcW@Y5["Z5Y"\5^"\P[^5]"euxhfvueDgwvfhxwg,iy|l@jzyik{zj,l|{km}p!n~}mo~n@poqtrq@srts#vwxu#z{|y-~}#- @(!H@ B""#  & &#  # &$"!" " "@B@BCD &@#F$!" F" F& @&B!&DBA$F"@ & &!@"BA " " "@B    @    B D BA B"@ F"C@@ C !""#@#$$!F%&&'C'((%@)*@*++,F,)-.!.//0&0-1223D3441B56A67$78F85"9: :;C;<&<9@=>A>? ?@F@="AB@BC CDFDA&EF FG@GH#HEFIJJKCKLLIDMN NOOP&PMQR@RS#STFTQ$UV@VW WXFXU"YZZ[C[\\Y@]^^_D_``]BabAbc cdBda"ef!fggh"heijjk klFli"mnno opFpm&qr rs@st&tqBuv@vw wxxu&yz z{{|&|y}~!~@"}BA "@#F  @#F C&@A$B"ZYGYQ@Q @R^A^]E]G`ab `bc `cd `d_@@   @MA&T!MAMaterialL?L?L?????????L??2 ???T'TDATAPT'T'T??????????TE'TTETex>@????????CAl(TCACamera2=B? A B?LA^LALamp????A4B>??? B4B?@@TXdiRTXobj_io_modif228.py$jRTdjR42\djRdjRXDATA$jR/tmp/obj_io_modif228.pyDATAdjRX,XJ2DATAX<XdjRX&DATA<XXX|X5headDATAX$hR<XXDATA$hRhRXdhRDATAhRiR$hRhRDATAiR0XhR$0XCBrowDATA0X1XiR0XPjRDATA1Xt1X0XD1XmRDATAt1X2X1X1X2lRDATA2X2Xt1XT2XDATA2X2X2X2XitorDATA2X NW2X43XJ3BuDATA NWNW2XLNWEcDATANWtOW NWNWIDATAtOW,PWNWOWGDATA,PWPWtOWlPW(DATAPW4QW,PWQWDATA4QWQWPWtQWDATAQWlRW4QWQWHDATAlRWSQWRWIDATASSlRWS'DATASSS4S4DATASLSSSJDATALSSSSGDATASSLSDSLDATASlSSS@DATAlS$SSSKDATA$SSlSdSKDATASS$SSWDATAS\SSSNDATA\SSSSDATASLS\S SDATALS SSSO(DATA SSLSLSMDATAS|S SSHDATA|S!SS$!SIDATA!Sd"S|S!SWDATAd"S#S!S"SJDATA#S#Sd"S\#SBDATA#S$S#S#Su3DATA$S$S#ST$SIDATA$S%S$S %SNDATA%SD&S$S%SPDATAD&S'S%S&SO(SDATA'S'SD&SD'SMDATA'St(S'S'SNDATAt(S,)S'S(SNDATA,)S)St(Sl)S<DATA)SD*S,)S*SDATAD*S*S)S*SDATA*S+SD*S+S[DATA+SL,S*S+SUDATAL,S -S+S,STequeDATA -S-SL,SL-SWDATA-S$R -SRUDATA$RR-SdRXDATARR$R,RXQDATAR4RRRRDATA4RRRtRFREEDATARdR4RRRFREEDATAdR,RRRW(SDATA,RRdRlRUFREEDATARR,R,RN(SDATARdRRRRRDATAdRRRRNLDATARRdR\R(SDATARTRRRW(SDATATRRRRWFREEDATARRTR\R?DATARDATANZLOZMZNZ7DATALOZOZNZOZ<rrrDATAOZtPZLOZ4PZDATAtPZPZOZPZDATAPZQZtPZ[=[=[DATA>[>[=[D>[DATA>[?[>[>[#DATA?[?[>[T?[DATA?[@[?[?[DATA@[@[?[D@[DATA@[@[@[@[DATA@[A[@[4A[!DATAA[B[@[A[ DATAB[B[A[TB[!DATAB[$C[B[B[DATA$C[C[B[dC[DATAC[$D[$C[C[DATA$D[D[C[dD[DATAD[$E[$D[D[DATA$E[E[D[dE[DATAE[F[$E[E[DATAF[F[E[TF[DATAF[ G[F[F[ DATA G[G[F[LG[DATAG[H[ G[G[DATAH[H[G[\H[UDATAH[LI[H[I[DATALI[I[H[I[ DATAI[\J[LI[J[DATA\J[J[I[J[.DATAJ[tK[\J[4K[DATAtK[K[J[K[DATAK[tL[tK[,L[DATAtL[L[K[L[DATAL[M[tL[4M[.DATAM[,N[L[M[6DATA,N[N[M[lN[DATAN[,O[,N[N[ DATA,O[O[N[lO[2DATAO[TP[,O[ P[DATATP[P[O[P[%DATAP[TQ[TP[$Q[DATATQ[Q[P[Q[1DATAQ[dR[TQ[4R[DATAdR[R[Q[R[DATAR[|S[dR[,S["DATA|S[T[R[S[DATAT[T[|S[DT[(DATAT[ U[T[T[DATA U[U[T[LU[HDATAU[dV[ U[V[2DATAdV[V[U[V[DATAV[|W[dV[W[9DATA|W[,X[V[W[ADATA,X[X[|W[lX[GDATAX[TY[,X[$Y[DATATY[Y[X[Y[DATAY[LZ[TY[Z[DATALZ[Z[Y[Z[3DATAZ[[[LZ[,[[<DATA[[T\[Z[[[SDATAT\[\[[[\[DATA\[|][T\[][HDATA|][4^[\[][MDATA4^[^[|][t^[KDATA^[_[4^[,_[JDATA_[`[^[_[ DATA`[`[_[\`[=DATA`[4a[`[a[DATA4a[a[`[ta[1DATAa[tb[4a[b[1DATAtb[c[a[b[1DATAc[c[tb[Tc[DATAc[ d[c[c[DATA d[d[c[Ld[DATAd[DATA~[<[}[~[>DATA<[[~[|[>DATA[|[<[$[-DATA|[[[[DATA[l[|[,[DATAl[܁[[[DATA܁[\[l[[DATA\[܂[܁[[DATA܂[L[\[[DATAL[[܂[[<DATA[[L[4[8DATA[D[[܄[=DATAD[̅[[[DATA̅[L[D[ [DATAL[Ԇ[̅[[DATAԆ[D[L[[DATAD[ć[Ԇ[[DATAć[D[D[[DATAD[[ć[[DATA[L[D[[*DATAL[[[[*DATA[T[L[$[DATAT[܊[[[DATA܊[\[T[[DATA\[[܊[[DATA[|[\[$[+DATA|[[[[DATA[[|[D[DATA[$[[č[0DATA$[[[d[DATA[[$[Ԏ[DATA[[[T[DATA[$[[܏[DATA$[[[d[DATA[4[$[[DATA4[[[t[DATA[D[4[[#DATAD[Ԓ[[[&DATAԒ[t[D[[/DATAt[ [Ԓ[[)DATA [[t[L[@DATA[T[ [[.DATAT[ܕ[[[DATAܕ[l[T[[ DATAl[[ܕ[[DATA[[l[4[ DATA[[[ė["DATA[[[T[+DATA[4[[[DATA4[ԙ[[t[0DATAԙ[\[4[[DATA\[̚[ԙ[[DATA̚[\[\[ [$DATA\[[̚[[DATA[l[\[$[DATAl[[[[DATA[|[l[4[DATA|[[[[-DATA[[|[T[DATA[ [[Ğ[DATA [[[L[DATA[4[ [ԟ[1DATA4[[[t[DATA[[4[[ DATA[[[\[DATA[$[[ܡ[DATA$[[[d[DATA[[$[Ԣ[DATA[[[\[DATA[$[[ܣ[DATA$[ܤ[[d[IDATAܤ[L[$[[DATAL[ԥ[ܤ[[DATAԥ[l[L[[*DATAl[ [ԥ[[2DATA [[l[L[!DATA[L[ [ܧ[EDATAL[ܨ[[[#DATAܨ[d[L[[DATAd[ [ܨ[[9DATA [[d[L['DATA[D[ [[2DATAD[̫[[[DATA̫[<[D[ [DATA<[ܬ[̫[|[0DATAܬ[l[<[[&DATAl[ܭ[ܬ[[DATAܭ[[l[[<DATA[[ܭ[Į[DATA[[[4[FDATA[\[[[HDATA\[[[[GDATA[[\[T[DATA[[[ܱ[DATA[[[\[DATA[[[[DATA[[[T[DATA[[[Գ[DATA[[[T[DATA[$[[Ĵ[4DATA$[[[d[*DATA[,[$[[DATA,[[[l[DATA[4[,[[DATA4[[[t[DATA[T[4[[-DATAT[ܸ[[[DATAܸ[|[T[[0DATA|[[ܸ[[DATA[l[|[,[DATAl[[[[$DATA[[l[<[DATA[[[Ļ[DATA[[[T[#DATA[,[[[DATA,[Ľ[[l['DATAĽ[L[,[[DATAL[[Ľ[[+DATA[|[L[$[.DATA|[$[[[7DATA$[[|[d[1DATA[|[$[[HDATA|[[[[6DATA[[|[\[#DATA[D[[[(DATAD[[[["DATA[l[D[[(DATAl[[[[*DATA[[l[D[3DATA[4[[[ DATA4[[[t[8DATA[l[4[["DATAl[[[[DATA[l[l[[$DATAl[[[[DATA[|[l[4[DATA|[[[[DATA[[|[D[DATA[$[[[-DATA$[[[d[DATA[[$[[DATA[[[\[DATA[D[[[1DATAD[[[[DATA[<[D[[DATA<[[[|[ DATA[4[<[[DATA4[[[t[-DATA[t[4[ [8DATAt[[[[DATA[[t[<[DATA[[[[DATA[[[T[!DATA[\[[[NDATA\[[[[DATA[\[\[ [ DATA\[[[[0DATA[[\[<[9DATA[<[[['DATA<[[[|[KDATA[[<[4[)DATA[[[[!DATA[[[\[?DATA[T[[ [DATAT[[[[8DATA[[T[<[ DATA[[[[DATA[[[<[1DATA[\[[[RDATA\[[[[DATA[|[\[ [CDATA|[,[[[EDATA,[[|[l[CDATA[d[,[[DATAd[[[[DATA[\[d[,[DATA\[[[[5DATA[[\[<[)DATA[ [[[DATA [[[L[DATA[ [ [[DATA [[[L[DATA[$[ [[DATA$[[[d[DATA[T[$[[<DATAT[[[[DATA[D[T[[DATAD[[[[ DATA[D[D[[DATAD[[[[DATA[\[D[ [$DATA\[[[[0DATA[[\[<[DATA[4[[[@DATA4[[[t[DATA[T[4[[6DATAT[[[[#DATA[\[T[$[ DATA\[[[[;DATA[t[\[D[DATAt[[[[DATA[[t[<[DATA[[[[&DATA[[[\[%DATA[D[[[)DATAD[[[[1DATA[|[D[$[.DATA|[[[[2DATA[[|[\[DATA[[[[&DATA[[[\['DATA[D[[[!DATAD[[[[-DATA[d[D[[DATAd[[[[4DATA[[d[D[)DATA[ [[[DATA [[[L[DATA[,[ [[)DATA,[[[l[/DATA[T[,[ [DATAT[[[[*DATA[[T[,[2DATA[[[[DATA[[[<[&DATA[$[[[*DATA$[[[d[5DATA[4[$[[DATA4[[[t[DATA[D[4[[DATAD[[[[ DATA[t[D[[0DATAt[ \[[*DATA \\t[L\)DATA\4\ \\DATA4\\\t\KDATA\t\4\,\DATAt\$\\\@DATA$\\t\d\ DATA\$\$\\DATA$\\\d\DATA\\$\\DATA\\\\\DATA\\\\\MDATA\\\\\DATA\\\\ \IDATA\\\\DATA\\\4\)DATA\ \\\$DATA \ \\\ \)DATA \, \ \ \ DATA, \ \ \l \ DATA \ \, \ \ DATA \ \ \\ \ DATA \ \ \ \DATA \ \ \T \DATA \ \ \ \DATA \ \ \D \DATA \ \ \ \DATA \\ \L\DATA\\ \\DATA\\\\\DATA\\\\DATA\\\\\DATA\\\\DATA\\\T\DATA\\\\DATA\\\T\DATA\\\\DATA\\\\\DATA\,\\\DATA,\\\l\DATA\4\,\\DATA4\\\t\DATA\$\4\\DATA$\\\d\DATA\,\$\\DATA,\\\l\DATA\4\,\\DATA4\\\t\DATA\<\4\\DATA<\\\|\DATA\4\<\\DATA4\\\t\ DATA\$\4\\ DATA$\\\d\ DATA\\$\\DATA\\\\\DATA\,\\\&DATA,\\\l\&DATA\L\,\\&DATAL\\\\DATA\D\L\\DATAD\\\\ DATA\4 \D\\ DATA4 \ \\t \ DATA \,!\4 \ \DATA,!\!\ \l!\DATA!\<"\,!\!\%DATA<"\"\!\|"\%DATA"\\#\<"\ #\%DATA\#\#\"\#\#DATA#\\$\\#\,$\DATA\$\ %\#\$\?DATA %\%\\$\L%\<DATA%\$&\ %\%\DATA$&\&\%\d&\DATA&\'\$&\&\DATA'\'\&\T'\'DATA'\4(\'\'\DATA4(\(\'\t(\'DATA(\D)\4(\ )\ DATAD)\)\(\)\ DATA)\,*\D)\)\DATA,*\*\)\l*\DATA*\4+\,*\*\DATA4+\+\*\t+\DATA+\,,\4+\+\DATA,,\,\+\l,\DATA,\,-\,,\,\DATA,-\-\,\l-\DATA-\.\,-\-\DATA.\.\-\\.\!DATA.\4/\.\.\DATA4/\/\.\t/\4DATA/\D0\4/\0\DATAD0\0\/\0\DATA0\D1\D0\1\DATAD1\1\0\1\DATA1\42\D1\2\DATA42\1\t2\ DATAL,X#=========================================================================DATA(X# Wavefront OBJ Importer/Exporter v1.2DATA8|X# This is a complete OBJ importer and exporter scriptDATAX# All Rights ReservedDATA dhR# chris@artdreamdesigns.com V/DATAhRS DATAD$0X#Version corrigee des bugs de l'import sur les conseils de jm solerDATA0X#M-M DATAD1XSDATA41X#Version mise a jour pour Blender 228 par jm solerDATAT2X# DATA2XxDATAL43X#=========================================================================DATAHLNW# DESCRIPTION: This script allows for full importing and exporting ofDATALNW# .obj files. uv texture coordinates and normals can be exported andDATAHOW# imported. .obj groups and materials can also be converted to andDATA,lPW# from material indexes in Blender.XDATAQW#DATAtQW# INSTALLATION:DATALQW# You need the FULL python installation to run this script. You canDATALRW# down load the latest version of PYTHON from http://www.python.org.DATAS#DATA84S# INSTRUCTIONS (You definitely want to read this!): DATALS# Once the script is loaded in Blender, hit alt-p. This will bring upDATAHS# the main interface panel. You will have a choise of exporting orDATAPDS# importing an .obj module. If you are exporting you must have at leastDATADS# one mesh selected in Blender, or you will get an error. DATALS# You can change the export filename by entering the path and filenameDATALdS# in the dialog. If you do not enter a path, the path will default toDATAXS# your blender directory. You can change the default path in the script <==== NOTEDATAPS# itself by modifying the variable 'Filename' at the top of the script. DATAS#DATA S# EXPORTING:DATAPS# There are 4 different export options: Default, Groups, Material Layers, DATAPLS# and Standard. "Default" will export your mesh using Material Layers ifDATALS# the mesh has material indexes. "Groups" and "Material Layers" areRDATAL$!S# logically equivalent, but are a different .obj format. If you are DATAX!S# exporting a Poser morph target, you must select "Material Layers". <===== NOTEDATAL"S# "Standard" will ignore grouping information, even if your mesh has DATA\#S# material indexes.DATA#S#DATALT$S# There is also a choice between export using "mesh coordinates" or DATAP %S# "object coordinates". "Object coordinates" are any location, rotation, DATAT%S# or scaling values created outside of mesh edit. They belong to the objectDATAP&S# rather than the mesh. If you export using mesh coordinates (the default)DATAPD'S# the center of the object will always be at 0, 0, 0. Export using "meshDATAP'S# coordinates is definintely what you want to use if you are working withDATAP(S# a Poser morph target. If you are exporting a group of objects, you willDATA@l)S# automatically be placed in "object coordinate" mode. DATA*S#DATA*S# IMPORTING:DATA\+S# If your OBJ model has uv mapping coordinates, and you want to use them <===== NOTE DATAX+S# in Blender, you can access them in two ways. The best way is through Blender'sdDATAX,S# realtime UV coordinates which you enable simply by selecting the UV option in%xDATAXL-S# the material edit window. This gives you an exact version of the uv coordinates.DATAXR# An older method is to select the "stick" option in the material edit window. IDATA\dR# really don't know why anyone would want to use this option since it cannot handleEEDATA\,R# seams and texture overlap, but I left it in just in case someone could use it forDATAR# something.DATAtR# DATATR# If your OBJ contains groups, once it has been imported, it may still appearDATAXR# to lack any material indexes. If this happens, it can be remedied <=== NOTEDATAXlR# by going to the mesh editor window, clicking on the mesh selection button, andDATAP,R# reselecting the mesh you have just imported. You will now have as many DATATR# materials attached to your object as there are groups. You can then select DATAPR# different groups by doing a material select when you are in edit mode. DATA\R#@DATAXR# Finally, you might have problems with certain parts of the object not displayingDATAXR# after you go in and out of edit mode the first time. To fix this, simply go intoDATA@\R# edit mode again, and select the "remove doubles" option.DATA R#DATA|R#DATA \iR# HISTORY:DATA$,R# Nov 13, 2001: Initial ReleaseDATAPR# Nov 16, 2001: Version 1.1 - no longer need to pre-define dummy materialsDATAptR# Dec 13, 2001: Version 1.2 - now imports into realtime UV (the UV button in the material edit window), andDATApLR# exports realtime UV. This format is more compatible with the native .OBJ uv format. Should eliminateDATAt$R# texture misalignments and seams. Simply press the UV button in the material edit window after importing.DATAR#DATA tR# GetRawDATA$R#================================DATA|RDATARDATA$\R# ===============================DATA R# Setup our runtime constantsDATA$|R# ===============================DATA RDATA8|RDEBUG=1 #Set this to "1" to see extra messagesDATA4RMESHVERSION=3 # If the export file doesn't work,DATA,RFILEVERSION=3 # try changing these to "2"DATATRDATAREVENT_PATHCHANGE= 1DATALREVENT_IMPORT= 2DATAREVENT_IMPORT_CONT= 3DATA\REVENT_OPTIONS= 4DATAREVENT_EXPORT= 7DATAlREVENT_EXPORT_CHK= 5DATAREVENT_EXPORT_CANCEL= 6DATA|REVENT_QUIT= 8DATAREVENT_EXPORT_ERR= 9DATAREVENT_TYPE= 10DATAREVENT_DONE= 11DATARDATA$ R# ===============================BDATAR# Import our librariesDATA$R# ===============================DATARDATARimport stringDATA Rimport osDATA Rimport structDATA Rimport mathDATARimport BlenderDATAtR#import Blender210DATARfrom Blender import *DATAtRfrom Blender import NMeshDATARfrom Blender.Draw import *DATARfrom Blender.BGL import *DATA Rfrom Blender import MaterialDATARDATA$R# ===============================DATAR# Input Variables/DATA$R# ===============================DATARDATALRFilename = "E:\\zi^p\\3dgrx\\blender\\reserve_python\\objimport\\test.obj"DATARDDATA 0:DATA~Z gAlert = 3DATA ,Z else:DATAZ gAlert = 4DATA$Z FILE.flush()DATAZ FILE.close()DATA$ZtDATAZ#=========================DATA(Zdef ObjImport(file, Name, filename):DATA Z#========================= DATA4Z vcount = 0DATAZ vncount = 0DATA4Z vtcount = 0DATAZ fcount = 0DATA4Z gcount = 0DATAZ setcount = 0DATA4Z groupflag = 0DATAZ objectflag = 0DATA4Z mtlflag = 0DATAZ baseindex = 0DATA4Z basevtcount = 0DATAZ basevncount = 0DATA4Z matindex = 0DATAZrDATA$Z pointList = []DATAZ uvList = []DATA$Z normalList = []DATAZ faceList = []DATA$Z materialList = []DATAZ uv = [] DATA Z lines = file.readlines()DATAZ linenumber = 1DATA$ZDATAZ for line in lines:DATA$Z words = string.split(line)DATA(Z if words and words[0] == "#":DATA$4Z pass # ignore commentsDATA(ĐZ elif words and words[0] == "v":DATA \Z vcount = vcount + 1DATA Z x = float(words[1])DATA |Z y = float(words[2])DATA Z z = float(words[3])DATA(Z pointList.append([x, y, z])DATA4ZDATA,Z elif words and words[0] == "vt":rDATA$ 1 and vtn[1]:DATA,Z tindex = int(vtn[1])DATAHZ if tindex < 0: tindex = basevtcount +tindex + 1DATA(4Z ti.append(tindex)DATĄZDATA0 2 and vtn[2]:DATA,ԩZ nindex = int(vtn[2])DATAHlZ if nindex < 0: nindex = basevncount +nindex + 1DATA(Z ni.append(nindex)DATA4Z faceList.append([vi, ti, ni, matindex])DATATZDATA(ĬZ elif words and words[0] == "o":DATA$\Z ObjectName = words[1]?DATAZ objectflag = 1DATA0tZ #print "Name is %s" % ObjectNameDATA Z=DATA(|Z elif words and words[0] == "g":DATAZ groupflag = 1DATA Z index = len(words)DATA $Z if objectflag == 0:DATA Z objectflag = 1DATA 1:DATA<IJZ ObjectName = string.join(words[1:],"_")DATA<lZ GroupName = string.join(words[1:],"_") =DATAZ else:DATA,Z ObjectName = "Default" DATA,,Z GroupName = "Default" DATA8ĵZ #print "Object name is %s" % ObjectNameDATA8dZ #print "Group name is %s" % GroupNameDATAZ else:DATA Z if index > 1:DATA< Z GroupName = string.join(words[1:],"_") =DATAZ else:DATA,4Z GroupName = "Default" DATA8̹Z #print "Group name is %s" % GroupNameDATAlZ DATA ܺZ if mtlflag == 0:DATALdZ matindex = AddMeshMaterial(GroupName,materialList, matindex)DATA$Z gcount = gcount + 1 DATAZDATAZ if fcount > 0: DATA$Z baseindex = vcountDATA(4Z basevncount = vncountDATA(ľZ basevtcount = vtcountDATATZDATA0ĿZ elif words and words[0] == "mtllib":DATA(\Z # try to export materialsDATA8Z directory, dummy = os.path.split(filename)DATA<Z filename = os.path.join(directory, words[1])DATA4Z try:DATA,Z file = open(filename, "r")DATALZ except:DATA8Z print "no material file %s" % filenameDATAlZ else:?DATAZ mtlflag = 1DATA,tZ file = open(filename, "r")DATA( Z line = file.readline()DATAZ while line:DATA0$Z words = string.split(line)DATA8Z if words and words[0] == "newmtl":DATA(\Z name = words[1]DATA8Z line = file.readline() # Ns ?DATA4Z words = string.split(line)DATA\,Z while (words[0] != "Ka" and words[0] != "Kd" and words[0] != "Ks"): DATA8Z line = file.readline() # KaDATA8Z words = string.split(line)DATA,4Z if words[0] == "Ka":DATA0Z Ka = [float(words[1]),DATA0dZ float(words[2]),DATA0Z float(words[3])]DATA8Z line = file.readline() # KdDATA44Z words = string.split(line)DATA,Z if words[0] == "Kd":DATA0lZ Kd = [float(words[1]),DATA0Z float(words[2]),DATA0Z float(words[3])]DATA84Z line = file.readline() # Ks DATA4Z words = string.split(line)DATA,tZ if words[0] == "Ks":DATA0 Z Ks = [float(words[1]),DATA0Z float(words[2]),DATA0 0:DATA8 Z material = matlist[matindex]DATA,Z material.R = Kd[0]DATA,DZ material.G = Kd[1]DATA,Z material.B = Kd[2]DATA tZ try:DATA<Z material.specCol[0] = Ks[0]DATA<Z material.specCol[1] = Ks[1]DATA<LZ material.specCol[2] = Ks[2]DATA$Z except:DATA$Z passDATA Z try:DATADZ alpha = 1 - ((Ka[0]+Ka[1]+Ka[2])/3)DATA$LZ except:DATA$Z passDATA lZ try:DATA8Z material.alpha = alphaDATA$Z except:DATA$$Z passDATAZ else:DATA( 0:DATA LZ #mesh.hasFaceUV() = 1DATA,Z print ("Object has uv coordinates")DATAlZ DATA Z if len(materialList) > 0:DATA dZ for m in materialList:DATAZ try:DATA dZ M=Material.Get(m)DATA(Z mesh.materials.append(M) DATA|Z except:DATAZ passDATA|ZDATAZ total = len(faceList)DATA tZ i = 0DATAZDATA\Z for f in faceList:DATAZ if i%1000 == 0:DATA8dZ print ("Progress = "+ str(i)+"/"+ str(total))DATA ZDATA|Z i = i + 1DATA$Z vi, ti, ni, matindex = fDATAZ face=NMesh.Face()DATA$Z if len(materialList) > 0:DATA Z face.mat = matindexDATA,ZDATAZ limit = len(vi)DATA($Z setcount = setcount + len(vi)DATAZ c = 0 DATA4[ DATA[ while c < limit:DATA,[ m = vi[c]-1DATA,[ if vtcount > 0 and len(ti) > c:DATAD[ n = ti[c]-1DATA,[ if vncount > 0 and len(ni) > c:DATAd[ p = ni[c]-1DATA[DATA\[ if vtcount > 0:DATA[ try:DATA$d[ u, v = uvList[n]DATA[ except:DATAt[ pass DATA[DATAl[ """ DATAp[ # multiply uv coordinates by 2 and add 1. Apparently blender uses uv range of 1 to 3 (not 0 to 1). DATA0[ mesh.verts[m].uvco[0] = (u*2)+1DATA0\ [ mesh.verts[m].uvco[1] = (v*2)+1DATA [ """DATAt [DATA [ if vncount > 0:DATA(l [ if p > len(normalList):DATAd [ print("normal len = " +str(len(normalList))+ " vector len = " +str(len(pointList)))DATA( [ print("p = " +str(p))DATA(\ [ x, y, z = normalList[p] DATA( [ mesh.verts[m].no[0] = xDATA(|[ mesh.verts[m].no[1] = yDATA( [ mesh.verts[m].no[2] = zDATA[ c = c+1 DATA[ DATA[ if len(vi) < 5:DATA[ for index in vi:DATA0[ face.v.append (mesh.verts[index-1])DATA<[ DATA[ if vtcount > 0: DATA 4[ for index in ti:DATA([ u, v = uvList[index-1]DATA(L[ face.uv.append((u,v))DATA[DATAL[ if vcount>0:DATA[ face.smooth=1DATAT[DATA$[ mesh.faces.append(face) DATAT[DATA0[ print "all other (general) polygons ..."DATA\[ for f in faceList:DATA$[ vi, ti, ni, matindex = f DATAl[ if len(vi) > 4:DATA,[ # export the polygon as edgesDATA<[ print ("Odd face, vertices = "+ str(len(vi)))DATA(4[ for i in range(len(vi)-2):DATA$[ face = NMesh.Face()DATA,T[ if len(materialList) > 0:DATA([ face.mat = matindexDATA4|[ face.v.append(mesh.verts[vi[0]-1])DATA4[ face.v.append(mesh.verts[vi[i+1]-1])DATA4[ face.v.append(mesh.verts[vi[i+2]-1])DATA\[DATA [ if vtcount > 0: DATA$\ [ if len(ti) > i+2:DATA, [ u, v = uvList[ti[0]-1]DATA,![ face.uv.append((u,v))DATA0"[ u, v = uvList[ti[i+1]-1]DATA,"[ face.uv.append((u,v))DATA0L#[ u, v = uvList[ti[i+2]-1]DATA,#[ face.uv.append((u,v))DATA|$[DATA($[ mesh.faces.append(face)DATA|%[ DATA %[ NMesh.PutRaw(mesh, Name,1)DATAt&[DATA8&[ print ("Total number of vertices is "+ str(vcount))DATA<'[ print ("Total number of faces is "+ str(len(faceList)))DATA84([ print ("Total number of sets is "+ str(setcount))DATA([DATAD)[DATA4)[ print("Finished importing " +str(Name)+ ".obj")DATAT*[DATA,*[#=========================================DATA4\+[def AddMeshMaterial(name, materialList, matindex):DATA,+[#=========================================DATA,[ DATA-[ index = 0DATA|-[ found = 0 DATA -[ limit = len(materialList)DATA|.[DATA.[ while index < limit:DATA(t/[ if materialList[index] == name:DATA0[ matindex = index DATA0[ found = 1DATA 1[ index = limitDATA1[ index = index + 1DATA 2[ DATA|2[ if found == 0: DATA 3[ materialList.append(name)DATA(3[ matindex = len(materialList)-1DATA $4[ DATA4[ return matindexDATA5[DATA,5[#=========================================DATA($6[def AddGlobalMaterial (name, matindex):DATA,6[#=========================================DATAT7[ DATA7[ index = 0DATA<8[ found = 0DATA8[ matindex = 0DATA49[ MatList = Material.Get()DATA9[ limit = len(MatList)DATAD:[DATA:[ while index < limit:DATA(<;[ if MatList[index].name == name:DATA;[ matindex = index DATAT<[ found = 1DATA<[ index = limitDATAT=[ index = index + 1DATA=[DATAD>[ if found == 0:DATA$>[ material = Material.New(name)DATAT?[ matindex = indexDATA?[ DATAD@[ return matindexDATA@[DATA$4A[#================================DATA$A[def ObjExport(FILE, Name, type):DATA$TB[#================================DATAB[ global returncodeDATAdC[ global vertexcountDATAC[ global uvcountDATAdD[ global TransformDATAD[ global multiflagDATAdE[ global exporttypeDATAE[DATATF[ vertexcount = 0DATAF[ uvcount = 0DATALG[ returncode = 0DATA G[ print("Writing %s..." % Name)DATAX\H[ FILE.write("# Wavefront OBJ (1.0) exported by lynx's OBJ import/export script\n\n")DATAI[DATA$I[ Objects = Object.GetSelected()DATAJ[ if Objects == []:DATA0J[ print("You have not selected an object!")DATA4K[ returncode = 4DATAK[ else:DATA,L[ for object in Objects:DATAL[ MtlList = []DATA04M[ if len(Objects) > 1 or exporttype > 1:DATA8M[ Transform = CreateMatrix(object, Transform)DATAlN[ multiflag = 1DATA N[ DATA4lO[ mesh = NMesh.GetRawFromObject(object.name)DATA P[ ObjName = mesh.nameDATA(P[ has_uvco = mesh.hasVertexUV()DATA$Q[DATA4Q[ FILE.write("# Meshname:\t%s\n" % ObjName)DATA4R[DATAR[ faces = mesh.facesDATA$,S[ materials = mesh.materialsDATA S[ Vertices = mesh.vertsDATA,DT[ GlobalMaterials = Material.Get()DATAT[DATALLU[ if len(materials) > 1 and len(GlobalMaterials) > 0 and type < 4:DATA4V[ CreateMtlFile(Name, materials, MtlList)DATAV[DATA<W[ # Total Vertices and faces; comment if not usefulDATADW[ FILE.write("# Total number of Faces:\t%s\n" % len(faces))DATAHlX[ FILE.write("# Total number of Vertices:\t%s\n" % len(Vertices))DATA$Y[DATAY[ FILE.write("\n")DATAZ[DATA4Z[ # print first image map for uvcoords to useDATA@,[[ # to be updated when we get access to other texturesDATAT[[ if mesh.hasFaceUV(): FILE.write("# UV Texture:\t%s\n\n" % mesh.hasFaceUV())DATA\[DATAL][ if len(materials) > 1 and len(GlobalMaterials) > 0 and type < 3:DATAP][ UseLayers(faces, Vertices, MtlList, has_uvco, FILE, ObjName, Name)DATALt^[ elif len(materials) > 1 and len(GlobalMaterials) > 0 and type == 3:DATAL,_[ UseMtl(faces, Vertices, MtlList, has_uvco, FILE, ObjName, Name)DATA_[ else:DATA@\`[ Standard(faces, Vertices, has_uvco, FILE, ObjName)DATAa[ DATA4ta[#================================================DATA4b[def CreateMtlFile (name, MeshMaterials, MtlList):DATA4b[#================================================DATATc[ global gFilename DATAc[DATA Ld[ # try to export materialsDATA8d[ directory, mtlname = os.path.split(gFilename.val)DATA |e[ mtlname = name + ".mtl"DATA4f[ filename = os.path.join(directory, mtlname)DATA$f[ file = open(filename, "w")DATA4g[DATA<g[ file.write("# Materials for %s.\n" % (name + ".obj"))DATA,Lh[ file.write("# Created by Blender.\n")DATAlh[ file.write("# These files must be in the same directory for the materials to be read correctly.\n\n")DATAi[DATA ,j[ MatList = Material.Get()DATA j[ print str(MeshMaterials)DATA 0:DATA([ limit = len(uvList)-200DATA0[ while index > limit and found == 0:DATA,[ uv_value = uvList[index-1]DATADL[ if uv[0] == uv_value[0] and uv[1] == uv_value[1]:DATA0[ uvPtrs.append(index+uvcount)DATA[ found = 1DATA$[ index = index - 1DATA[ if found == 0:DATA$4[ uvList.append(uv)DATA$ė[ index = len(uvList)DATA,T[ uvPtrs.append(index+uvcount)DATA[ u, v = uvDATA4t[ FILE.write("vt %s %s\n" % (u, v))DATA[ uv_flag = 1DATA[DATA( [ if has_uvco and uv_flag == 0:DATA[ for v in Vertices:DATA $[ u, v, z = v.uvco DATA[ u = (u-1)/2DATA4[ v = (v-1)/2DATA0[ FILE.write("vt %s %s\n" % (u, v))DATAT[DATAĞ[ for v in Vertices: DATAL[ x, y, z = v.noDATA4ԟ[ FILE.write("vn %s %s %s\n" % (x, y, z))DATAt[DATA[ p = 0DATA\[ uvindex = 0DATAܡ[ total = len(faces)DATAd[DATAԢ[ for face in faces:DATA\[ p = p+1DATAܣ[ if (p%1000) == 0:DATALd[ print ("Progress = "+ str(p)+ " of "+ str(total) +" faces")DATA[DATA[ FILE.write("f ")DATA,[ for index in range(len(face.v)):DATA4[ v = face.v[index].index + vertexcountDATA$L[ if len(face.uv) > 0:DATAHܧ[ FILE.write("%s/%s/%s " % (v+1, uvPtrs[uvindex], v+1))DATA$[ uvindex = uvindex+1DATA[ elif has_uvco:DATA<[ FILE.write("%s/%s/%s " % (v+1, v+1, v+1))DATA(L[ else: DATA4[ FILE.write("%s//%s " % (v+1, v+1))DATA[ FILE.write("\n")DATA [DATA4|[ vertexcount = vertexcount + len(Vertices)DATA([ uvcount = uvcount + len(uvList)DATA[DATA@[ print("Export of " +str(ObjName)+ ".obj finished.\n")DATAĮ[DATAH4[#=====================================================================DATAL[def UseLayers(faces, Vertices, MtlList, has_uvco, FILE, ObjName, Name): DATAH[#===================================================================== DATAT[ global vertexcountDATAܱ[ global uvcountDATA\[ global multiflagDATA[DATAT[ uvPtrs = []DATAԳ[ uvList = []DATAT[DATA8Ĵ[ FILE.write("mtllib %s\n\n" % (Name + ".mtl"))DATA,d[ FILE.write("g %s\n\n" % (ObjName)) DATA[DATAl[ for v in Vertices: DATA[ vert = v.co DATA t[ if multiflag == 1:DATA0[ vert = Alter(vert, Transform) DATA[ x, y, z = vertDATA4[ FILE.write("v %s %s %s\n" % (x, y, z))DATA[DATA,[ uv_flag = 0DATA([ for m in range(len(MtlList)):DATA <[ for face in faces:DATA Ļ[ if face.mat == m:DATA$T[ for uv in face.uv:DATA [ found = 0DATA(l[ index = len(uvList)DATA [ limit = 0DATA,[ if len(uvList)-200 > 0:DATA0$[ limit = len(uvList)-200DATA8[ while index > limit and found == 0:DATA4d[ uv_value = uvList[index-1]DATAL[ if uv[0] == uv_value[0] and uv[1] == uv_value[1]:DATA8[ uvPtrs.append(index+uvcount)DATA$\[ found = 1DATA,[ index = index - 1DATA$[ if found == 0:DATA,[ uvList.append(uv)DATA,[ index = len(uvList)DATA4D[ uvPtrs.append(index+uvcount)DATA$[ u, v = uvDATA<t[ FILE.write("vt %s %s\n" % (u, v))DATA$[ uv_flag = 1DATA[DATA([ if has_uvco and uv_flag == 0:DATA[ for v in Vertices:DATA 4[ u, v, z = v.uvcoDATA[ u = (u-1)/2DATAD[ v = (v-1)/2DATA0[ FILE.write("vt %s %s\n" % (u, v))DATAd[DATA[ for v in Vertices: DATA\[ x, y, z = v.noDATA4[ FILE.write("vn %s %s %s\n" % (x, y, z))DATA[DATA[ total = len(faces)DATA|[ p = 0DATA[ uvindex = 0DATA0t[ for m in range(len(MtlList)): DATA< [ FILE.write("usemtl %s\n" % (MtlList[m].name)) DATA [ for face in faces:DATA <[ if face.mat == m:DATA[ p = p+1DATA$T[ if (p%1000) == 0:DATAP[ print ("Progress = "+ str(p)+ " of "+ str(total) +" faces")DATA[DATA$ [ FILE.write("f ")DATA4[ for index in range(len(face.v)):DATA<<[ v = face.v[index].index + vertexcount DATA([ if len(face.uv) > 0:DATAL|[ FILE.write("%s/%s/%s " % (v+1, uvPtrs[uvindex], v+1))DATA,4[ uvindex = uvindex+1DATA$[ elif has_uvco:DATA@\[ FILE.write("%s/%s/%s " % (v+1, v+1, v+1))DATA [ else:DATA<[ FILE.write("%s//%s " % (v+1, v+1))DATA$<[ FILE.write("\n")DATA[DATA4<[ vertexcount = vertexcount + len(Vertices) DATAT[ print("Export of " +str(ObjName)+ ".obj using material layers finished.\n")DATA[DATAD [#==================================================================DATAH[def UseMtl(faces, Vertices, MtlList, has_uvco, FILE, ObjName, Name): DATADl[#==================================================================DATA[ global vertexcountDATA[ global multiflagDATA,[DATA8[ FILE.write("mtllib %s\n\n" % (Name + ".mtl")) DATA,<[ FILE.write("o %s\n\n" % (ObjName))DATA[ DATAL[ index = 0DATA[ VertexList = []DATA L[ for vertex in Vertices:DATA [ VertexList.append(-1)DATAd[ index = index + 1DATA@[ print("number of vertices is " +str(len(VertexList)))DATA[DATA[ Totalindex = 0DATA[ ix = 0DATA[ NewVertexList = []DATA[ NewVertexCo = []DATA( [ for m in range(len(MtlList)):DATA4[ # Group name is the name of the mesh DATA<[ if MtlList[m]:DATAD[ FILE.write("g %s\n" % (MtlList[m].name+str(m+1))) DATAt[ else:DATA8[ FILE.write("g %s\n" % ("Null"+str(m+1)))DATA$[ FILE.write("s off\n\n") DATA $[ DATA<[ FILE.write("usemtl %s\n\n" % (MtlList[m].name)) DATAD[ DATA [ for face in faces:DATA <[ if face.mat == m:DATA([ for vertex in face.v:DATA(\[ v = vertex.index DATA,[ if VertexList[v] < 0:DATA4[ VertexList[v] = TotalindexDATA0$[ NewVertexList.append(v)DATA4[ Totalindex = Totalindex + 1DATA\[ DATA([ for v_old in NewVertexList:DATA(\[ vert = Vertices[v_old].coDATA$[ if multiflag == 1:DATA0[ vert = Alter(vert, Transform)DATA [ x, y, z = vertDATA8[ FILE.write("v %s %s %s\n" % (x, y, z))DATA,D[ NewVertexCo.append([x,y,z])DATA[DATAL[ if has_uvco:DATA,[ for v_old in NewVertexList:DATA0l[ u, v, z = Vertices[v_old].uvcoDATA [ u = (u-1)/2DATA,[ v = (v-1)/2 DATA4,[ FILE.write("vt %s %s\n" % (u, v))DATA[DATA(<[ for v_old in NewVertexList:DATA,[ x, y, z = Vertices[v_old].noDATA8d[ FILE.write("vn %s %s %s\n" % (x, y, z))DATA[ DATA t[ for face in faces:DATA [ if face.mat == m:DATA$[ FILE.write("f ")DATA4[ for index in range(len(face.v)):DATA,[ v = face.v[index].indexDATA,L\ v_new = VertexList[v] DATA \ if has_uvco:DATALt\ FILE.write("%s/%s/%s " % (v_new+1, v_new+1, v_new+1))DATA,\ else:DATAD\ FILE.write("%s//%s " % (v_new+1, v_new+1))DATA$d\ FILE.write("\n")DATA\DATAd\ FILE.write("\n")DATA\DATA \\ NewVertexList = []DATAP\ print("Group " +str(m+1)+ " of " +str(len(MtlList))+ " finished.")DATA\ DATAL \ print("Export of " +str(ObjName)+ ".obj using groups finished.\n")DATA\DATA,4\#========================================DATA(\def CreateMatrix(object, Transform):DATA,\ \#========================================DATA \ Mx = []DATA l \ My = []DATA \ Mz = []DATA \ \ T1 = []DATA \ Transform = []DATAT \DATA \ angle = object.RotXDATAD \ Mx.append([1, 0, 0])DATA \ y = math.cos(angle)DATAL\ z = -math.sin(angle)DATA\ Mx.append([0, y, z])DATA\\ y = math.sin(angle)DATA\ z = math.cos(angle)DATA\\ Mx.append([0, y, z])DATA\DATAT\ angle = object.RotYDATA\ x = math.cos(angle)DATAT\ z = math.sin(angle)DATA\ My.append([x, 0, z])DATA\\ My.append([0, 1, 0])DATA\ x = -math.sin(angle)DATAl\ z = math.cos(angle)DATA\ My.append([x, 0, z])DATAt\DATA\ angle = object.RotZDATAd\ x = math.cos(angle)DATA\ y = -math.sin(angle)DATAl\ Mz.append([x, y, 0])DATA\ x = math.sin(angle)DATAt\ y = math.cos(angle)DATA\ Mz.append([x, y, 0])DATA|\ Mz.append([0, 0, 1])DATA\DATAt\ m0 = Mx[0]DATA\ m1 = Mx[1]DATAd\ m2 = Mx[2]DATA\ for row in My:DATA\\ x, y, z = rowDATA(\ nx = x*m0[0] + y*m1[0] + z*m2[0]DATA(l\ ny = x*m0[1] + y*m1[1] + z*m2[1]DATA(\ nz = x*m0[2] + y*m1[2] + z*m2[2]DATA \ T1.append([nx, ny, nz])DATA\DATA\ m0 = T1[0]DATA\ m1 = T1[1]DATAt \ m2 = T1[2]DATA \ for row in Mz:DATAl!\ x, y, z = rowDATA(!\ nx = x*m0[0] + y*m1[0] + z*m2[0]DATA(|"\ ny = x*m0[1] + y*m1[1] + z*m2[1]DATA( #\ nz = x*m0[2] + y*m1[2] + z*m2[2]DATA$#\ Transform.append([nx, ny, nz])DATA,$\DATA@$\ Transform.append([object.SizeX, object.SizeY, object.SizeZ])DATA@L%\ Transform.append([object.LocX, object.LocY, object.LocZ])DATA%\DATAd&\ return TransformDATA&\DATA(T'\#======================================DATA'\def Alter(vect, Transform):DATA(t(\#======================================DATA )\ v2 = []DATA )\ nv = []DATA)\DATAl*\ x, y, z = vectDATA *\ sx, sy, sz = Transform[3]DATA t+\ lx, ly, lz = Transform[4]DATA+\DATAl,\ v2.append(x*sx)DATA,\ v2.append(y*sy)DATAl-\ v2.append(z*sz)DATA-\DATA$\.\ for index in range(len(vect)):DATA.\ t = Transform[index]DATA8t/\ nv.append(v2[0]*t[0] + v2[1]*t[1] +v2[2]*t[2])DATA0\DATA0\ nv[0] = nv[0]+lxDATA1\ nv[1] = nv[1]+lyDATA1\ nv[2] = nv[2]+lzDATA2\DATAt2\ return nvGLOB PSDNA1Ed9SSDNANAME*next*prev*first*lastxyzwxminxmaxyminymax*newid*libname[24]usflagpadid*idblock*filedataname[160]totcurvecurblocktypeshowkeypostotelemtypert*data*refkeyelemstr[32]elemsizecurvalblock*ipo*fromtotkeyslurphactkey**scripts*flagactscripttotscript*linelenblen*nameflagsnlineslines*curl*sellcurcselc*undo_bufundo_posundo_len*compiledsizeseekdrawzoomholdclipstaclipendnetstanetendlensdrawsizehololenhololen1scriptlink*anim*ibuf*mipmap[10]oklastframelastqualitytpageflagtotbindxrepyreptwstatwendbindcode*repbind*packedfilelastupdateanimspeedreserved1texcomaptomaptonegblendtype*object*texprojxprojyprojzmappingofs[3]size[3]texflagcolormodelrgbkdef_varcolfacnorfacvarfac*handle*pname*stnamesstypesvars*varstr*result*cfradata[32](*doit)()(*callback)()versionaipotypedata[16]*ima*cube[6]imat[4][4]stypenotlaycuberesnoisesizeturbulbrightcontrastrfacgfacbfacfiltersizenoisedepthnoisetypeimaflagcropxmincropymincropxmaxcropymaxxrepeatyrepeatextendframesoffsetsfrafie_ima*nor*plugin*coba*envfradur[4][2]modetotexenergydistspotsizespotblendhaintatt1att2bufsizesampshadspotsizebiassofttexactshadhalostep*mtex[8]layspecrspecgspecbmirrmirgmirbambrambbambgambemitangspectraalpharefspeczoffsaddkfacharseed1seed2mode2flarecstarclinecringchasizeflaresizesubsizeflareboostrgbselpr_typeseptexpr_backpr_lamppad1*renfrictionfhreflectfhdistxyfrictdynamodename[256]scaleselcolexpxexpyexpzradrad2smaxrad2*mat*imat*bbelemsdisp**mattotcolloc[3]rot[3]wiresizerendersizethreshvec[3][3]alfas[3][2]h1h2f1f2f3hidevec[4]s[2]mat_nrpntsupntsvresoluresolvorderuordervflaguflagv*knotsu*knotsv*bp*beztnurb*bevobj*textoncurve*path*keybev*orcopathlenbevresolwidthext1ext2spacemodespacinglinedistshearfsizexofyof*strfamily[24]*vfontmaxrcttotrctadrcodevartypetotvertipoextrapbitmaskv1v2v3v4punoedcode*tpageuv[4][2]col[4]transptiledef_nrweight*dwtotweightco[3]no[3]co[2]effect*mface*dface*tface*mvert*dvert*mcol*msticky*texcomesh*oc*sumohandletotfacesmoothreshsubdivsubdivrreserved2reserved3cubemapsizertfpntswtypeutypevtypew*defname[32]partypepar1par2par3parsubstr[32]*pardata*parent*track*action*pose*activeconconstraintChannelsnetworkdefbasedloc[3]orig[3]dsize[3]drot[3]quat[4]dquat[4]obmat[4][4]parentinv[4][4]colbitstransflagipoflagtrackflagupflagipowinscaflagscavisflagboundtypedupondupoffdupstadupendsfctimemassdampinginertiaformfactordummy_1rdampingsizefacdtdtxactcolpropsensorscontrollersactuatorsbbsize[3]dfrasactdefgameflaggameflag2anisotropicFriction[3]constraintsnlastripsmistypehorrhorghorbhorkzenrzengzenbzenkambkfastcolexposuregravityactivityBoxRadiusskytypemisimiststamistdistmisthistarrstargstarbstarkstarsizestarmindiststardiststarcolnoisedofstadofenddofmindofmaxhemiresmaxiterdrawtypesubshootpsubshootenodelimmaxsublamppamapamielmaelmimaxnodeconvergenceradfacgammasxsy*lpFormat*lpParmscbFormatcbParmsfccTypefccHandlerdwKeyFrameEverydwQualitydwBytesPerSeconddwFlagsdwInterleaveEveryavicodecname[128]*avicodecdatacfraefraimagesframaptoframelenblurfacedgeRedgeGedgeBfullscreenxplayyplayfreqplaydepthattribrt1rt2stereomodepad[3]maximsizexschyschxaspyaspxpartsypartssafetyborderwinposplanesimtypebufflagqualityscemodealphamodedogammaosafrs_secedgeintsame_mat_reduxpad_3[3]postmulpostgammapostaddpostigammabackbuf[160]pic[160]ftype[160]col[3]pad2pad3*camera*world*setbase*basact*groupcursor[3]*fcam*ed*radioframingzoomblendximyim*rectspacetype*areaviewmat[4][4]viewinv[4][4]persmat[4][4]persinv[4][4]viewquat[4]perspview*bgpic*localvdlocalviewlayactscenelockaroundcamzoomgridnearfarmxmymxomyogridlinesviewbutverthormaskmin[2]max[2]minzoommaxzoomscrollkeeptotkeepaspectkeepzoomrowbutv2d*editipoipokeytotipopinbutofschannelmenunrlockcursenscuractmainbmainbo*lockpointexnrtexfromshowgrouprectxrectycurymodeltypescriptblockpad3[7]*anim_linked_sipo*filelisttotfiletitle[24]dir[160]file[80]ofssortmaxnamelencollums*libfiledataretvalmenuact(*returnfunc)()*menupoopsvisiflag*imageimanrcurtile*texttopviewlinesfont_idlheightleftshowlinenrspix_per_linetxtscrolltxtbar*py_draw*py_event*py_button*py_globaldicttitle[28]fasesubfasemouse_move_redrawimafasedirslidirsli_linesdirsli_sxdirsli_eydirsli_exdirsli_himaslifileselmenuitemimasli_sximasli_eyimasli_eximasli_hdssxdssydsexdseydesxdesydeexdeeyfssxfssyfsexfseydsdhfsdhfesxfesyfeexfeeyinfsxinfsyinfexinfeydnsxdnsydnwdnhfnsxfnsyfnwfnhfole[128]dor[128]file[128]dir[128]*firstdir*firstfiletopdirtotaldirshilitetopfiletotalfilesimage_sliderslider_heightslider_spacetopimatotalimacurimaxcurimay*first_sel_ima*hilite_imatotal_selectedima_redraw*cmap*arg1dupflagsavetimetempdir[160]fontdir[160]renderdir[160]textudir[160]plugtexdir[160]plugseqdir[160]pythondir[160]sounddir[160]versionsvrmlflaggameflagswheellinescrolluiflaglanguageuserprefconsole_bufferconsole_outfontsizeencodingtransoptsfontname[64]vertbaseedgebaseareabase*scenestartxendxstartyendysizexsizeyscenenrscreennrfullmainwinwinakt*newvvec*v1*v2*v3*v4*fullwinmat[4][4]headrctwinrctheadwinwinheadertypebutspacetypewinxwinyhead_swaphead_equalwin_swapwin_equalheadbutlenheadbutofscursorspacedatauiblocks*curscreendisplaymodefileflagsname[40]*se1*se2*se3nrdone*stripdatadir[80]orxoryname[80]*newseqstartstartofsendofsstartstillendstillmachinestartdispenddispmulhandsize*strip*curelemfacf0facf1*seq1*seq2*seq3seqbase*seqbasepmetastackbuttypestaendlifetimetotpartseednormfacobfacrandfactexfacrandlifeforce[3]dampnablavectsizedefvec[3]mult[4]life[4]child[4]mat[4]texmapcurmultstaticstep*keysheightnarrowspeedminfactimeoffs*obpremat[4][4]postmat[4][4]vec[3]faclenoalphaoeff[2]iterlastfralimbbaseeff[3]effg[3]effn[3]memslowtotytotxxyconstrainttotdefdef_scrolllimb_scrolldxdy*idlinkotypedataold*poin*oldpoinresetdistlastval*makeyqualqual2targetName[32]toggleName[32]value[32]maxvalue[32]materialName[32]damptimeranglerangeaxisdelaypropname[32]matname[32]axisflag*fromObjectsubject[32]body[32]pulsefreqtotlinks**linksinvertfreq2str[128]*mynewinputstotslinks**slinksvalvalopad5time*actblendinprioritystridelengthstrideaxissndnr*soundmakecopycopymadepad[1]trackvolume*melinVelocity[3]localflagforceloc[3]forcerot[3]linearvelocity[3]angularvelocity[3]addedlinearvelocity[3]anotherpad[4]butstabutendminmaxvisifacminloc[3]maxloc[3]minrot[3]maxrot[3]distributionint_arg_1int_arg_2float_arg_1float_arg_2toPropName[32]*toObjectbodyTypefilename[64]loadaniname[64]goaccellerationmaxspeedmaxrotspeedmaxtiltspeedrotdamptiltdampspeeddamp*sample*newpackedfile*snd_soundpanningattenuationpitchmin_gainmax_gaindistanceloopstartloopendchannelshighpriopad[6]gaindopplerfactordopplervelocitynumsoundsblendernumsoundsgameengine*gkeypadfokeygobjectgkey*activechildbaserollhead[3]tail[3]parmat[4][4]defmat[4][4]irestmat[4][4]posemat[4][4]boneclassfiller1filler2filler3bonebasechainbaseres1res2res3chanbase*achan*pchanactnrname[30]enforceoffset[3]orient[3]roll[3]*tartoleranceiterationssubtarget[32]cacheeff[3]cachemat[4][4]zminzmaxactstartactendstridelenrepeatblendoutTYPEcharucharshortushortintlongulongfloatdoublevoidLinkListBasevec2svec2ivec2fvec2dvec3ivec3fvec3dvec4ivec4fvec4drctirctfIDLibraryFileDataIpoKeyBlockKeyScriptLinkTextLineTextPackedFileCameraImageanimImBufMTexObjectTexPluginTexCBDataColorBandEnvMapLampWaveMaterialVFontVFontDataMetaElemMetaBallBoundBoxBezTripleBPointNurbCurvePathIpoCurveMFaceMFaceIntTFaceMDeformWeightBoneMDeformVertMVertMColMStickyMeshOcInfoLatticebDeformGroupbActionbPosebConstraintChannelWorldRadioBaseAviCodecDataRenderDataGameFramingSceneGroupFreeCameraBGpicView3DSpaceLinkScrAreaView2DSpaceInfoSpaceIpoSpaceButsSpaceSeqSpaceFiledirentryBlendHandleSpaceOopsSpaceImageSpaceNlaSpaceTextSpaceImaSelImaDirOneSelectableImaUserDefbScreenScrVertScrEdgeFileGlobalStripElemStripPluginSeqSequenceEditingEffectBuildEffPartEffParticleWaveEffDeformLimbIkaOopsbPropertybNearSensorbMouseSensorbTouchSensorbKeyboardSensorbPropertySensorbCollisionSensorbRadarSensorbRandomSensorbRaySensorbMessageSensorbSensorbControllerbExpressionContbPythonContbActuatorbAddObjectActuatorbActionActuatorbSoundActuatorbSoundbCDActuatorbEditObjectActuatorbSceneActuatorbPropertyActuatorbObjectActuatorbIpoActuatorbCameraActuatorbConstraintActuatorbGroupActuatorbRandomActuatorbMessageActuatorbGameActuatorbVisibilityActuatorbSamplebSoundListenerSpaceSoundGroupKeyObjectKeyGroupObjectbArmaturebPoseChannelbActionChannelSpaceActionbConstraintbKinematicConstraintbTrackToConstraintbRotateLikeConstraintbLocateLikeConstraintbActionConstraintbFollowPathConstraintbRotationConstraintbActionStripTLEN  0Ptdl(PPx4@H<0P <  L,@,(D($pDhhd @l8(,@0,HhH,(lDLP< <@Lx0848l@0pP<`|,,,88STRC                     !"# $%&'()*+,-./0 123 456789:; <!=>2 "?@ABCDEFGH%I#$J%K%LMNOPQRSTUVW!XYZ[&\]^_'`(abcdefghijklmnopq) rstuv wxyz{ |}*jkl~+*, '`##ABMN(#/p%#)+,-ijklmAB&%I.%/:ijkl\]&%/I01!X222/34 %/hg5 6777   6 5 8&4  ''%9/ gh/4 !"0#:::6 5 $%&'()*  +#;,-./01<,-./01= 23456>78?@>9:[A;<B~jklC=D"4 > %/ ? @ AAB@CBDCEDFEG H(IhgJKL[MNOPF QRST6U%GGGV 'OWXYZ[ \']'^%94H_I` Ja b > c d/efgghijklmnopqrstuvwxyz{|}~I     H4  K+i%&ILMMM'`N  O7N{=PQ'KQ# MRS  L  HP OjIT #(a = U&VVW'TU !E"#$f%&'()*X +,-./012345VVVWYVVWZVVW6X7 8 9%&:;<=>?[[VVW@AX7B>;C DEFGHIJKLsMZN\ VVWX7B ]VVW^OPQRSTUVW_XYZ[ \]` VVWX7 ^;_ DaVVWX7#` ;ab ?bVV?WX7cVVW cde2>fghijkl m n o pdQVVWqrstu%&vwxyz{|}~eeff% \ gh   Qiiii jjjiiWWWiiiih%  k l%KlllMm mm/ln  rsv} wyz { |o ooo /     ml%Q$Jnooo p   qqqrrr/sss' !"#$%&'()*+,-./0t1uuu2345&6v '7WXYZ89:;w ww/<;=>xW?@ ABCDEFGHI%']XYZJvUKLy yyMNO Pz zzVQRS T U{VVW|}V/X~YZ[\]V^_V`a&VbcdVeVcfgh'ijkQlmnV o'7pqr cstnQuV ovwxyz'7 H{V|}~[MN  z'7DVQ'V^'7 eh V'72;d&F VRf'jk sQV '7S |!X! %2VVWX7 ?VWXYZ']'^%efgghijklnopqz{'7 R  ????] V8eggijk    gikV[I % bV[H  VVWX7H_;[?JJJ% %Q[z'['[M'['['H{'   [%H{|ENDB