#!/usr/bin/env bash # # Copyright (C) 2011-2020 Intel Corporation. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # * Neither the name of Intel Corporation nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # set -e PKG_NAME="Intel SGX Driver" if test $(id -u) -ne 0; then echo "Root privilege is required to install $PKG_NAME." exit 4 fi PATH=/usr/bin:/bin umask 022 DRIVERPKG=`mktemp -t sgx-driver-pkg.XXXXXX` DRIVER_TEMP_FOLDER=`mktemp -d sgx-driver-XXXXXX -p /tmp` trap "rm -fr $DRIVERPKG $DRIVER_TEMP_FOLDER 2>/dev/null; /bin/sed -i '/^isgx$/d' /etc/modules; exit 3" HUP INT QUIT TERM EXIT # The number of lines in this script (plus 1). Using this number to # calculate the start address of the payload. NR_SCRIPT_LINES=93 # Run /usr/bin/md5sum on the binary payload to get the MD5 check sum. CHKSUM=1c1d881bcf6504811827c24de7d9e66f # Get the install payload from this shell script. echo -n "Unpacking $PKG_NAME ..." tail -n +$NR_SCRIPT_LINES "$0" > $DRIVERPKG echo " done." echo -n "Verifying the integrity of the install package ..." if test $(md5sum $DRIVERPKG | awk '{print $1}') != $CHKSUM; then echo " The install package appears to be corrupted." exit 1 fi echo " done." echo "Installing $PKG_NAME ..." tar zxf $DRIVERPKG -C $DRIVER_TEMP_FOLDER >/dev/null 2>&1 retcode=$? # Save the return code # Clean-up the temporary tarball. rm -f $DRIVERPKG 2>/dev/null if test $retcode -ne 0; then echo " failed." exit 2 fi pushd $DRIVER_TEMP_FOLDER source scripts/installConfig make install popd ${SGX_PACKAGES_PATH}/${DRIVER_PKG_NAME}/scripts/install.sh rm -fr ${DRIVER_TEMP_FOLDER} trap - EXIT exit 0 K_Rnqѩ5/~UlQUW|Qk@quTk֪ RDuQ^//IY>'Nԫګz^%9K}˱H{>' #.AqiykMVHt$+&r Z&d BX-q\Yd2\,|d:k˄V4ŲgplA a fd"#4pL f|hEYcW -V!x^^(Ԙւ  10cJ;}8㒅S^,y0 ̄,F#r[_P,cF@ a^HȄ!C mhZ8>%\X`& `B7L/hoI 42jh^674RV28W#p4x/w.9 GťJ.4RH߅־:`cXWH#IQ`DaOtT]Q!*W &$sr%:>{x.}|0STY L4z/w$ Xn[m lLzr_FP2(tapyGHGD`zK G(Y&6BuT fA"W1/] ߑxeE*dd65:f2Ty҈+LD>'{90&e xE6+ZK;lyDZ֬XTQG2xԍ;}FJg$U%lr_ iözRWRT01xC&.f7Ĝ">*%/G?5*A_X4T_!n^ yeh4HL'fcr $hSW:k5_ITx?B{?hzڬ_kի*aH,![ِU+}NΔŰCiPۣ\B0t\ .4! ypV,3HA&ؑ XtuA)%)-(Sj9eJϸnf@Ʀ.QBxH2t[$4#8BV`9+(LI?&Ԧ.Hk[Y#x݂d'l9<@LIjYR^_,J~.iƭ5ы\{0 Nh[hb7wj݀nn^ 3Wnl<'G3>u䝙66`:ۥ 80 `ȈOE `?Ҿ-n:_` ;mfz]5`؇|!(S IKk5pkEغ)ƠXj,%,H~$lm7:Wf ,{Qz>.iY -<_*,W)K;!4. Lan.M+'Y2'RDíI'Y^eO-"h讽%Z-u-H 2"chB1R^(l&%]w _/tڢ\54.Xrnz$F} R S1Do aCgTJG}x<7u_| (.:4mhq[ȕ aw {1eZ@, 0XAy<9]diGF5cհ g$(ط@+/#Bk:*LwXr?[<%`4POv}0\e&ჃMڶl7-`(P9o{jXn~r #w >6Bg͉wH%xID֔N&:˓TehRd6"DzgF셟vWa,Yk-UXrq.y;5 OV (\Fă^|@v# c!A`(1t oFsii$c=j]Yg]_y 3%~2;)psPH6w_P H]k!Jy?>p400L~% 6ՎV_ըa1sXR* N嵕+VBX]Ƈr] G I=}ICZ2 _ U_;2% shWm'/' 7P:,q5J晬FNȺkUS廊^2@gK/%f<11zs3H4AO4F3m! xnԱ?yt jG{tN ?h=j78h"_kzs9gzvzb {=&pB,F>|̛Z+lk HmE.Y !9f=~Z!ݳ8~>R ?I[*jcd8`? !óW +L7ͼN=!+6Ml`(jsd{"Sa\c >y*L`'_$Z4T^Q/Kzgy(kcJβFq/;:q( ;?V%,w"o~jVhh^C?aW-5.?z=,>~>r \R$au* ɸ#'8rW7@@КK"ZC"xlG#Fjr#,ԩpxDq@AoU1<,tL2{c% `[`PlM=֬[̔OqNT/fM!$-?G,VNԬW.@U'0ݨQ3cDiiOw )KO$ʻIEBO~@.f9Jʥ#7k ZBb6Rĺyme?ҭ}訌8S:p^glSFVOGiߣ6Y^nYRkLbaQ3^άzQ$)S=KCƼ nSOzer6f۪&Ѣ`h?MuwF}1nb|{BonM(>ťY4dҙ[Fa *ɫ"vS.-a x֦xbscpgA{|g qpm?p5tRI=vO5߃ܣ{W[/OC+ĝbG]Pi EBܜƽkr0yH V=1=d8P'{/BwQ9ZeӞ~i`5LkӫZ,]b߿KR¥KזFh@KI4&5{r!n\!{; vgJ.({H8rF9RaBICg̈Xo l$jakm (-Mm\OŖGTBBBpT-L ZYѥ;wU!~b4mӔfc1Kxo65siWC xqI6FAf͠=*u$nd3%dō IľU _3-u6mE8(3lGİ'/\Ue܃d&(ueM ? %-rtL03 %?ӳԷL4HvdYi/-\x[W볔[|k}1nR?W8KU+$BJI AA{@Jx99:n6v?ŵv?ng#*m Xlg0=vr'y}ڢ{wZ%ldN յ:u,m2P+J;W`c>ajOk qeٗ%4LEʹ  @y2 'q%d29I2;GV~rXW+UTWR029VdYȀba&aN΃LWEU Y&P̀ES>QJU#ꄄ %Hz:{ ^KxrGxд-,h_%lHvKBeO vCPٔV| Kn)#G`4 1'v9Ƴ4ud. ; [nhG X/o0j.l탮Ѷ Gi0K?o@%b4i\YWLYp (0C Ic}Wh8ᨗW< ?PZ !,ƤKwM/ֿeMW)@XBw۰)UFe\fx%T3(E88銦9jK#B%>{`T(hѼq=0(J4$#VA6N,O'lp6wkyXD-fn%0C͗g| fq)t Ԑ)Ef7ian.ZcGෝ3nEiɟ~# AZBAQs`f#ZGY9{^nIK&|Cį;rp.R 0?9лRr xAq.+P;|T1&<IzjɫI-WzQ`ֽ_zXM͋[_Z hQy r0;''z?^^v{t$ ւ *ӨRcVQ ]ji[47ʙ𛡘ZKKO WU"A/?LF PK\!hCЩ,&=ًY:5#^L`FrF?@uz: Vmч-{Lv7(aZZv2PNR|,=FJ 'V3!AfCSN?\_A{_tSlѶjxirN+,e9 8~V$4r }_9t(9ln{sXT!齐DpR1\:f/,%| M:(as$x't s!+lvLRU7\qf+3h's{8*!D\*I:SPJ Mt}4{KSLբn͋F zj;7[W7aR!g (9ytoge>bBN Պ& Dԭ*f|,Hf?X\JiS=tAm?+Ch oOʓ.* (VsZu4:?kKZ/Ax=*kтuG>p: ԼbJX}l@>3#2k4LM™g~Z{k8OͧfZ m-n_1sf G]9K<6p)0:zFo4uѳ۲(V3auzʹF/t$q3<+g{Q:AxOA#T\G^rWCd/M_YY@ i(zv{RqJ9 y+vM_N`dN#~ =M#q~e k4>f9g 1(=߂30Ek*_NgThR+w⾼o'}5Nv؅N7qW*ˊv{ː+Jے}A54p&hwn!O J[Ru"0SR2K!:XYrkZ{8hH=7X* m@+d-~U(B(*`QM.At؍E/_諈)Ē!paZ<ݪw7MoS;fꭳgg:̔2tC cZ0|((oOQoGuOS@*HW6/N(u%^RꋖcpRwwuUYevN;-V6D; wT髦Ij}^R*ԃR5 $ $ ]02JRn^e/\~"&~6lAw<7JvLQ>Oy 8pUMJ+CNƆm^o"rSF7%n^恹uz0x֨:a;*NHޥzzYNFNl?A9}3v(~̘r4o12{glzvmKNGW B ]F~eF6Zg9 ><qtH5%BԉJvx})f{*&8wL| zЛp+@fm2vV_鵤K׵-k E-WQ JlÉ(\cۃS>~st23&ggQ(g0{%Qdix'J;p5.װer9r7PŪJNODEx싅m}Iky.ey* òUDfw.&63t cLtDW[dy\%H8+ /sIU/'+6oyy2fF./m!ʙ\U8Gz(`sqsbf>44pʤc2/tգ->|uv4tHζON9tS]}3lZYM}кrEYƌ#ji޲ɾ$Rr=xٚNbV& 4V)] %\HNJ&vM`gϞ\aMfojc˱4UBdlHgø᲼!zsc}GC[WG&'>vLrVmʗJ5s'ymVoeZPݲoVzuR5¼M\*-uRc (ai$hYBV}[v&+˲"zCnV[Torʬ&+0Hogi ۫*E/(h|;܀P/"\\Om(Mo_8^E*ӨhSs a!}3E nutza(i2aGBj?cep=?}}Z]=| =8"y<\| {~JԱ@ڧ'wԑ>=ME<)x;xi-*6}\ܵm[jdPMjty芌xCW J:b .#3B|5LʎdH4yCp1/I4@ν}8A$kf4Ѓq?%}5Py4tu31N*ԯ3WwQ4(0nV/&s^Z 5cV+lbN(pq f/ 47)f rXPI5u3s3bZ kQh|0QG7oݵ  nL,/ #}x,D9Y1ݘe;5[hqly.xܝF iȠ}Ih)ߺ4#Ekf`*\P r[#['FmPm:JW\ 6Ce_Ψv+]B?q++J +.ۆ,g0Y?knajr SLӁBqCJcu>֕WGE[݂X֓N}?$C@xxg,,,,,,,,,0eve+vZ]Dk'ѓ%tI?#{Ҡ?j7m7+ti |߇%ROf7Reв{ZJʾwMzpdJiġ6a è)028S>Qs B\#&|N/ X&x~A=M nS` e7f=Rbr.үC8_6z#Ӌj!+*%54G!9Pr9J5M&YoLjG/Th*(p*ef7F5 oH2ZeGX^W-k[*^sAU$1&* F)N(Lwۭi}垎P8_RoE6Kky+[ %(gh'>;:#\T  W3v)q)DW鎮R}Vl~֝ط2f4.?FS1:tptp7afћxD #x<ڃ{JAW 6DךAh-k5FtLQExVz=K ܜpX-J"'j ?A~C/Pn˳xw̝E/tmAogPNn96K& }7jNdUJS #tkA 2Juf:WFyt1о|74?TLd; P/|Mhz6P& ,Iɹ²afJmS$QvØ9K ?Kxzރ|ja=DcEXl0:p3N6yKGİ-}@6h=%\r}}Bd2]` BU*^>p:8 C7]T`ahfa2NbtwN4]fhKN,`˅Ģͮ'xÒDr$PUYX-F+PFaOaR -ǎÝ>c E~!)_" t=5!LppNˈ%^̠ϓARv ʈv Zޜ`<$<~YP|BNSR:}(e2Dsk8qI'{C6=4ڴن/Yς]PD&-sV"ͫ>=Ch,ZOhpara7@@邍\Wuc ;2YF#>K1Lژg W {JDN Q759 4,/0N G;/oQ;Fd%#.| Ų۽{p`v 19d A!VU}/#Tݹ+)PkA9c[\nbzt4fx8U'^c'l{.Yd~b ߈]lHy"#0-U.|m9#@Kb뛨7$r,2uWڎ9B[V8WdA0{YfN>:Uoq~H!yֱ^dd6Y:e/.}â0r[)‘= 3dH=ɐ*#2C ` C3z8]8|{Mп耖#;}lzFEđ.u:*e|2d;|Zuy*%;uQ\.Zkj \I{"~Vګxi+Ǖa1\Ӄ ӭl>p^naS$é)V:0tQ)QL<6np)1TLLri˸iZj9XC";"l gvՓħfMnTwlAtCV )cy}k-*Xɋ?r@a-‡C![nލo *.|E2lN} SdȢ9EeV.ǎiWY[_y<\Y]|Y,g3f?YtT+[2Ŭd ʌ&^QD0 )JMiEu()_sI 5S^[K") ޻*&c#ItH+Q:xO=RۯuDPEtA/ ֵzX,&rD)[юkv(wt7._BAzYyTin$Yze6ʾȡtˍRG`\ _Oh:U`rGN$ңs&Fұn\|-@|]ݏ\KAy+γTәC}KJŒ8%Z>%^bnS*$t:gxS9ʊev[owwI-l7u-X>t[KO׻Dm#/O+[XKTswRf0pgw$m~Ach в3oefݫN& OpcK05U T˴Ԃax^h.99=ܚ,~1s۱۔2J㼘 tn!ŰЯCOsuPAIlz:xg k)DuVh9ZyدJ`,U'@=3Lɶh^Nn9FeMDfOf.N͆7!DI7B|l#m ۄRՈT;G'o~knDP;:mR5 c9{ɮ¶ J`xŞx>ojF3 yV8bP+pte%BĆ:rxBHCؘi\ N1 I8L Q'8%xjUJdM#teWfesڅœm1%5`@P6dU:&Iq6jq }U0ݥGYMK0gS]rW9`Es,LQO!,#vn>~OV 9^u͞=+3Ӟ yZ%hd 'LXp)0<8kUi#($(_%2!,W &d7Z-Uo3ȃpO +J;0 T`3p5[!ՂTjȣ@|[ E.E,&Avދ.لOy;)ߓEfM=Sj-/]߉ 60Щ 盬WuC뗥zu/CdxV* Pbɦ+UWɀGX{&hQ7FF҇JOZTA~?ŵFpa)\ *!XҤWtdCLqUxX ņ+27ٲ|'VG-Ml/N8BYcbp:g-jW-6\f5Z ~E'$\ޥ1I/+hyG߫ henz+T&R֑R|5_㵕~g3??K-H"Iߺ`W&#?̋Bv?b>[eЫ~;~)'mh _|0hnZ[#w.NOkYs˼qi#kpU껺JyգKuG8+޸+jO*sQs oQ eP?t.ԨQG!עZyxhX/Oeɓt|k{L5Qۢ-9@ ޛl:x'K'ݷdmSǡtfy(m&$7õ7̛ 䜱<@dRT^ަy|3D-+U5:ocdl+ŦIKFcf1/V >L8i.iià $mJ/!:{GR%| 5MN -OʥpΕ}Nyv"q•ٲ"=(X*Z||zYFh!WQڀB)s\G4Uop#g zx ]Єk||?o[]Lmpʯ"o@Lދ#e,Ey>!hTs2z}9t? QY |4x+16C4{U'+Jgn"r֊A+[Ca4E֖-W[‡ ֻ10O`Zl#|k&pKP叆>-pr-uZp&r}`xلs-m5JIp$s^__wW߉ENRLHi;Z;b+"N'bC 8m_-VWh&h-%\wG2(J!FO&Wsoox]'4f]-AǯO+p&++1IŀBoco>lޮ5?^?[Vh>Ǖ/~<`A*lҞ~A|t|J ;X:6xRΫOO9M#鸀o-$C<8*s$0QDܻï9⤍z)k]v_cNf6Ocp}/, FF1ޤ+MNӌ7T.~Ŀ/7sQu|FOD ~ds zB+]NtVz̝PXi=/ Zi= BUZ N@џʮBLu$:)*'IWՂy$A0ˉL1u:T :I+!sg .s&Ư0^/T0!7ۗuWů1[+Xw eSLNK)N_]=ң,EA]`td'-~׍è+TϮ}}@(꽷fşM3q&HYY9ld:.;nW!NIA1ELFN DXAˌ(bzI/2ҷFӸUHh߫)ZK)J8DmW2<T705*h8QntY}a\;JR.{ H8QCJ īF%^Cu* 8=vq?.Qlq(+ j7VIh(nJ|G <1"Un&?!@ir1#wq|:2iR\FToW#L5Dݶ(p 3 v+8[|)J`n@> {g`I_\ѧ%:Ӛi<t/nw<)e2b迆u.R_Y|">>n3uѫbr`]5&1"#xȰ4|%Q,BP-j=&HIF ! (7$(1 .s2*r︝҄feRmuNI AޫZ\eB3Ze;G,1zOatALߍqWӢ/2O,E.Gz( ox=n'Y{=g3{ř?wܻ{0o4M)!]ŎNlǰOao!'&89i!rTP-lMJ͌JkXҗ8TZ8[RA ")1α8 Qz jbp뼚Et/זheT{ ߌG÷ qRl_ՙҦup/"P:bԱ bїq@֟J>(OP_>7.K-RS-=يBV~ zOt0\Fj4^_q_~Nj*}(Kf#A(/i*4IY(RvӔ*m'# if%i<`M?׳B 0 l%й 6;&i-=}ߘ/Z \wX*me\m4lWqDFo}q 9 #2V0ZUTJ۱;ijX {GXmGVp&(j{NLJ\a9/UVS9:Yk[~M# BP{sڹ_{Td^?􈇍[blPNf6J:MV'ZɃݚ' {TDa*0յk际+O$ZP0\HaY*,8;5 laȶUtvgԀx*,v.RaA( ozO ߦPaj~k@TAK+( pSZ s3KĬ#gK|CxKV>o bJZ^0SڂwOa#'ܑsUFuP:#\?}i/rpsgj yR֥3koYOoy Xv_T*T{ ˨ʈAѷW C-'hx H"'a6aEAm[>ZgtKV ZaZ:h6{L:nh&6tnmc>S">~da#?4%: W"L-Uv1"Et [ѿv cy*Yl$ef> 1x5l9=N'mT1t+(o PsUxɑ.R$dKK`*[ aqvD:mqxn'2tr}ڨ'\(ߡMOnXcMbA|#z Baϴh)r1悺Ua̠FS0]q%X;:ǸxPv5{ݔ$8wqqW6'v3Ĝs: ?DwGZy@7x/5XF? q,N?.IbHl.zْ8EtL0H4gM7`L"p)_9p"XVmimo2A5 u?BɿhcI``7#4'-/ m ۺ4݉uTE2.LiN^9kq5AwK'ICӂdRZfZbĸ QVvq 7J=rq9HΣDtF Uȹb@$ P-% @dbC["A>}>F>a{JP޽zj,?rhkv5~`]9DIa8sH0jѳVRu 5PI"@q(_\'6^yk%y }739=Uq @cA%ڄsGhjC{ .oRa^91,랐B?W sjƒ),=jTir2lHO J^} FoN5D%c crYjn]'ӳ퓳_NC5N/=ou (]4+Bƣkrqys&gU'43Yqw!E !PbS9MNÖrÝ܀;j z=$㴉5qo}>dV&~IهT;D`.ku{y^^0*l>ߒE.eR@>rrkˈ x˘{$V]tXkK]=`$SILtFf `Er0=zsu}% &zȥtC:{oi+ u-P] ҆86UÌA5Xy_0OΏjWwFqڣU?{m},kGBgY,{=E}Ϣe)~}oM uC? лL2ª)YE&x'#y6i{kTgڿd*UJW*j%ʵ`h1˯TS}C'A˯Ԛ8R^~E=xϩq 95=}5^TwI{ g)lUؽNKҊ{9+V%4@?yzK_ԷOJX3ÃTz;~5B >>o0[*TsR&q>-V*O\h}եt :ޣ]J};.9(>^R?>)]{|7a a_C_B8`v0i`= [ /WyA;}M!:D^FɳCuLロ?^;lx 0g̰nj>ȣg0%ЪQqwGb@B4d1(y4ۜ#ҳ !|v-!&JPfcH.q\1*f`!<3l 쾨& AnA>?2%;LQ:o(*-:4l\ɨ4Aѥ7`z8c=w+^}l93%n3CKnr㣌)(!."^M3md*k ?[վ[W)=3kGg3#_0Yf%`f YfSE|1k NU$5$k*|!eGxиU'mm@w:u.RO$LZ#ڎ|:5토% jxʑ|Պ?ި+%JU> (6>ZzJ&fyQETP8nmti*`)z={󹝙-W/Yuw)gG%e(ZJXO -l F+ 07v7Eb2D1HG8Ŏ @lTV#e󠠅h\vN-5{ڟ  z {(FBo>:PorNso`x&fOT7"ɬHV1iLlI>i0瀜d(SF%Y|@ *b5ș~ 1M+8vh++0NjEAZuvs{2 %PsLsI\B>8cuKCwv̀OҎNU>mVIA۵lzhR Ș0#7<> HP(@_.%4.,kc/# !J\Y58XƒD<)![*]Dg~:h15BtD@t\'節󴑠_F-658 :iZhx [Ao L(;}10*AOy]`C:BP`" K*Y_>+CK+<:+Ez)N,Sg9꺗kH"X霅j ˮh2%i9Kz uTۇ̭֢"~ZBN̷B6tQTGT_j JtmUA_>Xv Grj. dۇKdIFYpQ!J#A<= [J  sFy.V/D<λ"h!rU+Z=hD4ps;O)P8}:>Ϊa NZx6nHO4ZHWXy$]v(/C)*e#K y ϝN?Fz tJ^+Ni8#MЉcߓ_W~\3{=y}ϼagӁJʹ  @)2y| -8$U(EO̡arhc&9=aN;vC6F;Et,UxǾSv.Pĝ3GEd<[ >,rXե }dÝC㭕o7tTmɲdj+^TCE$޸r>e1͑Ꜷu>sO?6CGV{ɶeN{(~aaݬ͔FM`e.;PkF[Tj$u|g>;<=G>z^f2CХX/iEKp_EK !E騡}.i?Zz~q?>uJϕˢB. wЉ .B-} ׵FTu8 Bфv? V4\m x||N_Ϳ0 ˟Շ+3?z<;{`]NdxU_o<ܢ.ܢmLEMc׷wv8agr:r{ q-otvW H'˪bhAAzS<0Bp QIK^>EO MYnTģ' l";B$=e\T⮔ijȝ{+8fD [9"u,(!rٚtG8%EHKd[s_seYp.@( rӭ%%<q1nÕCW%dҺZxq?VVy?_GXąlͭVg'@M o1:T.Y.g4u[˽uCeOcgg3 0