From 05a61527e76e30205a2204851c52175e33240080 Mon Sep 17 00:00:00 2001 From: Ma Nan Date: Tue, 14 May 2024 10:57:43 +0800 Subject: [PATCH 1/2] fix: vector as label --- README.md | 2 +- bioxelnodes/io.py | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2c01e8c..68481a1 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Before us, there have been many tutorials and add-ons for importing volumetric d Below are some examples with Bioxel Nodes. Thanks to Cycles Render, the volumetric data can be rendered with great detail: -![gallery](assets/gallery.png) +![gallery](docs/assets/gallery.png) The "Bioxel" in "BioxelNodes", is a combination of the words "Bio-" and "Voxel". Bioxel is a voxel that stores biological data. The volumetric data made up of Bioxel is called Bioxels. We are developing a toolkit around Bioxels for better biological data visualization. but before its release, we made this Blender version of bioxels toolkit first, in order to let more people to have fun with volumetric data. [Getting Started](https://omoolab.github.io/BioxelNodes/latest/getting-started) diff --git a/bioxelnodes/io.py b/bioxelnodes/io.py index 3285caa..4a3fea0 100644 --- a/bioxelnodes/io.py +++ b/bioxelnodes/io.py @@ -139,6 +139,8 @@ def rgb2gray(image): return sitk.Cast(I, sitk.sitkFloat32) +def x2gray(image): + return sitk.VectorIndexSelectionCast(image, 0, sitk.sitkUInt16) class ImportVolumeDataDialog(bpy.types.Operator): bl_idname = "bioxelnodes.import_volume_data_dialog" @@ -225,7 +227,11 @@ def execute(self, context): bioxel_size, image_shape, orig_spacing) if self.read_as == "labels": - image = sitk.Cast(image, sitk.sitkUInt16) + if "vector" in image.GetPixelIDTypeAsString(): + print("Convet to Grayscale...") + image = x2gray(image) + else: + image = sitk.Cast(image, sitk.sitkUInt16) default_value = 0 elif self.read_as == "scalar": if "vector" in image.GetPixelIDTypeAsString(): From d380cf7036848a140f5f69fdd41f519d2a082559 Mon Sep 17 00:00:00 2001 From: Ma Nan Date: Tue, 14 May 2024 14:39:34 +0800 Subject: [PATCH 2/2] docs: update docs --- docs/assets/as-labels.png | Bin 0 -> 6420 bytes docs/assets/as-scalar.png | Bin 0 -> 9355 bytes docs/assets/{bake_node.png => bake-node.png} | Bin docs/assets/before-sharing.png | Bin 0 -> 51030 bytes docs/assets/dependency.png | Bin 53734 -> 22542 bytes ..._example.png => general-graph-example.png} | Bin .../{general_graph.png => general-graph.png} | Bin docs/assets/import-dialog.png | Bin 0 -> 44532 bytes docs/assets/import-others.png | Bin 0 -> 8766 bytes docs/assets/import_dialog.png | Bin 47345 -> 0 bytes docs/assets/resample.png | Bin 0 -> 19333 bytes .../{segment_node.png => segment-node.png} | Bin docs/assets/to-mesh.png | Bin 0 -> 17077 bytes docs/features.md | 46 +++++++++++++- docs/getting-started.md | 57 +++++++++--------- docs/misc.md | 2 +- docs/nodes.md | 19 ++++++ mkdocs.yml | 2 +- 18 files changed, 94 insertions(+), 32 deletions(-) create mode 100644 docs/assets/as-labels.png create mode 100644 docs/assets/as-scalar.png rename docs/assets/{bake_node.png => bake-node.png} (100%) create mode 100644 docs/assets/before-sharing.png rename docs/assets/{general_graph_example.png => general-graph-example.png} (100%) rename docs/assets/{general_graph.png => general-graph.png} (100%) create mode 100644 docs/assets/import-dialog.png create mode 100644 docs/assets/import-others.png delete mode 100644 docs/assets/import_dialog.png create mode 100644 docs/assets/resample.png rename docs/assets/{segment_node.png => segment-node.png} (100%) create mode 100644 docs/assets/to-mesh.png diff --git a/docs/assets/as-labels.png b/docs/assets/as-labels.png new file mode 100644 index 0000000000000000000000000000000000000000..bc6c7884bca854d4a016b167c77afa5fbcf8172d GIT binary patch literal 6420 zcmZvg2{_bU*#F6HXzVj(9cu|==}8!6nJf{KN@B7_i!~WzXKXWyEQPXGge+kq%UFg% zvZch>nMn2-OJwW)si)`vf3NGEb6s=IHNW#a=RW5?=e|GR8*gD|$jy0_lYxPO+t>(c z$-r<34*b5z&I)`Vbut)bV1SMoBXzAXj7yoD=>n}n(LcqR@z^94L=rOx7B?-SVZx(p zjAdpK=S`Hr9n}Z;%y8D6S8eTl zX6c(=jW5@8k$66{bM6wX^1G0&!jw6Y`rsUqthmgqvRDG?KY~kOf zhGUM{bLnPS63o9mM&5i2TJlHIvO@R$@j@Kxz-|B&8{rt+_}U)d5`*F) z_|#k+M78m5e?cNoG5xjA(i=I=gI+qMn+#wsSZ*1c>p>?A2su)-dRMPgb7e4o;5_Y&!;ZC?ngj8U5t0?8z4{JXm&)y_y7FGBHUYk?%s25m8`K z7{|)K@dkKgjt$SnLr|P+?c$-;F<|jpHn7;%y`3NKo0}7%bt+D6(<8rh?~GKHob}uJ zv1C_hnP;h~Y$#k-x&Ld00cS|0g%YaVhN$SJ;Tb~5+IEDpmaw{qDW#_)S#Hd4B3N!E zF^LPXkB8|tS?3ekgidW0jcA=}i5W|P=?DF!wSdQlEAQ5)K~)@)4eU^U_|kA?GRBzc zjU|Gbrx(TPvG%PSMO3cWd_!$rY;uxBe@KO|@W6q8O^ldlHZ<>NWZn8b{1lh;1tMZ^ z{WFT_HqkI9c;bpe5n`kNlE-XMW{A%DC_`*$vw(suYWVGKDSDCvb*5%EYmLf+qGe5Q z7~Vyna-&SPf-Wr_lRn&@jOel=^2?c3*Z9oJN@G_8L^YLmU*(}M)&Zw4fsd}oj!)o@ z>YWJvRj(DieLp2_@|RTbF1>wui~cqKBOeplH9Po6nrn2S#fdA$UbDT~n>!-f0sT`Q z9Q&R!XUwzDjAd#E4vf|Kv@cCGPH;n&n*sw~;8RB_!5d$$j@9}ujBYFpj&-N2*VFFw zy@&$qK2f;#N#&TOYZmPi>^)~vHwFQh)x5_C@3Ob452&p3n!>JZI|(@z5dRlW~|Py&MZ??Th@Luz9CYdsBkIYth<6=7WM3u`~1!Xg+g$B zwD9q{{(wqt;ruK4-$zrM={PT(i$-F^>}_u>Pm&^f213{S443!!cFv^QPd0^*EB5*^ zb7PtN^!K}-oVYrgYn*KRYkzO-Q=Z9Kec+}@mLQ>9$7gfdPTjRfBt|raOXrc8_B{ux zj5>NKh6q~Z5JWkxuO;s5CYU}|ZRHk2 zP!w-8j1u}P?_PyVni4-6hVE^o3TvT@d+RjsP2(W78}nb*9CGmdash`SiZ;_N892Ao z$d6uYcma5Za4)s+Qa&*u0SP%rrNjy;&WCJGv8~{B(8;X3K z^2_`achxz0GU&zgt8Y-HZbKEzL$28yd%D@(X(}x-emwB>Q|_zdLd27chJ`m88|u8j zMg#vmn*cu&9qr3@liRI!8&U01*Xel1`b|VmNwEQPofhfa?O@u)uP^b*Jx?9d>~7t8t;Z z7`iMai(CAv%FlXiKi7|`y+&~Hhj%Ux5%x|grR;eR5yW>cZLiPqtGPW+wj+a>#Lbrw z;h(*V2|hH9E$!153qEMZWH)0ki6l%kN0se$JykoCm~6pFWx4JWqsv;y&W1c^#!*+kC}~j^K8v$p9@NWZ zKf-RehFH&HHv9nJt|t$8k8_RO&M%v zO~E~gy9uE?RYG}>m3`~Efs*t*pVa?LUUwzsSINAG|$E8QhjZKIu&%x+gHJNm#C=%RwzBvr^MRM>H zmBX{6K#%~f_2YSdE8`wpv?CyV84<24NE(4Q! z`<9_k!#F^KEI*C#7>;OfT83>My1Q4bxWouwHz#rHpR?Ja zK@$z@pG;6?5{{ER=3F&urbW?Ot2W=STc7rt3|sL;@{dC!H?u?c=NA6)7(LyX>8yG> zKZGQndS<~u;UIY9vKg68o#RcMwPY_76P%jjCV)G7L@z=&N^V^C!m}-sm}gtT#g{~h zskt=9h--SIyF+bsjK*P6&FSnc_dD_{Q7~^vI>luINa8z;ELzgH_`d0Wq&dgimy;g% z)|7XKAfEH@Zv%i3Y!sHkx#)d{h&0_Zkf!H){HWxDsL*2}uihtjV%4RrjdI#LvF%JS zQhLUmPo(T~@kkDQUCJ6(l<39ov?cjA;=A-Bve6-iN9GW7xRZ$L2u?h1=!nL>+_PEx zE}~Nx#`PntRnwJYE-;%*Xw*LNHvYtX$bl%CB= z&4Ej&-IH>qN?>HGq?+t+no{OHC&oraR6Kr-mFQoC>~A$)_tQs`-KblmERNMR~9{G zFt*d^AC*ZXd(C8|$CAN7+{zVCw@5oz%1_RnS_~P4g&jM}bC{%eh7VOac|T~aXHrJr zc5+Wy3nvhZKb#_KyZDW?Urbml1Gf`0-K)k1*cyEv4msBk^{di_lZP$bj{(f6a4W9z@kmnEGMpNb&XA@yWz3nD8)FtPgJ zD*FlKNuz?$KUgV^l15oRyKhTy>24oSOPdH=2&yfNJ>YpxA*Qb7>6;Y};4a)zlXDzO z4qq8bY;5V~A zC4~XJ4zz>m0BsZg&{2nauE|B9EI|Il!+go#83Xr!8TLLIbNp&)Mv+}z)qZH)zTcyL zzr??T=(v(sN6CsP`KzUiCx%{K5FV`YaUIMvfe2QH|Jx5(i!#%9&UF@Q?)fM3 z7g2KbaL2mfD(^GBMP z^x2Oq1PP>KZd1yh>z%{?lUEjf+^ghs^3#L)a%d_#>>PkPA2?NwT_mL_OAeS!#Sh`&DZv2B!%dwm9Kg_c$?a8{@uO5~6J^8AI*U z*vM4`&e%!TTJ+NV_U6jUfqrRMZ0kg}t=yV5zDxg9ant0TYphEmhkWKdc&p6|NXQ1*$wbd2pn}E$X>n&dSPkgo%we4 z6JQGtc!jtKNCcS9>Tr&WE1P zURZTxn(E6n<`3-wf{Aa1rscbfFAe+y0X^RNjo#rtR+;T#^k?T2&a-+Q=23Jgo>{BB zJ2+Z#vvYUnT2k=%AsC943p#nqeR%qSDxZwcea;^P7E2%s=+Y|yxb@rH_65YCyWbYg zLEWV*t)1Mt`*W>c2XIUL)kh#9h4-9a$b4`dKj$GAKyIPj))$99pD^n$h{~W1FH*`| z0FBc*M)d#ePAP+>Uv>GpI(E&(%Eo60*g;#D_7_k0Jdy`Au>)>#nNyN|`Nk&KzT z0l-`#IRa z#^0gQdILFXA0zW3#)-~6WqkDHtpt5yTF&`XrWN_Z&;Q(1)uyyNQ7T4M8G{}Wchn~* zi?(zXpKqoszDpA>UrbG)lqVn{63oyB_@14+(O#7?-_aehkcIHC z0GlT|Ka`OC6@B+pcOGrrwtsUz5D46>5kQX84kWrt+B7RsXVN_zydg@qG?*BXPspGG z3G4J90<6CsHMKhmlRV=*>D0-?6|!pObF~>1hLsfoA+pR=|`fZ)$ zg!-;D?39X6=bL5D^P`LdDgh)iXGNtWTTLvsBv1pTb_=Z_6faSpo%^0IrENn3*|0?g z!L19Vd>yi_H>RzJqYH;kFH0pprST4?yXo9CSJ(cN0CCPb)R|Cfltugn_bQo)w^3GU z-jSP!yqhI@b3_H;(u+3ZF{0)LI0O_SgJUBKNY6R4ky`j*x?3!Dx^!$Beo>)8>L@k~ zvUWdhR^}N7#ul9`i!hWH@p13xr(^xzBjA{vd#~l%*XKUVbqZ4Eq+ zikPx;)?;+v=t0I7KcWrrCbZOK*;{+*n8*7{DFI7%SN zhF2Dc1)|$e-F-k5`j{Sfd9A`>82S7(u|2v7OK*ktnqEFlO*b&pY+Ba68JA&!QCxfS== z%)7|^N#}+3IUgTDT)r~qL` zqWc(-i0vRggi_b4!?Tkk9EAx|&0QkQhpTv$rgJB6>YgkUpE~NI3XA+MvT#5CT`1Vz z_pJ=-7R)G-lO_NuO90Sa$w6o(J=a& z6;76X#9xh~|M;o;`}xv557d9V3N3=3a2GLq<$kjUZBleH3I; z*+Pwn-?9QgTsMM@9-|i5RzA`r~{T^5tLlBenAp{QI;*p7d9Pb z7YUkmz$*?oNexMKWO)SrvC*DOd6{zB*(uB2q%BEB#l002agrsmX;SzaH1{_1Q4a9K zrFI67aX#V2@)pe>FJa}a`xN#7$+FfEw9=0mYpqA_@0?2btvyE;t*_rRs}oveX=Tce zm~9eUC_bDK^Yy1$d96WKr(0R3D+KQ# zS`2-9^dCWx>?MvEqxK2d;fNpQI!?qb~jz$$b7>)*1n zg%?yJ^96u6_*vp(#p?q_IacIKW?K@YS#V*)zwaZV60ZDjK($g+k#<~G#nyeo(#Drz z(xj*C8Jbsi|FtZE@jlD;p(*S*JHJw~Qy`vCrs9cY-(maUgW7o9(SIsl!JLr)f8|`d znW3igJLtZFf@re_RR|7MxcvI@*)j~B`o9Y7(jOSG%)z`S)n$sWF&)Mm)6Ui-CbN{S zJ5rVZvELR{CmSgU2dd(qC$DQZunLCVf&U2VvkfO0_p zK6I2&gqB_F#oW+qH39N*{dHFGLp`Iy%ZZkAcW(Uc)OSQD2B^#zTNPNqtg0nkVrlu# z9Z97D8}rXD=MGtkL31u%6#jP?Le%UD32qe@X@fE*L|S;)lw)gb&5LsnUKeox;hzKE z4RU1=#fsr&ZQSZNi4=$;p^@Ft{lzKX-`)ZM6$QX{B(cUk;T0rz9=s9r2VI$uY=Lk1 W2DP%*sRQKU|z&y?Ui)wxBomO~`GjdBuhrh}j<^V1ti3bn@HThX=|Q1Dc{!HaqfDb;#wNCr z;{H{&{ZygS+W+&az!0B5TGqtK!n1Gk8X3`VU-E>eDkbAZz??9expQ%vroHACDvS@# zOLn7q<9VxRmG(#UN0c~5M3HU7Kw5jaomF+v(o5vnL%>68W6{AP5SgbGdCb=~PUemmte6HM`EZC>9F2H6h)dAHb3CcR7g?Gg zBzcd{862i=;y3Tmv*_MIOBZyt+UdUF^O^Z{{-+B4+b8gj`x`j&Fg+-JU2WiB*1&)p zWv98I7hj?~??%La(mcC6n<5G8`YSi`L4*tCAx@|(2Pn;ZO!_q;5n;Z=k2k-*uA+({ z&UqPi7Bawg$H#HR_w{V@_~8WGQNIUJ?L=ahxcOs{|V&JqwwpFO`qMWctW z;}7Z3oRPWfQ@nYmSZ-1}|Bd7_A+p1z*0k>p%T-V(1}@?Z96Bh&iu7vrN{rpBcViv1 zrjEJLYC^)7orJD``zWjCMW1-m)Y4XqJ%dQQSOE+ zV>Ex9j_usnd3ede=5|=d-KEvnF@t`!maUplM=)e>rLmp@HYb zT%m5SkT5QstU-m4O7cFNP{Bb+%$=@q6SvkjUVIZ8>&5#XQF0%wXvQj>WIZ}6Yjkx- zHTs>HL2QmXESzmS$9pse+WdP|sz+Ca_UU3?RmCvx7w&d8g2Su3%b(G)yshkcT`k*r zZ(ij6@LS~3ex@Wp#e#AY<#4IT0PSnVKuB#L`9m#%gi#ZA934;*w9I@7=Zo0d%&<=Q zyxTZq#sz7ZP)<&&dEWf;t^L?k-}@&55Z%@*v|QC3xTnEZYc| zAmYWep)tYhpKo8EmHj#HA@Zaq`#4;!a7y=b>}fR(RwTm4{JrY{S9P0Uzg&>2cQ1)b z#MjGZsdj6Z^5Pd}3m2!ue2G{rDo!7^x-?XRFjz{n&24{}d^L$O?s_OhZs6R@Y}Ykj z?IRVFRTAsqJKs!6-#wa$TD}O-9Wv%k8|&qd*VbolHFpi0>E``Bj0g`!4+c!A$(7`L z9>zR>m75XKMQ(WKytWN?(1^%v?`vSlnbfZ~Z%vhe?)KXw^Oj8mHVXOQy<|FyMEF)1 zacVTJNg20i^NJuHd;1KOgSkY47;2qINjA8Gc@kiIn^0k?!v=lG`qztvSN5;o2Ws$r z_4zi8NV1m$pX}xOOsd&l9LzJ*NvG+96%+!ez~uu@CIG_yUA0kE-2n(NQN6_K>SEFT zuYyY^&Rn@|j@8@q>02Eq_8gv%sMO2A;fx|V8lBnbj5ef`jz1tm#i7upOJcz2@XFBY z9jd92=LMb)HNQnGluO^x%ogQAI$*F`|0rDHY)K-w_pl0|mhqKi15ITKIWAC7^)s#; z;Ss=<+Gvxo-w`YZ28I!l)4e^LP=(F`iY!Hc_)J|@j>Z@R6MD8;Y5%j*uu=II^_YTBRy^z`(%vPg_jJ#J%n1u19QE^nLi zB8532X1AZ(J?=6IfQyWy6k6-jT2|0A357*FVj#WARp_YJOnklBQ)ARatIdudJ;fui zFV*H1obOTCCJQ{*L%ne2osEPQJ|KGbyl}WiJj?x@bHu6DSYtoaakD^5+ zzI49<30+L(y*X;R%5x1tm7&<5KflM4$7R9n3f8Sls9S~7AFU%xTUx4fJ|O$3J1+n* zHo@y@vu8NlQ`T{6EjxWe%jmEyFTrqEGe%)ztOa7GFypxJd190HB)i3T7vtzlLStZ| z{?$87oj}hBm94PHyzdqbX*Qx(f8VP7(G%G&ygH-Dj~O4ILG{xBhz=o<*br>7L|rQD zmlX9kh|J;xN?;J_6B1IgILjG7-o%l450dYR09@N(tm-dmiO#c-qP5Yn<#@=ma6l~? z_yTi#Bl@LI*9rW8kBEITj&j97lwCb~-_tdyDC(TmX;Q@;J@$E?X^ohJ%Ud-L7w1xI zBP9WI0Fry+%xkWd^Hr8^b5(0i$mbnd9@WsLhz{hzFGVm14WPfhfdgx!an>rf15A*$ zBE8EX`lkdxvvWVJDM1Ip$dS{LJP>IOS0-dh%YS@@YG&)JHXGwXe*^`t)-T-$qa8~* zi6m8{q=o6AvEh~Z@pyIxGQb^+jf-5`Eg3=>>iK zqFx2?bsMBAP>r_laGG+=J28oAG5<)?XsIaOgCQ^Og4MLRBBDY=s-6)BRHNDob140H zW?6BcmjFR@#))|#Jg}W$f{`HftnX4Cr;w4I;ACk(i$}9~I_+$*)B?FSA8s5B;6u%P zQ4|_`f+>w!ad0r~3shO2@G*7w>d=f88LR$&`V(eU=-f)v<;2-kMm;u3P1zE#h0I=D zM@1*6uN*EQi*v;Z$1w!&-ds5OVrA^h&HV#JtG#F{6qyQ{ z8kzdYEhaK5vJZM5si7s)&}ZR*xSVoy4?;xfe`tuTK0g0z{%HOTgAtiQjo0bTm+3Gy zZC0lWG{Xz+{4e`Wfq{1&Ki%qRAvph{R3U&SpcY(L49OEH6!71b^yk3LUVn=~KHL`F zuD}>YU{Dtd1s=XVpzbI-Opq|(WIVjt81mEWYl`qcRs-d?k+*wz{~zbTmqr0*{Ix=y zTI1(E^0v0#+D-A@}#9Sb0tNN5By7Se{1JzNr8lM zi3N5y-sc#YqSc}hSfsi8SCNNyx{6x56OE5Dtb?v4CQGgX*FlS}O#~=b64bm~lKn#b za>=^~MItB8TjQw3crAjiH&<7}iH=$!^RIJ#XJUL!TpOpE3JbrP*1wEzAUX6w^|)vh zgb+Sx-G^Jwexmm^uvA$`7Q7=U)ykf!@A9l%O!6b+)sa5`4qvE^IZQWqYwi5??Na2oqVG*A`+$i+I2GtH~T18l`*qBRNWiK~Ej(Ca*vUYMG!w@!#KsdhTz3 z{cJt}dFe~HdgfF2C@Uly?M)V0Qo_b0_bY2qwg@AF^=Z9CKjjOi*C+LuPZ^|7ji{+h z)(&)%QgzDNbT2(X#g+E8_gqof6c+sOR>^W7vEL<~R)Hsd^$aC+Nf}c*GSb{Nofyoa zhW(KgRzPjZ-6FWQ+1yUuFz;g=TA$~$Qi6z2&roZ(gZN4a=30>|&0#Mx0zF6aBc?5i zi6#1i@2}SD5zb9K$URl+)JBCb4(H7IXETNo03G1PQ6!;*=z)^yCszGt@bw1F&N}I> zRG+Gg)B+n@2J}YUxka>Aj;uv%qag((78M^wSGBWLWa$t*>G#GQ>?m|*?KQ;O6EC(5 zL}AP7yz@n)1L3A(S`+zCQE2Zl#(HDOnE9~{5Qc={t5G{6UEvBJEdAzL z-At?6Z}ynO@lG`1npYfy^SsOnhYTA>C>Fu&4~%;!bvCZhL+O}9GPPpcrP0M{wrC5f zX0UGESEuRSoU==e$E4mQO&Yd!LX1zM>$G;Bd7A!e`WfUsn8R-?pBgEZCY)j6r8bA6 z+$xhr;mLa@8EnP_59Gw09_$Fgc59qAVix_5hFK^_?hAVUEH7t0LCTHAHJ7)}JdM`N zcPU`M%5JfS35I`E%jhThtL=BUGPUcI#keY(D)}itt$ho__JcIHeO>Ds-%*L}xCZy9 z%Eipa3nl?|JVQn-bDX49NT>Jvl2R0|b4A*drih_)isA`FFCr9wOTPDh!1e*pb&fS| zEl}CE?I94O>9R<>pF{r^-Xk(&VpsHa8nE}Xo0X2Lrjrt<{}DNG&PdYBwOG53_E0BV z=z<}mF9y*&5qZHzaLM`k5sVu!{#6~mVX(`UoncE&xnm$2B~nf=Sh4W#a`F=-$H>yl zc$!a)P}F%=@K(d^sb5-&iC@}C8Rk0e9sO8C|FXponpx>;O_$+NHeocU+ry^B@LP4R zDq%r>e#(gx%7Wu3m8hjYIfB3Q5XFa>?L$MO(6J;8a=5}d!ntze#StNcV%}TdI%jZy zK>^>}j7+}@yM9BKi^)`W-*j%W~E>YI0)8^hbF~v8E`4eCemTZwAP6D zUadx}SORf(48E(~)Hiyg=y)VbuwaI?UvGK-Ob6$DVTcDX`#Z6B@an)5auSn&Bz-<* z6x2jC8x}VKfEI1|JNP~*rRik@haaX>k?Y6Do8RXPO;k2e4D7u2u!v?hMjNT3-Ah|Lq)5F>^2DXcn}kRs%}mtJK0))h;lZv!~vM*+C}WZm|fRw<=OXC zcZ{j9D=Nvx2j1;V_Md#ZWLMlXRqk*~g_!QWKV$^X!IaSG=FVr#`AD_%hKx%)4rH^L z^&M(6TTrF(>2-=IF)w2*H>cm6Z8UI>iZ#KTe4~mQlf~M2K0yiF(cVeyhVyVxJnSCJ zR`ITg5XK~I=#{<0mAze4C0U?951eTT(i%u>ea4XMQ?(zgwIJg77j$SLa$zu!|APaT z$l95)MKL`zyPTBy9j>6^^nF$QU_d&wE5wzkjhzV(>Yiz1;Eam~6M*qJqcJS9X<96B zt|DipH2pU8O$YU;B%fTLJYpaUlg|P0rVXSCdMMRVh2`+qd=lf*B%v-=pdd^yr-9?o z^)gbMR=Q-NjmHYA^)L|bu6{k!!qb`pJJV7=NzRzTradNp?zmTUNoDg+2NM(A``A?L zT;*jht$_-NWPvmVY09-$EC$06)p3oXogn%s3wF)eNtQ&YK@$q;NYoU1se#vq&EUUx*3(gz< zta8^bii__iQ%_*NUW=6V-}&sh=J~~<%18Fj%3PQaI3*0<%HHg#x3}KU7Fm{CPu%Y4K4A!hP@JRLh9%*U6EvM>Y$Xv! zP_VX8@+mo}s&VE$=4af5kb(EHp}O0CJ3!66RHbJj8spb_K3*AdXXM!N&pbj zanet%!Z(9jR>;|04l>~%_s`s4;1HxXh=t=Un(ctNRr_!Dt7W2jM4U?^N=zKv-fALz z5*lbTBg!Ao*^qKA0Kpr$T2GZH!t3TR6oMfND;|aKD7>cpR$2&Ws~TEx;~*7|_D}X% zz8IZn7#JV1iZu$|VVkcB=zewP+5ciJj{s(u%pv{ZfbOJ@AHDv>hhkInH*k zLRz1@N%`t6KAM7_X2wM-*hY9cd;w)vrf^9Z-fTeSCIe$>{wp}(nx^1L!e+}HSz-W&SCTtD}(2xjXNEep`qcVfNiYrSr1>V3I`7Z36b z#q*1Mm4zND4$uZOefib?28$Y&Pgsxf43P-@hKpb0%#e^!F~r5Av3Vjww98&fSeY7a z<)dum?Zb^AKf{jlQET!tAPh&l_V2G(kRDI#f`w*Dex%Pe3D=br5E((myjFWqh1_?> z6n)ZZZIJd+iI#_ihEW>tTxkqyqMtFy;-C20ermAvEVq+Ff}Tl3vR};#yVuf|NzsY6 zFY7IT@81|9`S87@h(x(IYtO8h&EH$A?bq3G-Nkkp06OOWuqknkRR zUsuzdE*hho4cchPP-m>v2Pj5djyQcE9W~LVt%FRnlT`P}m_j