BLENDER_v233REND 1@SRdL{T{SRscreenܪ{{ܭ{\{{{{^` DATAܪ{U{DATA{U\{ܪ{`DATA\{U{{`DATA{Uܫ{\{DATAܫ{U{{FDATA{U\{ܫ{FDATA\{U{{DATA{Uܬ{\{DATAܬ{U{{,DATA{U\{ܬ{,FDATA\{U{{,DATA{U\{DATAܭ{V{{\{DATA{V\{ܭ{ܪ{{DATA\{V{{{ܫ{DATA{Vܮ{\{\{{DATAܮ{V{{ܫ{{DATA{V\{ܮ{ܪ{\{DATA\{V{{ܫ{\{DATA{Vܯ{\{{{DATAܯ{V{{\{{DATA{V\{ܯ{\{ܬ{DATA\{V{{{ܬ{DATA{Vܰ{\{ܫ{{DATAܰ{V{{{{DATA{V\{ܰ{ܬ{{DATA\{V{{ܬ{\{DATA{Vܱ{\{{\{DATAܱ{V{{{{DATA{V\{ܱ{{{DATA\{V{\{{DATA{X{ܪ{\{{{?FDz@PףO{{|n}Do{Ժ{DATA{WT{OutputRender>DATAT{W${{RenderRender@>DATA${W{T{AnimRender>DATA{WĶ{${FormatRender>DATAĶ{W{{Link and MaterialsEditing>DATA{Wd{Ķ{MeshEditing@>DATAd{W4{{Texture faceEditing>4{DATA4{W{d{UV CalculationEditing>DATA{WԺ{4{Mesh ToolsEditing>DATAԺ{W{Mesh Tools 1Editing>DATA{F{333?{DdCI-DIeCC(BDC??T{DATA{A{333?{??? ???? A??FDz@PA Aj?I7>}GCHB? A|{ B?=CXXDATA{X̿{{ܫ{{\{{G`Ga``qjDATA̿{XT{{ܬ{\{{{>>o?--- T{{qqDATA{J{333?̿{CCx?'?g?Td |@GDATA{A{{333?̿{??ND?4.> >?D$?N%% ??% 4.+?̺o>x>o!)s>o???ND?4.> >??g@|{H B?=C>4.>22 gDATA{F{{333?̿{DdCD1MCC(BDC??DATAT{H{333?̿{SELECT IMAGE/home/ingo/projects/tuxkart/bonusblock.png v$DATAT{X{̿{\{ܫ{{ܬ{?&?n#?o?+E++E ,6N<{T{DATA<{A|{333?T{?3?3<;#5v>??3?3#5>??&?nI2n;m#?ꉖv8;>l?~e?f3_?C#5>??&?n#?o??3?3<;#5v>?5?5]?|{ B?=C<;w#5 DATAh|{L {<{ 333?T{<|$/ ][@,.DATA {MT{|{333?T{DATATT{H {333?T{SAVE FILEFile/home/ingo/projects/tuxkart/bonusblock.blend.py}NDATA{XT{\{{{{?y@ JL-E-+-,E TS{{ז~O?,DgZ?C?nj<.?ătז0D@>fZ?~O?C?/,@K@?>>>TP~OHT?C9Ns* MAAy_f鉾4c=_A>>4ZAt ΗVDB$A6@?y@ JLƃt@>ז~O?,DgZ?C?nj<.?>p=H\uA|{ B?=C>4.>$$ DATA{F{333?{DdCD1MCC(BDC??SRd{TL{SRscreen.001{L{{{ {{{DATA{U{DATA{U {{DATA {UL{{DATAL{U{ {DATA{U{L{DATA{U {{DATA {UL{{DATAL{U{ {DATA{U{L{DATA{U {{DATA {UL{{DATAL{U {DATA{V{{ {DATA{V {{{L{DATA {VL{{{{DATAL{V{ { {{DATA{V{L{{{DATA{V {{{ {DATA {VL{{L{L{DATAL{V{ { {L{DATA{V{L{ {{DATA{V {{{{DATA {VL{{{{DATAL{V{ {L{{DATA{V{L{{{DATA{V {{{ {DATA {VL{{{ {DATAL{V{ {{L{DATA{V{L{{L{DATA{V{ {L{DATA {X4{{ {L{L{?FDz@Pףd{{DATA{F{333?DdC˄3D(dCC(BDC??DATA{A{333???? ???? A??FDz@PA Aj?I7>}GCHB? A|{ B?=CXXDATA4{X{ {{{ {{dDATA{X{4{ {{{L{g=Ρ>o?qqd{{DATA{G{333?zCAzCA A@FB= A DATA{I{{333?AA Y YCA A@CC #<@\{\{DATA,\{fOB`A|{DATA{A{333????55@??A0??5>5?g=Ρ>o$[;??cYAYJ@5>5??cYA|{ B? #<C55@DATA{X{{ {L{{{g=S=o?w}w}5d{|{DATA{G{333?zCAzCA A@FB= A DATA{F{{333?DdCJRCۖzDGhICC(BDC??DATA{E{{333?zC̽̌?zC@ #< #<`jFzD OBzC̽̌?DATA{J{{333??DATA{I|{{333?AA>l>lBA A@CC #<@${${DATA,${fOBp=A|{DATA|{A{333????55@??A0??5>5?g=S=o$s>?cYA~2bA5>5??cYA|{ B?=C55@DATA{X{{{L{ {g=+=o?w}w}d{{DATA{E{333?zC̽̌?zC@@@ #< #<`jFzD OBzC̽̌?DATA{F{{333?DdC@CdDGhICC(BDC??DATA{A{333????55@??A0??5>5?g=+=o$gV>?cYAL³90A5>5??cYA|{ B?=C55@SC{?SC1|{{4{{dd??< d=fff?=fff?Z@@???//backbuf//ftypeDDATA{9{t{DATA{94{{l{DATA4{9{|{OB|{6t{OBCamera |3&=??????w?w3&=?????Dd??)d??>)d?????OBt{6l{|{OBMesh.001T{Mv>>>??>>>?????Dd?? #=?>=?@???DATAMvOBl{6t{OBMeshd{?????????????Dd?? #=?>=?@???MEd{+T{MEbonusblock$o???MET{+d{MEtestjD||||t|???DATAD| |DATAt|/!@!@??HԸ+p!@!@?HHp!@?!@?+Hp!@?!@??++p!@!@?HԸ+!@?!@?++!@?!@+H!@!@HH!@?!@?Hp+!@??!@?+p+!@??!@+pH!@?!@HpH!@!@HH!@!@?HԸ+!@?!@?++!@?!@+H?!@?!@?p++?!@!@?pHԸ+?!@!@pHH?!@?!@p+H!@?!@?++!@!@?H+!@!@HH!@?!@+HDATA||,@ @ @@ @ @ @    @ @ @   @ @@ @ @@@@ @@@  @DATA|*d |=,?=}?<}?<,?=d |s?P=r?w?=v?=@==d |=,?=}?<}?<,?=d |=,?=}?<}?<,?=d |s?P=r?w?=v?=@==d |q??p?4?Y?4???d |=,?=}?<}?<,?=d |=,?=}?<}?<,?=d |s?P=r?w?=v?=@==d |q??p?4?Y?4???d |=,?=}?<}?<,?=d |=,?=}?<}?<,?=d |s?P=r?w?=v?=@==d |=,?=}?<}?<,??d |q??p?4?Y?4???d |=,?=}?<}?<,?=d |=,?=}?<}?<,?=d |q??p?4?Y?4???d |s?P=r?w?=v?=@==d |q??p?4?Y?4???d |q??p?4?Y?4???d |q??p?4?Y?4???d |=,?=}?<}?<,?=d |q??p?4?Y?4???d |s?P=r?w?=v?=@==d |=,?=}?<}?<,?=MA@ |!MAdefault?????????????L????2 ?????@?=?=?IM(d |IMbonusblock.png/home/ingo/projects/tuxkart/bonusblock.pngvCA\|CACamera2=B B?TXd<|TXobj_io_modif228.py|x|v||TU}DATA$|/share/download/obj_io_modif228.pyDATA|\|̾vJ DATA\|||Dv&DATA||\|v5DATA|||vDATA|\||4vDATA\||||vDATA||\|vcDATA|||v2DATA|\|||=|}$DATA>|\>|=|T}DATA\>|>|>|}DATA>|>|\>|ܗ}DATA>|?|>|}DATA?|\?|>|d},DATA\?|?|?|}DATA?|?|\?|}#DATA?|@|?|T}.DATA@|\@|?|}DATA\@|@|@|}&DATA@|@|\@|<}DATA@|A|@||}DATAA|\A|@|} DATA\A|A|A| }!DATAA|A|\A|\}DATAA|B|A|}DATAB|\B|A|}$DATA\B|B|B|4}DATAB|B|\B|t}#DATAB|C|B|Ĝ}DATAC|\C|B|}DATA\C|C|C|D}DATAC|C|\C|}DATAC|D|C|̝}DATAD|\D|C| }DATA\D|D|D|T}DATAD|D|\D|}DATAD|E|D|Ğ}!DATAE|\E|D|}DATA\E|E|E|L}!DATAE|E|\E|}DATAE|F|E|ܟ}DATAF|\F|E|}DATA\F|F|F|\}DATAF|F|\F|}"DATAF|G|F|ܠ}#DATAG|\G|F|,}DATA\G|G|G|\}DATAG|G|\G|}DATAG|H|G|ܡ}DATAH|\H|G|$}DATA\H|H|H|d}DATAH|H|\H|}DATAH|I|H|Ԣ}0DATAI|\I|H|4}DATA\I|I|I||}0DATAI|I|\I|ܣ}DATAI|J|I|$}/DATAJ|\J|I||}DATA\J|J|J|}vDATAJ|J|\J|L}5DATAJ|K|J|}6DATAK|\K|J| }DATA\K|K|K|T}'DATAK|K|\K|}fDATAK|L|K|4}JDATAL|\L|K|}1DATA\L|L|L| }DATAL|L|\L|T}DATAL|M|L|}QDATAM|\M|L|}JDATA\M|M|M|}1DATAM|M|\M|}DATAM|N|M|$}DATAN|\N|M|d}DATA\N|N|N|}>DATAN|N|\N|}7DATAN|O|N|t}<DATAO|\O|N|ܫ}DATA\O|O|O|}DATAO|O|\O|\}DATAO|P|O|}PDATAP|\P|O|$}<DATA\P|P|P|}DATAP|P|\P|̭}DATAP|Q|P| }DATAQ|\Q|P|T}UDATA\Q|Q|Q|Ԯ};DATAQ|Q|\Q|<}DATAQ|R|Q||}DATAR|\R|Q|}DATA\R|R|R|})DATAR|R|\R|\};DATAR|S|R|İ}DATAS|\S|R|} DATA\S|S|S|<}DATAS|S|\S|}DDATAS|T|S|}5DATAT|\T|S|T} DATA\T|T|T|}!DATAT|T|\T|ܲ}DATAT|U|T|}!DATAU|\U|T|l}$DATA\U|U|U|}DATAU|U|\U|}!DATAU|V|U|<} DATAV|\V|U|t}!DATA\V|V|V|Ĵ}!DATAV|V|\V|}DATAV|W|V|T}!DATAW|\W|V|} DATA\W|W|W|ܵ}DATAW|W|\W| }!DATAW|X|W|\}&DATAX|\X|W|}(DATA\X|X|X|}DATAX|X|\X|D}DATAX|Y|X|}DATAY|\Y|X|} DATA\Y|Y|Y|}#DATAY|Y|\Y|<} DATAY|Z|Y|t}2DATAZ|\Z|Y|Ը} DATA\Z|Z|Z| } DATAZ|Z|\Z|D} DATAZ|[|Z|}DATA[|\[|Z|ܹ}.DATA\[|[|[|4}DATA[|[|\[|t}DATA[|\|[|}DATA\|\\|[|}DATA\\|\|\|4}DATA\|\|\\|t}DATA\|]|\|}DATA]|\]|\|}!DATA\]|]|]|4}&DATA]|]|\]|}(DATA]|^|]|ܼ}DATA^|\^|]|}DATA\^|^|^|\}DATA^|^|\^|} DATA^|_|^|Ľ}#DATA_|\_|^|}DATA\_|_|_|T}DATA_|_|\_|}DATA_|`|_|Ծ}DATA`|\`|_|}DATA\`|`|`|D}2DATA`|`|\`|}DATA`|a|`|Կ} DATAa|\a|`| } DATA\a|a|a|\}.DATAa|a|\a|}DATAa|b|a|}DATAb|\b|a|,}DATA\b|b|b|l}DATAb|b|\b|}DATAb|c|b|}!DATAc|\c|b|,}(DATA\c|c|c|}(DATAc|c|\c|}DATAc|d|c|}DATAd|\d|c|\}DATA\d|d|d|}DATAd|d|\d|} DATAd|e|d|}DATAe|\e|d|L}/DATA\e|e|e|}DATAe|e|\e|}DATAe|f|e|}DATAf|\f|e|\}!DATA\f|f|f|}DATAf|f|\f|}DATAf|g|f|4} DATAg|\g|f|l}DATA\g|g|g|}DATAg|g|\g|}DATAg|h|g|,}DATAh|\h|g|\}DATA\h|h|h|}$DATAh|h|\h|}DATAh|i|h|<}DATAi|\i|h||}DATA\i|i|i|}DATAi|i|\i|}DATAi|j|i|<}DATAj|\j|i||}DATA\j|j|j|}DATAj|j|\j|}DATAj|k|j|<}DATAk|\k|j||}DATA\k|k|k|}DATAk|k|\k|}DATAk|l|k|<}DATAl|\l|k||}DATA\l|l|l|}DATAl|l|\l|}DATAl|m|l|,}DATAm|\m|l|l}DATA\m|m|m|}DATAm|m|\m|} DATAm|n|m|$}DATAn|\n|m|l}DATA\n|n|n|}DATAn|n|\n|}DATAn|o|n|}DATAo|\o|n|d}%DATA\o|o|o|}"DATAo|o|\o|}'DATAo|p|o|T}DATAp|\p|o|}DATA\p|p|p|}DATAp|p|\p|,}DATAp|q|p|t}'DATAq|\q|p|}DATA\q|q|q|}(DATAq|q|\q|L}!DATAq|r|q|}DATAr|\r|q|}DATA\r|r|r|,}!DATAr|r|\r||}DATAr|s|r|}(DATAs|\s|r|}!DATA\s|s|s|T}DATAs|s|\s|}DATAs|t|s|}DATAt|\t|s|,}(DATA\t|t|t|}DATAt|t|\t|}'DATAt|u|t|}DATAu|\u|t|L}%DATA\u|u|u|}%DATAu|u|\u|}%DATAu|v|u|<}DATAv|\v|u|}DATA\v|v|v|}*DATAv|v|\v|$}0DATAv|w|v|}/DATAw|\w|v|}EDATA\w|w|w|L}&DATAw|w|\w|}DATAw|x|w|}1DATAx|\x|w|<}'DATA\x|x|x|}BDATAx|x|\x|}%DATAx|y|x|L} DATAy|\y|x|}.DATA\y|y|y|}*DATAy|y|\y|4}EDATAy|z|y|}'DATAz|\z|y|}DATA\z|z|z|$}.DATAz|z|\z||}*DATAz|{|z|}EDATA{|\{|z|D}'DATA\{|{|{|}3DATA{|{|\{|}DATA{|||{|$}'DATA||\||{|t}!DATA\||||||}DATA||||\|| },DATA||}|||d}DATA}|\}|||}'DATA\}|}|}|}DATA}|}|\}|,}DATA}|~|}|t}DATA~|\~|}|}DATA\~|~|~|}DATA~|~|\~|L}1DATA~||~|}1DATA|\|~| }DATA\|||L})DATA||\|}(DATA|||}6DATA|\||\}4DATA\|||}DATA|܀|\|}DATA܀|||D}1DATA|\|܀|}DATA\|||}(DATA|܁|\|<}4DATA܁|||}DATA|\|܁|}DATA\|||}KDATA|܂|\|} DATA܂|||}DATA|\|܂| }DATA\|||T}!DATA|܃|\|}$DATA܃|||}$DATA|\|܃|D}DATA\|||t},DATA|܄|\|}%DATA܄|||}1DATA|\|܄||}3DATA\|||}DATA|܅|\|}*DATA܅|||t}DATA|\|܅|}6DATA\|||}DATA|܆|\|T}DATA܆|||}*DATA|\|܆|}&DATA\|||D}DATA|܇|\|}(DATA܇|||}6DATA|\|܇|D}%DATA\|||}4DATA|܈|\|}*DATA܈|||L}ZDATA|\|܈|}6DATA\|||4}.DATA|܉|\|}*DATA܉|||}.DATA|\|܉|<}.DATA\|||}.DATA|܊|\|}4DATA܊|||L},DATA|\|܊|}*DATA\|||}.DATA|܋|\|T}.DATA܋|||}.DATA|\|܋|}5DATA\|||d},DATA|܌|\|}*DATA܌|||}.DATA|\|܌|l}.DATA\|||}.DATA|܍|\|}DATA܍|||L}CDATA|\|܍|}DATA\|||}/DATA|܎|\|D}DATA܎|||t}*DATA|\|܎|}5DATA\|||,}+DATA|܏|\|}+DATA܏|||}+DATA|\|܏|4}DATA\||||}9DATA|ܐ|\|}9DATAܐ|||L}9DATA|\|ܐ|} DATA\|||}"DATA|ܑ|\|T}DATAܑ|||}ADATA|\|ܑ| } DATA\|||\}"DATA|ܒ|\|}DATAܒ|||}4DATA|\|ܒ|T} DATA\|||}"DATA|ܓ|\|}DATAܓ|||<}$DATA|\|ܓ|}DATA\|||}*DATA|ܔ|\|}DATAܔ|||\}DATA|\|ܔ|},DATA\|||}DATA|ܕ|\|,}DATAܕ|||t}HDATA|\|ܕ|}DATA\|||,~1DATA|ܖ|\|~#DATAܖ|||~DATA|\|ܖ|~DATA\|||L~DATA|ܗ|\|~DATAܗ|||~#DATA|\|ܗ| ~DATA\|||T~DATA|ܘ|\|~ DATAܘ|||~DATA|\|ܘ|~DATA\|||D~DATA|ܙ|\|~DATAܙ|||~ DATA|\|ܙ| ~DATA\|||<~DATA|ܚ|\||~DATAܚ|||~*DATA|\|ܚ|~DATA\|||L~DATA|ܛ|\|~DATAܛ|||~DATA|\|ܛ|~DATA\|||\~%DATA|ܜ|\|~DATAܜ|||~DATA|\|ܜ|,~DATA\|||\~DATA|ܝ|\|~ DATAܝ|||~DATA|\|ܝ| ~DATA\|||L~DATA|ܞ|\|~7DATAܞ|||~DATA|\|ܞ| ~DATA\|||\ ~ DATA|ܟ|\| ~DATAܟ||| ~!DATA|\|ܟ|D ~DATA\||| ~DATA|ܠ|\| ~DATAܠ||| ~%DATA|\|ܠ|L ~DATA\||| ~DATA|ܡ|\| ~DATAܡ||| ~DATA|\|ܡ|D ~)DATA\||| ~DATA|ܢ|\| ~)DATAܢ|||< ~DATA|\|ܢ| ~DATA\||| ~DATA|ܣ|\| ~DATAܣ|||<~"DATA|\|ܣ|~DATA\|||~DATA|ܤ|\| ~DATAܤ|||<~DATA|\|ܤ||~lDATA\|||~,DATA|ܥ|\|l~,DATAܥ|||~DATA|\|ܥ|~DATA\|||,~DATA|ܦ|\|t~$DATAܦ|||~cDATA|\|ܦ|T~%DATA\|||~&DATA|ܧ|\|~$DATAܧ|||D~$DATA|\|ܧ|~$DATA\|||~DATA|ܨ|\|$~DATAܨ|||T~DATA|\|ܨ|~DATA\|||~/DATA|ܩ|\|4~DATAܩ|||d~DATA|\|ܩ|~DATA\|||~%DATA|ܪ|\|D~$DATAܪ|||~DATA|\|ܪ|~DATA\|||~DATA|ܫ|\|L~DATAܫ||||~"DATA|\|ܫ|~DATA\|||~,DATA|ܬ|\|T~DATAܬ|||~!DATA|\|ܬ|~DATA\|||$~)DATA|ܭ|\||~9DATAܭ|||~&DATA|\|ܭ|4~"DATA\|||~(DATA|ܮ|\|~%DATAܮ|||,~1DATA|\|ܮ|~3DATA\|||~3DATA|ܯ|\|L~DATAܯ||||~DATA|\|ܯ|~#DATA\|||~+DATA|ܰ|\|l~*DATAܰ|||~-DATA|\|ܰ|~*DATA\|||t~-DATA|ܱ|\|~*DATAܱ|||$~DATA|\|ܱ|T~&DATA\|||~DATA|ܲ|\|~DATAܲ||| ~DATA|\|ܲ|L ~7DATA\||| ~;DATA|ܳ|\|!~5DATAܳ|||t!~DATA|\|ܳ|!~DATA\|||!~3DATA|ܴ|\|4"~DATAܴ|||d"~*DATA|\|ܴ|"~2DATA\|||#~*DATA|ܵ|\|t#~DATAܵ|||#~ DATA|\|ܵ|#~ DATA\|||$~DATA|ܶ|\|\$~DATAܶ|||$~DATA|\|ܶ|$~$DATA\|||%~DATA|ܷ|\|d%~DATAܷ|||%~DATA|\|ܷ|%~DATA\|||$&~DATA|ܸ|\|T&~DATAܸ|||&~DATA|\|ܸ|&~$DATA\|||,'~DATA|ܹ|\|d'~DATAܹ|||'~DATA|\|ܹ|'~*DATA\|||,(~'DATA|ܺ|\||(~*DATAܺ|||(~DATA|\|ܺ|)~ DATA\|||<)~ DATA|ܻ|\|t)~DATAܻ|||)~DATA|\|ܻ|)~DATA\|||<*~DATA|ܼ|\|l*~DATAܼ|||*~$DATA|\|ܼ|*~DATA\|||D+~DATA|ܽ|\|+~DATAܽ|||+~DATA|\|ܽ|,~DATA\|||4,~DATA|ܾ|\|t,~#DATAܾ|||,~DATA|\|ܾ|-~DATA\|||4-~DATA|ܿ|\|t-~DATAܿ|||-~!DATA|\|ܿ|-~ DATA\|||D.~!DATA||\|.~DATA|||.~DATA|\||/~DATA\|||T/~DATA||\|/~DATA|||/~DATA|\||0~DATA\|||D0~DATA||\|0~ DATA|||0~DATA|\||0~DATA\|||D1~UDATA||\|1~DATA|||1~ DATA|\||D2~DATA\|||2~.DATA||\|2~DATA|||3~DATA|\||L3~DATA\|||3~DATA||\|3~.DATA|||,4~6DATA|\||4~DATA\|||4~ DATA||\| 5~2DATA|||l5~DATA|\||5~%DATA\|||6~DATA||\|46~1DATA|||6~DATA|\||6~DATA\||| 7~"DATA||\|\7~DATA|||7~(DATA|\||7~DATA\|||,8~HDATA||\|8~2DATA|||9~DATA|\||49~9DATA\|||9~ADATA||\| :~GDATA||||:~DATA|\||:~DATA\|||:~DATA||\|$;~3DATA|||;~<DATA|\||;~SDATA\|||l<~DATA||\|<~HDATA|||=~MDATA|\||=~KDATA\|||>~JDATA||\||>~ DATA|||>~=DATA|\||?~DATA\|||L?~1DATA||\|?~1DATA||| @~1DATA|\||l@~DATA\|||@~DATA||\|@~DATA|||$A~2DATA|\||A~DATA\|||A~,DATA||\|$B~ DATA|||tB~DATA|\||B~;DATA\||| C~+DATA||\|dC~kDATA|||C~DATA|\||,D~DATA\|||tD~DATA||\|D~DATA|||D~DATA|\||,E~DATA\|||tE~ DATA||\|E~DATA|||E~DATA|\||4F~DATA\|||tF~DATA||\|F~$DATA|||F~DATA|\||DATA\|||lO~>DATA||\|O~>DATA|||}DATALvv vL>}DATAv̨vLv|>}DATĄv vv>}MDATA vLv̨v 0:DATA} gAlert = 3DATA 4} else:DATAl} gAlert = 4DATA} FILE.flush()DATA} FILE.close()DATA,}DATA\}#=========================DATA(}def ObjImport(file, Name, filename):DATA }#========================= DATA<} vcount = 0DATA|} vncount = 0DATA} vtcount = 0DATA} fcount = 0DATA<} gcount = 0DATA|} setcount = 0DATA} groupflag = 0DATA} objectflag = 0DATA<} mtlflag = 0DATA|} baseindex = 0DATA} basevtcount = 0DATA} basevncount = 0DATA<} matindex = 0DATA|}DATA} pointList = []DATA} uvList = []DATA,} normalList = []DATAl} faceList = []DATA} materialList = []DATA} uv = [] DATA $} lines = file.readlines()DATAl} linenumber = 1DATA}DATA} for line in lines:DATA } words = line.split()DATA(d} if words and words[0] == "#":DATA$} pass # ignore commentsDATA(} elif words and words[0] == "v":DATA T} vcount = vcount + 1DATA } x = float(words[1])DATA } y = float(words[2])DATA ,} z = float(words[3])DATA(t} pointList.append([x, y, z])DATA}DATA,} elif words and words[0] == "vt":DATA$L} vtcount = vtcount + 1DATA } u = float(words[1])DATA } v = float(words[2])DATA$,} uvList.append([u, v])DATA|}DATA,} elif words and words[0] == "vn":DATA$} vncount = vncount + 1DATA T} i = float(words[1])DATA } j = float(words[2])DATA } k = float(words[3])DATA,,} normalList.append([i, j, k])DATA}DATA(} elif words and words[0] == "f":DATA } fcount = fcount + 1DATA(L} vi = [] # vertex indicesDATA(} ti = [] # texture indicesDATA(} ni = [] # normal indicesDATA <} words = words[1:]DATA } lcount = len(words)DATA,} for index in (xrange(lcount)):DATA4$} if words[index].find( "/") == -1:DATA0} vindex = int(words[index])DATAH} if vindex < 0: vindex = baseindex + vindex + 1 DATA(L} vi.append(vindex)DATA} else:DATA4} vtn = words[index].split( "/")DATA(<} vindex = int(vtn[0])DATAD} if vindex < 0: vindex = baseindex + vindex + 1 DATA(} vi.append(vindex) DATAL} DATA0} if len(vtn) > 1 and vtn[1]:DATA,} tindex = int(vtn[1])DATAH4} if tindex < 0: tindex = basevtcount +tindex + 1DATA(} ti.append(tindex)DATA}DATA0$} if len(vtn) > 2 and vtn[2]:DATA,|} nindex = int(vtn[2])DATAH} if nindex < 0: nindex = basevncount +nindex + 1DATA(D} ni.append(nindex)DATA4} faceList.append([vi, ti, ni, matindex])DATA}DATA($} elif words and words[0] == "o":DATA$t} ObjectName = words[1]DATA} objectflag = 1DATA0 } #print "Name is %s" % ObjectNameDATAd}DATA(} elif words and words[0] == "g":DATA} groupflag = 1DATA ,} index = len(words)DATA t} if objectflag == 0:DATA } objectflag = 1DATA } if index > 1:DATA4L} ObjectName = words[1].join("_")DATA4} GroupName = words[1].join("_") DATA } else:DATA,L} ObjectName = "Default" DATA,} GroupName = "Default" DATA8} #print "Object name is %s" % ObjectNameDATA8\} #print "Group name is %s" % GroupNameDATA} else:DATA } if index > 1:DATA4D} GroupName = join(words[1],"_") DATA} else:DATA,} GroupName = "Default" DATA8<} #print "Group name is %s" % GroupNameDATA} DATA } if mtlflag == 0:DATAL} matindex = AddMeshMaterial(GroupName,materialList, matindex)DATA$} gcount = gcount + 1 DATA}DATA } if fcount > 0: DATA$T} baseindex = vcountDATA(} basevncount = vncountDATA(} basevtcount = vtcountDATAD}DATA0t} elif words and words[0] == "mtllib":DATA(} # try to export materialsDATA4} directory, dummy = os.split(filename)DATA4|} filename = os.join(directory, words[1])DATA} try:DATA,} file = open(filename, "r")DATAt} except:DATA8} print "no material file %s" % filenameDATA} else:DATAT} mtlflag = 1DATA,} file = open(filename, "r")DATA(} line = file.readline()DATAD} while line:DATA,} words = line.split()DATA8} if words and words[0] == "newmtl":DATA(D} name = words[1]DATA8} line = file.readline() # Ns ?DATA,} words = line.split()DATA\L} while (words[0] != "Ka" and words[0] != "Kd" and words[0] != "Ks"): DATA8} line = file.readline() # KaDATA04} words = line.split()DATA,} if words[0] == "Ka":DATA0} Ka = [float(words[1]),DATA0<} float(words[2]),DATA0} float(words[3])]DATA8} line = file.readline() # KdDATA0L} words = line.split()DATA,} if words[0] == "Kd":DATA0} Kd = [float(words[1]),DATA0T} float(words[2]),DATA0} float(words[3])]DATA8} line = file.readline() # Ks DATA0d} words = line.split()DATA,} if words[0] == "Ks":DATA0} Ks = [float(words[1]),DATA0l} float(words[2]),DATA0} float(words[3])]DATA}DATADL} matindex = AddGlobalMaterial(name, matindex) DATA}DATA0} matlist = Material.Get() DATAD}DATA,t} if len(matlist) > 0:DATA8} material = matlist[matindex]DATA,,} material.R = Kd[0]DATA,} material.G = Kd[1]DATA,} material.B = Kd[2]DATA 4} try:DATA<|} material.specCol[0] = Ks[0]DATA<} material.specCol[1] = Ks[1]DATA<L} material.specCol[2] = Ks[2]DATA$} except:DATA$} passDATA T} try:DATAD} alpha = 1 - ((Ka[0]+Ka[1]+Ka[2])/3)DATA$ } except:DATA$\} passDATA } try:DATA8} material.alpha = alphaDATA$T} except:DATA$} passDATA} else:DATA(<} mtlflag = 0DATA}DATA,} line = file.readline()DATA } file.close()DATA\}DATA0} elif words and words[0] == "usemtl":DATA } #if mtlflag == 1:DATA ,} name = words[1]DATALt} matindex = AddMeshMaterial(name, materialList, matindex) DATA} # elif words: DATA4,~ # print "%s: %s" % (linenumber, words)DATA$~ linenumber = linenumber + 1DATA~ file.close()DATA~DATAL~ # import in BlenderDATA~ DATA$~ print "import into Blender ..."DATA ~ mesh = NMesh.GetRaw ()DATAT~DATA ~ i = 0DATA~ while i < vcount:DATA ~ x, y, z = pointList[i] DATA D~ vert=NMesh.Vert(x, y, z)DATA ~ mesh.verts.append(vert)DATA ~ i=i+1DATA ~DATA<~ if vtcount > 0:DATA |~ #mesh.hasFaceUV() = 1DATA,~ print ("Object has uv coordinates")DATA~ DATA L~ if len(materialList) > 0:DATA ~ for m in materialList:DATA~ try:DATA ~ M=Material.Get(m)DATA(\~ mesh.materials.append(M) DATA~ except:DATA~ passDATA,~DATA\~ total = len(faceList)DATA ~ i = 0DATA~DATA ~ for f in faceList:DATAL~ if i%1000 == 0:DATA8~ print ("Progress = "+ str(i)+"/"+ str(total))DATA~DATA ~ i = i + 1DATA$\ ~ vi, ti, ni, matindex = fDATA ~ face=NMesh.Face()DATA$ ~ if len(materialList) > 0:DATA D ~ face.mat = matindexDATA ~DATA ~ limit = len(vi)DATA( ~ setcount = setcount + len(vi)DATAL ~ c = 0 DATA ~ DATA ~ while c < limit:DATA ~ m = vi[c]-1DATA,D ~ if vtcount > 0 and len(ti) > c:DATA ~ n = ti[c]-1DATA, ~ if vncount > 0 and len(ni) > c:DATA< ~ p = ni[c]-1DATA ~DATA ~ if vtcount > 0:DATA ~ try:DATA$<~ u, v = uvList[n]DATA~ except:DATA~ pass DATA ~DATA<~ """ 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)+1DATA0l~ mesh.verts[m].uvco[1] = (v*2)+1DATA~ """DATA~DATA,~ if vncount > 0:DATA(t~ if p > len(normalList):DATAd~ print("normal len = " +str(len(normalList))+ " vector len = " +str(len(pointList)))DATA(T~ print("p = " +str(p))DATA(~ x, y, z = normalList[p] DATA(~ mesh.verts[m].no[0] = xDATA(D~ mesh.verts[m].no[1] = yDATA(~ mesh.verts[m].no[2] = zDATA~ c = c+1 DATA$~ DATAT~ if len(vi) < 5:DATA~ for index in vi:DATA0~ face.v.append (mesh.verts[index-1])DATA4~ DATAd~ if vtcount > 0: DATA ~ for index in ti:DATA(~ u, v = uvList[index-1]DATA(D~ face.uv.append((u,v))DATA~DATA~ if vcount>0:DATA~ face.smooth=1DATAL~DATA$|~ mesh.faces.append(face) DATA~DATA0~ print "all other (general) polygons ..."DATAT~ for f in faceList:DATA$~ vi, ti, ni, matindex = f DATA~ if len(vi) > 4:DATA,$~ # export the polygon as edgesDATA<|~ print ("Odd face, vertices = "+ str(len(vi)))DATA(~ for i in range(len(vi)-2):DATA$4~ face = NMesh.Face()DATA,~ 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])DATAL~DATA |~ if vtcount > 0: DATA$~ if len(ti) > i+2:DATA,~ u, v = uvList[ti[0]-1]DATA,l~ face.uv.append((u,v))DATA0~ u, v = uvList[ti[i+1]-1]DATA,~ face.uv.append((u,v))DATA0t~ u, v = uvList[ti[i+2]-1]DATA,~ face.uv.append((u,v))DATA$~DATA(T~ mesh.faces.append(face)DATA~ DATA ~ NMesh.PutRaw(mesh, Name,1)DATA ~DATA8L ~ print ("Total number of vertices is "+ str(vcount))DATA< ~ print ("Total number of faces is "+ str(len(faceList)))DATA8!~ print ("Total number of sets is "+ str(setcount))DATAt!~DATA!~DATA4!~ print("Finished importing " +str(Name)+ ".obj")DATA4"~DATA,d"~#=========================================DATA4"~def AddMeshMaterial(name, materialList, matindex):DATA,#~#=========================================DATAt#~ DATA#~ index = 0DATA#~ found = 0 DATA $~ limit = len(materialList)DATA\$~DATA$~ while index < limit:DATA($~ if materialList[index] == name:DATA%~ matindex = index DATAd%~ found = 1DATA%~ index = limitDATA%~ index = index + 1DATA$&~ DATAT&~ if found == 0: DATA &~ materialList.append(name)DATA(&~ matindex = len(materialList)-1DATA ,'~ DATAd'~ return matindexDATA'~DATA,'~#=========================================DATA(,(~def AddGlobalMaterial (name, matindex):DATA,|(~#=========================================DATA(~ DATA)~ index = 0DATA<)~ found = 0DATAt)~ matindex = 0DATA)~ MatList = Material.Get()DATA)~ limit = len(MatList)DATA<*~DATAl*~ while index < limit:DATA(*~ if MatList[index].name == name:DATA*~ matindex = index DATAD+~ found = 1DATA+~ index = limitDATA+~ index = index + 1DATA,~DATA4,~ if found == 0:DATA$t,~ material = Material.New(name)DATA,~ matindex = indexDATA-~ DATA4-~ return matindexDATAt-~DATA$-~#================================DATA$-~def ObjExport(FILE, Name, type):DATA$D.~#================================DATA.~ global returncodeDATA.~ global vertexcountDATA/~ global uvcountDATAT/~ global TransformDATA/~ global multiflagDATA/~ global exporttypeDATA0~DATAD0~ vertexcount = 0DATA0~ uvcount = 0DATA0~ returncode = 0DATA 0~ print("Writing %s..." % Name)DATAXD1~ FILE.write("# Wavefront OBJ (1.0) exported by lynx's OBJ import/export script\n\n")DATA1~DATA$1~ Objects = Object.GetSelected()DATAD2~ if Objects == []:DATA02~ print("You have not selected an object!")DATA2~ returncode = 4DATA3~ else:DATAL3~ for object in Objects:DATA3~ MtlList = []DATA03~ if len(Objects) > 1 or exporttype > 1:DATA8,4~ Transform = CreateMatrix(object, Transform)DATA4~ multiflag = 1DATA 4~ DATA4 5~ mesh = NMesh.GetRawFromObject(object.name)DATAl5~ ObjName = mesh.nameDATA(5~ has_uvco = mesh.hasVertexUV()DATA6~DATA446~ FILE.write("# Meshname:\t%s\n" % ObjName)DATA6~DATA6~ faces = mesh.facesDATA$ 7~ materials = mesh.materialsDATA \7~ Vertices = mesh.vertsDATA,7~ GlobalMaterials = Material.Get()DATA7~DATAL,8~ if len(materials) > 1 and len(GlobalMaterials) > 0 and type < 4:DATA48~ CreateMtlFile(Name, materials, MtlList)DATA9~DATA<49~ # Total Vertices and faces; comment if not usefulDATAD9~ FILE.write("# Total number of Faces:\t%s\n" % len(faces))DATAH :~ FILE.write("# Total number of Vertices:\t%s\n" % len(Vertices))DATA|:~DATA:~ FILE.write("\n")DATA:~DATA4$;~ # 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())DATAl<~DATAL<~ if len(materials) > 1 and len(GlobalMaterials) > 0 and type < 3:DATAP=~ UseLayers(faces, Vertices, MtlList, has_uvco, FILE, ObjName, Name)DATAL=~ 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)DATA?~ DATA4L?~#================================================DATA4?~def CreateMtlFile (name, MeshMaterials, MtlList):DATA4 @~#================================================DATAl@~ global gFilename DATA@~DATA @~ # try to export materialsDATA4$A~ directory, mtlname = os.split(gFilename.val)DATA A~ mtlname = name + ".mtl"DATA0A~ filename = os.join(directory, mtlname)DATA$$B~ file = open(filename, "w")DATAtB~DATA<B~ file.write("# Materials for %s.\n" % (name + ".obj"))DATA, C~ file.write("# Created by Blender.\n")DATAldC~ file.write("# These files must be in the same directory for the materials to be read correctly.\n\n")DATAC~DATA ,D~ MatList = Material.Get()DATA tD~ print str(MeshMaterials)DATAD~DATAD~ MtlNList=[]DATA,E~ for m in MatList:DATA$tE~ MtlNList.append(m.name)DATAE~DATAE~ counter = 1DATA4F~ found = 0 DATAtF~DATA(F~ for material in MeshMaterials:DATA F~ for mtl in MtlList:DATA 0:DATA(Y~ limit = len(uvList)-200DATA0Z~ while index > limit and found == 0:DATA,lZ~ uv_value = uvList[index-1]DATADZ~ if uv[0] == uv_value[0] and uv[1] == uv_value[1]:DATA04[~ uvPtrs.append(index+uvcount)DATA[~ found = 1DATA$[~ index = index - 1DATA$\~ if found == 0:DATA$l\~ uvList.append(uv)DATA$\~ index = len(uvList)DATA, ]~ uvPtrs.append(index+uvcount)DATAd]~ u, v = uvDATA4]~ FILE.write("vt %s %s\n" % (u, v))DATA ^~ uv_flag = 1DATAT^~DATA(^~ if has_uvco and uv_flag == 0:DATA^~ for v in Vertices:DATA _~ u, v, z = v.uvco DATAd_~ u = (u-1)/2DATA_~ v = (v-1)/2DATA0_~ FILE.write("vt %s %s\n" % (u, v))DATA<`~DATAl`~ for v in Vertices: DATA`~ x, y, z = v.noDATA4`~ FILE.write("vn %s %s %s\n" % (x, y, z))DATA\a~DATAa~ p = 0DATAa~ uvindex = 0DATAb~ total = len(faces)DATALb~DATA|b~ for face in faces:DATAb~ p = p+1DATAc~ if (p%1000) == 0:DATALLc~ print ("Progress = "+ str(p)+ " of "+ str(total) +" faces")DATAc~DATAc~ FILE.write("f ")DATA, 0:DATAHDe~ FILE.write("%s/%s/%s " % (v+1, uvPtrs[uvindex], v+1))DATA$e~ uvindex = uvindex+1DATAf~ elif has_uvco:DATA<Lf~ FILE.write("%s/%s/%s " % (v+1, v+1, v+1))DATA(f~ else: DATA4g~ FILE.write("%s//%s " % (v+1, v+1))DATAdg~ FILE.write("\n")DATAg~DATA4g~ vertexcount = vertexcount + len(Vertices)DATA( 0:DATA0} limit = len(uvList)-200DATA8} while index > limit and found == 0:DATA4|} uv_value = uvList[index-1]DATAL} if uv[0] == uv_value[0] and uv[1] == uv_value[1]:DATA8T} uvPtrs.append(index+uvcount)DATA$} found = 1DATA,} index = index - 1DATA$\} if found == 0:DATA,} uvList.append(uv)DATA,} index = len(uvList)DATA4\} uvPtrs.append(index+uvcount)DATA$} u, v = uvDATA< } FILE.write("vt %s %s\n" % (u, v))DATA$t} uv_flag = 1DATA}DATA(} if has_uvco and uv_flag == 0:DATAD} for v in Vertices:DATA } u, v, z = v.uvcoDATA} u = (u-1)/2DATA} v = (v-1)/2DATA0T} FILE.write("vt %s %s\n" % (u, v))DATA}DATA} for v in Vertices: DATA$} x, y, z = v.noDATA4l} FILE.write("vn %s %s %s\n" % (x, y, z))DATA}DATA} total = len(faces)DATAD } p = 0DATA| } uvindex = 0DATA0 } 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$L"} if (p%1000) == 0:DATAP"} print ("Progress = "+ str(p)+ " of "+ str(total) +" faces")DATA#}DATA$D#} 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,$%} uvindex = uvindex+1DATA$|%} elif has_uvco:DATA@%} FILE.write("%s/%s/%s " % (v+1, v+1, v+1))DATA4&} else:DATA<|&} FILE.write("%s//%s " % (v+1, v+1))DATA$&} FILE.write("\n")DATA4'}DATA4d'} vertexcount = vertexcount + len(Vertices) DATAT'} print("Export of " +str(ObjName)+ ".obj using material layers finished.\n")DATAD(}DATADt(}#==================================================================DATAH(}def UseMtl(faces, Vertices, MtlList, has_uvco, FILE, ObjName, Name): DATADT)}#==================================================================DATA)} global vertexcountDATA *} global multiflagDATAL*}DATA8|*} FILE.write("mtllib %s\n\n" % (Name + ".mtl")) DATA,*} FILE.write("o %s\n\n" % (ObjName))DATA4+} DATAd+} index = 0DATA+} VertexList = []DATA +} for vertex in Vertices:DATA ,,} VertexList.append(-1)DATAt,} index = index + 1DATA@,} print("number of vertices is " +str(len(VertexList)))DATA$-}DATAT-} Totalindex = 0DATA-} ix = 0DATA-} NewVertexList = []DATA.} NewVertexCo = []DATA(T.} for m in range(len(MtlList)):DATA4.} # Group name is the name of the mesh DATA/} if MtlList[m]:DATADL/} FILE.write("g %s\n" % (MtlList[m].name+str(m+1))) DATA/} else:DATA8/} FILE.write("g %s\n" % ("Null"+str(m+1)))DATA$\0} FILE.write("s off\n\n") DATA 0} DATA<0} FILE.write("usemtl %s\n\n" % (MtlList[m].name)) DATAL1} DATA |1} for face in faces:DATA 1} if face.mat == m:DATA( 2} for vertex in face.v:DATA(\2} v = vertex.index DATA,2} if VertexList[v] < 0:DATA43} VertexList[v] = TotalindexDATA0d3} NewVertexList.append(v)DATA43} Totalindex = Totalindex + 1DATA4} DATA(L4} for v_old in NewVertexList:DATA(4} vert = Vertices[v_old].coDATA$4} if multiflag == 1:DATA0<5} vert = Alter(vert, Transform)DATA 5} x, y, z = vertDATA85} FILE.write("v %s %s %s\n" % (x, y, z))DATA,<6} NewVertexCo.append([x,y,z])DATA6}DATA6} if has_uvco:DATA,7} for v_old in NewVertexList:DATA0\7} u, v, z = Vertices[v_old].uvcoDATA 7} u = (u-1)/2DATA,7} v = (v-1)/2 DATA4T8} FILE.write("vt %s %s\n" % (u, v))DATA8}DATA(8} for v_old in NewVertexList:DATA,49} x, y, z = Vertices[v_old].noDATA89} FILE.write("vn %s %s %s\n" % (x, y, z))DATA9} DATA :} for face in faces:DATA d:} if face.mat == m:DATA$:} FILE.write("f ")DATA4:} for index in range(len(face.v)):DATA,\;} v = face.v[index].indexDATA,;} 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$=} FILE.write("\n")DATA=}DATA>} FILE.write("\n")DATAL>}DATA |>} NewVertexList = []DATAP>} print("Group " +str(m+1)+ " of " +str(len(MtlList))+ " finished.")DATA ?!@A5 " BCDEFG(H#$I%J%KLMNOPQRSTUV!WXYZ&[\]^'_(`abcdefghijklmnopqrs) tuvwx yz{|} ~*ijk+*,'_##DELMr(52o(#)+,-%hijklDE&(H.(/Ehijk[\&(/sH0  1!W2223   243   (/g f!"#$5 %&'()*+,-6.&/*-7770-123456789:6;5<8&3  = '>'?(9@A/ BC f!gDEFGH3427IJKLMNOPQ0R:::6;5<STUVWXY  Z&; [\]^_<"3  ` (A/ a b c=d>e?f@g<hCAi jWkg f!lmnopZqrBstuvw0xCyzD>C{|Z=}~0?ijk@E 126(AFFF AfG''T ''(9@3 HI J  `   / f!H     j]  KGGsL7h(&HMNNN'_O       P  sQRUOP !"#$%&'()@*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcSdrseT'fLgTh# iNjUklVm nMo jSpRiQqHW #(`NO@rstuvX+YYwxZyz{|}~'fWXFel[YYYwxZyz\YYwxZyz]YYwxZyzs[  ()^YYwxZyz[ vrs_ YYwxZyz[rs`YYwxZyzab c YYwxZyz[  dYYwxZyz[#rsNOe YYwxZyz[fYYwxZyz 5g YYwxZyhs5iQYYwxZy     jjkk !"s%#  $l%&'()*+,-./012345rsm6./789:;<=>?@ABCDEFGrnnn lHmImJmKmLmMmNmOmPmQmRmSmTmUo]V.p"WXYZ[\]^_`abcdefghijklmnopq rstuvowq x y zT{|}~rrrr sssrr2tttstZZZrrrrqTw   u 3v%JvvvLw ww2vx  tux y{| } ~y%yyy 2wv(T{$Ixyyy z{   |||}}}2~~~*|~F ' 2 (' -         rs /  s   r' !" #$%rs &''() *+% ,se &-./01' H2 3456Z78 9z:;<9=> 1'<? @AT{'f ' BC !DEFG  rHI'JKLMNO  rHIUkPQRSTU'V!Wrs"XY * Z 'V [\]^_`azb c!W!d e(>fghijk5lmnopqrstuvYYwxZy[z9NOs w''( f!x' yU z {|DDDD } ~z f     f ZI (  ZH YYwxZyz[HZsJJJ( ( Z1'Z'Z7'Z'Z'JH2'''rsk   Z(H23ENDB