From d06a3eda0d3638eb9f39afd724a33589f485db72 Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Tue, 8 Apr 2014 14:26:28 -0400 Subject: [PATCH] Add method to get indexes for the current table --- core/abstract/abstract_driver.php | 13 +++++++++++++ core/abstract/abstract_table.php | 3 ++- core/interfaces/sql_interface.php | 10 +++++++++- tests/core/db_test.php | 18 +++++++++--------- tests/databases/firebird/FirebirdQBTest.php | 6 +++++- tests/databases/firebird/FirebirdTest.php | 6 ++++++ tests/databases/pgsql/PgSQLTest.php | 9 +++++++++ tests/databases/sqlite/SqliteTest.php | 13 +------------ tests/db_files/FB_TEST_DB.FDB | Bin 831488 -> 860160 bytes 9 files changed, 54 insertions(+), 24 deletions(-) diff --git a/core/abstract/abstract_driver.php b/core/abstract/abstract_driver.php index a45138e..5989118 100644 --- a/core/abstract/abstract_driver.php +++ b/core/abstract/abstract_driver.php @@ -419,6 +419,19 @@ abstract class Abstract_Driver extends \PDO implements Driver_Interface { // -------------------------------------------------------------------------- + /** + * Retrieve indexes for the table + * + * @param string $table + * @return array + */ + public function get_indexes($table) + { + return $this->driver_query($this->sql->index_list($table), FALSE); + } + + // -------------------------------------------------------------------------- + /** * Retrieve list of data types for the database * diff --git a/core/abstract/abstract_table.php b/core/abstract/abstract_table.php index 9943364..26e35bc 100644 --- a/core/abstract/abstract_table.php +++ b/core/abstract/abstract_table.php @@ -47,7 +47,8 @@ abstract class Abstract_Table { */ public function set_options(Array $options) { - $type = end(explode('_', get_class($this))); + $class_segments = explode('_', get_class($this)); + $type = end($class_segments); foreach($options as $option => $value) { diff --git a/core/interfaces/sql_interface.php b/core/interfaces/sql_interface.php index fea8f3f..1ff40dc 100644 --- a/core/interfaces/sql_interface.php +++ b/core/interfaces/sql_interface.php @@ -127,9 +127,17 @@ interface SQL_Interface { * table * * @parma string $table - * @return string + * @return array */ public function fk_list($table); + /** + * Get the list of indexes for the current table + * + * @param string $table + * @return array + */ + public function index_list($table); + } // End of sql_interface.php \ No newline at end of file diff --git a/tests/core/db_test.php b/tests/core/db_test.php index c8b9586..ee8fe68 100644 --- a/tests/core/db_test.php +++ b/tests/core/db_test.php @@ -43,15 +43,7 @@ abstract class DBTest extends Query_TestCase { $this->assertTrue(is_array($tables)); } - - // -------------------------------------------------------------------------- - - public function testCreateTransaction() - { - $res = $this->db->beginTransaction(); - $this->assertTrue($res); - } - + // -------------------------------------------------------------------------- public function testBackupData() @@ -83,5 +75,13 @@ abstract class DBTest extends Query_TestCase { $this->assertTrue(is_array($keys)); } + // -------------------------------------------------------------------------- + + public function testGetIndexes() + { + $keys = $this->db->get_indexes('test'); + $this->assertTrue(is_array($keys)); + } + } // End of db_test.php \ No newline at end of file diff --git a/tests/databases/firebird/FirebirdQBTest.php b/tests/databases/firebird/FirebirdQBTest.php index aae1d9b..22c215b 100644 --- a/tests/databases/firebird/FirebirdQBTest.php +++ b/tests/databases/firebird/FirebirdQBTest.php @@ -140,7 +140,11 @@ class FirebirdQBTest extends QBTest { public function testBackupStructure() { - $this->assertEquals('', $this->db->util->backup_structure()); + + $existing = QTEST_DIR.QDS.'db_files'.QDS.'FB_TEST_DB.FDB'; + $backup = QTEST_DIR.QDS.'db_files'.QDS.'FB_TEST_BKP.FDB'; + + $this->assertTrue($this->db->util->backup_structure($existing, $backup)); } // -------------------------------------------------------------------------- diff --git a/tests/databases/firebird/FirebirdTest.php b/tests/databases/firebird/FirebirdTest.php index e58d1a3..297742c 100644 --- a/tests/databases/firebird/FirebirdTest.php +++ b/tests/databases/firebird/FirebirdTest.php @@ -109,6 +109,7 @@ class FirebirdTest extends DBtest { public function testCreateTable() { + //Attempt to create the table $sql = $this->db->util->create_table('create_delete', array( 'id' => 'SMALLINT', @@ -314,4 +315,9 @@ SQL; { $this->assertFalse($this->db->setAttribute(47, 'foo')); } + + public function testLastInsertId() + { + $this->assertEqual(0, $this->db->lastInsertId('NEWTABLE_SEQ')); + } } \ No newline at end of file diff --git a/tests/databases/pgsql/PgSQLTest.php b/tests/databases/pgsql/PgSQLTest.php index 4b9dd0a..e7ee7ae 100644 --- a/tests/databases/pgsql/PgSQLTest.php +++ b/tests/databases/pgsql/PgSQLTest.php @@ -62,10 +62,19 @@ class PgTest extends DBTest { // -------------------------------------------------------------------------- + public function DataCreate() + { + $this->db->exec(file_get_contents(QTEST_DIR.'/db_files/pgsql.sql')); + } + + // -------------------------------------------------------------------------- + public function testCreateTable() { if (empty($this->db)) return; + $this->DataCreate(); + // Drop the table(s) if they exist $sql = 'DROP TABLE IF EXISTS "create_test"'; $this->db->query($sql); diff --git a/tests/databases/sqlite/SqliteTest.php b/tests/databases/sqlite/SqliteTest.php index 6f38a00..a37c9e4 100644 --- a/tests/databases/sqlite/SqliteTest.php +++ b/tests/databases/sqlite/SqliteTest.php @@ -224,7 +224,7 @@ SQL; public function testGetDBs() { - $this->assertNull($this->db->get_dbs()); + $this->assertTrue(is_array($this->db->get_dbs())); } // -------------------------------------------------------------------------- @@ -261,16 +261,5 @@ SQL; $sql = $this->db->sql->sequence_list(); $this->assertEqual(NULL, $sql); - - $sql = $this->db->sql->fk_list('create_test'); - $this->assertEqual(NULL, $sql); - } - - // -------------------------------------------------------------------------- - - public function testGetFKs() - { - $keys = $this->db->get_fks('create_test'); - $this->assertNull($keys); } } \ No newline at end of file diff --git a/tests/db_files/FB_TEST_DB.FDB b/tests/db_files/FB_TEST_DB.FDB index e8a33ae84bfe8f80e9ef2de5f6166ac13f61213d..ad2957101e1fb5cf5da03d46931c6b56eb4440c6 100755 GIT binary patch delta 33090 zcmeHwe|%KcweLDJbIzH}nO~5QgrAu}_@QFWBojguDqy0L36MavXafldEw4vJ&OUR_ znMuI<>z{XE&pB)FwbxpE?X`dZNdG`X|AEYWg<9%&Hd5h98vQ{V;&-}%Xc`<*K)L6C z5_LDfF!}5n3n57X{Oc2dg5Pw*p4z_eC2miKViQ6Z%D>_DZ(F;@DsS&eCtpbHd8bB8 z-VxeSX%KM?74C`MU9ZINNIrRDPiWT3L}j3*KF>j(C%dPr^9&`}uaDi`)viUA<0naZ z^dtp7t-NX0#v>#4eD_nAPEkg0?J8GeEYzN{{jbN(WI{RdP-si1vd|nhV3glcJy5Sa zvb*bN@jc1cPSoES3RLR4U~}-FYD2Fj^2vJT#5qcmsl=&_C_lDOc|E?h@A$qoN@$J1 zj|u!=+4#qm6SpZk@M8fQE)w(r!hazX^jK(1V2u((c$q?#BIZNT(94Ohhmyg^Ldnqa z^3hV)2n9zdWXhdY>P=N0$_%PiWUS%?ERL;0Fuily4oED_4pVCE(&Kc@O=Hz~^FaIZNL4NBtsx@D|sn+}(RJ5n~4_QP!{n?kGL zX2Dg%9Szshez+~+DYPOym8QeJs7j7q->h*kupb0XFt6HqW%a{&ZcG&VHVUiv7deh1^ulU zR|-ANEA&X8Y9%aHJF+2X*?`n7BREo*IeC7v$s@EaGlcfwyG)=dQ!I25E(@K5K{Pdb zr7riWTEbG*5|*lF*b&-gs7;okNrP}S?Z(f!4Y$d%Adjlu$O2cYy51{v%%^GzOI1r) zYMNm@&_5S=m(&@{@QS3iBRKfdJ~Ea;d4w*)wS~@Dw&WB&z2PD&|D{#yb}FQ*B`j6V zu=V(aHovq=)CqnBM@sX7RVZym!BQ~GUL3&`pEe~dwJBk#O@>R#Wto;#W}&qCBRFze zHsjG|5v~;4G8ac^?ksSHDl0MxOQF;L(#8m-q@HGFla$&qTtB`PdYV=2Jwg}Zvd}ZQ z`nAfkBeksdr3n;O+n!o|c2Tgc41cZe$8&0F(R!R`wH`w?KmLljKtQ=dn3^BK(S|81 z_8snif~#t(w@fYS)ThzE(V)1N`3#L~E1=%8oDk@S(X8d@{=o#W%w`1;=iD=avr^d6)@zi*h8CrNbwCqKUEmO+0SSHxuWI@B< z2FJCsE8%D>Q36*c$jUAuK#sc>MFL1fZ(e!3aM5?xz5A}{s$^Q6E`>6I>3O<(Y*Uh+ zl|_z*fX5ZP{S=H(bV$EV$~Y%A3U0I@hc?l@kCrO zNrqbyKmAO;VYYf*Jo`wIYL*ouf_g!9R>VHR@s|Sye<^8S{`Cdwu+-%9T%#Sy^c{R? z^uIykEb0s>M7IRYhBfLf)mnnW^V>evJ$p_^TOgrmm&}{fwr~+C+n1D8mtX+A{TK>)--lEpU_VufwWL+sa zW(YanglSBsSpiyOPT8V{6bP_AQYdSd$yHI)1B zkXb%IwLf;_9iX4%_mfBz#w~v%t2|}YKzlHQ-+R?eW+cS3yr;K}N@y7Q{xG4ZpGxQr zKT7D0Pbc)uj}v;+j-)>Afu!F2U{as{P*QIRCDmY4ef=XzJ^g4>Z>W4MsWX{Ls zFs*4{LZ6mT=*{NKJJkAIa9U%dbd8N6`FW~$&nYn%pBe>Ba*d~jCPe%&FmoRU(bK27 z_+#eZlRITTN=rEXM7GD5y@=uMy zY4Ky_3Z-8rRlfbG9|~s9seB|``96L2?z!pX))%Y_Fs%D72|)uFU-O0?|l&+ zq)e5fIf(t0LM?57r;q8^n}E+LQ6`3Blz-r1b+VEl_PF}Gmb((|w*NV27*Ej-gozfS zT@O<1zoC~or><>rciY1Gvpaf2My0x7PJ7!0-M!tHb+(1{<@%!T+17&vNU(C#z4}o7J21SL{;H4l7CSrj+a4O=((D zA~{{+Xwso{F3RP6A=9eBvXKUU8b)8bDWefeWuV=#>vtcDG zdu3nE>NjNdWJdJO{?{|=g`w$I-)wukYPPHU+d~a^x2xZ1SMO<8?`>D_YgfP7t`5&q z?24;bE?c{@cg4!pE7z{PBOBY6H8Vd|&#I4RJsr8tS>x8MQ3eTQcMht9+EVgAC-lrR zPN*^i^X-!{Ax|N~ARE0obik@~GCH$!=eM>kMqVr)t_Rd!o+vjbA5?#qsnkQ^&V_U5 z&0cs}bGc5#Ii#UiXdykfl_ON>hMM7z5%_504`%q&xL|lLGrR^2gS1F89P4FRRbV)v z9y))Fi(z$1hIi}3M@gQeCC?Q2vSZ$lTD*^d_tGBB;FnPXOD;2zScPK0P!@G{)Y-H7 z>E@2^bTb4~*)#nJg&NA2sew!;zf5a-V7WH^aSAo6%R|AYOylFrwaj;xYfZbCYt#N| zxz_xB1m|CPU9AsPKejy9`0eGf%#+JwO?#HdrsbE%nt!-FHa-9DU)3%pH#ypp^1JCj z@cRq~zi-Uk$ICvN`&d&SZOMI{%7^ZY@_*Y4T0 z9x;ejh9S~rvw&VnSIbCvhv&}kZo8EMz!k^OiKwUr!N z-L7dC*KzH^GE7%nKv|P=mPk?lYiqR2b*0xl{AH~sf7Lo|t!^IAX%)lVP5|8Up26^Dw_FviT8@X`c#jKcH6YRbUvVe>7`$X_FemSXA9b z%8!pn@Ns}YqWCz-A8~vP@JA9K$N6J81+?oZKYN$9F|qG}7TO_7W%rFB7^AE3D@tV) z#lULe^^U>J8T{ujZ|?HnqyMR zMQz6O>IE9tQ^i-QBIu!X21tcSi=$<6Vctj;ng9eSoucXg$tx~d`Mk5^M@vIySN#gytcZL>>f-LeuzGAeKpyv`zv@MaLp2Re& z!?*ug5uZ%=#v18h>};A5JBJQM&!J7xDKsNGX?NEjjogE*3iFUKWRMXIy!bu_CGhX`(|3<-# zH;Y4g^v zgh!i)@gsr!$Xxi9WV7GqLl|f8Ph3Rn6EkQ=;(R(3Kbuy^r_%g1Og4iaZ6P;t&`O9_cS4 zhObOiaEe@UY#W!1g4m2`>A@E-SHYjiXm)#%!wrJ1Gb+njhgBGGU z8~#KHJ=r>0yKmWdARO9K?(f-E&@i*Avut+ox#+~*T~|fx9`Y1G6fDn>^3@cY$-m~0 z^^{cy0~ZChc8wZ_R#QAJHfc;&RSm1PJ!{a|@DtwM^;lxxnlfbzZv!1?c{;yk)OlxB zByCsJMAKtwipI`#!uexOG)=8huis81P3sM>-#{cydm~=IYWN*1^ZIp`rK!&Am!pm0 zH1&kf@-RN2r)it+^?O50)AO3wuO5COpWiAqO*2$4-i}b3)`q-(F9p-|L~xkbGZ{?p z?s{C=7mO$|-Y`8DV_f$$oX#<;l9467(=`mU;hs~QX$xF^*-Sbfo=Lml*1*-n9oJ{l zVuYpOj)t0P7u-6ydiWpLfD5+>`9wn7#pb!d?jtp zuZc`7$9yuEyWgb_V<*r_N}WUi5XM)|eJkY)BSP5Hagm9u{Q)ai!Q37|s>E)NljOi7 z(J7;oG)IP4GYlytjDa4uiL^T5wG3mDnZvCoVE%SoWQ>_FkBl_jzORjqj5JS_N5=Sl z$C%9(rEu3)_;6pS0o}>NBGu(9m;1!O-_pUT*0)mF4Q`Lej@l}MhzMupRTT%WUHN}y zWGJvW9Fyk=XC;=1jD+7VI8Q9st!zO{VC74~3K(Ark^EsN5hn7oRDjIOQeiAc5vP-z zy&|A`vqZ21+#-0w+#+}ad?I+lScGA=Y)-(+$JSIvl&mz855kC?%vM(Bk5@(d6_43` zfF_n-Gb*x84Kz38wNzxYv1e8?t|;g4?phi|zuXKRG?I;#809~gm`+>Z7Q|ELfw>EYjO^MCj-F4X4Nl^~?JJ#j)NFarghMYhAV`|v^1u6XZ zbZ1bqyj!9MPRiNCMr=w8^H_*SOeftPA1!B5I!xZZe~K$IHmbQI%hBY~l;%VoJT5k` z4ILNlig!Pji!pYz4ISCni(>7``BLmFOuAGjdLh404Yx#g^|W%$uco{ky9xp{VAG*X z0NML+(miNAY(g9=p1UuB?ZA+_&_VVKjp7rtgm(Jc@hNmLUQ18J$J2)R zMC!x$47loe?e4Ch#ByHqe%r}xHg7Q$0$Hyyxo}{`n9F!MH53l46|)|L;aI9_gjL!z zAb((DULzP^94Aym8S%o?7!PIi6_wQ)*B|~R3%5SdjLn4SQV8yZ5~Cw(X1IDOIY-WT(D@$1Z;j|M&ztvSjJ@^}9C^pQo1=s!M+r-g=?0r4Z`Utygtx_!cjXs2 z!rS7=`|oXzyhq;6QNog=geAwb9F9UyGL7)IIm)DqG{W2FD3UI;%6o*}93?C{N?3B7 z=x`Kzk{sb}b3}nGq!Hd0N8Y+@r;(2}IUMQ2g%TDVzkDnuVZjlVM2+Og2c@J|Tj#*r z;>gFLB*&|k!`tR4lr7T8=ZqYV*bFOSD~(O{5*8d`CL;yMiB&4MOldyqB-v8id<5Ej zrOKh(bOzowU!ij5yOK`|IegQZ76}W!s5~TW^S!6sNvSkVSnQ&1c-tJM%E9rvE8%T( z6e<@fnSa8H#aZGaLGe$Cz;f3(FIPy^*a~l(<40T%ahFK*@#)LdO(_>7BduF_ZkVDhvtZATEAyOw!KOA_xw=5~G_Oh5HAMuq!S~#9G`}*bO`wzVZ zvz^z*tFXKXi#1r7ZLZL}mpLnoJF*mWQGvUCgrbrV^W=V*y;WZ-uc_XtivVO;VNr;`D2_klYTILVB+ zJjq-*`{2iuhnRU<45tt~ynQ!~k5#i(7X}z>m3isij z0rztNv%=eO$AJ4e5l+){xKqIWOo89qy4SA<6UFsDzb)D&XVm zS>fkHUcagEBcER%W{NYxsk^%#P|TidBUAHr*F+9QQyRuU?&;xAD++zr=J`fK8HNif zUP|Eljc|@fO71M-S^F|dT6Ykv(I4e(RAHoxbeZg{;`%%ZekIpWm-7^D?Q1=P_Sa zbRc_DKEHlsMYk_2_981b2EFu-1~6y;UzGeyw@1#1<$S8<48l?etiKSc6)LZG!K{IG zP;ZA%$K)rjt>ZJV`gu3|x6Zg{!byxfR)>jtm8H^MQl&mVih}z24wzHQXHNaFoNix1-3!av z=(C)ou$-rSmNN!^$9J>-BhZi1q;s(8 zkIkevXlM7a(Kyc$=y$JAzZLL1;?r*{bY9`}TMPZR`gHy(qT47WLrZt*Rf7Yl} z-ZrlXIKsZ-XBN5%6M6obZz6l!+`61G)A^-W7!O7LJ$qhm`u~O7&Moo!KnnNO##N#o z-RCacAb+`X0Ub(=r@dIz-ISP!6~0<(1)NGupuX66v_G|IZ|aB=DLNjH(ev>M^c3EA z;k^;>Rq+~HjCXx}5+&m)B76_TQrN&8qbFjuv>`T$#zbN?D^^3fLuDykJ2)QG0uyL8 zt{be2jiQV39mYFVHjxIRlQ0J{ilT_HJ~|%DhLdPI;3VEBj8Rx61W}_F22w*Cj7hW# zeuu)f^i()ScZJ8(Ecn&IkAQP1QcL^cwnQe;+Q=vj&}u(VQ{k}=$lc)y*veH)QA9eX z*U)o%Ej_G{$Ize-_MEBbg}eRGP7o0H&n3)rpb9NpEnzX??h5BQL*=t8uRf>2{KVyv znlmP1N2UFQcv6v99RYLqAMcYPx@OtxmFWhcFYS(uQAU~zmPRJ#&H;D%D7@KMnJUKyId^*CQ-b-}uiKp^AcZpzny617OJ) zpqAz$BHCpLZJ8{3I;RPr{b@k+?q0sohX7$Z%}|% zGC%1d&9BL>-cHl%fG(;x+rFBd)Pr7e^>%vp1q~I^`FrfEh{!4Ji^~1gTM>;R?W?+U z^@iOZPj4_%Q%jf?bi^#VCylqFq6WFF_QY^TH2|r@GbJ>B)60j z-zsLAdKp9Dm#CHyZtmG^Oze~qWp6`9R78_j+!9KBSzaZ+rw&R=EH1*F`J&}>d|7O6 zNnF)Tk?MTqiMtC$INstSdILo`p5kD&_T0i*4>!Q(S8p;ZhFR^oE5vlF&Kz3q(`mE) zvyTRNd=NuQXQt&;Q!+ADAMlVeheHRaH6`;Q&B!S3DVf`iOiYR5&?k1*bAJ?#6V}9j zTeL#SL(PwJB=@n-JYt##$z8(Qu$~WXn&x}Pn%G6Shsb$i_$s58zh~Of%pNe#aEzNN zc4De4WltsYQsQ0=pZf9c#`;zY?>EXYM8h=VHcTV-;XNI22=5m$g}4J#iR;3Xs1@%D zzyq+^{rV&JaBo`{Ov^J+&T=OoQJo%>U=>@Q)c>6iMTlWA7m=)SJV2~SR6!~L)Cb{7@dQa*0DH*HitU#j^cgHz!KMXBhH;c zwGZp_`nYaDMm@uJCjF#n?c?FFCH=Y1ia6p^CSEFTnV5M3SQG4x(2`i#P*4a2~ z9n)HI!#oDsRE|zG#fiAoju+in?F$75yL$rzP)AEXTs-3<@QBaFnKpE{-py=VSkXsie=-!RTh>dM~A- z3+RwBo7NdC=veqms7}6us-vCy!spWwbuAsxmSEEWrj*n<#M>*ln=^sb3zT+iBaL#= z`Bh38b|Bh+!-M~M*Jl0*-`LOpM0HGcwu|1OEbyBm2^B4F;T3fQ&Vk?#_C2KW(5*&=^J>fk-d zyv&igP;o*9C$Cq22-^G<`~kdw)%eJD7jo|Oq$X|AWjGZ%`w!SGDzZ)pc`8-s-k+|$ zLjSA>LaV~u-XhnAQLn8XbxUe~b8J+b?9=6IJ@5RwRDAQ6vC)y^{K!i^$mXt^Xw_J+ zT(2#C*G*5LobPGKtn3@MM3fYvZ|goCTs>g5*=XKe<>ZKM*xe0iAT4G4$Z__a7C9dF zu(g)Mwh6h1QS$P!(MjW)rnOisJ?dg!=gkDpqhq7f0(k!h@9sz3tza-z@ecYSD9-Au zAj!r0nDQSqqR&a2>js@;GJWWixYGBUQ*hC#3GsN$$D;d#VBxj{!G!A}`_Z|ASd?p> z!_CDRaHt_>iy8vMRcxEZ)nf`ap#-fRw4!D})zLOz_y;M-U#K16ci}?mci}>4#hZ|4 zdrBn)Z8~bqx5&s1p(;xj$i$LnmNefC%Uv)Vn0#N$)6W#*PHTV zOW!TBk|H|h_iCb*<}b%Z^;|7y2nqvBR11ez?u}Z}%E=wj%0=la#om{X+It0%-t9=? zS3Fbg8lU4&h2ugtwYY(^@^g`F;w&)r$<(Fk`ufyiPgmGw=tn`74IK>*4etfOvqV9X z_d((0npKL?Wp-KlD~^?;(=BokHsfRA82aDMq9`BGiLsxEr4#&x9(c6F!N|LXkw>h{ z%tY%h%omrEiT$~DyN7;|jWM@XgyZ%yd;hMmdl{e4^m*d5$7@TyiOdyBfjgDxpo&u9 zI+5U2qu*K;I_V``C;$bz$Eb*2E@S6QF~N+Fpkw@l5G-x^(5#=1G=8Qt+%g@vWZXnl z+XKxHv#(+s0{V-E?%xD>iaunnxD)x2_93}r_TGCovJY9@>61qfIH_H5-cFytqlbxI zv57w|3|c}BfP$#_t*}NwAqUC;QXMGQ1W-dTI+P7A;+!V?vCALd{zd1(IRb&cRr846 z5&G-=XYgD!K$+_ov^QQ)yTK8jIjhqud4Y+Q#mvku>mY$gmQ^m=UUKeIKDZ=&dzm5% zKNoI?!Ucr!g|An_!-3Q4m2ioWot%pbogB|qL{^_E(PLM)x;Q|9%O~tg0wZ}>UHdz` zu5D|;TmbiCZuRt8#6TtSX`56~kirQBn-oU#E>bVsr1S>N2Y{6MFXN(FbNsmIrH`hf zDZVBR)8vI`6+S-;7s7gkN}F*{Xb*{dLjPpn6RM27M;wd{T(F>{BQP5WrULVE1GK_N z#1t)35$3Z-0sPs--at*}w64zFw@y0{m=et@!(m0Fa3{jKV^qn85`29eEQn1E_mJj) z{14iAb$8b_I&U|^SbGX7`Pu{8%Zc;16p|snF30b$khlQtKx)pj?({CV@AU3y>+K8$ zt_m%>cr03KmOlSxUv!BYTrj`eJiID;wK;25G;YqkGCC`N#b=`Tjda)rnB7|m!8*v_ z*5v3&7kA_gE=C+h&n8-EW8z%ufJ?%?hWy{RG@< zxT$cPFlg?8i^4sx!{Pmuj%^Zf_rh(0TMvh4>m@A#obctFK+LtnBlt_2fcWkYaREz@ zSQh*R@I=oUZ(j9dcsR-?KN241gE3wXfE1h=;<2|jO`1fTav zq5P=(FEX00B=A{dx5yHfB1>3`EMY0Kgry1?E|CPcw<`%gZFT;Dt1I5+p2>AYqvV3Cko%Smpx5C6eIwb|t~*Et9}? zh$Q038g>6&SW^(;QvSi$NN%BA+}%RCO1azHl`@}qsgyZM2x73w74F2*F@-#1U(6|C z<`s{HFn%2Flo|?$FLpXLk-0+?;mUq+B3LtFQL7?~YoI6Pv;xQTZCrzei`%#c3*=U3 z6vP`WoJA|m8EY_7tio)o6w3;fVwDV+VwDVZiB&ROid7tF-7q$B1QtQ9uI(b{ZZiAe z<`Vlr#;l|wKFgBIQrl}+GRcb$FW6;)j}_*JZBYgiVuSS3!Uk!+D%$hlzFaKy)ze*x zW}J>oZK{c$`@E;%_pKw_5iw3#^9D-;<03i&F#T1@YPW7 zNh7C<pyCp*V{6A`|MGG5{O2uuB5 zW=K>CSCZ0%#H67usi{M2r?H&(yK~Rc z?%tVg`d*v#d*Aog9%g>`oVoWmXRhYlbMKuyLq}6Xr(2g8qBF7VLn8l+g@(!q$^E-6 zLi`Gw5FX=;KMF@)2np8h24`6_SJa* zSB*%#kc_<<{ajbf`+VFR`^o#P`MW;RIpWp87HU1oe&()kx7>^z3`$qW- zv9~WIa^4}M%J7X;43_;gdMIId6Gl{?UM>P6GBRn6@r&}ZYp=aFS8+P@^FxD%cTk-W zp%cy<-t9SW+^F)6vuQm7!ewtopY(3`3>y9i`zGYZ{cULcNPMvDyU|a_$_~Z6-t*%> z=@cdcLhZcFaVeZfnDiFC)`E5(s2kNJ-+Ri4hohh={BlO#N1 zMXoww-jIDi7!l!6gE)r$iC}|BU?0a8!?r6pT?__iimqUb*b<0{4cJy;I~$lTjs#|k zZGjf?hCd<>W7~@@g>*mCPx@O#C9oIU1z$uA`KOD1|4dPj^fkb}*t)QN+c!NccKc?E zL0^m5Z=pbJ+pyL6ri*jdOmW0&5%1xKp2c<&+d6By=s>z3>D|C7Z1vcN&FNyRIaBnT zEn>SD1!5b-_P%$zIPRS(c6(dIsWKFZ?FhC7NS}!Gb7g@Ru@wnB%BCOa3wQ!qm~=VJ zbA9d)H-@TnL$`Ur{1{)W;eLth+d4jxTe~4tIrmUGy_7HGr4qlptef!?i9zii zDkr1L0qJ|}a;nm3ocL6Y$%n-M!ax$H& zoZD16nU3OeGB;8=ms38B=V*Ag#JJiURXLexXrKDTcox;6btO`meRY8kYL213}Eu?~4?Tm$BoRqje*~vJ;a#c`@ zsva0GvnJdULo+&XZ9^*^wQVr2frDl{7yVbR&((2l} zsT8f^4bG)f?57!+GH#%2VO-CcN}-B3mr9|EHu3ZA`z4+ejYoUf=){ax{cMF{C3<#{!9 zp2X@`cwSOF53-TeW#(~j_H!Uz_%o1ChcT%zNvx2MfBfcKYH$B*{L4QJPmS?o;a#$H z$^4(jfzxAhoZvlgRDVrsdPF`Q&_1u4&&%S(Z=G(?POP#|Ja6RF`NS$d@uzW=J3%{d zf_c5yHt@F%}moK_@EC*Js%_}0a`D1cb zK#g6%U!KmV^LaHRzgTKk#Aj`XqW=3O5-jlqB(0(s|N0*Gd<wy7Z+lvFf z)Jp@t^veUj%qs)F_SXh{9lKZhI*pZbUzK%oCtcGSLF%tEra$neOCUTGLH3xHZ_nO}+{^t_I$|n>a z+o>Zs;dP(!nrz*TU-VE+HpRC3g;)%ul!@|_9%+E97S8YKUcF@A;`v^q+3fX(e&4rz z#q$37i&tOOGw+fB*aPholD^hV^ zC@oL&*cHT>B~R){RV)*gIF(L1ZJw$epFb)2qAxUd;@_9srTr~V%zinFXBpaZLd>?W z%==x>^1hyWZ(y3)J^!kC*Y@-$+mWj&6O%@x=}ERd(P*XiHCpN6Ml17Tqt*U$qt)?R zqt)r1ZhBf1PffRy&rY{mUzl#S9iDEbUT(J1uQgklJuO!IQ!Q4e&4utJD0Di3<1hhpgnjl+`+%vf5ru zA=4BxO(D}XGEF1XG%`(_sC^wL>Yb6d{Vxz)MPFk2t%N5=igxE~q!TWtqdSgDs* zSm{?+SeeHLtoFSFR>v~~R_Cx`wmm;!B}N9U8MA6BA1tVDfSiTbb- z^?0D60c9sRa zs2_U+X7ZVU+4_9IY#RxfsUrb1{c5?Hc`RzS?~R%r&qU46aZxYo$4Jyn9*LT*kHpNj zCt_wcwJ&C-hht{u#hBUta?I>_EoOFlE4+9*Jyl^QpRF)kpQ|$44py0|m#UCy6*8?x zrq#%_8ktsmJ?)8+YGhiCOly#7jhWh4gFI`HXASbKF*}Y-GCPgQUQb8jiOFVi-(<6O zc(U2{;$$;*`OA}W{gZM1b-4aITz{R}Ilj(|VDE69nfz*<+4^YQY2cVhdW!iq<{X^t2^U+gw+|xHqtlje-39<9qP5bF$1TJpDG<` zjgY~u{jkBFPD?&2toFjQs%;l0!(0B{Ob2h`iDQZ%M?GST81h(R{5u}c;-yRKJ&WgE zzuL2S{^F&cWh+)&o_ow?^DR^O@%&j0wVQ%Q?b~7b#P(ddw5P{2uYciE&yv*(yA7FU zSizg4^0DQ?b8EFHkQU9zbmZ5A)(t+RE_cIbt8V1puJBRM$eW+ArkK&5c?Qm3VywOr z|19s%ozKE>c-oEqZpG0}BNK+Kx1%|4uT^QcVodQMI!&g7Hu^|zDsQ+sw{Zxy`u^?K z@4-+_@{%teEX)O&$jkm~Gz3ktV5DxhwaxMbx^wfMv|2qAugTpb_mi#}dFn~)I{$-f zcGx%PpzYOs($;=)RjzK>YUFznK6KRb?v{jVjL3_Ve7}yG5!^)sy)@QaQR7AX%;=4v zFiyOQ^OZ}ucF4D6qQ?-$9_d~qvek(Eu@U)GBX?%VHzyi5LWTcJM>9=18kMjAByt=l z_KIA5yKf-&MPcm{)|Z6!Wnq0qSVOrlZ1+tjV0Ii^u$FhBAv4V?;JN4&0i6pze1L^ zH=mdNXXa5C9GAJ-b(lPQI-X`~Ri7X9d)v^48T-Ll@a%r^Ml>yUL{nl_G$ZP9e6Acl zBjwY@LF|u}Pe0IiZMnxUavyxsf3Yw9^EfX0t=#Y@{gvUuuqAi=lm6y#VL&qC&-&kw zO_u#w{F5bmQRd<3)nZF@wwN6qd89eGy6nK3Uj(xS)C>_jF)HkqCtt|VUCM1jdv01RF`~~fQ?SGv4q)O(qz>cnDMqbJ&e|bpI2_;KrlzVNfIeBEoSN!`> zt+rb=WtCzH{>c2Z_)d5a9rb&+f6g0^K@`hX_Xg%2SoU~$WOP-)S7v-g{*7H+!Df3% zU6lACs!c_hF0G#IY#r!(GJ0q*U~HFtc*Sv?Y<%@STpdhiw?~rV{cuEdU>}ZLA~rJqY?9T-*5k0|ru{V$ul}PKwz8+~?1NGvxKPh_rk*v562dmJ(cf?;WYH+;O7ZFE& zNwEW6dl!85Xd@=kl@}53SxND2bl){2?LHh|z{4kjy%%Zgta@?OOp0ct-HiQgbm#3d z>&1KCq*#ZpyxrJu^3D_|y!9f1<6Y>rJ6V<#`^zTG6k#OZ3?Psg!@j$${y^X3#-XyH z5s|&e+w8yQe7zYbX6CA6!5fzLdgqE5w&P`U#dd6oz#MVjKSvB>8^o5tcHTD!or-hC z5HcUcwgy`-wgl48ThPTeh^?y(&xJ`-GmZIjgb^S80eT$9e!%avk>e~9h?Zk27(^*FFCDi2iQ zI8cSd# z2_5LW-D~>>bF3PwhbY=c;zamTu@jsAyDuCOo5PU#L4 z!I>3_OhS%3yoSzl`IyCR`6!a-CDNUgjG+u6q>*KAWpp-U&Ydym4hyK<)9r=1BU$EN zkw|BXbGOGpW+l>TnJl}zh5SP)K zP4q;YL=*NR+8|DrH;BXKbz(>P6tM~WeryRGhq0ZD)QLADQ^X#4zO9jXR;-Ck6SJ|! zA~VFf@HBBO+$eU3r;06bgR8=E(Sfu|Y-d9=#Ievcu`ARlHenR3KNJ@U;4rq+!5QL6 zaGKZ=ge+JmdV^C%GhAU9$L9iZ@kU^p*n@3zV20?&zB$l{(XXlEj6XXSuCPJu^2fzy z|1=DJO%qN285jc zjCRGv8FL!kBgmLD#31$y%tp~<)(NkP0=;$O&xL;g^|8sWlh=`HJpvtD_{l`+0o6X4 zl79gFGmQ5}MZkmG`+FPjy6x`QRX&Y&KCEL>KDn-YLzVIobjSUn$zi*|dRwtRx8>eY z{Z()4`C37gn`|X=QwuXK#qC^6?$%F*F7n&C#|@D?nGH;AmS=j!-D@|j7vh{=in$1} zN%Cuod5w`f{;5!X+^Hp-eJRqKU~5h7P1}FIe4XyLke#LZAKOAE$_Fa;Wu{oW;qHxd zkyn9bR5VzjEb|XK=VHr53yUaanV%I}2K|Y)Wy*2pMz#zzzWFDiiNVBpd zYLW>|Syg^1m8M;l9=kNOfpIzSjY=-Gy>5tBLyh$-HQPd*jeUzQh3eg}=T2`8O};d3 zy9UnC-I^WH|L8{6v8{PAuEnld@EG};m604oM%nL|`lS@xFJLnG`E~$FcMtQaIX->_;8YVm6W4Rw~4b`ENNuS0)ceB_voK;Y< z@_)Eg$u@E&gX7B^=@Lm@Tw)t3dqFRy*huQxKxLFN(*NzF0X%Y7-W#g;?|3@gERDeT z&-r&>{B)4lU)Usfza5ioyOOQOZilL+KPbEbsJr-GY~O(HQ~&-As4dL2)D5ufmgoC+ zU9Fq;(NUMjU12r*fA~SxZ9hNoAd|oE>85kIq;R42v|IAM!dnuw6@%)*@z;93#eWn2 z!c0ruk`wA?covQ3{w5o!?Z!D{kKE&W{tn*W!Xh-@#|wGGiQ(r_yuYL8JI32HV2ldP zfXM$!@qSbBHW!YHV$aa{8$1KLW`sZ$w4KSn+0Mj%z_ zilz3s-_nw+F4)Pe%8xho_w+5>2-A#ra-X<2)ad!kmfXwthbB!wUwBHXOZ+C?nmMDn zU(XFphz=NKXhcp$2h>!tJ=%cKC+hi?twSw}ACce8N(1sU!|CA)pBb}lTgxWvRK5W0 zWnw@q6DOjWUKB;g3!2Oeu%8IL1-b$2ip+#{pB;!*;X%NINlP$e5pt>E4D>2 z{|N2X1?aUo7>FVglDh9B&Pv0|q@cI|9w(LZHF!wULvwE}(Pf4S%y}3S=8F-ihuV z^wczA|GuvoJveA!qo*d0G>pTdf1_D!_cdT57OnujH`}paXElpsXp+Wpd>?vhj-jV! zr`e22T4+1t_y~GxWRK0az0K&!X%P3}_&oYbnz0v1TjOoO1T1tRjk7ya&_`9)jLBCG z;=Ct$pzjMtZrkQy^GN;O!BgQ0GFX{WU~w6^cnsjj%+p{xT+qGF8W5wvj-a|Bgt`#%-D^-k| zOjN6jnT48Mly!)Sg+AHn9lH2CsZ_>;8s13wtrD!%{2M=>C8lBgwaC@o5en4m%FMCN zwp7+3CXTJe)2_r>;&>ZzV0^2FZz25s5**d+9gU-|%p4PnqeHAXW;!*FKO~Opi38(x z8vYpJH{ChXlrxQ^u1p*;uT0jstV2v3GaAPe#BnuoVEhpc-$3~F5*$?>(m3kM%rT`n zI>f}WP2>1Y;<$o1Fuq>H*AafD1V>eeG>*D5b5!%>vJNqE)aT6|C63F91LI{H?jwA_ zonuSlCh=16YFAyypQbT{(};y8miFqY%P^2c~O;oICf(iBteUhB%lv5nk}LrffXH#0~a zrx6FnQ#Cw=@Y)g_UEPeX%pA$hIK;$JcQZE<$4SJ2@k9+@O!&GI99`XvuFM?C%{auw zQFk+|h@(B8gnP@lia0TzKzOk`$5vN2qbn1~R^?_KQbn;TgNZHS^z$kecQ6!e30&&#c%;m(9 zM@1ORz8U#r%%fa-_$a&M1DNZ5Gs4C_2pcy?o5jf}qOuggF2s#8e%xQ)jJUEv+>GPn zh#SM$pN=$(E)0e2LfGg)Vi#h`E!g)W zmK;Xd7{>7?gpI=p8@D2CJcF>Y3&(pAHl9JKco<=04bnE@_!Pp%8tl&@Z0tcOxffw$ z3~4>s&y6E-2yx>n#EadCC5N!@N8ET2abpa}n-Ml1MErOk!p5@*8@q9Q(t{U-JRn$x zc>f+_o74*of-_HVCd zXVrX`f4^#WN6(0u!HvX}e%{ zY3g2>eHbPV<9HKHEKR)?CO!ibcj5R1YBo#_^P^_pX^fnBKA4D9%!GaUC+AezeInVL z&^@vrh&v}f1}xK_MH&xHtFz+!q)h#&Kg52>wRP$p9(tbn_axMLs)M7g6HX>K{*KUu zT3taofVNI*dpg8auHN?i2wltF^e|<7mxj3uB>x^pF)!D)r>@K#sqN_y6Gy%6xr8|0 zPMjET&@gv_q&1tf?OfZQx-xU5wx>g^ICki5&&!G9O~i@ujT+`IkOp^-9jabvZBJd9 zICfCm(;+5~dfRgraa>EB7_ZSVcY#bO!O^wtsVg%_YI{1w#8Gd1P9}~ki4)@i4RaTW zS%RZ$+f!F&j@0&ah>4@#_ADok*Agej_FJgr}SrrovesVfsl^#W_w zAypI|FSLGuBIP4$DN$s+M8n(#^3xI&UE7|zGE=0sr$bB}^|t3f5l8!VS8!#_ue&nl zE|Bk);ON%&tksp7BQ-u9V&bT`J%30XuOz!MzCy#?1@d|cj;>uCx-xO37j3f+vErz| zcq{&jIP#0OjO`a~VOPf71@fXh$Bc?!v`3Gw%pA$hIK;$JcQdaN$9A$CSlCh;+Q5k;}8=^-OYTKI5rSR#`PNJE|7alaCCJux-xSl zH{%c!N8QbQk~r28C&u=>$oQLK%v~VsOK@~`GrBT!Bsb#_6Gz?6+(8`eDYf9l*q%~b zfVm6gT6c~qS2v?86UUV5;&4b6MaS#vA0dk4$&8H0X_&h}=9i%8>SlChrbuqaAtsKx zn^{5}BgBbuSi{@}k}ko~)y?S2%#qxTLrffXH*-00^bse<{2m5l?gD8j!O_jlWM@(4 z9Gd9;BQmewV!WQ!0`^AXjMp1o;`K(Cc)igjUdN141dhe=dZQh$#}G{R__A`C9bFxm z4SEUzV>hD7A?*7RuOGxr&=`(4BXB&3!0|o=j%P93vm3|z5jdVjuy_Q4<3yxw#_?$c zjuWvzkHE3l+lWCLbP6D?7yEjoZ7pjQrx8RJ{SK`D0~%|u{BH1^8f!0%E9E3#6<5ml zdu0sCapi)sw`K}s#}qxh^G>0g&coYIcFBx6ren-8-E1vi6(6NMc+ks*MQU}qs?@18 z`Fw}iuGFct?(;i{)*VEPF^6%CIgCrV(@MMgd|jD2lFxUDiKFiGn~CGi#E~(Faf~^P zt1rRP)#vNV%#nP)L##N`^E!Wf@wS~^Ej~&d8FLuNn8UalcaAhPrnT>MW#X73pYIS8 zN8RUF6311I1%pA$fIK+x$Qt!arOB@@C zBV&%@7;_Z2+nr<5HL}!|iDQzyj6+NubuY7vIL3)1V~*k&a}>9u1V=Y7Q>!a8M{+X` zF>%zr%%2fQ``tu5${BMM$C#tI`%7>v_A)eQP*-M-Ar2C?<3_^9Mw+oG3EpD2_2larcy<=;~&4Wu{1O#vvw-x|_L^ zIQoerV~*k&a};-5368FAMptHz%FXmS#Kci|GdwQkA&!pmD0_ZxTc`32wYr!>gG9oP z3?|5V!iBMmTpz%WUFKa;u;hT8_qz!App;U%IJAH1F}=b@RT@tMJM_@S>Z;R8ataQy zebwot?i4OZDbJz2d#H5A93e602&t(AD_5tWD>FxO3Jx)G)SW_-IBq14j5%Cl%;D0- zB{;e|1znjrl2dSq6-WAm&W9e;h~q89kuir$j5%B?cjuUJbqcyNaZHd?aEOVc?i8ws zJ)Tk#SxP^<+7|4@_6n;V+7ZFFs94|5EcW^`rdNN&a$pVu5LzGW{%`$9Ae_AyO|;4crkHg%<&Rqj+ZvLbEJ2Sitlxeu1p*=%FQ^WiXshs z=d0r;qBwylGUjlJF^5ZQN>FrlGrBTUBsb#_6Gz?6+)Ny!#E~(_ON=>Q>Mz03)y?S2 z%#qxTLrffXH?xX328bhLj+Yp7ytJSMM^`taD-*{wxtU%nyNt?a%<+gm2qr@_Ig@f7 zO%mP|ZNVhrMv=h8)g73uDkrV(DQ^*eq^-g6F-%tVVt*piB09<&g?(i z%b@h)_#kFYUcju$V}TaYgtQ?XpTVrjdh9RwTg3H&M$8Gu7!=a_v6qYf-{;2|lpOTx z#^~2pOrPxcwcuS-40PdmGX}p7V!-P@41S%(;1^av#iU@l=s#w^nk`}?(l+7vBnH1~ zus`cst-|q9m{=~tb{r;7!R*;>uTlZ1P55J%!x*!UD|+XcH1Vc!e8AB2s=IF=t$7>139VB<5e z@oXILhK*0duEVf#CDJzF_&97V7hgN=!N(b3_g!+5@O&C(JU%Xzbl6)4J^zLE`!`na z>~FVzyI1c`RK2%aE$i(1-36QPft}C5wg+M78rXgi$0uOtO6r;o!SaCB=g*Ayw|M+vF9EQ-Wqql9g3dVBd- zm{Tur7mxTdUQe7DuOs}<*aBR|b}Vi$t5HH-m(57cWrtXqk={|tw@?0&DDr?W%#GN7y_h`3TS0;|F)LeFmiKE_J{u|=R1HOz`5GTgh6aG#Kj;_sRU70yjbJ-y# zj(T(XTf~tEd>Jn%PK=ik{__$XU7O3gGIONnvO`Q9_2%*`#F0mQ880SIjC%+_@6M5i zdy4OMjjl`_ld8GwkSdBvy;o)*QRER{##a+1##a%3v;;-h=CZEL6sfuF5EDnex%@@q zcm;7_JWs=2gdZxw(Y3j(D>FxGE<41;QEx8aM;v*?mod-VWqc`d%rE^{^yEppHkWl} z;+UZ3vO}ymQpaun(X*L2@`x|vG;v~_B8-9$#EJ1N!mCSgbn`N`x-xSlH{%c!N8QU@PaJu~m+=hZ#JGv@k`f$?y$p>K>dMTK z+>AqPb8MxK+x)%0nmF=^FXL&%iSbmzm%DOorB|J_d#x)gj;)>KW*lPTsJoeV;>aVu zjCtNJC8HboS z>TYHtapVzS#udbgag1=aJ4bpgs`y@4>&nD2Hy7`*WgSArkos-&wJ}BvdBB%(h!`;r z5)PGM=;~#3Wn$PtUdACNj=Gnzh$9d9GB$}5V=rN&1V>jdqboB<_ms48O~RZW**<@&JKm6;>Xm_sQys%923Nm!y3js zs>+y0Ri~HW==!kNm6;>Xmo(Xm9+RN}~C4PzcvWz3_hweB3=q$?9gTB6AzRTLdd zH2ninDwCdFc6DeTq18T*H`0RT*~^ z$M2TlsHza(YSmMq>#`Loq;QDIjQYd=uZSXtHH>*sl`#*hzFvZ&Ye=Ch6GvX5$stx8 z9V;{)C5{}{Fy=v3#yqGx;?B{1g(h8@Ig*!gh>4>fQoKMMIjmvKgQ|>M=~h2of}^XK z(UqAac^QY8IO<;J3F63M4PzcuW!y|0zf^*wtC!K0nIm}_hgflRtkCoY;>ckQV;)px z+(;a^yK{73p-ERJj=VyXLrffXFSCs}a#+K7Y*3ZtJg9na368E_MptHz(y}rerqx%X? zx-xO36`CAUMbWWB(|V%FQ4M1rRApRF6jzm?=;mc=b!DbVZpI-dj(SXSJ#pl?hA|JS zGWHY4r6o8Pdl~8}(3P1ZxfzF;IO=YOCwp>S!Z01V~lI@BI56CjB!~g6=}cR4)4@I@_Sky zag)7B^DzwO9>liQ9?Zq~H;((UHAkmopm%2OvNfUF>>C)tJ&e)Zz1VhQ8;ndB-B_r( z66tcaEjgNg2HTPFbd2!M6l=mQq8GReTMg3Ah42+D4CL;|NblBA6BcX6V#}dfq6XNH z?L7?a9uGF*lUrD^D>zH61MbJxjcsDEDJ#xnEuy1=Sy&DVL(2AuFFuDAXcDuL9!C26 z81X%a?G(0y{w9p9V|8f%EU^H%16va|f%Fr2yL69l7Cylx2i!4Wh^@!hWWRNK-kN2P z2p`AD#&*VR!U#N;d@^U*ucO|KQOoPGC6Mk#`U&qW zdo7~`Mk(Xi_IsN!N-SSPoh7zmlyVEU4cOi*YZBkatEjumX7SC*J+Lk`Gxv9EL*L1T zZww`J_pJ|Y9og`)(8FPU+kI9dYy#t_b&w%kU`#`RwEqV(@TIyb;~17`fLI004OH`V9#G=G4R1He3fOI zF;{)W;HT=A_1FG}j~LwbAH9!XAG;4|CE-I0&DR#@JoZ_M0%}OJze@D_*NNJ4MePmx zzCz!qm^+q-s(Px)iRO@fiIUpu^a%-b6g9#A@alo$Wzq~x_hmQ6-K{C zR+z7>@E2r-D@Scw@@&~uka?N*7my0AaFnbN8Wk{z{r!u}<@Yb@jaK_}En_uAagP^r z#{i+^K42gdd8T=pq%1!SG{rca>-*DCd}Q&ThAuWjN3?6pjocT)XU)_#-L$dbnnw9k zKu6Ryl{Jrw+|3V!y6sPgkvtA2PYF2SSbNPgB_gUmLQ&81-4YtCi}mZl?5<|qbOX0yjfI%Mje0Q_*9v*ZVT~0 zh)7_x;0w2ki25d1VT~l0;Im!A!$ie$PyvksDxjn}4M^Rn;4_2rp z^<_eSYt6m+>Ci+MhlFpfx#g|LLvk$VKOYZe|KpP`e=G4&7R~Gb;H1m{qId`^_F~>2 z&$$e_Pr7^v0g(}uU(PPWU%ae9vMum9wkHns{jB_Ru|GTiP_GxCE6o37$n?8xZevPj z_P03a_&3hU#FWgnSi$FaF(>o+&|u_hXlYH7%TG&U#|LiXwrdYi_1qo z^~2D;$ti!qoUoVm#DZI_EdMB)__IYX0^cR+{<<0iyIty7iaSJst>+Ts>$D^`Vpy0pNqeB z<1Kfb%iUQSuAU;a96$1FH?@&p*M*I^{HAWj*k~RuMMkRTfxb|1_A*%Mm_+u25`$WV z)#Emg)q_-FvW1aL^aU@T;**~a>XgeDo=_5wEmysbSk>wQL_c}K)j?Qrb#lO@z@iDtSvB~CV9Zy?m`h3&l_aNf z7nB5H!PT{~k=4~fSa9#!Y$L0yo2gltF>{((Tqgf{c5axsA_ zs^xMQ!KM~M`x4d|cpZqRnn*0SH;~5Hjzj$7`((QM;V)%uv^LYJhF|i1%X*$WwewV0 zbEXp)pcdHH6;$7Nrjv%{9Adj~JkzO$RPyCYJ$Ws6)ANb(T^ifqAN2;8kTd2iK7}*$#ax?lH*$9#CVN{We<`3{YeRqst#!!b!FyA z!*UKWany(9q@Ls`d!d+v#5_@-JxS?WqR6;k z!#q#_4@*!~RY)_VuFMo^Sk56Pj{2~i)RP>S5+}w>G|cn#H<#e3s*uJ}S7wehEawmt zM}1gM>Pe0Zi4)@m8s>@mcbDMkI{QOcCXT##wL`2pIu@^%dXnRn#EJ108lFe^4tI{O zi&xhaDd#8p(BuzMB+k2zjP5$5p5!>EfP=(5QJ>{JQUBHw9913Sd#xt==(=o1@-hxF znNjyLQcqIil?E7Rh%#fIr@y`gMOQDQD>Fy(G7hog=vcd2>Pe1C;>0+iVV5UK z!_x@&m*D8?WpricNM6PvCXTw7k$RG2T>%G)d7eJYCy{)qJ4g4mt951KNNZO+q>7?r z?P{qfDb*HGkeH|Gvz({tUsHmjtC!K0nId@^hnP6(UPkIkPUDFqW1gnZn5XH_FTv5( z%jn9?k-UsUOdNGDBlRT52ytZ06ZIMMME$N399_MPu1p;Hxr1T!#VR%S5loBZA-b$exF*7WT|v z-Rt$#o68r}Mg@gR9WO_%&Wod_CzW_DY9)8atky?jR@>t-EA>RoN{#A6j!a!-ZT`gn!a_Ed$H zdb+|&@2jvf&sA9M!xdJ?feNd0LWSw+NW8ehN*-EawH{t!wY{{$O1-?oO79u4GLH{f z?N1C?9ZwHfouL80>}K9SU?oSs^0c|u9J%hs@Kd#RhfQH{R}KTH;Ld1PfgA^S602Wf z0N3tVPWpYASq6aoegR_+tQd1(C2?WCD!^;^q*Lkz1YNGGR(qN}uS0BCt@gC;dEX^k z{DJ{vj-?oLEG4lEt+cD>)s>ked0vNDadfO8{SI;D7YrD4EX9~(DT!S;y00LuD-%av zLE0fEj=JalIdS|b{Yf(BSc);nQWCpyboIQtGIJ!)>kt!1-SeI$j{JfFV~(X5b1WsX z8%I~qt1B}{^1Kc)anwEUTg36hWJksvOflwQN@5p|?n_AP%EXbDkakEFMaL4-KO~C1 zM3FJaQj9s4lGu%+tLN2~nId^!hnP6(p7;C2kzX)i%&`<>j-@1ax~Uj=Y4lL##MDmXLmvIPx0?j5(HK%(0ZjE*#yL zkk*x%BL#R4F>%!6yKfRle#3w<2UCnWn3C9yV{v>(T}!$$b0jz85EDn;&Ad(=`3(cc z9859hU`k>)j;?M-S7wgnW*lP0(XoW|QR2vN7%=8wiZKUM61#A8UqV_}CXT#>v_niB zbvN@0acrb#4`U9d7;`Wsu^UHMH=`>vM{+X`F>%!0%pu|!CytCcm}1Pql*DcvUEPeX z%pA$hIK;$JcQXfwBfnw5n4>Ai98F2=!qI&RXrP7;`Wsu^UHMH=`>vM{+X`F>%!0%%jAS z-!Ndz!4zW-rX+Ub=;~&4WyLW=>rwYP#5Tu_P|uG{ZABm50%cCLnOu=BCRaJ%GD|8%FL0RfeieCB_^t zeb}9&`x4T+GI8W3q#a`7s5=FzCpq3i92s-G#F*oyz7iZ=or12+9LXs-#Kci|3Q|vU z{1|a$%<&Rqj+c5$aCCJFx-xSlr{EA1N8Kq%J<0I~;>eieCB_^tUG2)T-F*pZU0HE# zrzNBvQk!DCV+m=gCn@s#*o-+`V$9*v6(uOTIt5*sDUwrgh>4@_6r`Ty*hgk$%<&Rq zj+f??;OOcUbYeieCB_^tb(G-f>J)Tk;>b%#JH(2kV+m=g zCppe1j*K~8V$AVUn>$DMC8Tv_=18%JLrfg?*hA_`j&q44V~&>?bG$UG1V`7{Lsw>w zm+DGzEOs+$98uRLGq#hL zafr!`x|fl9lHzot$e6<=#vCqPRDzwA7OnFD8nNIa*@O(Ne4gMOQDQD>Fs%G7d3u)V++6$JaNdp5z!Hj*K~6V$9)^KHfp&60`&g&kms8BVCy}Dle0kVp(<>mCcyL z5jn+fE}H~<`Ob|U$Ry>|K^eI4C=6o`B^Yxkk;tvx5UTQEF$EdG7>V42HdH(S@4P)! zb%mTaxUcYo9dfduEM<`RG3H=^F$V)PsT36^88fLA<*xu`DFcorTR(smWGS~&DU7)} z&zPI@602WfP3}b0UCc88ca z>aP9U#Ic7sGUgUMV{XAq?81>|>uJv^U70xYYHkj(;^;alcGQ)bBRzW@V&bSjdmbW= zml8+D+=6G!EqICDIJ!Q2bY$68!W{&ji zaflU1$9hHg5yx4?kukU68FLF>Vi%6?>lNwB#F5u4a)^ne{_MGzI5rVS#@vKw%uRTS z-8i~Fdvs;yNY5UJm^kXso=+0Tsl<^nH{ls`6JBCBj;>*auFM=MtZ;~lqaIfLK5?8# z92s*Po-w!KC3fNHzFv{8OdM&wB8OB_bgWmji6~YPMaJBOXUt7_iQOo=h84OpQ>3uM zAtsJ`Sh0~f#)uCcMOM99_c-U70yjSm6*8M?I{#l{f~8BV%sDGv+3|#BLm2 z-HfhG9C?u^VQPB3rcwugaZ{7ino1q?#m)Z> D$livW