BLENDER_v245REND tֿSceneGLOB tֿ 0~' SRx`zSR1-AnimationH}}' DATA0DATA0 X DATA X`0 DATA`{ XDATA{H{`DATAH{{{DATA{{H{DATA{|{DATA|H|{DATAH|||DATA||H|DATA|}|DATA}H}|DATAH}}DATA}}0 XDATA}~}`DATA~`~}0H{DATA`~~~ X{DATA~~`~H{{DATA~8~{{DATA8~{|DATA8{|DATA{{DATAXH|DATAX{|DATAX`|DATA0H||DATA0x{|DATAx0H{}DATAx|}DATAP|}DATAPH|H}DATAP|H}DATA({|DATA(p|H}DATAp(H{H|DATAp}H}DATAXH||`OȒDATALink and MaterialsEditing>DATAMeshEditingF>DATA(Anim settingsObject>DATA(8DrawObjectF>DATA8H(ConstraintsObject>DATAHX8EffectsObjectDATAXhHHooksObjectF>(DATAhxXParticle InteractionObject>8DATAxhSoftbodyObject>8DATAxOutputRender>DATARenderRenderF>DATAAnimRender>DATAFormatRender>DATAȒw333?V,@DhCDhCC(BDC?z?DATAhyȒ333?V,/9DATAXPH{0 X{ !  DATAP0X|}|{G==o?hHXDATAHXTransform PropertiesView3d>DATAXH3D Viewport propertiesView3d>"DATAhr333?V<????????G==o? A*A?G==o??????*A0  B??=C ݢM@ݢM@ݢM@? DATAhyh333?V</9DATA0P{|{{??PףH8((DATA(Transform PropertiesIpo!>DATA(8v333?V\zC̽̌?zC@ #< #<`jFzD OBzC̽̌?DATAz8333?V\CC|||??l|DATA 333?V\zCCHBC|||?CFC= ADATAx}0 333?V\hvG  =rttDATA0| 333?V\?zDzDBCl||ll|zDzD=HB DATA0 333?V\BCBCl|llFzD #<HB DATAr333?V\??? ???? A???PA A!O?j?}GCHB? A0  B? #<C DATAhy333?V\/9DATA0H}|{| HDATALink and MaterialsEditing>DATAMeshEditingF>DATA333?VLzCB{ µCB ?BFB= ADATAP 333?VLzCCHBC$?CFC= ADATAPwH333?VL#DhC`DpJgChCC(BDC?z?DATAhHyP333?VL/9DATAH|H{}H}} ?=o?.زDATAزTransform PropertiesView3d>DATAز3D Viewport propertiesView3d>"DATAzȶ333?YDATA LampLampF>DATA 0SpotLamp>DATA0@ Texture and InputLamp>DATA@P0Map ToLamp>0DATAP`@PreviewMaterial>DATA`pPMaterialMaterialF>DATAp`PreviewWorld>DATApWorldWorldF>DATAMist Stars PhysicsWorld>DATATexture and InputWorld>DATAMap ToWorld>DATAOutputRender>DATARenderRenderF>DATAAnimRender>DATAFormatRender>DATALink and MaterialsEditing>DATA MeshEditingF>DATA 0Mesh ToolsEditing>DATA0@ Mesh Tools 1Editing^>DATA@P0CameraEditingF>DATAP`@ShadersMaterial>@DATA`pPTextureMaterial>DATAp`Anim settingsObject>DATApDrawObject>DATAConstraintsObject>DATAScriptlinksScript>DATAEffectsObjectDATAMap InputMaterial>`DATAMap ToMaterial>`DATAAnimAnim>DATASoundSound>DATAListenerSoundF>DATA SequencerSound>DATA 0ArmatureEditingF>DATA0@ RampsMaterialF>`DATA@P0Mirror TranspMaterial>DATAP`@Mist / Stars / PhysicsWorld>DATA`pPAmb OccWorld>PDATAp`Shadow and SpotLamp>DATApModifiersEditing>DATAShapesEditing>DATAMultiresEditing>DATACurve and SurfaceEditingF>DATACurve ToolsEditingF>DATACurve Tools1Editing>DATAObject and LinksObjectF>DATAw333?DHhC3DhCC(BDC?z?mDATAr333???? ???? A??@PA Aj?c3>}GCHB? A0  B? #<C DATAz@333?   ??DATAh@y333?/9DATAxDATA8xձ>b?o?(DATATransform PropertiesView3d,>DATAView PropertiesView3dT>"DATAr333?8` 'S?ׅ=S람8e5?33?6?$}_=?'S?잌ׅ=9e5?3?S36?` *>N=E?@$>m=#n9^3 ?8;wL?po:놽E@?i@M+uCk=L?K?0@Q/Cn1a *>N=E?ձ>b?o?'S?ׅ=S람8e5?33?6?$}_=?>l? ¾h;y=C@?0  B??;=C` *NE<15=<>>>? DATA(vp333?8` zC̽̌?zC@22 #< #<`jFzD OBzC̽̌?DATApzP333?8` 2 ??2HDATA,HBO`Ax DATA,HBOp=A0 DATA,CS@ff'DATAP0p 333?8` ?zDzDBD22FzD #<HB DATA0w(P333?8` DdC8CnD fCC(BDC?z?DATAh(y0333?8` Save AseNT PICTURES/home/miles/ben/p/umpbug Folder/ender.app/Contents/Resources/knot.blendntitled.blendSRx PSR3-Materialodel Singh   `G' DATAh  DATA  h  DATA (   DATA( h  DATAh  ( <DATA  h <DATA (  DATA( h  DATAh  ( ,<DATA  h ,DATA (  DATA( h  ,DATAh  ( DATA h DATA 0  DATA0x h ( DATAx0h h DATAx(  DATAPh  DATAP  DATAP ( DATA( ( DATA(p ( DATAp(h h DATAp h DATAH(  DATAHh  DATAHh  DATA   DATA h ( DATAh h ( DATAh ( DATA@ h DATA@( h DATA@  DATA  DATAh  DATA`"h h  ( ?@Pף;;!x XDATAXhOutputRender>DATAhxXRenderRenderF>DATAxhAnimRender>DATAxFormatRender>DATAX333?V\~CA~CA!?AFA= ADATAX( 333?V\zCCHBC ?CFC= ADATA(w X333?V\DhC?DhCC(BDC?z?mDATA rP(333?V\??? ???? A??@PA Aj?c3>}GCHB? A0  B? #<C DATAPzx  333?V\@̌AR|B1@lA A@CC #<@DATAhx yP333?V\/9DATA"#`   (  !  DATA#7"h  (  G@? JL-=-=W-X~0@6$/DATA$%OutputRender>DATA% &$RenderRender>DATA &0'%AnimRender0>DATA0'@( &FormatRenderH>DATA@(P)0'PreviewMaterial>DATAP)`*@(MaterialMaterial>DATA`*p+P)ShadersMaterial0>DATAp+,`*TextureMaterialD>DATA,-p+Map InputMaterial\>DATA-.,Map ToMaterial`>DATA./-RampsMaterial>P)DATA/.Mirror TranspMaterialH>DATA0w1333?VChCCvgCC(BDC?z?DATA1r40333?VJ>H!?)xu?i6>Pbܗ=(?^L?a?滎z?J>#xu?ܗ=Hi6>(? ?Pb^L?\FAA?4[?[!?@jG>gb>Pb>4Im>k&?]M^L<0@AzA=>Kc<2֍7&> ?:x¸A1vB,jB~@G@? JLJ>H!?)xu?i6>Pbܗ=(?^L?a?滎z?@?$$OA0  B?=Ch?j(4?t'>d DATA(4v@61333?VzC AzC A #< #<`jFzD OBDATAh@6y4333?V;SAVE FILE/usr/home/intrr/blender/blend/untitled.blendDATA7?#h  ( h U.=w=o?+=+=W+X,X8P>DATA8r<333?W???h?j(4?t'>????hj(4t'?U.=w=o??OA0  B??=Ch?j(4?t'>dEh@Eh@Eh@? DATA<w<8333?WDdC>9C,DeCC(BDC?z?DATA(<vP><333?WzC AzC A #< #<`jFzD OBDATAhP>y<333?W SAVE FILE/Users/ton/Desktop/der/blend/untitled.blendDATA?G7h   ( e?B$?AHM+++US@`FDATA@rD333?W |ݕ/?U~'?3F:?>T8165e?2>Z& 4?ߕ/?7F:?81W~>85e?'?T2>ne@>M@?4z?'''䷄?K??T?v|@?l211A 4Atp>?@@FC>G ?4xB֟&BĭeA(@e?B$?AHMݕ/?U~'?3F:?>T8165e?2>Z& 4?H?N,Z#OA0  B??=Ch?j(4?t'>dA@A@A@? DATADwE@333?W |DdC>9C,DeCC(BDC?z?DATA(Ev`FD333?W |zC AzC A #< #<`jFzD OBDATAh`FyE333?W | SAVE FILE/Users/ton/Desktop/der/blend/untitled.blendDATAG?   h &=+=o?USHpNDATAHr L333?W ?3?3:-vk(4??3?3;@k(40v@?&=PU1n;+=ꉖø;ZO{:?JXA54U0AC;@j(40v@?&=+=o??3?3:-vk(4?5?5IXA0  B??=C:j(4?.vdٚ@ٚ@ٚ@? DATA LwMH333?W DdC>9C,DeCC(BDC?z?DATA(MvpN L333?W zC AzC A #< #<`jFzD OBDATAhpNyM333?W SAVE FILE/Users/ton/Desktop/der/blend/untitled.blendSRxP~ SR4-SequencePS0TYZw' DATAPPDATAP0QP DATA0QpQP DATApQQ0QDATAQQpQDATAQ0RQDATA0RpRQDATApRR0RDATARRpRDATAR0SRDATA0SpSRTDATApSS0STDATASSpSDATASSDATA0TxTP0QDATAxTT0TPpQDATATUxTPQDATAUPUTpQQDATAPUUUQQDATAUUPUP0RDATAU(VU0QpRDATA(VpVU0RpRDATApVV(V0RRDATAVWpVpRRDATAWHWVRRDATAHWWWR0SDATAWWHWR0SDATAW XW0RpSDATA XhXWpRpSDATAhXX X0SpSDATAXXhXQSDATAX@YXRSDATA@YYXRSDATAYY@YQSDATAYYSSDATAZaPQQpQP_H`[@^DATA[ \OutputRender>DATA \0][RenderRenderF>DATA0]@^ \AnimRender>DATA@^0]FormatRender>DATAP_wH`333?WDhCvDhCC(BDC?z?DATAhH`yP_333?W/9DATAabZ0RP0QpR !  DATAb8jaQSSQ8=i>o? chDATAcd333?W&~CB~CB ?BFB= ADATAdxpec333?W&zCAzCA  A@FB= A DATAperhd333?W&????????8=i>o?fffAD&@??fffA0  B? #<C DATAhhype333?W&AVE TARGA/t1.blend9DATA8jpb0SpSpRR8=H>o?UUU 0k@oDATA0kxl333?W*zCAzCA1||1 A@FB= A DATAlr@o0k333?W*????????8=H>o?fffA*@??fffA0  B? #<C DATAh@oyl333?W*AVE TARGA/t1.blend9DATApw8jR0RpS0S8=>o?SSSTqXvDATA(qv(s333?W.B̽̌?B̽̌? #< #<`jFzD SQB̽̌?DATA(srXvq333?W.????????8=>o?fffA@??fffA0  B? #<C DATAhXvy(s333?W.OAD FILE/9DATAwpSRRS8=i>o? x|DATAxxy333?W1zCAzCA A@FB= A DATAyr|x333?W1????????8=i>o?fffAD&@??fffA0  B? #<C DATAh|yy333?W1AVE TARGA/t1.blend9SRx~PSR5-Scripting8x':DATA8xDATAx8DATAxDATA8DATA8xDATAx8DATAxDATA8DATA8xDATAx8DATAxDATAHxxDATAHDATA؂HxDATA؂ 8DATA h؂x8DATAh 8DATAh8DATA@8xDATA@88DATAЄ@8xDATAЄxDATA`ЄxDATA`8xDATA`DATAxx DATAȎ8x8DR8>_>o?.0DATATransform PropertiesView3d>DATA3D Viewport propertiesView3d>"DATAr0333????k4%? O????k?4% O=?DR8>_>oq) ?i9?Ʊ@ "@1yk?4% O=?DR8>_>o????k4%? O??Ʊ@?0  B?=ނ7<=Ck4%? O ???? DATAh0y333?Save AsTPUT PICTURES/home/miles/ben/color_knot.blendpngender.pngDATAȎx8??Pף  {wА(@,g DATATransform PropertiesIpo!>DATA$А~ 333?Ȏc DATAx }ȑА 333?ȎpLj 4 "@qs_sDATAȑ{ 333?ȎCCx??|?DATA(vHȑ333?ȎzC̽̌?zC@;; #< #<`jFzD OBzC̽̌?DATAHzx333?ȎCC|||??l|pȕDATA,pȕBO`Ax DATA,ȕpBOp=A0 DATAxHH 333?ȎzCCHBC|||?CFC= ADATAH|x 333?Ȏ?zDzDBCl||ll|zDzD=HB DATAH 333?ȎBCBCl|llFzD #<HB DATAr(333?Ȏ??? ???? A???PA A!O?j?}GCHB? A0  B? #<C DATAh(y333?ȎiO dSelect filename/home/miles/angle.svgender/scripts/blender/ome/miles/ben/color_triangle_knot.svgesh.003.svge_knot.svgesh.003.svggle_knot.svgesh.003.CUvCDATAȎ88x رв{ xo2 DATAȟLink and MaterialsEditing>HDATAȟؠMeshEditingF>HDATAؠȟAnim settingsObject>JDATAؠDrawObject>JDATAConstraintsObject>JDATAEffectsObjectDATA(HooksObjectF>DATA(8Particle InteractionObject>DATA8H(SoftbodyObject>DATAHX8OutputRender>TDATAXhHRenderRenderF>TDATAhxXAnimRender>TDATAxhFormatRender>TDATAxScriptlinksScript>DATACurve and SurfaceEditingF>DATAModifiersEditing>HDATAȰCurve ToolsEditing>DATAȰ!Curve Tools1Editing>DATA!-ȰPreviewMaterial>DATA-h"!Links and PipelineMaterialF>DATAh"0s -Object and LinksObjectF>JDATA0s >0 h"Render LayersRender>THDATA>0 `z 0s BakeRender>ThDATA`z `i_ >0 ShapesEditing>HDATA`i_ P0 `z MultiresEditing>HDATAP0 `i_ Texture faceEditing^>)DATA1 P0 UV CalculationEditing^>)P0 DATA1 ۮPaintEditing>6DATAۮЖ 1 Mesh ToolsEditing>EDATAЖ 8 ۮMesh Tools 1Editing^>EDATA8 Ж VideoRender>NxDATA8 AudioRender>NxDATAرwв333?DHhC܍DZ*SdCC(BDC?z?'5DATAhвyر333?/9SC'pSCScenetageain0 H D x D yTE{RТ">IqIqIqIII=F Кi Pp(#ϙdd??< dddZ! ??и и ????//backbuf/tmp/render.png//ftype@&#@^@&^#D82 n x)DATAD c]( DATAchED m@ DATAhEcxF m` DATAxF c@EC hEm DATA@EC c3xF H DATA3c(x @EC  DATA(x c{ 3 DATA{ c8(x  DATA8c{ { h DATA{ c8 DATAcp% {  DATAp% c  DATA c p%  DATA c$`  H DATA$` c~   DATA~ c`z $` X DATA`z cX. ~   DATAX. c@gY `z 2 DATA@gY cx X. x DATAx c@gY .0 DATA(F b,d'=A@DATALКi mL?B ?o: ??H} #<=DATA82  DATAnfDATA@и h1 RenderLayerCU8i /p,CUCurve i i  @=ؤz=$>?C?]4?d? ????L=DATA8 i , pF DATA+_r?5A????>=.?@???ݱֿ????o?R)??? 'h?ֿ????j &)???DATA4pF ?@@@@@@@AA A0A@ACU8p,/1i CUCurve.001-.p ???d? ????L=DATA8-,@. //DATA8@.,.- H0DATA8.,@. 0DATA/+[1P=???[<1P???????[«`p!@^ipA@G̱?~Ӿp!@/B#?p!@?p!@u1??DATA0* (9=౲ :+?j k?@B??ؿ?5 ??00??Bk?B:+?ͪB)9=I'&?? :ؿf??CU81/8-j p,CUCurve.002`3`3 ???d? ????L=DATA8`3, 43DATA3+R-\ՇѲ??? ۿ\_Բ???J6\^7ײ???lՓ>\"ڲ???[?\ܲ???DATA(4?????CU88-j /@0j 1CUCurve.003.j .j ???d? ????L=DATA8.j , /j /j DATA/j +w50???w=/???????w=2???@w25???DATA(/j ?????CU8@0j /2j 8-j CUCurve.0041j 1j ???d? ????L=DATA81j ,  5DATAp5*cA?Ⱦ笈?2=.???v??:??&@d???CU82j /7j @0j CUCurveCircle.001x3j 3j ???d? ????L=DATA8x3j ,3j  H4j DATA83j ,x3j  6j X5j DATAH4j *H??.4?8???DI@:@`M@??t8?t.4?tH????`MИ>:И>DIИ>??DATA X5j +=???=`>??=`4a???=`Є>??=Є????Є>???4a????>??DATA<6j ?@@@@@@@AA A0A@APA`ACU87j /9j 2j CUCurveCircle.002x8j x8j ???d? ????L=DATA8x8j ,  8j DATA8j *uu>v[ E<=ľ???G~k=E׀W? ???kG~? E=?W? ?׀????>=?E<?%K??CU89j /x=j 7j CUCurveCircle.003X;j X;j ???d? ????L=DATA8X;j , =j ;j DATA ;j +1' ???愲>??1xf????9C>???' 1?????2>???xf2????9C2>??DATA<=j ?@@@@@@@AA A0A@APA`ACU8x=j /?j 9j CUCurveCircle.004m>j >j b pt zX zX @r-< 6=l=?d? ????L=DATA8>j , H?j DATAlH?j +Jֽ[???@ɠ=???ɐ= k???CU8?j / Dj x=j CUSurfTubeHAj HAj ???d? ????L=DATA8HAj , @ ': Aj DATA@Aj +1???>??????>?? 1??????>???"J????>?? ?????>??"J/??????>??????????>???.??????>??DATA<@ ?@@@@@@@AA A0A@APA`ADATA': ?@@@CU8 Dj /?j CUSurfTube.001Ej XFj b b? ?{??d? ????L=DATA8Ej ,Ej  0Ij 8#Fj DATA8Ej ,XFj Ej  Lj f Ij DATA8XFj ,Ej  ( DATA@Fj +#?~????"?+r?>??f?>???V G?ZX>??T???*>>??,v????E@>??#?~?????"?,r??>??f?>????V G?ZX?>??T????,>?>??,w?????E@?>??DATA<0Ij ?@@@@@@@AA A0A@APA`ADATA8#?@@@DATA@Ij +;???G>??G·w????G?>??;????8?>??8·w????8>??;????G?>??G·w?????G??>??;?????8??>??8·w?????8?>??DATA<Lj ?@@@@@@@AA A0A@APA`ADATAf ?@@@DATA  +uzA˽???#H>??#H82???#H>>??uzA˽>????>>???C2????>??DATA<( ?@@@@@@@AA A0A@APA`AIMtED IMRender ResultCA CACameraamera.001L>DB=B B@?LA@ $LASpot5 ?????AB>??.?A4B?@@@ ???IPTp  IPCurveIpo fff?zC̽̌?CUDATA\ 1x CU?e9DATApx *$($(BsB?B? C?IPT  p IPCurveIpo.001 fff?zC̽̌?CUDATA\ 1 CU?e9DATAp *$($(BsB?B? C?IPT h  IPCurveIpo.002@ @ fff?zC̽̌?CUDATA\@ 1 CU?e9DATAp *$($(BsB?B? C?IPTh  IPFoldRateIPO ?zC@OBDATA\ 1p OB DATAp *?Bc,;BA4CAzCAc,XWCCCc,WO(H aWOWorldg=pb>>===??A@pA A?L=TXh pLj TXframeChanged.py& ' ' ' 0 DATA& ^ V FREEDATA^ @s & 8 as DATA@s W ^ '.GetDATAW 8E @s .GetDATA8E O W  .GetDATAO  8E imatDATA ' O  rameDATA'   DATAV import Blender7DATA$8 import mesh_unfolder as UnfolderREEDATA( u = Blender.Registry.GetKey('unfolder')DATA if u!=None:DATA n = u['net']giDATA  if(n!=None and n.animates):IpDATA  n.unfoldToCurrentFrame()EDATA nTXhpLj hvG TXmesh_unfolder.pyMj N9 9 9 8rG DATA4Mj /usr/share/blender/scripts/blender/mesh_unfolder.pyDATA9 h DATAh `t 9 0000DATA`t 0BM h 0. DATA0BM oM `t E @DATAoM |M 0BM F~ @DATA|M ЖM oM #@DATAЖM N |M d DATAN  ЖM @DATA IN DATAI  ) W?DATA ` I`ɐ=DATA`  0@?DATAxr ` pDATAxr k } JֽDATAk `P xr DATA`P G k  ɐ=DATAG `\U `P x_ ɐ=DATA`\U XJ7 G iO JֽDATAXJ7 ^E `\U Y JֽDATA^E xj XJ7 xDATAxj x7 ^E 2ɐ=DATAx7 hW; xj X. JֽDATAhW; +; x7 X1DATA+; ; hW; @DATA; (#A +; 8y DATA(#A  7 ; @1 JֽDATA 7 n7 (#A (SDATAn7 IV 7 0W DATAIV `8 n7 )=?DATA`8 p IV y DATAp  `8 DATA 5X p PDATA5X 0M GDATA0M h& 5X AilesDATAh& 0M &k DATAPh& b DATAP85 DATA85@2 P+ DATA@2 ~854g}DATA~. @2 ( DATA. h~DATAhx. DATAxȨ h@DATAȨ F xE( DATAF u Ȩ *DATAu й F @| DATAй u `UDATA й Yw DATA ` p;@ DATA`  Ⱦ g}DATA  ` (DATA 8 h DATA8  0Y DATA  8 0%DATA  DATA X ?DATAX   =DATA  X h@g}DATA 0 8DATA0 x qt DATAx  0 @ADATA  x @g}DATA P ?DATAP   .DATA  P hb DATA ( CDATA( p `IDATAp  ( ADATA  p ~) DATA H H#g}DATAH  ) DATA  H V DATA   DATA  h DATAh   E DATA  h ( # DATA @  x @DATA@   DATA  @ ˮDATA   0!DATA `  !%DATA`   !.DATA  ` 8"+DATA 8  "gDATA8   (#)DATA  8 #$DATA   #DATA X  ($G DATAX   p$DATA  X $DATA 0  %DATA0 x  P%/ DATAx  0 %DATA  x 0U DATA P  % DATAP   XO g, DATA  P @)  DATA (  0&DATA( p  x&DATAp  ( &)DATA  p  DATA H  C% DATAH  '+ DATA  H kDATA  |(  DATA h  DATAh  `H DATA  h p'DATA @ c; DATA@  @ DATA  @ @u  DATA  3 DATA ` hz DATA`   'DATA  ` ($DATA 8 H1W g}DATA8  `Tz h DATA  8 yA DATA  X(Q DATA X (DATAX   (DATA  X 0)DATA 0  x)DATA0 x  )DATAx  0 *DATA  x E DATA P  0  8 DATAP   P*M 8 DATA  P V7 DATA (  *DATA( p  P} DATAp  ( +DATA  p `+_DATA H  +dDATAH   ,"DATA  H ,DATA    (-#DATA  h  y m DATAh   x-nDATA  h ./?DATA @  Y DATA@   Y f DATA  @ x.2 DATA   .2DATA `  y) DATA`   8/mDATA  ` /9b DATA 8  mb DATA8   H DATA  8 (~ DATA   h DATA X  @0DATAX   XRDATA  X 0EH DATA 0  0DATA0 x  v DATAx  0 1DATA  x X DATA P  X DATAP   * DATA  P p18DATA (  1& DATA( p  `vE DATAp  ( 02'j$ DATA  p 2<g}DATA H  9 ź* DATAH   2/ DATA  H B DATA    X3'DATA  h  3JDATAh   (  1-DATA  h ( DATA @  (4DATA@   p4"DATA  @ 4DATA   5NDATA `  5DATA`   50DATA  ` A} ?DATA 8   ?DATA8   86%?DATA  8 t ?DATA   p ?DATA X  6 ?DATAX   68?DATA  X H7%DATA 0! 7,o?DATA0! x! /DATAx! ! 0! / /DATA! " x! Ш| ?DATA" P" ! 8-?DATAP" " " s /DATA" " P" @. ?DATA" (# " `8=?DATA(# p# " @11 DATAp# # (# 8?DATA# $ p# 9?DATA$ H$ # 3 ?DATAH$ $ $ `9?DATA$ $ H$ 9?DATA$  % $ |?DATA % h% $ 9?DATAh% % % / ?DATA% % h% 8:?DATA% @& % 0c ?DATA@& & % :?DATA& & @& :(?DATA& ' & ;!o?DATA' `' & }j ?DATA`' ' ' p;%?DATA' ' `' ;4o?DATA' 8( ' } DATA8( ( ' 0<DATA( ( 8( x<?DATA( ) ( <?DATA) X) ( =ֿDATAX) ) ) `=ֿDATA) ) X) t. ֿDATA) 0* ) =?DATA0* x* ) p ?DATAx* * 0* =G?DATA* + x* h"DATA+ P+ *  ?DATAP+ + + p>?DATA+ + P+ >?DATA+ (, + ??DATA(, p, + H??DATAp, , (, ?,?DATA, - p, ??DATA- H- , @@?DATAH- - - @?DATA- - H- p ?DATA-  . -  ?DATA . h. - @#?DATAh. . . (A?DATA. . h. u urveDATA. @/ . pAurveDATA@/ / . AurveDATA/ / @/ BAurveDATA/ 0 / xB CuDATA0 `0 / BJurveDATA`0 0 0 8C%x11DATA0 0 `0 @ urveDATA0 81 0 C@urveDATA81 1 0 C/ CuDATA1 1 81 آ% %x11DATA1 2 1 $ TubeDATA2 X2 1 r 2%x8DATAX2 2 2 urveDATA2 2 X2 PD CuDATA2 03 2 _ 3%x9DATA03 x3 2 DurveDATAx3 3 03 DurveDATA3 4 x3 @N urveDATA4 P4 3 ^ urveDATAP4 4 4 rurveDATA4 4 P4 = irclDATA4 (5 4 0E2%x8DATA(5 p5 4 xEHirclDATAp5 5 (5 EurveDATA5 6 p5 8FurveDATA6 H6 5 Hi ?DATAH6 6 6 F?DATA6 6 H6 F?DATA6  7 6 G׫DATA 7 h7 6 `G7?DATAh7 7 7 G?DATA7 7 h7 H?DATA7 @8 7 _ ?DATA@8 8 7 `H?DATA8 8 @8 H ?DATA8 9 8 pqY ?DATA9 `9 8 HG5DATA`9 9 9  DATA9 9 `9 I<DATA9 8: 9 I?DATA8: : 9 I?DATA: : 8: J?DATA: ; : PJ-?DATA; X; : J$͈=>DATAX; ; ; K =DATA; ; X; PK?DATA; 0< ; K?DATA0< x< ; KDATAx< < 0< (LDATA< = x< pL+DATA= P= < L>DATAP= = = MDATA= = P= `MDATA= (> = M)DATA(> p> = N DATAp> > (> hWZ DATA> ? p> @N DATA? H? > NDATAH? ? ? NDATA? ? H? ODATA?  @ ? XODATA @ h@ ? ODATAh@ @ @ O7DATA@ @ h@ HP,DATA@ @A @ PDATA@A A @ PCDATAA A @A `QDATAA B A QDATAB `B A QDATA`B B B 8RDATAB B `B (_ DATAB 8C B xRFREEDATA8C C B RDATAC C 8C SDATAC D C @SDATAD XD C S2FREEDATAXD D D SDATAD D XD TDATAD 0E D `TDATA0E xE D TrfacDATAxE E 0E TfDATAE F xE UDATAF PF E `UDATAPF F F UFDATAF F PF (VDATAF (G F pVDATA(G pG F V#DATApG G (G WDATAG H pG PWDATAH HH G W)iDATAHH H H WDATAH H HH 0XDATAH  I H xX'DATA I hI H X%DATAhI I I _ DATAI I hI (YDATAI @J I pY)DATA@J J I Y1rfacDATAJ J @J (ZDATAJ K J xZrfacDATAK `K J ZDATA`K K K [rfacDATAK K `K P[DATAK 8L K [DATA8L L K [DATAL L 8L \3DATAL M L \DATAM XM L \DATAXM M M ]'DATAM M XM x]DATAM 0N M ]DATA0N xN M 0| DATAxN N 0N ^;DATAN O xN [) DATAO PO N p^>DATAPO O O ^DATAO O PO _DATAO (P O @_DATA(P pP O _DATApP P (P _DATAP Q pP `-DATAQ HQ P x`DATAHQ Q Q `DATAQ Q HQ a/DATAQ  R Q haDATA R hR Q a002%DATAhR R R aDATAR R hR 8burveDATAR @S R xburveDATA@S S R bDATAS S @S cDATAS T S PcDATAT `T S c?DATA`T T T c5| DATAT T `T d%x6|DATAT 8U T `durveDATA8U U T durveDATAU U 8U d^DATAU V U 8eDATAV XV U eCDATAXV V V e,DDATAV V XV fCDATAV 0W V Pf,DDATA0W xW V f^DATAxW W 0W fDATAW X xW (gz?DATAX PX W pg#CDATAPX X X gDATAX X PX h3DATAX (Y X hh!DATA(Y pY X hDATApY Y (Y i DATAY Z pY PiDATAZ HZ Y iUDATAHZ Z Z jDATAZ Z HZ `j+DATAZ  [ Z j >DATA [ h[ Z kADATAh[ [ [ a DATA[ [ h[ xk>DATA[ @\ [ k6DATA@\ \ [ Pl/DATA\ \ @\ l+DATA\ ] \ mDATA] `] \ HmYDATA`] ] ] miDATA] ] `] j DATA] 8^ ] Mb DATA8^ ^ ] @j DATA^ ^ 8^ oZ DATA^ _ ^ hn7DATA_ X_ ^ S1 FREEDATAX_ _ _ Ks DATA_ _ X_ :< DATA_ 0` _ neDATA0` x` _ hovDATAx` ` 0` pMDATA` a x` pJDATAa Pa ` qUDATAPa a a q'DATAa a Pa q(DATAa (b a @r&DATA(b pb a rDATApb b (b r-propDATAb c pb @soperDATAc Hc b sDATAHc c c sDATAc c Hc tXDATAc  d c t!DATA d hd c tDATAhd d d : DATAd d hd 0uLDATAd @e d u1DATA@e e d v.DATAe e @e pvDATAe f e vDATAf `f e wDATA`f f f DATAf f `f HwDATAf 8g f wDATA8g g f wDATAg g 8g ({ FREEDATAg h g (0N DATAh Xh g x%ptDATAXh h h pxDATAh h Xh x+DATAh 0i h y+DATA0i xi h Py?DATAxi i 0i y8?DATAi j xi y?DATAj Pj i z?DATAPj j j hz+DATAj j Pj z?DATAj (k j z3?DATA(k pk j X{@?DATApk k (k {?DATAk l pk |urveDATAl Hl k X|3DATAHl l l |4DATAl l Hl }+DATAl  m l x}cle%DATA m hm l } urveDATAhm m m ~001%DATAm m hm hc 002%DATAm @n m H~DATA@n n m ~002%DATAn n @n ~DATAn o n "?DATAo `o n p"տ?DATA`o o o >ݱDATAo o `o 0?DDATAo 8p o 0DATA8p p o DATAp p 8p  DATAp q p H-DATAq Xq p ";GDATAXq q q I`FDATAq q Xq p(0FDATAq 0r q Ȃ# FDATA0r xr q ! FDATAxr r 0r h`FDATAr s xr Z DATAs Ps r ?DATAPs s s 0%?DATAs s Ps ?DATAs (t s Є8?DATA(t pt s 8%?DATApt t (t DATAt u pt ؅,`3GDATAu Hu t 8&;GDATAHu u u $DATAu u Hu DATAu  v u 0DATA v hv u xDATAhv v v DATAv v hv DATAv @w v @DATA@w w v DATAw w @w ЈDATAw x w ?DATAx `x w X!?DATA`x x x $?DATAx x `x ?DATAx 8y x P?DATA8y y x ?DATAy y 8y Њ?DATAy z y (?DATAz Xz y h4?DATAXz z z Ћ5?DATAz z Xz 8)?DATAz 0{ z  ?DATA0{ x{ z ?DATAx{ { 0{ (?DATA{ | x{ h?DATA| P| { ?DATAP| | ?DATAP| (?DATA(h%?DATA(p FDATAp(`FDATAp`?DATAH0?DATAH4/DATAخHxDATAخ DATA hخDATAh PDATAhDATA@DATA@0DATAа@xDATAаȒDATA`аDATA`XDATA`DATA8DATA8 tDATAȲ8t ?DATAȲx$ *DATAXȲ8%DATAXPu DATAX.*DATA0-*DATA0xP*DATAx01?DATAxDATAP@ FDATAPDATAPؖ!?DATA((#?DATA(px?DATAp(?DATAp ?DATAH@?DATAH?DATAطH?DATAط (?DATA hطp ?DATAh  XG=DATAh?DATA@7?DATA@pF>DATAй@C?DATAй8y DATA`йX%DATA`DATA`'?DATA8PDATA8@DATAȻ8*DATAȻ DATAXȻhDATAXF`FDATAX00FDATA0pFؿDATA0xtDATAx08-EDATAx-DATAP-DATAP1 DATAPXG DATA(CDATA(p0DATAp(( DATApE EDATAHȉ' DATAH(F ?DATAH7 xDATA xF ADATA h DATAh F <DATAhXG DATA@G P?DATA@(H ?DATA@pH F?DATAH 9DATA`PI JDATA`I >DATA`8J !DATA8p `13DATA8J #wwwDATA8J wwwDATA K DATAXhK pDeDATAXK eeeDATAXK DATA0@L 빜DATA0xPQ eeeDATAx0L wwwDATAxL DATAPM pDeDATAP`M eeeDATAPwwwDATA(M $MLMDATA(pN LLLDATAp(@N ,sDATApN &`hDATAHN DnlDATAHpO PDATAHO 1DATA PP $DATA hP 3.002DATA8T 3DATA0U ,x6| DATAXU 6%x7DATAXU x6| DATAX0V 3DATA0xV xe.00DATA0x W )| DATAx0xW CurvDATAxW 3x6| DATAP(X  CurDATAPhX $rveCDATAPX (rveCDATA(Y DATA(pXY DATAp(Y (BDATApY ?DATAH0Z DATAHxZ DATAHZ  DATA Z 18?DATA hX[ JDATAh [ .8?DATAh0\ 8?DATA@\  DATA@\ DATA@] ,7| DATAh] )DATA`] DATA`^ 0DATA``^ x= DATA8^ DATA8^  DATA80_ !8?DATA-  DATAX_ *DATAX_ +8?DATAX0` 8?DATA0x` )xDATA0x*( DATAx0` 38?DATAxhP 8?DATAP0a 7| DATAPxa 3DATAPa Q8?DATA(z  DATA(pXb 5x! DATAp(Q DATAp`{P DATAH0U 8?DATAHb %8 DATAHc DATA x) DATA hhc )8?DATAh c DATAhd NDATA@d '8?DATA@d DATA@ e DATAhe 8?DATA`e $7| DATA`f UDATA`Hf 5 DATA8f *DATA8DATA8g *8?DATA N DATAX`g 3DATAXg *x! DATAXxM DATA0h 5DATA0x$Q 8?DATAx0;Y 8 DATAxh ,8?DATAPh DATAP(i "DATAPxi $>~ DATA(i DATA(pj $8?DATAp(hj DATApj DATAH Y  DATAHj M]C DATAHpk hC= DATA k 3]C DATA hl DATAh Xl 7| DATAhl (8?DATA@m 8?DATA@Pm  DATA@m P)~ DATAm xDATA`n  DATA``n DATA`n DATA8n ;DATA8@o -DATA8o DATAo ŷ?DATAXp CIDATAXp +DATAXp 4DATA0(q DATA0xpq DATAx0H&F _DATAxq @DATAPq qqqqDATAP lq qDATAP@r x DATA(r DATA(pr qqqqDATAp(s qqqqDATApHs DATAHs qqqqDATAHs !qqqqDATAHt qqqqDATA `t nnnnDATA ht atalDATAh t IT GDATAh8u omanDATA@xu &lifiDATA@` q뼾DATA@u 'DATA(v ?DATA`pv DATA`v ?DATA`w DATA8Hw .DATA80 DATA8}s DATAw DATAXw :DATAX@x WeDATAXx =DATA0x DATA0x8y WeDATAx0y 1DATAxy DATAP(z "DATAP DATAPa DATA(xz WeDATA(pz DATAp({ 9p/DATApX{ @DATAH{ DATAH DATAH| !DATA X| X DATA h| RDATAh | YDATAh(x r DATA@p} r DATA@} 0DATA@~ DATAT DATA``~ DATA`~ X DATA`~ ,1DATA8@ DATA8{ 9p/DATA8 DATA! DATAX ջDATAX DATAXp DATA0 DATA0xeU DATAx0 DATAxH DATAP 'DATAP DATAP聋 DATA(0 @X DATA(p xDATAp( DATAp0 #DATAH DATAHȃ /DATAH( tDATA p DATA h& :p/DATAh  B DATAh 0DATA@` ƥ=DATA@ WDATA@8 DATAx ,@DATA`؆ DATA`@/ F̻DATA` F̻DATA8h @DATA8؇ DATA8 )DATAp DATAX DATAX @g;DATAXX DATA0x1 9p/DATA0xXDATAx0} ;DATAx 8=DATAP ?DATAPH $^@@DATA8x ?DATA8 urveDATA 2| DATAXH  DATAX rve.DATAXؘ urveDATA0 2| DATA0xh ) DATAx0 urveDATAx0j urveDATAP .003DATAP`O5| DATAPa_ 001%DATA(  urveDATA(p@ .003DATAp( rve.DATApȚ urveDATAH rveCDATAHP  DATAH rve.DATA ؛ urveDATA h rveCDATAh X eCirDATAh urveDATA@؜ rveCDATA@;1 eCirDATA@ rveCDATAX@ eCirDATA`X rveCDATA` eCirDATA` rve.DATA8 urveDATA8` rveCDATA8 :001%DATA CurvDATAXH urveDATAX 2| DATAX؟ DATA0 5| DATA0 x  001%DATAx  0   rve.DATA !x xf DATA!P! | 2| DATAP!!!D ve.0DATA!!P!X  SurDATA!("!  DATA("p"!蠋 rve.DATAp""("0 urveDATA"#p"h ".003DATA#H#" -4DATAH### 4DATA##H#`  SurDATA# $# '002%DATA $h$# urveDATAh$$ $P urveDATA$$h$ $x13|DATA$@%$ veCiDATA@%%$0 "ve.0DATA%%@% urveDATA%&%Ȥ #2| DATA&`&% - DATA`&&&x '| DATA&&`&F /urveDATA&8'&hF 4J DATA8''&F  DATA''8'F rve.DATA'('0F urveDATA(X('xF 2| DATAX(((ȪF 002%DATA((X(F 5| DATA(0)(PF urveDATA0)x)(F eCirDATAx))0)ثF 7x6| DATA)*x)@F (4DATA*P*)F )urveDATAP***F #e.00DATA**P*@F - DATA*(+*F -| DATA(+p+*F /| DATAp++(+`F '| DATA+,p+F urveDATA,H,+F urveDATAH,,,XF x13|DATA,,H,F 'urveDATA, -,F e.00DATA -h-,(F 5| DATAh-- -pF urveDATA--h-F x13|DATA-@.-F 002%DATA@..-PF 5| DATA..@.F urveDATA./.F x13|DATA/`/.(F eCirDATA`///pF ?rve.DATA//`/F 4DATA/80/(F 4DATA800/xF 002%DATA0080F 5| DATA010F 6urveDATA1X10hF urveDATAX111F rveCDATA11X1F 0urveDATA1021@F urveDATA02x21F 2| DATAx2202ȵF 5| DATA23x2F &urveDATA3P32`F e.00DATAP333F 5| DATA33P3F urveDATA3(43F ".003DATA(4p43hF 4DATAp44(4F urveDATA45p4F 4001%DATA5H54XF CurvDATAH555F (urveDATA55H5F e.00DATA5 65(F eCirDATA 6h65hF urveDATAh66 6F 2| DATA66h6F cle%DATA6@760F urveDATA@776xF urfTDATA77@7F eCirDATA787F rve.DATA8`87HF urveDATA`888F 001%DATA88`8ȻF *5| DATA8898 F urveDATA8998`F rveCDATA9989F eCirDATA9:9F rve.DATA:X:98F ?DATAX:::xF DATA::X:F ?DATA:0;:F ?DATA0;x;:HF ?DATAx;;0;F ?DATA;<x;ȾF "?DATA<P<;F ?DATAP<<<`F ?DATA<<P<F ?DATA<(=<F ?DATA(=p=<0F ?DATAp==(=F ?DATA=>p=F "?DATA>H>=F ?DATAH>>>hF ?DATA>>H>F DATA> ?>F ?DATA ?h?>0F ?DATAh?? ?pF =DATA??h?F S?DATA?@@?`F 7DATA@@@?F )?DATA@@@@ F DATA@A@hF ?DATAA`A@F ?DATA`AAAF ?DATAAA`A0F `DATAA8BApF +>DATA8BBAF ?DATABB8BF ׀=DATABCBF DATACXCBF DATAXCCCJb ?DATACCXC0F ?DATAC0DCpF #?DATA0DxDCF DATAxDD0DF +>DATADExDHF ?DATAEPEDF !?DATAPEEEF `DATAEEPE0F ?DATAE(FEpF ?DATA(FpFEF ׀=DATApFF(FF ?DATAFGpF0F ?DATAGHGFpF *׀=DATAHGGGF &DATAGGHG F <ϽDATAG HGF DATA HhHGF DATAhHH HF ?DATAHHhHXF u?DATAH@IHF :DATA@IIHhF 6?DATAII@IF -?DATAIJI0F ,?DATAJ`JIF DATA`JJJF ?DATAJJ`J(F C?DATAJ8KJF DATA8KKJF DATAKK8KF $?DATAKLKpF &DATALXLKF DATAXLLLF N?DATALLXLF q>DATAL0ML8F iDATA0M LF ?DATA h 0MF ?DATAh  hF zP>DATA  h F ?DATA @ F ?DATA@  8F ?DATA  @ xF G?DATA  F GDATA ` hF *DATA`   F ?DATA  ` F B?DATA 8 xF DATA8  F -jZ;DATA  8 F headDATA  `F 9DATA X F DATAX   F headDATA  X PF .DATA 0 F  DATA0 x F EDATAx  0 pF DATA  x F  DATA P F =win DATAP   hF -headDATA  P F 'DATA ( F !DATA( p pF DATAp  ( F win DATA  p F DATA H PF jZ;DATAH  F win DATA  H F DATA  F jZ;DATA h `F DATAh  F ?DATA  h F DATA @ @F win DATA@  F DATA  @ F ƒ?DATA  F DATA ` XF DATA`   F $jZ;DATA  ` F ,win DATA 8  HF DATA8   F DATA  8 F DATA   F DATA X  hF ƒ?DATAX   F DATA  X F headDATA 0  8F DATA0 x  F DATAx  0 F DATA  x F *ƒ?DATA P  XF DATAP   F headDATA  P F DATA (  @F ?DATA( p  F 'DATAp  ( F win DATA  p F DDATA H  pF DATAH   F $win DATA  H F DDATA    PF ADATA  h  F DATAh   F .DATA  h 0F headDATA @  xF DATA@   F DATA  @ F jZ;DATA  @F %DATA ` F DATA`   F $headDATA  ` 8F CDATA 8 F DATA8  F DATA  8 F DATA  PF ,?DATA X F DATAX   F 'win DATA  X XF "DDATA 0 F DATA0 x F DATAx  0 8F headDATA  x pF DATA P F ,win DATAP   F DATA  P hF +DATA (  F &DATA( p  F headDATAp  ( `F DATA  p F 1DATA H  F DATAH   `F win DATA  H F DATA    F headDATA  h  (F DATAh   `F win DATA  h F DATA @  F DATA@   PF DATA  @ F 'headDATA   F CDATA `  @F ,?DATA`   F DATA  ` F win DATA 8  8F DATA8   F ƒ?DATA  8 F win DATA   F ,DATA X  `F  DATAX   F *DATA  X F $headDATA 0  `F CDATA0 x  F ?DATAx  0 F /DATA  x PF win DATA P  F DATAP   F ƒ?DATA  P F DATA (  `F ?DATA( p  F DATAp  ( F DATA  p 8F DATA H  F headDATAH   F %DATA  H 0F DATA    xF ,DATA  h  F win DATAh   (F DATA  h pF DATA @  F DATA@   F headDATA  @ 8F DATA   F win DATA `  F <DATA`   @F DATA  ` F ?DATA 8  F 'DATA8   (F win DATA  8 hF DATA   F jZ;DATA X  F DATAX   (F pADATA  X hF headDATA 0  F DATA0 x  F DATAx  0 0F DATA  x xF ƒ?DATA P  F ,DATAP   G #headDATA  P pG DATA (! G DATA(! p! G DATAp! ! (! HG +DATA! " p! G (DATA" H" ! G headDATAH" " " @G DATA" " H" xG win DATA"  # " G 'DATA # h# " G +DATAh# # # Y DATA# # h# @0 DATA# @$ # xG 1DATA@$ $ # G  DATA$ $ @$ G DATA$ % $ `G DATA% `% $ G ƒ?DATA`% % % G DATA% % `% 8G headDATA% ो % G DATAो ( % G ?DATA( p ो G headDATAp  ( HG +DATA  p G 'DATA H G +DATAH  PG 'win DATA ا H G DDATAا  G headDATA h ا (G DATAh  `G win DATA  h G )DATA @ G /DATA@  ` G DATA Щ @ G headDATAЩ  G DATA ` Щ H G DATA`   G DATA  ` G +DATA 8 ( G DATA8  ` G $%DDATA ȫ 8 G DATAȫ  G *DATA X ȫ H G headDATAX   G DATA 謋 X G *DATA謋 0 G DATA0 x 謋 X G DATAx  0 G DATA  x G !headDATA P 0G DATAP   G DATA ஋ P G .headDATA஋ ( G )DATA( p ஋ pG DATAp  ( G !DATA  p G %win DATA H hG DDATAH  G DATA ذ H G win DATAذ  (G pADATA h ذ xG DATAh  G /DATA  h G DATA @ HG headDATA@  G DATA в @ G DATAв  G +headDATA ` в pG pBDATA`   G (DATA  ` G DATA 8 XG #win DATA8  G 2DATA ȴ 8 G  DATAȴ  PG "DATA X ȴ G headDATAX   G DATA 赋 X 0G ?DATA赋 0 G DATA0 x 赋 G win DATAx  0 G DATA  x @G DATA P G DATAP   G win DATA ෋ P G :DATA෋ ( hG :DATA( p ෋ G DATAp  ( G DATA  p XG ƒ?DATA H G win DATAH  G DATA ع H G 0DATAع  pG win DATA h ع G DATAh  G DATA  h G )DATA @ pG DATA@  G DATA л @ G DATAл  G )DATA ` л pG DATA`   G DATA  ` G BDATA 8 PG DATA8  G DATA Ƚ 8 G DATAȽ  (G headDATA X Ƚ xG DATAX   G ,DATA 辋 X G DATA辋 0 HG #headDATA0 x 辋 G ,DATAx  0 G 5 DATA  x ` G DATA P G DATAP   G 'DATA  P @!G ,DATA ( IDATA( p xW DATAp  ( !G DATA ‹ p !G win DATA‹ H‹ "G DATAH‹ ‹ ‹ p"G DATA‹ ‹ H‹ "G DATA‹  Ë ‹ #G headDATA Ë hË ‹ P#G DATAhË Ë Ë #G !?DATAË Ë hË #G mDATAË @ċ Ë 8$G 8X@DATA@ċ ċ Ë $G DATAċ ċ @ċ $G XDATAċ ŋ ċ X%G $[DATAŋ `ŋ ċ %G DATA`ŋ ŋ ŋ %G ?DATAŋ ŋ `ŋ @&G ~C@DATAŋ 8Ƌ ŋ &G DATA8Ƌ Ƌ ŋ &G DATAƋ Ƌ 8Ƌ 'G W?DATAƋ Nj Ƌ 'G 7DATANj XNj Ƌ (G DATAXNj Nj Nj 8(G 1DATANj Nj XNj p(G ,DATANj 0ȋ Nj (G DATA0ȋ xȋ Nj )G *_pDATAxȋ ȋ 0ȋ P)G '13DATAȋ ɋ xȋ )G DATAɋ Pɋ ȋ )G DATAPɋ ɋ ɋ 0*G DATAɋ ɋ Pɋ p*G DATAɋ (ʋ ɋ *G BJ3DATA(ʋ pʋ ɋ (+G ]DATApʋ ʋ (ʋ x+G * % DATAʋ ˋ pʋ +G ?$ DATAˋ Hˋ ʋ @,G /DATAHˋ ˋ ˋ ,G DATAˋ ˋ Hˋ ,G DATAˋ  ̋ ˋ -G /DATA ̋ h̋ ˋ p-G >DATAh̋ ̋ ̋ -G /DATA̋ ̋ h̋ .G #DATA̋ @͋ ̋ X.G 5DATA@͋ ͋ ̋ .G <DATA͋ ͋ @͋ 0/G DATA͋ ΋ ͋ /G #DATA΋ `΋ ͋ /G 2SSSDATA`΋ ΋ ΋ 00G 1r DATA΋ ΋ `΋ 0G MDATA΋ 8ϋ ΋ 1G \| DATA8ϋ ϋ ΋ P1G DATAϋ ϋ 8ϋ 1G DATAϋ Ћ ϋ 1G b qqDATAЋ XЋ ϋ 2G x DATAXЋ Ћ Ћ P2G  notDATAЋ Ћ XЋ 2G DATAЋ 0ы Ћ 2G DATA0ы xы Ћ 3G DATAxы ы 0ы P3G DATAы ҋ xы 3G DATAҋ Pҋ ы 3G DATAPҋ ҋ ҋ 4G DATAҋ ҋ Pҋ P4G (DATAҋ (Ӌ ҋ 4G DATA(Ӌ pӋ ҋ 4G DATApӋ Ӌ (Ӌ 05G (DATAӋ ԋ pӋ 5G 1 q DATAԋ Hԋ Ӌ 5G  DATAHԋ ԋ ԋ 6G %DATAԋ ԋ Hԋ x6G )DATAԋ  Ջ ԋ 6G )DATA Ջ hՋ ԋ (7G 2DATAhՋ Ջ Ջ x7G *?DATAՋ Ջ hՋ 7G DATAՋ @֋ Ջ 8G (DATA@֋ ֋ Ջ x8G 2DATA֋ ֋ @֋ 8G :?DATA֋ ׋ ֋ 09G DATA׋ `׋ ֋ p9G 2DATA`׋ ׋ ׋ 9G 3DATA׋ ׋ `׋ 9G DATA׋ 8؋ ׋ 0:G DATA8؋ ؋ ׋ :G DATA؋ ؋ 8؋ :G 2DATA؋ ً ؋ ;G 4DATAً Xً ؋ H;G xDATAXً ً ً ;G >DATAً ً Xً G DATAۋ (܋ ۋ >G DATA(܋ p܋ ۋ >G 2DATAp܋ ܋ (܋ ?G %3DATA܋ ݋ p܋ `?G DATA݋ H݋ ܋ ?G 2DATAH݋ ݋ ݋ ?G 3DATA݋ ݋ H݋ @G DATA݋  ދ ݋ h@G 0DATA ދ hދ ݋ @G DATAhދ ދ ދ AG JDATAދ ދ hދ xAG -DATAދ @ߋ ދ AG 2DATA@ߋ ߋ ދ BG 'DATAߋ ߋ @ߋ xBG DATAߋ  ߋ BG (DATA ` ߋ CG DATA`   PCG DATA  ` CG 8DATA 8 CG DATA8  8DG DATA  8 xDG %DATA  DG &DATA X (EG DATAX   hEG 2DATA  X EG ?DATA 0 EG DATA0 x 8FG DATAx  0 xFG DATA  x FG KE8DATA P (GG E8DATAP   `GG DATA  P GG DATA ( GG "DATA( p (HG #9?DATAp  ( `HG $E8DATA  p HG DATA H HG <DATAH  hIG DATA  H IG E8DATA  IG 6DATA h PJG DATAh  JG &DATA h JG DATA0 KG DATA0x`KG DATAx0KG DATAxKG E8DATAPLG 2DATAPxLG ?`:8DATAPLG DATA((MG ;DATA(pMG ?DATAp(MG ?DATApNG DATAH`NG (DATAHNG ⧠?DATAHNG ?DATA 8OG DATA hpOG E8DATAh OG DATAhOG 27DATA@HPG 3E8DATA@PG >DATA@PG DATA0QG E8DATA`xQG (?DATA`QG DATA`RG E8DATA8PRG DATA8RG DATA8RG E8DATA SG ?DATAXhSG DATAXSG DATAXSG DATA00TG DATA0xpTG DATAx0TG 1E8DATAxUG DATAPPUG DATAPUG E8DATAPUG DATA((VG DATA(p`VG >DATAp(VG DATApVG E8DATAH(WG >DATAH`WG >DATAHWG $>DATA XG DATA hPXG %DATAh XG E8DATAhXG 3?DATA@@YG <DATA@YG DATA@YG DATA@ZG DATA`xZG E8DATA`ZG NDATA`H[G DATA8[G !DATA8[G (DATA8(\G DATAh\G DATAX\G ?DATAX]G DATAXH]G !DATA0]G (DATA0x]G DATAx00^G ?DATAxp^G gDATAP^G $DATAP_G ?DATAPH_G ?DATA(_G >DATA(p_G %DATAp(`G DATApH`G E8DATAHaG DATAHaG cDATAHbG DATA 0cG _DATA hcG XDATAh HdG ZDATAhdG 1DATA@0eG :8DATA@eG }?DATA@fG oDATA8gG _E8DATA`gG _E8DATA`XhG FE8DATA`hG $E8DATA8(iG DATA8xiG DATA8iG DATA jG DATA X wDATAX   PjG DATA  X jG *E8DATA 0  jG DATA0 x  0kG DATAx  0 pkG E8DATA  x kG @3 DATA P  kG DATAP   0lG pDATA  P plG AudDATA (  lG ew %DATA( p  lG ButtDATAp  ( @mG ImagDATA  p mG ndowDATA H  mG 11|TDATAH   nG ew DATA  H XnG ButtDATA   nG 3|%lDATA h nG rowsDATAh oG indoDATAhhoG ew %DATA@0x4|NDATA@oG 5ndowDATA@pG WindDATAPpG riptDATA`pG itorDATA`pG ndowDATA`qG AudDATA8`qG ew %DATA8qG x4|NDATA8qG &itorDATA#!BPYDATA """DATA0. Name: 'Unfold'DATAE Blender: 243=DATAF~ Group: 'Mesh'=DATA$Tip: 'Unfold meshes to create nets'DATAd Version: v2.2.4DATAAuthor: Matthew ChadwickDATA """DATA) import BlenderDATA`from Blender import *ֽDATA from Blender.Mathutils import *DATAptry:DATA }  import sysDATA import tracebackDATA  import mathDATA x_  import reDATAiO  from math import *DATA Y  import sysDATAx import randomDATA4 import xml.sax, xml.sax.handler, xml.sax.saxutilsDATAX.  DATA4X # annoying but need so classes dont raise errorsDATAD xml_sax_handler_ContentHandler = xml.sax.handler.ContentHandlerDATA8y DATA@1 except:DATAT( Draw.PupMenu('Error%t|A full python installation is required to run this script.')DATA 0W  xml = NoneDATA, xml_sax_handler_ContentHandler = type(0)DATAy DATA __author__ = 'Matthew Chadwick'DATA P__version__ = '2.2.4 24032007'DATAH__url__ = ["http://celeriac.net/unfolder/", "blender", "blenderartist"]DATAD__email__ = ["post at cele[remove this text]riac.net", "scripts"]_ DATA&k __bpydoc__ = """\DATAb DATA Mesh Unfolder_ DATA+ DATA8Unfolds the selected mesh onto a plane to form a netDATA( DATA Not all meshes can be unfoldedDATA DATA @Meshes must be free of holes, DATAHisolated edges (not part of a face), twisted quads and other rubbish.DATA,Nice clean triangulated meshes unfold bestDATA@| DATAX`This program is free software; you can distribute it and/or modify it under the termsDATA\of the GNU General Public License as published by the Free Software Foundation; version 2EEDATA<por later, currently at http://www.gnu.org/copyleft/gpl.htmlDATAȾ DATA,The idea came while I was riding a bike.DATAh """ DATA0Y DATA(0# ***** BEGIN GPL LICENSE BLOCK *****M DATA#DATA@# This program is free software; you can redistribute it and/orDATA@# modify it under the terms of the GNU General Public LicenseDATADh# as published by the Free Software Foundation; either version 2REEDATA<# of the License, or (at your option) any later version.DATAqt #DATAD@# This program is distributed in the hope that it will be useful,I DATAD# but WITHOUT ANY WARRANTY; without even the implied warranty ofREEDATA@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theDATA0# GNU General Public License for more details.DATAhb #DATAD# You should have received a copy of the GNU General Public LicenseDATAL`# along with this program; if not, write to the Free Software Foundation, DATAD# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.DATA~) #DATA$H# ***** END GPL LICENCE BLOCK *****DATA) DATAV # Face lookup}DATAclass FacesAndEdges:DATA def __init__(self, mesh): DATAE  self.nfaces = 0DATA$(  # straight from the documentationDATADx  self.edgeFaces = dict([(edge.key, []) for edge in mesh.edges])REEDATA  for face in mesh.faces:DATAˮ face.sel = FalseDATA 0! for key in face.edge_keys:DATA(! self.edgeFaces[key].append(face)}DATA0! def findTakenAdjacentFace(self, bface, edge):DATA,8" return self.findAdjacentFace(bface, edge)DATAh" # find the first untaken (non-selected) adjacent face in the list of adjacent faces for the given edgeDATA,(# def findAdjacentFace(self, bface, edge):DATA(# faces = self.edgeFaces[edge.key()] DATA # for i in xrange(len(faces)):DATA($ if faces[i] == bface:a DATAp$ j = (i+1) % len(faces) DATA$ while(faces[j]!=bface):DATA % if faces[j].sel == False:DATAP% return faces[j]DATA% j = (j+1) % len(faces)DATA0U  return None}DATA % def returnFace(self, face):DATAXO  face.sel = FalseDATA@)  self.nfaces-=1DATA0& def facesTaken(self):DATAx& return self.nfacesDATA,& def takeAdjacentFace(self, bface, edge):DATA  if (edge==None):DATAC%  return NoneDATA,' face = self.findAdjacentFace(bface, edge)DATAk if(face!=None):DATA|(  face.sel = TrueDATA  self.nfaces+=1DATA`H return faceDATAp' def takeFace(self, bface):DATAc;  if(bface!=None):DATA@  bface.sel= TrueDATA@u  self.nfaces+=1DATA3  DATAhz  DATA'class IntersectionResult:i DATA(( def __init__(self, rn, rd, v=None):Bi DATAH1W  self.v = vDATA`Tz  self.rd = rdDATAyA  self.rn = rnDATAX( def intersected(self):DATA( return not(not(self.v))DATA( def isParallel(self):DATA0) return (self.rd==0)DATAx) def isColinear(self):DATA) return (self.rn==0)DATA* def intersection(self):DATAE  return self.vDATA0  DATAPP*# represents a line segment between two points [p1, p2]. the points are [x,y]_ DATAV7 class LineSegment:DATA* def __init__(self, p):DATAP}  self.p = pVJ DATA+ def intersects(self, s):DATA``+ rn = ((self.p[0].y-s.p[0].y)*(s.p[1].x-s.p[0].x)-(self.p[0].x-s.p[0].x)*(s.p[1].y-s.p[0].y)) DATAh+ rd = ((self.p[1].x-self.p[0].x)*(s.p[1].y-s.p[0].y)-(self.p[1].y-self.p[0].y)*(s.p[1].x-s.p[0].x))DATA$, # need an epsilon closeTo() hereDATA , if(rd<0.0000001 or rn==0.0): DATA$(- return IntersectionResult(rn,rd)DATA y  r = rn/rdDATApx- s = ((self.p[0].y-s.p[0].y)*(self.p[1].x-self.p[0].x)-(self.p[0].x-s.p[0].x)*(self.p[1].y-self.p[0].y)) / rdDATA0. i = (0.0<=r and r<=1.0 and 0.0<=s and s<=1.0)DATA Y  if not(i):DATAY  return NoneDATA4x. ix = self.p[0].x + r*(self.p[1].x - self.p[0].x) DATA4. iy = self.p[0].y + r*(self.p[1].y - self.p[0].y)DATAy)  t = 0.0001DATAp8/ if ( abs(ix-self.p[0].x)>t and abs(iy-self.p[0].x)>t and abs(ix-self.p[1].x)>t and abs(iy-self.p[1].y)>t ):}DATA</ return IntersectionResult( rn, rd,Vector([ix,iy,0.0]))DATA  else:DATAH  return None DATA(~  DATAh class LineSegments:DATA@0 def __init__(self, face):DATAXR self.face = faceDATA0 def segmentAt(self, i):DATA 0 if(i>self.face.nPoints()-1):DATAv  return NoneDATA 1 if(i==self.face.nPoints()-1):DATA X  j = 0o DATAX  else:DATA *  j = i+1DATA<p1 return LineSegment([ self.face.v[i], self.face.v[j] ])DATA(1 def iterateSegments(self, something): DATA`vE  results = []DATA(02 for i in xrange(self.face.nPoints()):DATA@2 results.extend(something.haveSegment(self.segmentAt(i))) g}DATA9  return resultsDATA02 def compareSegments(self, something, segment):DATAB  results = []DATA(X3 for i in xrange(self.face.nPoints()):DATAL3 results.append(something.compareSegments([self.segmentAt(i), segment])) DATA(  return resultsx4|DATA( DATA(4class FaceOverlapTest:?DATA$p4 def __init__(self, face1, face2):DATA 4 self.faces = [face1, face2]( DATAP5 self.segments = [ LineSegments(self.faces[0]), LineSegments(self.faces[1]) ]DATA5 def suspectsOverlap(self):DATA45 tests = self.segments[0].iterateSegments(self)J DATA A}  gi = 07DATA  for i in tests:8DATA(86 if( i!=None and i.intersected() ):?DATA t  gi+=1DATAp  return gi>0?DATA$6 def haveSegment(self, segment):DATA<6 return self.segments[1].compareSegments(self, segment)?DATA(H7 def compareSegments(self, segments):DATA07 return segments[0].intersects(segments[1])DATA DATA/  DATAШ|  DATA08# A fold between two faces with a common edgeDATA s class Fold:DATA @.  ids = -1DATA@`8 def __init__(self, parent, refPoly, poly, edge, angle=None):DATA@11  Fold.ids+=1DATA8 self.id = Fold.ids?DATA9 self.refPoly = refPolyDATA3  self.poly = polyDATA`9 self.srcFace = None?DATA9 self.desFace = None?DATA| self.edge = edgeDATA9 self.foldedEdge = edgeDATA/  self.rm = NoneDATA8: self.parent = parent?DATA0c  self.tree = NoneDATA: if(refPoly!=None):?DATA,: self.refPolyNormal = refPoly.normal()˪DATA$ ; self.polyNormal = poly.normal()?DATA}j  if(angle==None):DATA(p; self.angle = self.calculateAngle()?DATA8; self.foldingPoly = poly.rotated(edge, self.angle)DATA}  else:DATA0< self.angle = angle?DATAx< self.foldingPoly = polyDATA < self.unfoldedEdge = self.edgeDATA = self.unfoldedNormal = None?DATA `= self.animAngle = self.angle?DATAt.  self.cr = NoneDATA= self.nancestors = NoneDATAp  def reset(self):EEDATAH= self.foldingPoly = self.poly.rotated(self.edge, self.dihedralAngle())DATAh" def getID(self):?DATA  return self.id?DATAp> def getParent(self):?DATA> return self.parent?DATA? def ancestors(self):?DATA H? if(self.nancestors==None):?DATA0? self.nancestors = self.computeAncestors()/DATA? return self.nancestorsDATA @@ def computeAncestors(self): ?DATA@ if(self.parent==None):DATA p  return 0DATA  else:DATA$@ return self.parent.ancestors()+1DATA(A def dihedralAngle(self): DATAu  return self.angleDATApA def unfoldTo(self, f):DATA A self.animAngle = self.angle*fDATADB self.foldingPoly = self.poly.rotated(self.edge, self.animAngle)eCDATAxB def calculateAngle(self):1DATALB sangle = Mathutils.AngleBetweenVecs(self.refPolyNormal, self.polyNormal)0DATA8C if(sangle!=sangle):clDATA@ sangle=0.0 DATADC ncp = Mathutils.CrossVecs(self.refPolyNormal, self.polyNormal)veCDATA0C dp = Mathutils.DotVecs(ncp, self.edge.vector)DATAآ%  if(dp>0.0):11DATA$  return +sangle CDATAr  else:DATA  return -sangleDATAPD def alignWithParent(self):DATA_  passDATAD def unfoldedNormal(self):lDATA D return self.unfoldedNormal%x6DATA@N  def getEdge(self):DATA^  return self.edgeuDATAr def getFace(self):DATA=  return self.polyCDATA0E def testFace(self):rveDATALxE return Poly.fromVectors([self.edge.v1, self.edge.v2, Vector([0,0,0])])CurDATAE def unfoldedFace(self):rclDATA8F return self.foldingPolyclDATAHi  def unfold(self):DATAF if(self.parent!=None):DATA F self.parent.foldFace(self)8DATAG def foldFace(self, child):DATA8`G child.foldingPoly.rotate(self.edge, self.animAngle) DATAG if(self.parent!=None):DATA H self.parent.foldFace(child)?DATA_  DATA`Hclass Cut(Fold):DATA H  passDATApqY  DATAHH# Trees build folds by traversing the mesh according to a local measureDATA  class Tree:DATA@I def __init__(self, net, parent,fold,otherConstructor=None):"DATAI self.net = netDATAI self.fold = foldEDATAJ self.face = fold.srcFaceDATA0PJ self.poly = Poly.fromBlenderFace(self.face)R>DATA(J self.generations = net.generationsM.>DATAK self.growing = True?DATAPK self.tooLong = False?DATAK self.parent = parentcDATAK self.grown = FalseDATA(L if not(otherConstructor):DATA,pL self.edges = net.edgeIteratorClass(self)DATAL def goodness(self):facDATA M return self.edges.goodness()DATA`M def compare(self, other):DATA,M if(self.goodness() > other.goodness()):DATAN return +1ierDATAhWZ  else:DATA@N return -1andDATAN def isGrowing(self):DATAN return self.growingDATAO def beGrowing(self):DATAXO self.growing = TrueDATAO def grow(self):DATA8O self.tooLong = self.fold.ancestors()>self.generationsDATA0HP if(self.edges.hasNext() and self.growing):DATAP edge = self.edges.next()DATADP tface = self.net.facesAndEdges.takeAdjacentFace(self.face, edge)DATA`Q if(tface!=None):DATA Q self.branch(tface, edge)DATAQ if(self.parent==None):DATA8R self.grow()DATA(_  else:DATAxR self.grown = TrueriaDATAR def isGrown(self):DATAS return self.grownDATA@S def canGrow(self):DATA4S return (self.parent!=None and self.parent.grown)DATAS def getNet(self):1DATA T return self.netDATA`T def getFold(self):DATAT return self.foldDATAT def getFace(self):DATA U return self.faceDATA `U def branch(self, tface, edge):DATAHU fold = Fold(self.fold, self.poly, Poly.fromBlenderFace(tface), edge)DATA(V fold.srcFace = tfaceDATA pV self.net.myFacesVisited+=1DATA$V tree = Tree(self.net, self, fold)DATAW fold.tree = treeEDATAPW fold.unfold()DATA,W overlaps = self.net.checkOverlaps(fold)DATAW nc = len(overlaps)DATA0X self.net.overlaps+=ncDATA(xX if(nc>0 and self.net.avoidsOverlaps):DATA(X self.handleOverlap(fold, overlaps)DATA_  else:DATA(Y self.addFace(fold)DATA,pY def handleOverlap(self, fold, overlaps):DATA4Y self.net.facesAndEdges.returnFace(fold.srcFace)DATA (Z self.net.myFacesVisited-=1DATAxZ for cfold in overlaps:DATAZ ttree = cfold.treeDATA[ ttree.growing = TrueDATAP[ ttree.grow()DATA[ def addFace(self, fold):MDATA[ ff = fold.unfoldedFace()?DATA4 \ fold.desFace = self.net.addFace(ff, fold.srcFace)DATA \ self.net.folds.append(fold)DATA \ self.net.addBranch(fold.tree)DATA( ] fold.tree.growing = not(self.tooLong)DATA x] if(self.net.diffuse==False):DATA] fold.tree.grow()DATA0| DATA<^# A Net is the result of the traversal of the mesh by TreesDATA [) class Net:EDATA p^ def __init__(self, src, des):DATA^ self.src = srcDATA_ self.des = desDATA@_ self.firstFace = NoneDATA_ self.firstPoly = NoneDATA_ self.refFold = NoneDATA0` self.edgeIteratorClass = RandomEdgeIteratorDATAx` if(src!=None):DATA ` self.srcFaces = src.facesDATA0a self.facesAndEdges = FacesAndEdges(self.src)DATAha self.myFacesVisited = 001DATAa self.facesAdded = 0DATAa self.folds = []DATA8b self.cuts = []12DATAxb self.branches = []02%DATAb self.overlaps = 0DATA c self.avoidsOverlaps = True?DATAPc self.frame = 1REEDATAc self.ff = 180.0EEDATA c self.firstFaceIndex = None02%DATA d self.trees = 012DATA`d self.foldIPO = NoneveDATAd self.perFoldIPO = None005DATAd self.IPOCurves = {}DDATA8e self.generations = 128DATAe self.diffuse = TrueDATAe self.noise = 0.0DATAf self.grownBranches = 0REEDATAPf self.assignsUV = TrueDATAf self.animates = FalseDATAf self.showProgress = FalseDATA(g self.feedback = NoneDATA$pg def setSelectedFaces(self, faces):DATAg self.srcFaces = facesDATA4h self.facesAndEdges = FacesAndEdges(self.srcFaces)DATA$hh def setShowProgress(self, show):DATAh self.showProgress = showDATA$i # this method really needs workDATAPi def unfold(self):DATAXi selectedFaces = [face for face in self.src.faces if (self.src.faceUV and face.sel)]DATAj if(self.avoidsOverlaps):DATA,`j print "unfolding with overlap detection"DATA$j if(self.firstFaceIndex==None):DATADk self.firstFaceIndex = random.randint(0, len(self.src.faces)-1)DATAa  else:DATA@xk print "Using user-selected seed face ", self.firstFaceIndexDATA8k self.firstFace = self.src.faces[self.firstFaceIndex]DATA0Pl z = min([v.co.z for v in self.src.verts])-0.1DATA,l ff = Poly.fromBlenderFace(self.firstFace)DATAm if(len(ff.v)<3): DATA\Hm raise Exception("This mesh contains an isolated edge - it must consist only of faces")DATAlm testFace = Poly.fromVectors( [ Vector([0.0,0.0,0.0]), Vector([0.0,1.0,0.0]), Vector([1.0,1.0,0.0]) ] )DATA j  # hmmmREEDATAMb  u=0DATA@j  v=1DATAoZ  w=2DATA8hn if ff.v[u].x==ff.v[u+1].x and ff.v[u].y==ff.v[u+1].y:DATAS1  u=1DATAKs  v=2DATA:<  w=0EDATAhn # here we make a couple of folds, not part of the net, which serve to get the net into the xy planeDATAxho xyFace = Poly.fromList( [ [ff.v[u].x,ff.v[u].y, z] , [ff.v[v].x,ff.v[v].y, z] , [ff.v[w].x+0.1,ff.v[w].y+0.1, z] ] )DATAPp refFace = Poly.fromVectors([ ff.v[u], ff.v[v], xyFace.v[1], xyFace.v[0] ] )EEDATALp xyFold = Fold(None, xyFace, refFace, Edge(xyFace.v[0], xyFace.v[1] ))eDATAXq self.refFold = Fold(xyFold, refFace, ff, Edge(refFace.v[0], refFace.v[1] ))DATA(q self.refFold.srcFace = self.firstFaceDATA,q trunk = Tree(self, None, self.refFold)DATA(@r trunk.generations = self.generationsDATAr self.firstPoly = ffEEDATA0r self.facesAndEdges.takeFace(self.firstFace)DATA@s self.myFacesVisited+=1DATAs self.refFold.unfold()DATAs self.refFold.tree = trunkDATA\t self.refFold.desFace = self.addFace(self.refFold.unfoldedFace(), self.refFold.srcFace)kZ DATA$t self.folds.append(self.refFold)DATAt trunk.grow()DATA:  i = 0DATAP0u while(self.myFacesVisited 0):DATA4u if self.edgeIteratorClass==RandomEdgeIterator:DATA0v i = random.randint(0,len(self.branches)-1)DATApv tree = self.branches[i]DATAv if(tree.isGrown()):DATAw self.branches.pop(i)DATA  else:DATAHw tree.beGrowing()DATAw if(tree.canGrow()):DATAw tree.grow()6 DATA ({  i = 0mDATA (0N  else:DATA(x i = (i + 1) % len(self.branches)DATApx if self.src.faceUV:?DATA x for face in self.src.faces:DATAy face.sel = False?DATA Py for face in selectedFaces:?DATAy face.sel = TrueDATAy self.src.update()DATA z Window.RedrawAll()?DATAhz def assignUVs(self):?DATAz for fold in self.folds:DATA4z self.assignUV(fold.srcFace, fold.unfoldedFace())DATADX{ print " assigned uv to ", len(self.folds), len(self.src.faces)>DATA{ self.src.update()DATA | def checkOverlaps(self, fold):DATA4X| #return self.getOverlapsBetween(fold, self.folds)DATA8| return self.getOverlapsBetweenGL(fold, self.folds)DATA, } def getOverlapsBetween(self, fold, folds):DATAx} if(fold.parent==None):10|DATA} return []DATA~ mf = fold.unfoldedFace()1DATA hc  c = []DATAH~ for afold in folds:veDATA ~ mdf = afold.unfoldedFace()2|DATA~ if(afold!=fold):DATA$  it1 = FaceOverlapTest(mf, mdf)?DATA$p it2 = FaceOverlapTest(mdf, mf)>DATA@ overlap = (it1.suspectsOverlap() or it2.suspectsOverlap())DATA@0 inside = ( mdf.containsAnyOf(mf) or mf.containsAnyOf(mdf) )DATA4 if( overlap or inside or mdf.overlays(mf)):DATA c.append(afold)DATA   return cDATA0H def getOverlapsBetweenGL(self, fold, folds):DATA$ b = fold.unfoldedFace().bounds()EDATAL polys = len(folds)*4+16 # the buffer is nhits, mindepth, maxdepth, nameGDATA,p buffer = BGL.Buffer(BGL.GL_INT, polys)FDATA$Ȃ BGL.glSelectBuffer(polys, buffer)DATA$ BGL.glRenderMode(BGL.GL_SELECT)GDATAh BGL.glInitNames()DATA BGL.glPushName(0)DATA BGL.glPushMatrix()?DATA(0 BGL.glMatrixMode(BGL.GL_PROJECTION)DATA BGL.glLoadIdentity()?DATA<Є BGL.glOrtho(b[0].x, b[1].x, b[1].y, b[0].y, 0.0, 10.0)?DATA(8 #clip = BGL.Buffer(BGL.GL_FLOAT, 4)=DATA #clip.list = [0,0,0,0]DATA0؅ #BGL.glClipPlane(BGL.GL_CLIP_PLANE1, clip)DATA(8 # could use clipping planes here tooDATA( BGL.glMatrixMode(BGL.GL_MODELVIEW)DATA BGL.glLoadIdentity()DATA0 bx = (b[1].x - b[0].x)DATAx by = (b[1].y - b[0].y)DATA cx = bx / 2.0DATA cy = by / 2.0DATA @ for f in xrange(len(folds)):DATA afold = folds[f]DATAЈ if(fold!=afold):DATA BGL.glLoadName(f)?DATA$X BGL.glBegin(BGL.GL_LINE_LOOP)DATA( for v in afold.unfoldedFace().v:DATA  BGL.glVertex2f(v.x, v.y)?DATAP BGL.glEnd()DATA BGL.glPopMatrix()DATAЊ BGL.glFlush()DATA, hits = BGL.glRenderMode(BGL.GL_RENDER)K!DATA8h buffer = [buffer[i] for i in xrange(3, 4*hits, 4)]DATA8Ћ o = [folds[buffer[i]] for i in xrange(len(buffer))]DATA,8 return self.getOverlapsBetween(fold, o)ĽDATA$ def colourFace(self, face, cr):DATA for c in face.col:?DATA( c.r = int(cr[0])DATAh c.g = int(cr[1])DATA c.b = int(cr[2])DATA c.a = int(cr[3])DATA( self.src.update()DATA(h def setAvoidsOverlaps(self, avoids):DATA  self.avoidsOverlaps = avoidsDATA  def addBranch(self, branch):GDATA ` self.branches.append(branch)DATA4 if self.edgeIteratorClass!=RandomEdgeIterator:?DATA8 self.branches.sort(lambda b1, b2: b1.compare(b2))DATAx def srcSize(self):DATA  return len(self.src.faces)DATA def nBranches(self):DATAP return len(self.branches)DATA def facesCreated(self):REEDATA  return len(self.des.faces)DATA0 def facesVisited(self):DATA x return self.myFacesVisitedDATAȒ def getOverlaps(self):DATA return self.overlapsDATA X def sortOutIPOSource(self):DATA print "Sorting out IPO"DATA if self.foldIPO!=None:DATA   returnEEDATA t  o = NoneEDATAx$  try:DATA(8 o = Blender.Object.Get("FoldRate")DATA Pu  except:DATA0 o = Blender.Object.New("Empty", "FoldRate")0DATA0 Blender.Scene.GetCurrent().objects.link(o)DATAP if(o.getIpo()==None):DATA4 ipo = Blender.Ipo.New("Object", "FoldRateIPO")DATA z = ipo.addCurve("RotZ")DATA$@ print " added RotZ IPO curve"DATA z.addBezier((1,0))?DATA$ؖ # again, why is this 10x out ?DATA$( z.addBezier((180, self.ff/10.0))DATAx z.addBezier((361, 0.0))DATA o.setIpo(ipo)REEDATA z.recalc()?DATA @ z.setInterpolation("Bezier")DATA  z.setExtrapolation("Cyclic")DATA self.setIPOSource(o)?DATA( print " added IPO source"DATA$p def setIPOSource(self, object):DATA  try:?DATA self.foldIPO = objectDATA8 for i in xrange(self.foldIPO.getIpo().getNcurves()):DATAHp self.IPOCurves[self.foldIPO.getIpo().getCurves()[i].getName()] = iDATAD print " added ", self.foldIPO.getIpo().getCurves()[i].getName()DATA 8y  except:DATA(X print "Problem setting IPO object"ֽDATA print sys.exc_info()[1]DATA( traceback.print_exc(file=sys.stdout)DATA P def setFoldFactor(self, ff):?DATA self.ff = ffDATA def sayTree(self):DATA  for fold in self.folds:DATA h if(fold.getParent()!=None):DATAH print fold.getID(), fold.dihedralAngle(), fold.getParent().getID()DATA0 def report(self):DATAHp p = int(float(self.myFacesVisited)/float(len(self.src.faces)) * 100)DATA  print str(p) + "% unfolded"DATA08 print "faces created:", self.facesCreated()?DATA0 print "faces visited:", self.facesVisited()DATA0 print "originalfaces:", len(self.src.faces)DATA1  n=0?DATAX if(self.avoidsOverlaps): DATAD print "net avoided at least ", self.getOverlaps(), " overlaps ",DATA4 n = len(self.src.faces) - self.facesCreated()DATA (  if(n>0):DATAHE  print "but was unable to avoid ", n, " overlaps. Incomplete net."?DATA ȉ'  else:DATA (F  print "- A complete net."DATA7  else:DATADxF  print "net has at least ", self.getOverlaps(), " collision(s)"?DATA   return nDATA@F  # fold all my folds to a fraction of their total fold angleDATA$XG  def unfoldToCurrentFrame(self):DATATG  self.unfoldTo(Blender.Scene.GetCurrent().getRenderingContext().currentFrame())DATA(H  def unfoldTo(self, frame):DATAHpH  frames = Blender.Scene.GetCurrent().getRenderingContext().endFrame()DATA<H  if(self.foldIPO!=None and self.foldIPO.getIpo()!=None):DATALPI  f = self.foldIPO.getIpo().EvaluateCurveOn(self.IPOCurves["RotZ"],frame)DATA@I  # err, this number seems to be 10x less than it ought to beDATA$8J  fff = 1.0 - (f*10.0 / self.ff)DATAp  else:DATA$J  fff = 1.0-((frame)/(frames*1.0))DATAJ  for fold in self.folds:DATA K  fold.unfoldTo(fff)wDATAhK  for fold in self.folds:DATAK  fold.unfold()REEDATA K  tface = fold.unfoldedFace()DATA@L  bface = fold.desFaceDATA PQ  i = 0++DATAL  for v in bface.verts:DATAL  v.co.x = tface.v[i].xwDATAM  v.co.y = tface.v[i].yDATA`M  v.co.z = tface.v[i].zDATA  i+=1DATA(M  Window.Redraw(Window.Types.VIEW3D) DATAN  return NonewDATA0@N  def addFace(self, poly, originalFace=None):DATA(N  originalLength = len(self.des.verts)DATAHN  self.des.verts.extend([Vector(vv.x, vv.y, vv.z) for vv in poly.v])DATATpO  self.des.faces.extend([ range(originalLength, originalLength + poly.size()) ])?DATA4O  newFace = self.des.faces[len(self.des.faces)-1]DATA(PP  newFace.uv = [vv for vv in poly.v]DATA4P  if(originalFace!=None and self.src.vertexColors):DATA0Q  newFace.col = [c for c in originalFace.col]DATAhQ  if(self.feedback!=None):DATA@Q  pu = str(int(self.fractionUnfolded() * 100))+"% unfolded"003DATAT R  howMuchDone = str(self.myFacesVisited)+" of "+str(len(self.src.faces))+" "+pu%xDATA$R  self.feedback.say(howMuchDone) DATA$R  #Window.DrawProgressBar (p, pu) DATA@S  if(self.showProgress):x10DATA(S  Window.Redraw(Window.Types.VIEW3D)rvDATAS  return newFace CuDATA T  def fractionUnfolded(self):x2|DATA@pT  return float(self.myFacesVisited)/float(len(self.src.faces))3DATA T  def assignUV(self, face, uv):DATA00U  face.uv = [Vector(v.x, v.y) for v in uv.v]veCDATA U  def unfoldAll(feedback=None):CDATA$U  objects = Blender.Object.Get()x10DATA0V  for object in objects: DATA|xV  if(object.getType()=='Mesh' and not(object.getName().endswith("_net")) and len(object.getData(False, True).faces)>1): ODATA, W  net = Net.createNet(object, feedback)x1DATA xW  net.searchForUnfolding() DATA4W  svg = SVGExporter(net, object.getName()+".svg")DATA(X  svg.export()REEDATA(hX  unfoldAll = staticmethod(unfoldAll)CurDATA,X  def searchForUnfolding(self, limit=-1):DATAY  overlaps = 1DATAXY  attempts = 0DATA,Y  while(overlaps > 0 or attempts=0 and (mesh.faces[mesh.activeFace].sel):DATA(d  net.firstFaceIndex = mesh.activeFaceDATAd  net.object = obEEDATA e  net.feedback = feedbackDATAhe  return netDATA(e  createNet = staticmethod(createNet)>~ DATAf  def importNet(filename):~ DATA8Hf  netName = filename.rstrip(".svg").replace("\\","/")DATA,f  netName = netName[netName.rfind("/")+1:] DATA try:DATA,g  netObject = Blender.Object.Get(netName)DATA N  except:DATA4`g  netObject = Blender.Object.New("Mesh", netName)DATA,g  netObject.getData(mesh=1).name = netName DATAxM  try:DATA8h  Blender.Scene.GetCurrent().objects.link(netObject)DATA $Q  except:DATA;Y  passDATA0h  net = Net(None, netObject.getData(mesh=1))aDATAh  handler = NetHandler(net)DATA$(i  xml.sax.parse(filename, handler)DATA(xi  Window.Redraw(Window.Types.VIEW3D)* DATAi  return netDATA(j  importNet = staticmethod(importNet)UDATAhj  def getSourceMesh(self):DATAj  return self.srcEEDATA Y  DATAPj # determines the order in which to visit faces according to a local measure DATApk class EdgeIterator:DATA4k  def __init__(self, branch, otherConstructor=None):DATAl  self.branch = branchDATA Xl  self.bface = branch.getFace()DATA,l  self.edge = branch.getFold().getEdge()UDATA m  self.net = branch.getNet() DATAPm  self.n = len(self.bface)DATAm  self.edges = []EEDATAm  self.i = 0ADATAn  self.gooodness = 0! DATA`n  self.createEdges()DATAn  self.computeGoodness()DATA n  if(otherConstructor==None):DATA@o  self.sequenceEdges()DATAo  def createEdges(self):DATAo  edge = NoneDATADp  e = Edge.edgesOfBlenderFace(self.net.getSourceMesh(), self.bface)DATAp  for edge in e:ĕ DATA8p  if not(edge.isBlenderSeam() and edge!=self.edge):DATA(q  self.edges.append(edge)DATApq  def sequenceEdges(self):DATAH&F  passDATAq  def next(self):REEDATAq  edge = self.edges[self.i]DATA   self.i+=1DATA@r  return edge> DATAr  def size(self):REEDATAr  return len(self.edges)qqqDATAs  def reset(self):##DATAHs  self.i = 0DATAs  def hasNext(self):DATA$s  return (self.iDATAD0  f = self.net.facesAndEdges.findAdjacentFace(self.bface, edge)DATA  if(f!=None):DATA$  p2 = Poly.fromBlenderFace(f)DATA$0  fold = Fold(None, p1, p2, edge)DATA  fold.srcFace = fDATA0ȃ  b = Tree(self.net, self.branch, fold, self)DATA(  c = Curvature(b, False)DATAp  g = c.goodness()DATA &  gg+=gDATA  edge.setGoodness(g)DATA4  self.edges.sort(lambda e1, e2: e1.compare(e2))DATA `  tg = (self.gooodness + gg)DATAX  rc = float(random.randint(0, self.net.srcSize())) / float(self.net.srcSize()) / 100.0DATA8  if(tg!=0.0):DATA0x  self.gooodness = self.gooodness + rc / tgDATA؆  def computeGoodness(self):DATA@/  g = 0DATA  for edge in self.edges:DATADh  f = self.net.facesAndEdges.findAdjacentFace(self.bface, edge)DATA؇  if(f!=None):DATA,  p1 = Poly.fromBlenderFace(self.bface)DATA$p  p2 = Poly.fromBlenderFace(f)DATA$  f = Fold(None, p1, p2, edge)DATA  g += f.dihedralAngle()DATAX  self.gooodness = g;DATAx1  DATAX DATA } class Edge:DATA<  def __init__(self, v1=None, v2=None, mEdge=None, i=-1):DATA  self.idx = iDATAH  if v1 and v2:DATA  self.v1 = v1.copy()DATAЊ  self.v2 = v2.copy()DATAPL2  else:DATA   self.v1 = mEdge.v1.co.copy()DATA h  self.v2 = mEdge.v2.co.copy()DATA  self.v1n = -self.v1DATA  self.vector = self.v1-self.v2DATAP  self.vector.resize3D()DATA  self.vector.normalize()ĽDATA  self.bmEdge = mEdgeDATA(  self.gooodness = 0.0DATA(p  def fromBlenderFace(mesh, bface, i):DATAȍ  if(i>len(bface)-1):DATA  return None?DATAP  if(i==len(bface)-1):DATA &  j = 0DATA  else:DATA x  j = i+1DATA@  edge = Edge( bface.v[i].co.copy(), bface.v[j].co.copy() )DATA8  edge.bEdge = mesh.findEdge(bface.v[i], bface.v[j])DATAp  edge.idx = iDATA  return edge=DATA0  fromBlenderFace=staticmethod(fromBlenderFace)%DATA(P  def edgesOfBlenderFace(mesh, bmFace):eDATAX  edges = [mesh.edges[mesh.findEdges(edge[0], edge[1])] for edge in bmFace.edge_keys] DATA0  v = bmFace.vertsuDATA (  e = []DATA `8  vi = v[0]DATA i=0 DATA(p  for j in xrange(1, len(bmFace)+1):rveDATAȑ  vj = v[j%len(bmFace)]001DATA  for ee in edges:DATApP  if((ee.v1.index==vi.index and ee.v2.index==vj.index) or (ee.v2.index==vi.index and ee.v1.index==vj.index)):DATA,  e.append(Edge(vi.co, vj.co, ee, i))%x1DATA `H  i+=1rvDATA 0  vi = vjEDATA 5 return e1DATA8H  edgesOfBlenderFace=staticmethod(edgesOfBlenderFace)urvDATA  def isBlenderSeam(self):5%DATA4  return (self.bmEdge.flag & Mesh.EdgeFlags.SEAM) DATAX  def isInFGon(self):rveDATA4  return (self.bmEdge.flag & Mesh.EdgeFlags.FGON)ubDATA  def mapTo(self, poly):DATA H  if(self.idx==len(poly.v)-1): DATA H  j = 0%x1DATAC  else:DATA  j = self.idx+1 DATA,ؕ  return Edge(poly.v[self.idx], poly.v[j])DATA0  def isDegenerate(self):10|DATA x  return self.vector.length==0 DATAȖ  def vertices(s): DATA@  return [ [s.v1.x, s.v1.y, s.v1.z], [s.v2.x, s.v2.y,s.v2.z] ]DATAx  def key(self):DATA  return self.bmEdge.key05%DATA  def goodness(self):rveDATAH  return self.gooodnessDATA  def setGoodness(self, g):vDATAؘ  self.gooodness = gve.DATA  def compare(self, other):1DATA,h  if(self.goodness() > other.goodness()): DATA  return +1CirDATA0j  else:DATA  return -1.00DATA`O DATA a_ class Poly:DATA   ids = -1%xDATA@  def __init__(self):DATA  Poly.ids+=11%DATAȚ  self.v = [] DATA  self.id = Poly.idsrveDATAP  self.boundz = None| DATA  def getID(self):| DATA؛  return self.id CuDATA  def normal(self):CDATAX  a =self.v[0] DATA  b=self.v[1] DATA؜  c=self.v[2] DATA ;1  p = b-aEEDATA  p.resize3D() DATA X@ q = a-cEEDATAX  q.resize3D() DATA  return CrossVecs(p,q)DATA  def isBad(self):| DATA  badness = 0 DATA`  for vv in self.v:DATA<  if(vv.x!=vv.x or vv.y!=vv.y or vv.z!=vv.z): # Nan checkbDATA  badness+=1 DATAH  return (badness>0)ve.DATA  def midpoint(self):rveDATA؟  x=y=z = 0.000DATA n = 0DATA  for vv in self.v:DATA  x+=vv.xEDATA xf  y+=vv.yEDATA | z+=vv.zEDATAD  n+=1DATAX  return [ x/n, y/n, z/n ]1DATA  def centerAtOrigin(self):SDATA蠋  mp = self.midpoint() DATA 0  mp = -mpxDATA$h  toOrigin = TranslationMatrix(mp) DATA0  self.v = [(vv * toOrigin) for vv in self.v]03DATA  def move(self, tv):x7|DATA `  mv = TranslationMatrix(tv)x2|DATA(  self.v = [(vv * mv) for vv in self.v]DATA  def scale(self, s):02%DATA P  mp = Vector(self.midpoint()) DATA(  fromOrigin = TranslationMatrix(mp)CurDATA  mp = -mp DATA$0  toOrigin = TranslationMatrix(mp) DATA  sm = ScaleMatrix(s, 4)05%DATA$Ȥ  # Todo, the 3 lines below in 1 LCDATA0  self.v = [(vv * toOrigin) for vv in self.v]%xDATA(x  self.v = [(sm * vv) for vv in self.v]DATA0F  self.v = [(vv * fromOrigin) for vv in self.v]DATAhF  def nPoints(self):DATAF  return len(self.v)SurDATAF  def size(self):9| DATA0F  return len(self.v)ve.DATA$xF  def rotated(self, axis, angle): DATAȪF  p = self.clone()%DATAF  p.rotate(axis, angle)DATA PF  return pEDATA F  def rotate(self, axis, angle):DATA8ثF  rotation = RotationMatrix(angle, 4, "r", axis.vector)DATA,@F  toOrigin = TranslationMatrix(axis.v1n)urvDATA,F  fromOrigin = TranslationMatrix(axis.v1)06DATA$F  # Todo, the 3 lines below in 1 LCDATA0@F  self.v = [(vv * toOrigin) for vv in self.v]%xDATA0F  self.v = [(rotation * vv) for vv in self.v]%xDATA0F  self.v = [(vv * fromOrigin) for vv in self.v]DATA(`F  def moveAlong(self, vector, distance):DATA F  t = TranslationMatrix(vector)DATA F  s = ScaleMatrix(distance, 4) DATA XF  ts = t*s1DATA(F  self.v = [(vv * ts) for vv in self.v]DATAF  def bounds(self):EDATA(F  if(self.boundz == None): DATA pF  vv = [vv for vv in self.v]| DATA F  vv.sort(key=lambda v: v.x)2|DATAF  minx = vv[0].xe%DATAPF  maxx = vv[len(vv)-1].x| DATA F  vv.sort(key=lambda v: v.y)| DATAF  miny = vv[0].y CDATA(F  maxy = vv[len(vv)-1].yclDATA@pF  self.boundz = [Vector(minx, miny, 0), Vector(maxx, maxy, 0)]DATAF  return self.boundzle%DATA (F  def fromBlenderFace(bface):x2|DATAxF  p = Poly()rfTDATAF  for vv in bface.v:01%DATA8F  vec = Vector([vv.co[0], vv.co[1], vv.co[2] , 1.0]) vDATAhF  p.v.append(vec)uDATA F  return pEDATA4F  fromBlenderFace = staticmethod(fromBlenderFace) O DATA@F  def fromList(list):ve.DATAF  p = Poly()DATAȵF  for vv in list:e.DATA(F  vec = Vector( [vvv for vvv in vv] )eDATA`F  vec.resize4D()EEDATAF  p.v.append(vec).DATA F  return pxDATA$F  fromList = staticmethod(fromList) DATAhF  def fromVectors(vectors):|DATAF  p = Poly()DATA8F  p.v.extend([v.copy().resize4D() for v in vectors])SurDATA XF  return p|DATA,F  fromVectors = staticmethod(fromVectors)006DATAF  def clone(self): CDATA(F  p = Poly() DATAhF  p.v.extend(self.v)ve.DATA F  return pxDATAF  def hasVertex(self, ttv):1DATA0F  v = Mathutils.Vector(ttv)DATAxF  v.normalize()DATAF  for tv in self.v:DATA F  vv = Mathutils.Vector(tv)CirDATAHF  vv.normalize()EEDATAF  t = 0.00001CDATA,ȻF  if abs(vv.x-v.x)0): j=i-1DATApF  cv = self.v[i]G=DATAF  nv = self.v[j]DATAF  if ((((cv.y<=tp.y) and (tp.yDATAl8F  self.file.write("g#foldLines line.mountain{stroke:white;stroke-width:0.01;stroke-dasharray:0.02,0.04}")DATAF  self.file.write("]]>")DATA F  self.e.endElement("style")?DATAhF  self.e.endElement("defs")DATAF  #self.addClipPath()?DATAF  self.addMeta()REEDATA8F  def addMeta(self):DATAHxF  self.e.startElement("metadata", xml.sax.xmlreader.AttributesImpl({}))DATAHF  self.e.startElement("nets:net", xml.sax.xmlreader.AttributesImpl({}))DATA,hF  for i in xrange(1, len(self.net.folds)):DATAF  fold = self.net.folds[i]DATADF  # AttributesNSImpl - documentation is rubbish. using this hack.DATAxF  atts = {}DATA0F  atts["nets:id"] = "fold"+str(fold.getID())DATAF  if(fold.parent!=None):DATA<`F  atts["nets:parent"] = "fold"+str(fold.parent.getID())DATA F  else:REEDATA$F  atts["nets:parent"] = "null"=DATA0PF  atts["nets:da"] = str(fold.dihedralAngle())DATAF  if(fold.parent!=None):DATAHF  atts["nets:ofPoly"] = "poly"+str(fold.parent.foldingPoly.getID()) DATA pF  else:REEDATA F  atts["nets:ofPoly"] = ""DATA@F  atts["nets:toPoly"] = "poly"+str(fold.foldingPoly.getID())DATA0hF  a = xml.sax.xmlreader.AttributesImpl(atts)DATA(F  self.e.startElement("nets:fold", a)DATA$ F  self.e.endElement("nets:fold")DATA pF  self.e.endElement("nets:net")DATA F  self.e.endElement("metadata")DATAF  def end(self):DATAPF  self.e.endElement("svg")ADATAF  self.e.endDocument()DATAF  print "grown."DATA F  def export(self):DATA`F  self.net.unfoldTo(1) DATA$F  bb = self.object.getBoundBox()DATAF  self.vxmin = bb[0][0]DATA@F  self.vymin = bb[0][1]DATAF  self.vxmax = bb[7][0]DATAF  self.vymax = bb[7][1]DATAF  self.start()DDATA XF  atts = {}DATA(F  atts["id"] = self.object.getName()DATA0F  a = xml.sax.xmlreader.AttributesImpl(atts)DATA HF  self.e.startElement("g", a)DATAF  #self.addUVImage()DATAF  self.addPolys()DDATA F  self.addFoldLines()adDATAhF  #self.addCutLines()DATAF  self.e.endElement("g")DATAF  self.end()Z;DATA8F  def addClipPath(self):DATA F  atts = {}DATAF  atts["id"] = "netClip"r 9DATA,F  atts["clipPathUnits"] = "userSpaceOnUse"DATA XF  atts["x"] = str(self.vxmin)DATA F  atts["y"] = str(self.vymin)DATAF  atts["width"] = "100%"DATA@F  atts["height"] = "100%"DATA(F  self.e.startElement("clipPath", atts)DATAF  self.addPolys()DATA F  self.e.endElement("clipPath")DATApF  def addUVImage(self):DATA(F  image = Blender.Image.GetCurrent()DATAF  if image==None:DATA PF  returnDATAF  ifn = image.getFilename()DATA0F  #ifn = self.filename.replace(".svg", ".jpg")DATA0F  #image.setFilename(ifn)DATA xF  #ifn = ifn[ifn.rfind("/")+1:]DATAF  #image.save()DATA F  atts = {}DATA(@F  atts["clip-path"] = "url(#netClip)"DATAF  atts["xlink:href"] = ifnDATA(F  self.e.startElement("image", atts)DATA 8F  self.e.endElement("image")DATAF  def addPolys(self):DATA F  atts = {}DATAF  atts["id"] = "polys" DATA0PF  a = xml.sax.xmlreader.AttributesImpl(atts)DATA F  self.e.startElement("g", a)DATA(F  for i in xrange(len(self.net.folds)):DATA$XF  self.addPoly(self.net.folds[i])DATAF  self.e.endElement("g")DATAF  def addFoldLines(self):DATA 8F  atts = {}DATApF  atts["id"] = "foldLines"DATA0F  a = xml.sax.xmlreader.AttributesImpl(atts)DATA F  self.e.startElement("g", a)DATA,hF  for i in xrange( 1, len(self.net.folds)):DATA(F  self.addFoldLine(self.net.folds[i])DATAF  self.e.endElement("g")DATA `F  def addFoldLine(self, fold):DATA4F  edge = fold.edge.mapTo(fold.parent.foldingPoly)DATA F  if fold.dihedralAngle()>0:DATA`F  foldType="valley"DATAF  else:DATAF  foldType="mountain"DATA (F  atts={}DATA `F  atts["x1"] = str(edge.v1.x)DATA F  atts["y1"] = str(edge.v1.y)DATA F  atts["x2"] = str(edge.v2.x)DATA PF  atts["y2"] = str(edge.v2.y)DATA(F  atts["id"] = "fold"+str(fold.getID())DATAF  atts["class"] = foldTypeDATA0@F  a = xml.sax.xmlreader.AttributesImpl(atts)DATA$F  self.e.startElement("line", a)DATAF  self.e.endElement("line")DATA8F  def addCutLines(self):DATA F  atts = {}DATAF  atts["id"] = "cutLines"DATA0F  a = xml.sax.xmlreader.AttributesImpl(atts)DATA `F  self.e.startElement("g", a)DATA,F  for i in xrange( 1, len(self.net.cuts)):DATA(F  self.addCutLine(self.net.cuts[i])DATA`F  self.e.endElement("g")DATAF  def addCutLine(self, cut):DATA0F  edge = cut.edge.mapTo(cut.parent.foldingPoly)DATAPF  if cut.dihedralAngle()>0:DATAF  foldType="valley"eadDATAF  else:DATAF  foldType="mountain" DATA `F  atts={}DATA F  atts["x1"] = str(edge.v1.x)DATA F  atts["y1"] = str(edge.v1.y)DATA 8F  atts["x2"] = str(edge.v2.x)DATA F  atts["y2"] = str(edge.v2.y)DATA(F  atts["id"] = "cut"+str(cut.getID())DATA0F  atts["class"] = foldTypeDDATA0xF  a = xml.sax.xmlreader.AttributesImpl(atts)DATA$F  self.e.startElement("line", a)iN;DATA(F  self.e.endElement("line")DATApF  def addPoly(self, fold):DATAF  face = fold.foldingPolyDATA F  atts = {}DATA8F  if fold.desFace.col:?DATA F  col = fold.desFace.col[0]DATA@F  rgb = "rgb("+str(col.r)+","+str(col.g)+","+str(col.b)+")"DATA@F  atts["fill"] = rgbn DATAF  atts["class"] = "poly"DATA(F  atts["id"] = "poly"+str(face.getID())DATA(F  points = ""Z;DATAhF  first = TrueDATAF  for vv in face.v:DATAF  if(not(first)):DATA(F  points+=','DATAhF  first = FalseDATAF  points+=str(vv[0])DATAF  points+=' 'DDATA0F  points+=str(vv[1])adDATAxF  atts["points"] = pointsDATA0F  a = xml.sax.xmlreader.AttributesImpl(atts)DATA$ G  self.e.startElement("polygon", a)DATA pG  self.e.endElement("polygon")DATA G  def fileSelected(filename):DATAG  try:DATA,HG  net = Registry.GetKey('unfolder')['net']DATA,G  exporter = SVGExporter(net, filename)DATAG  exporter.export()DATA @G  except:DATA$xG  print "Problem exporting SVG"iN;DATA(G  traceback.print_exc(file=sys.stdout)DATA, G  fileSelected = staticmethod(fileSelected) DATAY DATA@0 DATA4xG class NetHandler(xml_sax_handler_ContentHandler):DATAG  def __init__(self, net):DATA G  self.net = netDDATA`G  self.first = (41==41)DATA G  self.currentElement = NoneDATAG  self.chars = NoneDATA8G  self.currentAction = NoneDATAG  self.foldsPending = {}DATAG  self.polys = {}DATAG  self.actions = {}DATA,HG  self.actions["nets:fold"] = self.foldInfoDATA(G  self.actions["line"] = self.cutOrFoldDATA,G  self.actions["polygon"] = self.createPolyDATA(PG  def setDocumentLocator(self, locator):DATAG  passDATAG  def startDocument(self):DATA(G  passDATA`G  def endDocument(self):DATA,G  for fold in self.foldsPending.values():DATA0 G  face = self.net.addFace(fold.unfoldedFace())DATA` G  fold.desFace = faceDATA G  self.net.folds.append(fold)DATA G  self.net.addFace(self.first)DATAH G  self.foldsPending = NoneDATA G  self.polys = NoneDATA, G  def startPrefixMapping(self, prefix, uri):DATA( G  passDATA(` G  def endPrefixMapping(self, prefix):DATA G  passDATA, G  def startElement(self, name, attributes):DATAH G  self.currentAction = NoneDATA G  try:DATA, G  self.currentAction = self.actions[name]DATA G  except:DATAX G  passDATA G  if(self.currentAction!=None):DATA$ G  self.currentAction(attributes)=DATA 0G  def endElement(self, name):DATAG  passDATA0G  def startElementNS(self, name, qname, attrs):DATA,G  self.currentAction = self.actions[name]DATA pG  if(self.currentAction!=None):DATA$G  self.currentAction(attributes)DATA(G  def endElementNS(self, name, qname):DATAhG  passDATA G  def characters(self, content):DATAG  passDATA (G  def ignorableWhitespace(self):DATAxG  passCDATA0G  def processingInstruction(self, target, data):DATAG  passDDATA HG  def skippedEntity(self, name):DATAG  pass DATAG  def foldInfo(self, atts):DATA,G  self.foldsPending[atts["nets:id"]] = attsDATA pG  def createPoly(self, atts):DATA,G  xy = re.split('[, ]' , atts["points"])DDATAG  vectors = []DATA$XG  for i in xrange(0, len(xy)-1, 2):DATA4G  v = Vector([float(xy[i]), float(xy[i+1]), 0.0])DATAG  vectors.append(v)DATA$PG  poly = Poly.fromVectors(vectors)DATAG  if(self.first==True):DATAG  self.first = polyin DATA 0G  self.polys[atts["id"]] = polyDATAG  def cutOrFold(self, atts):DATAG  fid = atts["id"]DATAG  try:DATA @G  fi = self.foldsPending[fid]DATA G  except:DATAG  passDATA<G  p1 = Vector([float(atts["x1"]), float(atts["y1"]), 0.0])DATA<hG  p2 = Vector([float(atts["x2"]), float(atts["y2"]), 0.0])DATAG  edge = Edge(p1, p2)%DDATAG  parent = NoneDATAXG  ofPoly = NoneDATAG  toPoly = NoneDATAG  try: DATA4G  parent = self.foldsPending[fi["nets:parent"]]DATA pG  except:DATAG  passDATAG  try:DATA,G  ofPoly = self.polys[fi["nets:ofPoly"]]DATA pG  except:DATAG  passDATAG  try: DATA,G  toPoly = self.polys[fi["nets:toPoly"]]DATA pG  except:DATAG  passDATADG  fold = Fold(parent, ofPoly , toPoly, edge, float(fi["nets:da"]))DATA PG  self.foldsPending[fid] = foldDATA G  def fileSelected(filename):DATAG  try:DATA$(G  net = Net.importNet(filename)=DATAxG  try:DATA0G  Registry.GetKey('unfolder')['net'] = netDATA G  except:DATA$HG  Registry.SetKey('unfolder', {})DATA0G  Registry.GetKey('unfolder')['net'] = netDATA8G  Registry.GetKey('unfolder')['lastpath'] = filenameDATA ` G  except:DATA$ G  print "Problem importing SVG"DATA( G  traceback.print_exc(file=sys.stdout)DATA0@!G  fileSelected = staticmethod(fileSelected) DATAIDATAxW DATA !G class GUI:DATA!G  def __init__(self):DATA$ "G  self.overlaps = Draw.Create(0)DATAp"G  self.ani = Draw.Create(0)DATA"G  self.selectedFaces =0DATA #G  self.search = Draw.Create(0)DATAP#G  self.diffuse = Truen DATA$#G  self.ancestors = Draw.Create(0)DATA #G  self.noise = Draw.Create(0.0)DATA 8$G  self.shape = Draw.Create(0)8@DATA$G  self.nOverlaps = 1==2DATA\$G  self.iterators = [RandomEdgeIterator,Brightest,Curvature,EdgeIterator,OddEven,Largest]Q8DATA(X%G  self.iterator = RandomEdgeIteratorDATA%G  self.overlapsText = "*" DATA%G  self.message = " "DATA@&G  def makePopupGUI(self):DATA &G  useRandom = Draw.Create(0)DATA &G  pub = []DATAX'G  pub.append(("Search", self.search, "Search for non-overlapping net (maybe forever)"))DATA8'G  pub.append(("Random", useRandom, "Random style net"))DATA (G  ok = TrueDATA 8(G  while ok:DATA0p(G  ok = Blender.Draw.PupBlock("Unfold", pub)DATA (G  if ok:DATA)G  if useRandom.val:DATA(P)G  self.iterator = RandomEdgeIteratorDATA )G  else:DATA )G  self.iterator = CurvatureDATA0*G  self.unfold()DATAp*G  def makeStandardGUI(self):DATAD*G  Draw.Register(self.draw, self.keyOrMouseEvent, self.buttonEvent)?DATA (+G  def installScriptLink(self):DATA,x+G  print "Adding script link for animation" DATA@+G  s = Blender.Scene.GetCurrent().getScriptLinks("FrameChanged")DATA0@,G  if(s!=None and s.count("frameChanged.py")>0):DATA ,G  returnDATA,G  try:DATA0-G  script = Blender.Text.Get("frameChanged.py")DATA p-G  except:zDATA0-G  script = Blender.Text.New("frameChanged.py")DATA$.G  script.write("import Blender\n")DATA8X.G  script.write("import mesh_unfolder as Unfolder\n")XXDATA@.G  script.write("u = Blender.Registry.GetKey('unfolder')\n")v>DATA$0/G  script.write("if u!=None:\n")DATA$/G  script.write("\tn = u['net']\n")DATA4/G  script.write("\tif(n!=None and n.animates):\n")wDATA400G  script.write("\t\tn.unfoldToCurrentFrame()\n")DATAP0G  Blender.Scene.GetCurrent().addScriptLink("frameChanged.py", "FrameChanged")DATA1G  def unfold(self):DATAP1G  anc = self.ancestors.val0DATA 1G  n = 0.0EEDATA 1G  s = TrueEDATA2G  self.nOverlaps = 0DATAP2G  searchLimit = 10qDATA2G  search = 1 DATA2G  Draw.Redraw(1)DATA3G  net = NoneDATAP3G  name = NoneDATA3G  try:DATA3G  self.say("Unfolding...")DATA4G  Draw.Redraw(1)DATA,P4G  while(s):# and search < searchLimit):DATA4G  if(net!=None):DATA4G  name = net.des.nameDATA,05G  net = Net.unfoldSelected(self, name)DATA45G  net.setAvoidsOverlaps(not(self.overlaps.val))S DATA 5G  printDATA( 6G  print "Unfolding selected object"DATA,x6G  net.edgeIteratorClass = self.iteratorDATA,6G  print "Using ", net.edgeIteratorClassDATA (7G  net.animates = self.ani.valDATA,x7G  self.diffuse = (self.ancestors.val==0)DATA 7G  net.diffuse = self.diffuseDATA, 8G  net.generations = self.ancestors.val- DATA x8G  net.noise = self.noise.val DATA<8G  print "even:", net.diffuse, " depth:", net.generationsDATA09G  net.unfold()DATAp9G  n = net.report()DATA 9G  t = "."DATA9G  if(n<1.0):DATA 0:G  t = "Overlaps>="+str(n)+B DATA :G  else:DATA:G  t = "A complete net."DATA;G  self.nOverlaps = (n>=1)DATAH;G  if(self.nOverlaps):DATA@;G  self.say(self.message+" - unfolding failed - try again ")DATA$=1.0)DATA(=G  dict = Registry.GetKey('unfolder')DATA@>G  if(not(dict)): DATA>G  dict = {}DATA>G  dict['net'] = netDATA(?G  Registry.SetKey('unfolder', dict)DATA `?G  if(s):?DATA?G  net = net.clone()DATA?G  search += 1DATA @G  except(IndexError):DATA4h@G  self.say("Please select an object to unfold")epDATA @G  except:DATALAG  self.say("Problem unfolding selected object - see console for details")DATA0xAG  print "Problem unfolding selected object:"3DATAAG  print sys.exc_info()[1]DATA( BG  traceback.print_exc(file=sys.stdout)DATAxBG  if(self.ani):DATA,BG  if Registry.GetKey('unfolder')==None:DATACG  print "no net!"DATA PCG  return DATA<CG  Registry.GetKey('unfolder')['net'].sortOutIPOSource()DATACG  self.installScriptLink()DATA8DG  Draw.Redraw(1)DATA(xDG  def keyOrMouseEvent(self, evt, val):DATA(DG  if (evt == Draw.ESCKEY and not val):DATA(EG  Draw.Exit() DATA hEG  def buttonEvent(self, evt):DATAEG  if (evt == 1):REEDATAEG  self.unfold()r DATA8FG  if (evt == 5):DATAxFG  try:DATALFG  Registry.GetKey('unfolder')['net'].setAvoidsOverlaps(self.overlaps.val)DATA (GG  except:DATA `GG  pass?DATAGG  if (evt == 2):DATA$GG  print "Trying to set IPO curve">DATA(HG  try:DATA(`HG  s = Blender.Object.GetSelected()DATAHG  if(s!=None):DATA@HG  Registry.GetKey('unfolder')['net'].setIPOSource( s[0] )@DATAhIG  print "Set IPO curve"DATA IG  else:DATA8IG  print "Please select an object to use the IPO of"?DATA PJG  except:DATA(JG  print "Problem setting IPO source"DATAJG  Draw.Redraw(1)?DATA KG  if (evt == 6):DATA`KG  Draw.Exit()DATAKG  if (evt == 7):DATAKG  try:DATA4LG  if (Registry.GetKey('unfolder')['net']!=None):DATA@xLG  Registry.GetKey('unfolder')['net'].animates = self.ani.valDATALG  if(self.ani):?DATA<(MG  Registry.GetKey('unfolder')['net'].sortOutIPOSource()DATA MG  self.installScriptLink()DATA MG  except:DATANG  print sys.exc_info()[1]DATA,`NG  traceback.print_exc(file=sys.stdout)DATANG  Draw.Redraw(1)>DATANG  if (evt == 19):DATA8OG  passDATApOG  if (evt == 87):DATAOG  try:DATA4OG  if (Registry.GetKey('unfolder')['net']!=None):DATA4HPG  Registry.GetKey('unfolder')['net'].assignUVs()DATA PG  self.say("Assigned UVs")DATA PG  except:DATA0QG  print sys.exc_info()[1]DATA,xQG  traceback.print_exc(file=sys.stdout)Z DATAQG  Draw.Redraw(1)DATARG  if(evt==91):DATA PRG  if( testOverlap() == True):DATARG  self.nOverlaps = 1DATA RG  else:DATA SG  self.nOverlaps = 0DATAhSG  Draw.Redraw(1)EEDATASG  if(evt==714):DATASG  Net.unfoldAll(self)DATA0TG  Draw.Redraw(1)DATApTG  if(evt==713):DATA4TG  self.iterator = self.iterators[self.shape.val]DATAUG  Draw.Redraw(1)DATAPUG  if(evt==92):=DATA UG  if( testContains() == True):DATAUG  self.nOverlaps = 1DATA (VG  else:REEDATA`VG  self.nOverlaps = 0DATAVG  Draw.Redraw(1)DATAVG  if(evt==104):DATA(WG  try:DATA`WG  filename = "net.svg"DATA(WG  s = Blender.Object.GetSelected()DATA XG  if(s!=None and len(s)>0):DATA(PXG  filename = s[0].getName()+".svg"?DATA XG  else:DATA4XG  if (Registry.GetKey('unfolder')['net']!=None):DATA@@YG  filename = Registry.GetKey('unfolder')['net'].des.nameDATAYG  if(filename==None):DATAYG  filename="net.svg"DATA @ZG  else:DATA xZG  filename=filename+".svg"DATAPZG  Window.FileSelector(SVGExporter.fileSelected, "Select filename", filename)DATA H[G  except:EDATA$[G  print "Problem exporting SVG"DATA,[G  traceback.print_exc(file=sys.stdout)G DATA(\G  if(evt==107):DATAh\G  try:DATA@\G  Window.FileSelector(NetHandler.fileSelected, "Select file")DATA ]G  except:DATA$H]G  print "Problem importing SVG"DATA,]G  traceback.print_exc(file=sys.stdout)d DATA]G  def say(self, m):DATA0^G  self.message = mDATAp^G  Draw.Redraw(1)DATA(^G  Window.Redraw(Window.Types.SCRIPT)?DATA_G  def draw(self):1DATA H_G  cw = 64DATA _G  ch = 16DATA(_G  l = FlowLayout(32, cw, ch, 350, 64)DATA `G  l.y = 70DATAH`G  self.search = Draw.Toggle("search", 19, l.nx(), l.ny(), l.cw, l.ch, self.search.val, "Search for non-overlapping mesh (potentially indefinitely)")DATAaG  self.overlaps = Draw.Toggle("overlaps", 5, l.nx(), l.ny(), l.cw, l.ch, self.overlaps.val, "Allow overlaps / avoid overlaps - if off, will not place overlapping faces")DATAdaG  self.ani = Draw.Toggle("ani", 7, l.nx(), l.ny(), l.cw, l.ch, self.ani.val, "Animate net")DATAbG  Draw.Button("uv", 87, l.nx(), l.ny(), l.cw, l.ch, "Assign net as UV to source mesh (overwriting existing UV)")DATA`0cG  Draw.Button("Unfold", 1, l.nx(), l.ny(), l.cw, l.ch, "Unfold selected mesh to net")DATA\cG  Draw.Button("save", 104, l.nx(), l.ny(), l.cw, l.ch, "Save net as SVG")REEDATA\HdG  Draw.Button("load", 107, l.nx(), l.ny(), l.cw, l.ch, "Load net from SVG")DATA4dG  # unfolding enthusiasts - try uncommenting thisDATA0eG  self.ancestors = Draw.Number("depth", 654, l.nx(), l.ny(), cw, ch, self.ancestors.val, 0, 9999, "depth of branching 0=diffuse")DATAeG  #self.noise = Draw.Number("noise", 631, l.nx(), l.ny(), cw, ch, self.noise.val, 0.0, 1.0, "noisyness of branching")DATApfG  #Draw.Button("UnfoldAll", 714, l.nx(), l.ny(), l.cw, l.ch, "Unfold all meshes and save their nets")DATA`8gG  options = "order %t|random %x0|brightest %x1|curvature %x2|winding %x3| 1010 %x4|largest %x5"DATA`gG  self.shape = Draw.Menu(options, 713, l.nx(), l.ny(), cw, ch, self.shape.val, "shape of net")DATAHXhG  Draw.Button("exit", 6, l.nx(), l.ny(), l.cw, l.ch, "exit")DATA(hG  BGL.glClearColor(0.5, 0.5, 0.5, 1)DATA (iG  BGL.glColor3f(0.3,0.3,0.3)DATAxiG  l.newLine()DATA iG  BGL.glRasterPos2i(32, 100)DATAjG  Draw.Text(self.message)DATAwDATAPjG class FlowLayout:DATA,jG  def __init__(self, margin, cw, ch, w, h):DATAjG  self.x = margin-cw-4DATA0kG  self.y = marginDATApkG  self.cw = cwDATAkG  self.ch = ch?DATAkG  self.width = wDATA0lG  self.height = hViDATAplG  self.margin = margintDATAlG  def nx(self):lDATAlG  self.x+=(self.cw+4)|%DATA@mG  if(self.x>self.width):xt DATAmG  self.x = self.marginDATAmG  self.y-=self.ch+44|NDATAnG  return self.xDATAXnG  def ny(self):sDATAnG  return self.yDATAnG  def newLine(self):DATA oG  self.y-=self.ch+self.marginNDATAhoG  self.x = self.margingDATA0DATA8oG # if xml is None, then dont bother running the scriptioDATApG if xml:DATAPpG  try:DATA pG  sys.setrecursionlimit(10000)oDATApG  gui = GUI()3DATAqG  gui.makeStandardGUI()DATA`qG  #gui.makePopupGUI()agDATA qG  except:|ScDATA(qG  traceback.print_exc(file=sys.stdout)TTXhhvG pLj TXTextwG wG wG wG HwG DATAwG  } EERFDATA } OB 0 [h OBCameraamera.001 ne@>N@???*?91<"P???ޕ/?5F:?81V~>75e?'?T3>ne@>N@??????8573I)?ar0LZ?2^ڜT??OBd8?)d??>)d?????OB h [ 0 OBCircle|G M>>???U7><]>??q}?H>]=w# iy? 6>k;z<\{?M>>?????E??(f?T??q?Ab:d@?DOBd8? #=?>=??@???OB  [ h OBCube0 E$bϴ>=??? =יV>=???y?¥=U}P~?Y=4[>F>.y?E$bϴ>=?????:?-?=<*>1G?>IJd?]A@)[@?DOBd8? #=?>=??@???OB  [  OBCurvei `>????????`>?????ߕ/?8F:?81X~>85e?'?T1>I^@=??@???OB  [H  OBCurve.001p, }…=??? >.r<%>?? w?ű>ouio?s>D=-_v? }…=?????CY?5? zg?A?t>#?@> @?DOBd8? #=?>=??@???OB H [  OBCurve.0021r*e v>???U7><]>??q}?H>]=w# iy? 6>k;z<\{?r*e v>?????E??(|f?T??q?[A:d@?DOBd8? #=?>=??@???OB  [ H OBCurve.0038-j K6b? >???U7><]>??q}?H>]=w# iy? 6>k;z<\{?K6b? >?????E??(f?T??r?|Ad:d@?DOBd8? #=?>=??@???OB  [  OBCurve.004@0j 2W C=???U7><]>??q}?H>]=w# iy? 6>k;z<\{?2W C=?????E??(f?T??q?jA$?:d@?DOBd8? #=?>=??@???OB  [(  OBCurve.005H  5H@h ??????????5H@h ???????ޕ/?9F:?81U~>95e?'?T3>T@Y@?DOBd8? #=?>=??@???/1 `yOB ( [`  OBCurve.005_netD ?????????????ޕ/?8F:?81W~>85e?'?T2>me@>M@?DOBd?? #=?>=??@???} 82 yOB ` [ ( OBCurve_net  ?????????????ޕ/?8F:?81W~>85e?'?T2>me@>M@?DOBd8? #=?>=??@???H b z yOB  [ ` OBCurveCircle2j ' O>???U7><]>??q}?H>]=w# iy? 6>k;z<\{? ' O>?????E??(f?T??r?A9d@?DOBd8? #=?>=??@???OB  [  OBCurveCircle.0017j ' O>???U7><]>??q}?H>]=w# iy? 6>k;z<\{? ' O>?????E??(f?T??r?A9d@?DOBd8? #=?>=??@???OB  [@  OBCurveCircle.0029j 6Yf9?##>??? =יV>=???y?¥=U}P~?Y=4[>F>.y?6Yf9?##>?????:?-?=<*>1G?>Dze?ʴA|*[@?DOBd8? #=?>=??@???OB @ [x  OBFoldRateh ?????????????ޕ/?8F:?81W~>85e?'?T2>me@>M@?DOBd?? #=?>=??@???OB x [ @ OBLamp @ p@?p@???{&?W+b=???6씾t? bfE9L"?%?_>oK?p@?p@?????>M.9 ?Ʈ>89?ژ?_Lc?+0=!?DOBd8? #=?>=?@???OB  [  x OBPlane E$bϴ>=??? =יV>=???y?¥=U}P~?Y=4[>F>.y?E$bϴ>=?????:?-?=<*>1G?>IJd?]A@)[@?DOBd8? #=?>=??@???OB   [X  OBSurfTube?j Ѿ@9???~M5 ;??z?t ;D<W?b-L`I:?Ѿ@9????? /?9?@s\q>%g?*? @>] A 3V@?DOBd8? #=?>=??@???OB X [  OBSurfTube.001 Dj Uþsd|>??? 4nǼd>??y?Cb>[<m_x?༽Ϥ4c==~?Uþsd|>?????TT??6<S_>"n??F㰹>Ԉ@sp@?DOBd8? #=?>=??@???OB  [X OBxurveCircle.003x=j P KE@@@??@@@P KE?????:R>:>%HiQ>>0>|F=>G@k-@?DOBd8? #=?>=??@???TE"x{G TETex.0017>@???????@@????? @??<dME|G 20 MECircle  (      ???DATA,   DATA  8 5?5?5ZZ2T?9?`ZljG^l?>B.@v0{?G>2}?`й3{?Gx)}_l?þ͉/@v2T?9Vm10lj5?5 0Z9?2T0G>`l00G>{0w|הּ0G{_@0w$þ[l09,T 0且55508T9YZ0dlþ8.0{Gp20w5/{G>+wWl8>0&T9?zm1G55?0‰Z9>T?ljþhl?@v]G{? ְ}5?1G>{?`@}L>Sl?0@v9? T?ְGljDATA, ( DATA( 5  DATA, ME0 2  |G MECube.001    p     L XX???DATA,p  DATA 8 XXII XXINMXXLMWXI YX?III YX?IINMWX?IMMXX?IIDATA,  DATA 5 ############DATA,   DATAx  4ME  2H  0 MEMesh  ???DATA,  ColMEH  2   MEMesh.001q{  x  8 8   x P$lH@=ؤz=$>?C?]4?DATA,  DATA 8$>R?ls5Fج>S?rh(5Qt7> w?a Z]thv=DнS;` >>r>7odY's>l̮4tӾH>\,ȳ!W'diD?L$ Yzfe$ú>Uz$'ʽ~vGQ=+hL> L4fl++ؽϞaX2>2!鳘#n?AEs8op'C?)ؖ#f`=ZK>/9z >j>_}e>'nz[ ?>(>(M`?>󈄌bӡ3Y?C?ߜ{)\?WҸ>c+w).> ʽ0w)ރ6>I>-=5eP=?ٽRF?t.=M"BV2ldc $5xgӷٳqRjƟβ$'hå='7{"ֽAپ8a>{+rA3=N. dgK?^ ;> 8v?f:S??}{?ѹZ>Fa3 !P? >!ѽ td?)?yM>R9Fg? ?=߽en<DATA, 8 DATA8 5l###!###"############ ## # # # # # # # # # # # # ###!########################### ## #!# #"# ##!"#!##"####!### "#"### ############### # # # # # # # # #######DATA,x  UVTexx @Col8DATA 4H##"!!"!## #" """!!##                  DATA` x <H 4E@O@?IA~@Ylu~@ >??h^@ 6Qq@1ffb@??S̋@SNXqh@ 6Qq@??SNXqh@1hfb@ 6Qq@??9@>^@`0 4E@O@???^@`0IA~@Yl 4E@O@???9(iD!@h^@1ffb@??9(iD!@1ffb@iFh'@??iFh'@1ffb@N<+D@??3@/9@>A@$)>??A@$)>9@> 4E@O@??? )@h^@7(iD!@?? B?7(iD!@C???9(iD!@iFh'@L???L?iFh'@L|_Z@??x替P@ )@~ɿD ???~ɿD ? )@ B??? )@7(iD!@ B???z!|? B?5Q??? B?C?Dt>??Dt>C?)???!,?z!|?!,?!???O>?!,???q*?z!|?h>,???G?g @h>,?O>???6į??O>??`׷????`׷?O>?ӈ????O>?ɾ?N8?ӈ?????@:}?0@?Fp????TS>@h>,?G?g @???XVZ>Hp??r+?O>??Hp???`׷?r+?O>??r+?O>?`׷?ӈ????r+?O>ӈ??Mm?>??Lm?>ӈ??= >W>???@:}?Fp???XVZ>??'?p?@4>?K|???@4>r+?O>?K|???K|r+?O>Lm?>???L|Lm?>%?پ??k?۵rF7 @ T?@4>??k?۵r?@4>'?p??='?p?K|??4n?j?{7?n???n?{7D>?4??^ @Fk?ڵrt @??t @k?۵r4n?j??k?۵r'?p4n?j?? 9@R4n?j?n?? 9@R?n/6@xv&??/6@xv&?n$~@Tc1??@&t @A.@dԿ??A.@dԿt @4n?j??A.@dԿ4n?j 9@R??~k@|| 9@R"D~@ٿ?? 9@R/6@xv&Έ~@u#??Έ~@u#/6@xv&J@U;??g8@o6HA.@dԿO@l??O@lA.@dԿ~k@||??A.@dԿ 9@R~k@||??HA~@Yl~k@||\e@rϾ??~k@||"D~@ٿe@??O@l^@`0u:A@??3و@Te@"D~@ٿ??^@`0O@l~k@||??^@`0~k@||IA~@Yl??DATA89  -M%EY EY+L+ :EY :+L+EY : -M% \ +L+\+L+ +L+ +L+ :   :   \=\\   nn = \=>=N=NNnNn&&n=&=>#>N#Na,a,NG0N&G0G0&#&>#;#a,;a,==a,3a,G033G0;G0#;*;B;=BB=3B33*3;*(u*-*B--B-AA*A*(uc(u-c-""-!&!-A!&!!&!AcA(ucc""%%"9 r"!&!9 r9 r!&!c9 rc s %  %9 r 9 r]]9 r s9 r s-M% sEY s EY]EY]EY ] s s-M%MED 2F  MEMesh.003hg%  ' @ H H$` Xs hM  ȴ/ PH-bL>\_~@4Ga@'7DATA,Xs ' DATA' 8\j@iL>cpjL>LXqVkϿiL>?iL>apiL>\j@iL>cpjL>2+iL>LXqVkϿiL>@46SiL>\j@iL>LXqVkϿiL>@46SiL>LXqVkϿiL>a&\iL>t޿IkL>\l@iL>@46SiL>a&\iL>*ʍh=jL>@46SiL>a&\iL>LXqVkϿiL>ƾtFgL>\>EiL>@46ShL>*ʍh=jL>a&\iL>r$P{=jL>*ʍh=jL>cpjL>@Bx>L:iL>2+iL>\>EiL>v濆)jL>@46ShL>r$P{=jL>{\D?dL>*ʍh=jL>De iL>@Bx>L:iL>cpjL>@Bx>L:iL>P=,P`gL>2+hL>?iL>hx iL>apiL>jC0jL>hx gL>?iL>De iL>6?fL>@Bx>L:iL>!DR?^hL>6?fL>De iL>6?fL>@+սYhL>@Bx>L:iL>!DR?^hL>o?^ҿhL>6?fL>z{>RhL>!DR?^hL>De iL>!DR?^hL>??EgL>o?^ҿhL>??EgL>p @)gL>o?^ҿhL>F?OhL>??EeL>!DR?^hL>p @)gL>*@qhL>o?^ҿhL>LϦ?eL>p @)gL>??EgL>p @)gL>* @lNcL>*@qhL>o?^ҿhL>*@qhL>@2]L>* @lNcL>r%@/Ja]L>*@reL>?0LLlL>* @lNcL>p @)gL>* @lNcL>*?PkhL>r%@/Ja]L>*@reL>r%@/Ja]L>C@h^^L>*?PkhL>p?ՅiL>r%@/Ja]L>v?}OhL>*?PkhL>* @lNcL>*?PkhL>>=2_jL>p?ՅiL>r%@/Ja]L>p?ՅiL>@+eL>*?PkhL>CJR?tHkL>>=2_jL>r?ՅfL>>=2_jL>?5eL>CJR?tHkL>*>ջhL>>=2_jL>>=2_jL>Dd>{jL>?5eL>*>ջhL>lEeL>>=2_jL> u?ZZ9lL>*>ջhL>CJR?tHkL>>;2_hL>lEeL> 1 =kkL>*@qcL>C@h^^L>;H@[eL>r%@/Ja]L>2O@jL>C@h^^L>*@qcL>;H@[eL>)%8@gcL>;H@[eL>C@h^^L>\Y@ 6cL>C@h^^L>2O@jL>'a@bYL>+%8@giL>;H@[eL>rZ@ cL>o?^ҿhL>@2]L>h?bL>h?bL>@2]L>M-*@sdL>D>{>eL>\>EiL>*ʍh=jL>JD׿fL>v濆)jL>\>EiL>Jh>gL>\=EjL>D>{>eL>{\D?dL>奔E?fL>*ʍh=jL>Jh>gL>D>{>eL>9 Pd?fL>Jh>gL>hL>\=EjL>ah?eL>@h>fL>9 Pd?fL>9 Pd?cL>D>{>eL> m?iL><~?`L>ah?eL>9 Pd?fL><~?iL>9 Pd?fL>q>MLc?cL>x$ c>eL>ah?eL><~?`L>q>MJc?cL>9 Pd?fL>E2L?`L>q>MJc?cL>E2L?`L>O?fL>9 Pd?fL>*,ʿݯ@^L>E2L?`L>q>MJc?cL>O?fL>~ˍ?jL>O?cL>E2L?`L>;5>P@_L>~ˍ?jL>O?fL>ev @gL>?5eL>Dd>{jL>(>sjL>?5eL>(>sjL>z?勚fL>jC0jL>l9U-kL>hx gL>DATA,hM @ DATA @ 5""""""""" " " " " " """"""""""""""""" " "!"""#"!#"$%"%&"$&"'("()"')"*+"+,"*,"-."./"-/"01"12"02"34"45"35"67"78"68"9:":;"9;"<="=>"<>"?@"@A"?A"BC"CD"BD"EF"FG"EG"HI"IJ"HJ"KL"LM"KM"NO"OP"NP"QR"RS"QS"TU"UV"TV"WX"XY"WY"Z["[\"Z\"]^"^_"]_"`a"ab"`b"cd"de"ce"fg"gh"fh"ij"jk"ik"lm"mn"ln"op"pq"oq"rs"st"rt"uv"vw"uw"xy"yz"xz"{|"|}"{}"~""~""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""DATA,ȴ/ VTexhg% UVTex @Col H DATAhg% 4H  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~DATA`  <H\j@cpLXqVkϿ???ap\j@??cp2+LXqVkϿ??@46S\j@LXqVkϿ??@46SLXqVkϿa&\??t޿I\l@@46S??a&\*ʍh=@46S??a&\LXqVkϿƾtF??\>E@46S*ʍh=??a&\r$P{=*ʍh=??cp@Bx>L:2+??\>Ev濆)@46S??r$P{={\D?*ʍh=??De @Bx>L:cp??@Bx>L:P=,P`2+???hx ap??jC0hx ???De 6?@Bx>L:??!DR?^6?De ??6?@+սY@Bx>L:??!DR?^o?^ҿ6???z{>R!DR?^De ??!DR?^??Eo?^ҿ????Ep @)o?^ҿ??F?O??E!DR?^??p @)*@qo?^ҿ??LϦ?p @)??E??p @)* @lN*@q??o?^ҿ*@q@2??* @lNr%@/Ja*@r???0LL* @lNp @)??* @lN*?Pkr%@/Ja??*@rr%@/JaC@h^??*?Pkp?Յr%@/Ja??v?}O*?Pk* @lN??*?Pk>=2_p?Յ??r%@/Jap?Յ@+??*?PkCJR?tH>=2_??r?Յ>=2_?5??CJR?tH*>ջ>=2_??>=2_Dd>{?5??*>ջlE>=2_?? u?ZZ9*>ջCJR?tH??>;2_lE 1 =k??*@qC@h^;H@[??r%@/Ja2O@C@h^??*@q;H@[)%8@g??;H@[C@h^\Y@ 6??C@h^2O@'a@b??+%8@g;H@[rZ@ ??o?^ҿ@2h???h?@2M-*@s??D>{>\>E*ʍh=??JD׿v濆)\>E??Jh>\=ED>{>??{\D?奔E?*ʍh=??Jh>D>{>9 Pd???Jh>\=E??ah?@h>9 Pd???9 Pd?D>{> m???<~?ah?9 Pd???<~?9 Pd?q>MLc???x$c>ah?<~???q>MJc?9 Pd?E2L???q>MJc?E2L?O???9 Pd?*,ʿݯ@E2L???q>MJc?O?~ˍ???O?E2L?;5>P@??~ˍ?O?ev @???5Dd>{(>s???5(>sz?勚??jC0l9U-hx ??DATA H 9 %"9 r"%"!&!9 r %9 r 9 r]% ]EY ]9 r s s EY]EY"-!&! s  :EYc-"-A!&!c"9 rcc(u-A(uc(u*-A*(u!&!AcA*3*-A3;*B33G0;*;BG0#;a,G03G0&#;#a,&>#N&G0&=>#>N&n=>=Nn ==N \= n=\;a,=#Na,;=B=a,3a,NG0B=3*B--B-M% sEY9 r s s-M% :+L+EY-M% ] s :  -M%EY  :   \+L+ : \ +L+\+L+ EY+L+\  +L+  NnNn&9 r!&!cME 2pMEPlane`  8    ???DATA,8  DATA 8 ??2?9C2愲?9Cq뼾տ?dտ?n>dDf>տDֿ`뼾[뼾׿??dI׿?U>?dDI_>ֿ?DIԿm뼾?IDATA,  DATA 5""""#### # # # # ## # #DATA,`DATA`4     BRH} BRBrush? A=7W? AA= AA=?HZ?DATAxHZ???????????L>DNA1SDNANAMEF*next*prev*first*lastxyzwxminxmaxyminymax*pointergroupvalpadname[32]typesubtypeflagsaveddatalentotallen*newid*libname[24]usicon_id*propertiesid*idblock*filedataname[240]filename[240]tot*parentcurvecurblocktypeshowkeyposcurvaladrcodetotelem*data*weightsvgroup[32]sliderminslidermax*refkeyelemstr[32]elemsizeblock*ipo*fromtotkeyslurph**scripts*flagactscripttotscript*line*formatblen*nameflagsnlineslines*curl*sellcurcselc*undo_bufundo_posundo_len*compiledsizeseekpassepartalphaangleclipstaclipendlensortho_scaledrawsizeshiftxshiftyYF_dofdistYF_apertureYF_bkhtypeYF_bkhbiasYF_bkhrotscriptlinkh*rectframenrframesoffsetsfrafie_imacyclokmulti_indexlayerpassmenunribufs*anim*rrsourcepad1lastframetpageflagtotbindxrepyreptwstatwendbindcode*repbind*packedfile*previewlastupdatelastusedanimspeedgen_xgen_ygen_type*vnodetexcomaptomaptonegblendtype*object*texuvname[32]projxprojyprojzmappingofs[3]size[3]texflagcolormodelrgbkdef_varcolfacnorfacvarfacdispfacwarpfacname[160]*handle*pname*stnamesstypesvars*varstr*result*cfradata[32](*doit)()(*instance_init)()(*callback)()versionaipotype*ima*cube[6]imat[4][4]obimat[3][3]stypeviewscalenotlaycuberesdepthrecalclastsizenoisesizeturbulbrightcontrastrfacgfacbfacfiltersizemg_Hmg_lacunaritymg_octavesmg_offsetmg_gaindist_amountns_outscalevn_w1vn_w2vn_w3vn_w4vn_mexpvn_distmvn_coltypenoisedepthnoisetypenoisebasisnoisebasis2imaflagcropxmincropymincropxmaxcropymaxxrepeatyrepeatextendcheckerdistnablaiuser*plugin*coba*envloc[3]rot[3]mat[4][4]min[3]max[3]*obmodetotexenergydistspotsizespotblendhaintatt1att2shadspotsizebiassoftbufsizesampbuffersfiltertypebufflagbuftyperay_sampray_sampyray_sampzray_samp_typearea_shapearea_sizearea_sizeyarea_sizeztexactshadhalostepYF_numphotonsYF_numsearchYF_phdepthYF_useqmcYF_bufsizeYF_padYF_causticblurYF_ltradiusYF_glowintYF_glowofsYF_glowtypeYF_pad2*mtex[10]specrspecgspecbmirrmirgmirbambrambbambgambemitangspectraray_mirroralpharefspeczoffsaddtranslucencyfresnel_mirfresnel_mir_ifresnel_trafresnel_tra_ifiltertx_limittx_falloffray_depthray_depth_traharseed1seed2mode_lflarecstarclinecringchasizeflaresizesubsizeflarebooststrand_stastrand_endstrand_easesbiasshad_alphapadfrgbselpr_typeuse_nodespr_backpr_lampseptexml_flagdiff_shaderspec_shaderroughnessrefracparam[4]rmsdarkness*ramp_col*ramp_specrampin_colrampin_specrampblend_colrampblend_specramp_showpad3rampfac_colrampfac_spec*nodetree*groupfrictionfhreflectfhdistxyfrictdynamodepad2sss_radius[3]sss_col[3]sss_errorsss_scalesss_iorsss_colfacsss_texfacsss_frontsss_backsss_flagsss_presetYF_arYF_agYF_abYF_dscaleYF_dpwrYF_dsmpYF_presetYF_djitname[256]scale*bbi1j1k1i2j2k2selcol1selcol2quat[4]expxexpyexpzradrad2s*mat*imatelemsdisp**mattotcolwiresizerendersizethreshvec[3][3]alfaweightradiush1h2f1f2f3hidevec[4]mat_nrpntsupntsvresoluresolvorderuordervflaguflagv*knotsu*knotsv*bp*beztcharidxkernnurb*bevobj*taperobj*textoncurve*path*keybevpathlenbevresolwidthext1ext2resolu_renresolv_renspacemodespacinglinedistshearfsizewordspaceulposulheightxofyoflinewidth*strfamily[24]*vfont*vfontb*vfonti*vfontbisepchartotboxactbox*tbselstartselend*strinfocurinfoname[128]maxrcttotrctvartypetotvertipoextraprtbitmaskslide_minslide_max*drivereffect*mface*mtface*tface*mvert*medge*dvert*mcol*msticky*texcomesh*mselect*oc*sumohandlevdataedatafdatatotedgetotfacetotselectcubemapsizesmoothreshsubdivsubdivrsubsurftype*mr*pv*tpageuv[4][2]col[4]transptileunwrapv1v2v3v4edcodecreasedef_nr*dwtotweightco[3]no[3]co[2]indexv[4]midchildrenstartpad[2]v[2]*verts*faces*colfaces*edges*vert_edge_map*vert_face_map*map_memlevelslevel_countcurrentnewlvledgelvlpinlvlrenderlvluse_col*edge_flags*edge_creases*vert_map*edge_map*old_faces*old_edges*errormodifiersubdivTyperenderLevels*emCache*mCachedefaxispad[6]startlengthrandomizeseed*start_cap*end_cap*curve_ob*offset_oboffset[3]scale[3]merge_distfit_typeoffset_typecountaxistolerancesplit_angle*texturestrengthdirectiondefgrp_name[32]midleveltexmapping*map_objectuvlayer_name[32]uvlayer_tmp*projectors[10]*imagenum_projectorsaspectxaspectypercentfaceCountfacrepeat*objectcenterstartxstartyheightnarrowspeeddamptimeoffslifetimedeformflagparentinv[4][4]cent[3]falloff*indexartotindexforceoperationpntswopntsuopntsvopntswtypeutypevtypewfufvfwdudvdw*defvec[8][3]dvec[3]max**obpartypepar1par2par3parsubstr[32]*track*proxy*proxy_group*proxy_from*action*poseconstraintChannelsnetworkdefbasemodifiersdloc[3]orig[3]dsize[3]drot[3]dquat[4]obmat[4][4]laycolbitstransflagipoflagtrackflagupflagnlaflagprotectflagipowinscaflagscavisflagboundtypedupondupoffdupstadupendsfctimemassdampinginertiaformfactorrdampingsizefacdtdtxactcolempty_drawtypepad1[7]empty_drawsizepropsensorscontrollersactuatorsbbsize[3]actdefgameflaggameflag2softflaganisotropicFriction[3]constraintsnlastripshooks*pd*soft*dup_groupfluidsimFlagrestrictflagshapenrshapeflagrecalcopad4*fluidsimSettings*derivedDeform*derivedFinallastDataMaskcurindexactivedeflectforcefieldpdef_damppdef_rdamppdef_permf_strengthf_powermaxdistpdef_sbdamppdef_sbiftpdef_sbofttotpointtotspring*bpoint*bspringnodemassgravmediafrictrklimitphysics_speedgoalspringgoalfrictmingoalmaxgoaldefgoalvertgroupfuzzynessinspringinfrictefraintervallocalsolverflags**keystotpointkeysecondspringcolballballdampballstiffsbc_modeaeroedgeminloopsmaxloopschokepad5*scratchshow_advancedoptionsresolutionxyzpreviewresxyzrealsizeguiDisplayModerenderDisplayModeviscosityValueviscosityModeviscosityExponentgravxgravygravzanimStartanimEndgstarmaxRefineiniVelxiniVelyiniVelz*orgMesh*meshSurface*meshBBsurfdataPath[240]bbStart[3]bbSize[3]typeFlagsdomainNovecgenvolumeInitTypepartSlipValuegenerateTracersgenerateParticlessurfaceSmoothingsurfaceSubdivsunusedDNADummyparticleInfSizeparticleInfAlphafarFieldSize*meshSurfNormalsmistypehorrhorghorbhorkzenrzengzenbzenkambkfastcolexposureexprangelinfaclogfacgravityactivityBoxRadiusskytypephysicsEnginemisimiststamistdistmisthistarrstargstarbstarkstarsizestarmindiststardiststarcolnoisedofstadofenddofmindofmaxaodistaodistfacaoenergyaobiasaomodeaosampaomixaocolor*aosphere*aotableshemiresmaxiterdrawtypesubshootpsubshootenodelimmaxsublamppamapamielmaelmimaxnodeconvergenceradfacgammaselcolsxsy*lpFormat*lpParmscbFormatcbParmsfccTypefccHandlerdwKeyFrameEverydwQualitydwBytesPerSeconddwFlagsdwInterleaveEveryavicodecname[128]*cdParms*padcdSizeqtcodecname[128]codecaudio_codecvideo_bitrateaudio_bitrategop_sizerc_min_raterc_max_raterc_buffer_sizemux_packet_sizemux_ratemixratemainpad[3]*mat_override*light_overridelayflagpassflagpass_xor*avicodecdata*qtcodecdataffcodecdatacfrapsfrapefraimagesframaptothreadsframelenblurfacedgeRedgeGedgeBfullscreenxplayyplayfreqplayattribrt1rt2stereomodedimensionspresetmaximsizexschyschxaspyaspxpartsypartswinposplanesimtypesubimtypequalityscemoderendererocresrpad[2]alphamodeosafrs_secedgeintsafetyborderdisprectlayersactlaygausspostmulpostgammaposthuepostsatdither_intensitybake_osabake_filterbake_modebake_flagGIqualityGIcacheGImethodGIphotonsGIdirectYF_AAYFexportxmlYF_nobumpYF_clamprgbyfpad1GIdepthGIcausdepthGIpixelspersampleGIphotoncountGImixphotonsGIphotonradiusYF_numprocsYF_raydepthYF_AApassesYF_AAsamplesGIshadowqualityGIrefinementGIpowerGIindirpowerYF_gammaYF_exposureYF_raybiasYF_AApixelsizeYF_AAthresholdbackbuf[160]pic[160]ftype[160]col[3]framename[64]*brushtoolcornertypeeditbutflagjointrilimitdegrstepturnextr_offsdoublimitsegmentsringsverticesunwrapperuvcalc_radiusuvcalc_cubesizeuvcalc_mapdiruvcalc_mapalignuvcalc_flagimapaintselect_threshclean_threshretopo_moderetopo_paint_toolline_divellipse_divretopo_hotspotmultires_subdiv_typepad4[2]dirairbrushview*sessiondrawbrushsmoothbrushpinchbrushinflatebrushgrabbrushlayerbrushflattenbrushbrush_typetexnrtexrepttexfadetexsepaveragingdraw_flagtablet_sizetablet_strengthsymm*camera*world*setbase*basactcursor[3]twcent[3]twmin[3]twmax[3]editbutsizeselectmodeproportionalprop_mode*ed*radioframing*toolsettingsaudiomarkersjumpframe*theDagdagisvaliddagflagssculptdatazoomblendximyimspacetypeblockscale*areablockhandler[8]viewmat[4][4]viewinv[4][4]persmat[4][4]persinv[4][4]winmat1[4][4]viewmat1[4][4]viewquat[4]zfacpad0persp*ob_centre*bgpic*localvd*ri*retopo_view_data*depthsob_centre_bone[32]localviewlayactscenelockaroundcamzoompivot_lastgridgridviewpixsizenearfarcamdxcamdygridlinesviewbutgridflagmodeselecttwtypetwmodetwflagtwdrawflagtwmat[4][4]clip[4][4]*clipbbafterdrawzbufxrayflag2gridsubdivsnap_target*properties_storageverthormaskmin[2]max[2]minzoommaxzoomscrollkeeptotkeepaspectkeepzoomoldwinxoldwinyrowbutv2d*editipoipokeyactname[32]constname[32]totipopinbutofschannellockmedian[3]cursenscuractaligntabomainbmainbo*lockpointexfromshowgroupmodeltypescriptblockre_alignoldkeypresstab[7]chanshown*filelisttotfiletitle[24]dir[160]file[80]ofssortmaxnamelencollums*libfiledataretvalmenuact(*returnfunc)()(*returnfunc_event)()(*returnfunc_args)()*arg1*arg2*menup*pupmenuoopsvisiflagtree*treestoresearch_string[32]search_tsesearch_flagsdo_outlinevisstoreflagdeps_flags*cumapimanrcurtileimtypenrshowsparecentxcenty*info_str*info_spare*spare*texttopviewlinesfont_idlheightleftshowlinenrstabnumbercurrtab_setshowsyntaxunused_paddpix_per_linetxtscrolltxtbar*script*but_refsredraws*idaspect*curfont*edittreetreetypetitle[28]fasesubfasemouse_move_redrawimafasemxmydirslidirsli_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*cmapoutline[4]neutral[4]action[4]setting[4]setting1[4]setting2[4]num[4]textfield[4]textfield_hi[4]popup[4]text[4]text_hi[4]menu_back[4]menu_item[4]menu_hilite[4]menu_text[4]menu_text_hi[4]but_drawtypeiconfile[80]back[4]header[4]panel[4]shade1[4]shade2[4]hilite[4]grid[4]wire[4]select[4]lamp[4]active[4]group[4]group_active[4]transform[4]vertex[4]vertex_select[4]edge[4]edge_select[4]edge_seam[4]edge_sharp[4]edge_facesel[4]face[4]face_select[4]face_dot[4]normal[4]bone_solid[4]bone_pose[4]strip[4]strip_select[4]vertex_sizefacedot_sizebpad[2]syntaxl[4]syntaxn[4]syntaxb[4]syntaxv[4]syntaxc[4]movie[4]image[4]scene[4]audio[4]effect[4]plugin[4]transition[4]meta[4]bpad1[4]tuitbutstv3dtfiletipotinfotsndtacttnlatseqtimatimaseltexttoopsttimetnodebpad[4]spec[4]dupflagsavetimetempdir[160]fontdir[160]renderdir[160]textudir[160]plugtexdir[160]plugseqdir[160]pythondir[160]sounddir[160]yfexportdir[160]versionsvrmlflaggameflagswheellinescrolluiflaglanguageuserprefviewzoomconsole_bufferconsole_outmixbufsizefontsizeencodingtransoptsmenuthreshold1menuthreshold2fontname[256]themesundostepscurssizetb_leftmousetb_rightmouselight[3]tw_hotspottw_flagtw_handlesizetw_sizetextimeouttexcollectratememcachelimitframeserverportpad_rot_angleobcenter_diarvisizervibrightversemaster[160]verseuser[160]recent_filessmooth_viewtxvertbaseedgebaseareabase*sceneendxendysizexsizeyscenenrscreennrfullmainwinwinakthandler[8]*newvvec*v1*v2panelname[64]tabname[64]drawname[64]ofsxofsycontrolsnapold_ofsxold_ofsysortcounter*paneltab*v3*v4*fullwinmat[4][4]headrctwinrctheadwinwinheadertypebutspacetypewinxwinyhead_swaphead_equalwin_swapwin_equalheadbutlenheadbutofscursorspacedatauiblockspanelssubvstr[4]subversionpadsminversionminsubversiondisplaymode*curscreen*curscenefileflagsglobalfname[80]*ibuf*se1*se2*se3nrdone*stripdataorxory*instance_private_data**current_private_data*newseqstartofsendofsstartstillendstillmachinestartdispenddispmulhandsize*strip*curelemfacf0facf1*seq1*seq2*seq3seqbase*sound*hdaudiolevelpancurposstrobe*effectdataanim_preseek*oldbasep*parseq*seqbasepmetastackedgeWidthforwardwipetypefMinifClampfBoostdDistdQualitybNoCompScalexIniScaleyIniScalexFinScaleyFinxInixFinyIniyFinrotInirotFin*frameMapglobalSpeedbuttypeuserjitstaendtotpartnormfacobfacrandfactexfacrandlifeforce[3]vectsizemaxlendefvec[3]mult[4]life[4]child[4]mat[4]texmapcurmultstaticstepomattimetexspeedtexflag2negvertgroup_vvgroupname[32]vgroupname_v[32]*keysminfacusedusedelemdxdylinkotypeold*poin*oldpoinresetdistlastval*makeyqualqual2targetName[32]toggleName[32]value[32]maxvalue[32]materialName[32]damptimerdelaypropname[32]matname[32]axisflag*fromObjectsubject[32]body[32]pulsefreqtotlinks**linksinvertfreq2axisfbuttonbuttonfhathatfprecisionstr[128]*mynewinputstotslinks**slinksvalotime*actblendinprioritystrideaxisstridelengthsndnrpad1[2]makecopycopymadepad2[1]trackvolume*melinVelocity[3]localflagforceloc[3]forcerot[3]linearvelocity[3]angularvelocity[3]butstabutendminvisifacslowminloc[3]maxloc[3]minrot[3]maxrot[3]distributionint_arg_1int_arg_2float_arg_1float_arg_2toPropName[32]*toObjectbodyTypefilename[64]loadaniname[64]goaccellerationmaxspeedmaxrotspeedmaxtiltspeedrotdamptiltdampspeeddamp*sample*stream*newpackedfile*snd_soundpanningattenuationpitchmin_gainmax_gaindistancestreamlenchannelshighpriopad[10]gaindopplerfactordopplervelocitynumsoundsblendernumsoundsgameengine*lamprengobjectchildbaserollhead[3]tail[3]bone_mat[3][3]arm_head[3]arm_tail[3]arm_mat[4][4]xwidthzwidthease1ease2rad_headrad_tailbonebasechainbasepathflaglayer_protectedghostepghostsizeghosttypepathsizeghostsfghostefpathsfpathefconstflagikflagselectflag*bone*childiktree*b_bone_matschan_mat[4][4]pose_mat[4][4]pose_head[3]pose_tail[3]limitmin[3]limitmax[3]stiffness[3]ikstretch*customchanbaseproxy_layerstride_offset[3]cyclic_offset[3]reserved1autosnapactnractwidthtimeslidename[30]enforce*tariterationsrootbonesubtarget[32]orientweightgrabtarget[3]reserved2minmaxflagstickystuckcache[3]lockflagfollowflagzminzmaxvolmodeplaneorglengthbulgepivXpivYpivZaxXaxYaxZminLimit[6]maxLimit[6]extraFzchannel[32]no_rot_axisstride_axiscurmodactstartactendactoffsstridelenblendoutstridechannel[32]offs_bone[32]hasinputhasoutputdatatypesockettypenslimitstack_indexinternstack_index_extlocxlocyown_indexto_index*tosock*link*new_nodelastyoutputs*storageminiwidthcustom1custom2need_execexectotrbutrprvr*typeinfo*fromnode*tonode*fromsocknodeslinks**stackinitstacksizecur_indexalltypes*owntype(*timecursor)()(*stats_draw)()(*test_break)()cyclicmoviesamplesminspeedbokehhuesatt1t2t3fstrengthfalphakey[4]colname[32]bktyperotationpreviewgamcono_zbuffstopmaxblurbthreshshortymintablemaxtableext_in[2]ext_out[2]*curve*table*premultablecurrcliprcm[4]black[3]white[3]bwmul[3]offset[2]innerradiusratergb[3]cloneactive_rndpad[4]*layerstotlayermaxlayertotsizeTYPEcharucharshortushortintlongulongfloatdoublevoidLinkListBasevec2svec2ivec2fvec2dvec3ivec3fvec3dvec4ivec4fvec4drctirctfIDPropertyDataIDPropertyIDLibraryFileDataIpoKeyBlockKeyScriptLinkTextLineTextPackedFileCameraPreviewImageImageUserImageanimRenderResultMTexObjectTexPluginTexCBDataColorBandEnvMapImBufTexMappingLampWaveMaterialbNodeTreeGroupVFontVFontDataMetaElemBoundBoxMetaBallBezTripleBPointNurbCharInfoTextBoxCurvePathIpoDriverIpoCurveMeshMFaceMTFaceTFaceMVertMEdgeMDeformVertMColMStickyMSelectOcInfoCustomDataMultiresPartialVisibilityMDeformWeightMultiresColMultiresColFaceMultiresFaceMultiresEdgeMultiresLevelMultiresMapNodeModifierDataSubsurfModifierDataLatticeModifierDataCurveModifierDataBuildModifierDataArrayModifierDataMirrorModifierDataEdgeSplitModifierDataDisplaceModifierDataUVProjectModifierDataDecimateModifierDataSmoothModifierDataCastModifierDataWaveModifierDataArmatureModifierDataHookModifierDataSoftbodyModifierDataBooleanModifierDataLatticebDeformGroupLBufbActionbPosePartDeflectSoftBodyFluidsimSettingsDerivedMeshObHookSBVertexBodyPointBodySpringSBScratchWorldRadioBaseAviCodecDataQuicktimeCodecDataFFMpegCodecDataAudioDataSceneRenderLayerRenderDataGameFramingTimeMarkerImagePaintSettingsBrushToolSettingsBrushDataSculptDataSculptSessionSceneDagForestBGpicView3DSpaceLinkScrAreaRenderInfoRetopoViewDataViewDepthsView2DSpaceInfoSpaceIpoSpaceButsSpaceSeqSpaceFiledirentryBlendHandleSpaceOopsTreeStoreTreeStoreElemSpaceImageCurveMappingSpaceNlaSpaceTextSpaceScriptScriptSpaceTimeSpaceNodeSpaceImaSelImaDirOneSelectableImaThemeUIThemeSpacebThemeSolidLightUserDefbScreenScrVertScrEdgePanelFileGlobalStripElemStripPluginSeqSequencebSoundhdaudioMetaStackEditingWipeVarsGlowVarsTransformVarsSolidColorVarsSpeedControlVarsEffectBuildEffPartEffParticleWaveEffOopsbPropertybNearSensorbMouseSensorbTouchSensorbKeyboardSensorbPropertySensorbCollisionSensorbRadarSensorbRandomSensorbRaySensorbMessageSensorbSensorbControllerbJoystickSensorbExpressionContbPythonContbActuatorbAddObjectActuatorbActionActuatorbSoundActuatorbCDActuatorbEditObjectActuatorbSceneActuatorbPropertyActuatorbObjectActuatorbIpoActuatorbCameraActuatorbConstraintActuatorbGroupActuatorbRandomActuatorbMessageActuatorbGameActuatorbVisibilityActuatorFreeCamerabSamplebSoundListenerSpaceSoundGroupObjectBonebArmaturebPoseChannelbActionChannelSpaceActionbConstraintChannelbConstraintbKinematicConstraintbTrackToConstraintbRotateLikeConstraintbLocateLikeConstraintbMinMaxConstraintbSizeLikeConstraintbActionConstraintbLockTrackConstraintbFollowPathConstraintbDistanceLimitConstraintbRotationConstraintbStretchToConstraintbLocLimitConstraintbRotLimitConstraintbSizeLimitConstraintbRigidBodyJointConstraintbClampToConstraintbActionModifierbActionStripbNodeStackbNodeSocketbNodeLinkbNodebNodePreviewbNodeTypeNodeImageAnimNodeBlurDataNodeHueSatNodeImageFileNodeChromaNodeGeometryNodeVertexColNodeDefocusCurveMapPointCurveMapBrushCloneCustomDataLayerTLEN  L4(Thxh tx T8pDDlh8$88\,< @ @ 44DX`Dt<<<\h`4@t( <(,((0@XP Lt<$x$(h x$ 8x h (88,@0,HhH,(lDLP@< <@Lh48<8l(DlP<,4D4,,D,@,<4` <$t (@  ,<STRC                 !"#$ %&'( )*+, -./01 234* 56789 :;<=!!!>?@" ABC D!E!FGHIJK L#MNB -$OPQRSTUVWXYZ[\6 ]%^_& `abcdefghij'! k(l)mfnopqrstuvwx#y%z{|}~ *+,-   .)&/#&.0+'1QRfp,4dabc&6'-/02+34QR   * 6 ]465p  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHI/J/KLMNOPQRS* 6T67UVWXYZ[\]^_`abcdefghijklmno ]8pq9-#y:::;rstuvwxyz{|}~<;r  65= >???>=@\A^B9;r  +++6C5 \D)8888A@@D+'+EEE>='+  *DF);r 65GHIJKLMNFOP QQQ\RS I GKTLTJMNOH'UVUWX Y YYJ W V X   ZR QQSGK[[[\[ !"B # $][ +^[ +%&_[ '()*` [ +++,+-+./0(123B4a[ 56b[ 7Bc [ ,89:;<=+>?@d [ +A'BBCDE?@e[ FGf[ H;Ig[ +HM;h[ +J;,8+>KLMNOP=@?QRi[ So\+;j [ +TUVWXYk[ l[ +Zm[\]^\_`abcdefg>h6Lnnn;iPjo#k+l+gmnopq+$+r+s+t+u6C;rpvqw - x  y  z {5|}~{T ]        rs7tuu vvv+$TUVWXYr ws(xycw8Qzt(FFF6     J{9 !"#$%&'()*+,-./0123456789:;<=6*  ]|>?@ABCDEFGHIJKL}}}MNO+~ P QRSTUVWXYZ[ \ ]^\_ `abcdBefghijkl 5m7nopqe~rstucvwxyz{|}~M \o\QQ\M9* %+{' }     >6T |  ] o\Q '&MD !"#$%&'()*+++,-./01@234567oS89:;<=>?@ABjCDEFGH;I JKLMNO\ P#&QRSTUVWXYZ[\]   ^\_ ` a67bcdefg('jhi#. jklm_njeo pqrstuvw _nx\ yz{|}~      _ e p  _'B&jh\1  jh_ "Bj Bjo __7j 6T6Q\1       l0   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQ@R4STUVWXYZ[\]^_`abcdefghijklmn opqrstuvwxyz{|}~&   KL  ]      1f | p     ) 'c6(l      P B(c-R8*   P  M7UKLMNOPQR, - !" # $% & '()o\5*+,-./0123P\P5*456o7+89:$;<=o\ ->+?@ 5ABCDEFG"HI=$J\Q ->KLM+ pNOPQR STUVWSXY M+FZ[\+0+ ]^|_` o&ab+MckH5dPefghi l&ab7U*jklmn5o+p9qo\:rs H$t -+ uvwxyz{| }#y#~ 6YB_Sh\+ 7 h$ (h  @Sh \$  {+q 6 xp  _pveh6 - ++B++ +bo\+ +'ckpN++b+o\/   +   M   o   o++o\+ +6pN+';IO {ck -   o      j I   z           6       ac voHL\p`c !"#$ %&'()*+,q- ./01234 &56789:;'B; M<=>* ?b@A -QBCDEENDB