* @license GNU General Public License, version 2 (GPL-2.0) * * For full copyright and license information, please see * the docs/CREDITS.txt file. * */ // // Security message: // // This script is potentially dangerous. // Remove or comment the next line (die(".... ) to enable this script. // Do NOT FORGET to either remove this script or disable it after you have used it. // die("Please read the first lines of this script for instructions on how to enable it"); // This script adds missing permissions $db = $dbhost = $dbuser = $dbpasswd = $dbport = $dbname = ''; define('IN_PHPBB', 1); define('ANONYMOUS', 1); $phpEx = substr(strrchr(__FILE__, '.'), 1); $phpbb_root_path='./../'; include($phpbb_root_path . 'config.'.$phpEx); require($phpbb_root_path . 'includes/acm/acm_' . $acm_type . '.'.$phpEx); require($phpbb_root_path . 'includes/db/' . $dbms . '.'.$phpEx); include($phpbb_root_path . 'includes/functions.'.$phpEx); define('ACL_NEVER', 0); define('ACL_YES', 1); define('ACL_NO', -1); define('ACL_GROUPS_TABLE', $table_prefix.'acl_groups'); define('ACL_OPTIONS_TABLE', $table_prefix.'acl_options'); define('ACL_USERS_TABLE', $table_prefix.'acl_users'); define('GROUPS_TABLE', $table_prefix.'groups'); define('USERS_TABLE', $table_prefix.'users'); $cache = new acm(); $db = new sql_db(); // Connect to DB $db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false); // auth => is_local, is_global $f_permissions = array( 'f_' => array(1, 0), 'f_list' => array(1, 0), 'f_read' => array(1, 0), 'f_post' => array(1, 0), 'f_reply' => array(1, 0), 'f_edit' => array(1, 0), 'f_user_lock' => array(1, 0), 'f_delete' => array(1, 0), 'f_bump' => array(1, 0), 'f_poll' => array(1, 0), 'f_vote' => array(1, 0), 'f_votechg' => array(1, 0), 'f_announce'=> array(1, 0), 'f_sticky' => array(1, 0), 'f_attach' => array(1, 0), 'f_download'=> array(1, 0), 'f_icons' => array(1, 0), 'f_bbcode' => array(1, 0), 'f_smilies' => array(1, 0), 'f_img' => array(1, 0), 'f_flash' => array(1, 0), 'f_sigs' => array(1, 0), 'f_search' => array(1, 0), 'f_email' => array(1, 0), 'f_print' => array(1, 0), 'f_ignoreflood' => array(1, 0), 'f_postcount' => array(1, 0), 'f_noapprove'=> array(1, 0), 'f_report' => array(1, 0), 'f_subscribe' => array(1, 0), ); $m_permissions = array( 'm_' => array(1, 1), 'm_edit' => array(1, 1), 'm_delete' => array(1, 1), 'm_move' => array(1, 1), 'm_lock' => array(1, 1), 'm_split' => array(1, 1), 'm_merge' => array(1, 1), 'm_approve' => array(1, 1), 'm_unrate' => array(1, 1), 'm_auth' => array(1, 1), 'm_ip' => array(1, 1), 'm_info' => array(1, 1), ); $a_permissions = array( 'a_' => array(0, 1), 'a_server' => array(0, 1), 'a_board' => array(0, 1), 'a_clearlogs' => array(0, 1), 'a_words' => array(0, 1), 'a_icons' => array(0, 1), 'a_bbcode' => array(0, 1), 'a_attach' => array(0, 1), 'a_email' => array(0, 1), 'a_styles' => array(0, 1), 'a_user' => array(0, 1), 'a_useradd' => array(0, 1), 'a_userdel' => array(0, 1), 'a_ranks' => array(0, 1), 'a_ban' => array(0, 1), 'a_names' => array(0, 1), 'a_group' => array(0, 1), 'a_groupadd'=> array(0, 1), 'a_groupdel'=> array(0, 1), 'a_forum' => array(0, 1), 'a_forumadd'=> array(0, 1), 'a_forumdel'=> array(0, 1), 'a_prune' => array(0, 1), 'a_auth' => array(0, 1), 'a_authmods'=> array(0, 1), 'a_authadmins' => array(0, 1), 'a_authusers' => array(0, 1), 'a_authgroups' => array(0, 1), 'a_authdeps'=> array(0, 1), 'a_backup' => array(0, 1), 'a_restore' => array(0, 1), 'a_search' => array(0, 1), 'a_events' => array(0, 1), 'a_cron' => array(0, 1), ); $u_permissions = array( 'u_' => array(0, 1), 'u_sendemail' => array(0, 1), 'u_readpm' => array(0, 1), 'u_sendpm' => array(0, 1), 'u_sendim' => array(0, 1), 'u_hideonline' => array(0, 1), 'u_viewonline' => array(0, 1), 'u_viewprofile' => array(0, 1), 'u_chgavatar' => array(0, 1), 'u_chggrp' => array(0, 1), 'u_chgemail' => array(0, 1), 'u_chgname' => array(0, 1), 'u_chgpasswd' => array(0, 1), 'u_chgcensors' => array(0, 1), 'u_search' => array(0, 1), 'u_savedrafts' => array(0, 1), 'u_download' => array(0, 1), 'u_attach' => array(0, 1), 'u_sig' => array(0, 1), 'u_pm_attach' => array(0, 1), 'u_pm_bbcode' => array(0, 1), 'u_pm_smilies' => array(0, 1), 'u_pm_download' => array(0, 1), 'u_pm_edit' => array(0, 1), 'u_pm_printpm' => array(0, 1), 'u_pm_emailpm' => array(0, 1), 'u_pm_forward' => array(0, 1), 'u_pm_delete' => array(0, 1), 'u_pm_img' => array(0, 1), 'u_pm_flash' => array(0, 1), ); echo "

Determining existing permissions

\n"; $sql = 'SELECT auth_option_id, auth_option FROM ' . ACL_OPTIONS_TABLE; $result = $db->sql_query($sql); $remove_auth_options = array(); while ($row = $db->sql_fetchrow($result)) { if (!in_array($row['auth_option'], array_keys(${substr($row['auth_option'], 0, 2) . 'permissions'}))) { $remove_auth_options[$row['auth_option']] = $row['auth_option_id']; } unset(${substr($row['auth_option'], 0, 2) . 'permissions'}[$row['auth_option']]); } $db->sql_freeresult($result); if (sizeof($remove_auth_options)) { $db->sql_query('DELETE FROM ' . ACL_USERS_TABLE . ' WHERE auth_option_id IN (' . implode(', ', $remove_auth_options) . ')'); $db->sql_query('DELETE FROM ' . ACL_GROUPS_TABLE . ' WHERE auth_option_id IN (' . implode(', ', $remove_auth_options) . ')'); $db->sql_query('DELETE FROM ' . ACL_OPTIONS_TABLE . ' WHERE auth_option_id IN (' . implode(', ', $remove_auth_options) . ')'); echo '

Removed the following auth options... [' . implode(', ', array_keys($remove_auth_options)) . "]

\n\n"; } $prefixes = array('f_', 'a_', 'm_', 'u_'); foreach ($prefixes as $prefix) { $var = $prefix . 'permissions'; if (sizeof($$var)) { foreach ($$var as $auth_option => $l_ary) { $sql_ary = array( 'auth_option' => $auth_option, 'is_local' => $l_ary[0], 'is_global' => $l_ary[1] ); $db->sql_query('INSERT INTO ' . ACL_OPTIONS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary)); echo "

Adding $auth_option...

\n"; mass_auth('group', 0, 'guests', $auth_option, ACL_NEVER); mass_auth('group', 0, 'inactive', $auth_option, ACL_NEVER); mass_auth('group', 0, 'inactive_coppa', $auth_option, ACL_NEVER); mass_auth('group', 0, 'registered_coppa', $auth_option, ACL_NEVER); mass_auth('group', 0, 'registered', $auth_option, (($prefix != 'm_' && $prefix != 'a_') ? ACL_YES : ACL_NEVER)); mass_auth('group', 0, 'global_moderators', $auth_option, (($prefix != 'a_') ? ACL_YES : ACL_NEVER)); mass_auth('group', 0, 'administrators', $auth_option, ACL_YES); mass_auth('group', 0, 'bots', $auth_option, (($prefix != 'm_' && $prefix != 'a_') ? ACL_YES : ACL_NEVER)); } } } $sql = 'UPDATE ' . USERS_TABLE . " SET user_permissions = ''"; $db->sql_query($sql); $cache->destroy('_acl_options'); echo "

Done

\n"; /* $ug_type = user|group $forum_id = forum ids (array|int|0) -> 0 == all forums $ug_id = [int] user_id|group_id : [string] usergroup name $acl_list = [string] acl entry : [array] acl entries $setting = ACL_YES|ACL_NEVER|ACL_NO */ function mass_auth($ug_type, $forum_id, $ug_id, $acl_list, $setting) { global $db; static $acl_option_ids, $group_ids; if ($ug_type == 'group' && is_string($ug_id)) { if (!isset($group_ids[$ug_id])) { $sql = 'SELECT group_id FROM ' . GROUPS_TABLE . " WHERE group_name = '" . strtoupper($ug_id) . "'"; $result = $db->sql_query_limit($sql, 1); $id = (int) $db->sql_fetchfield('group_id', 0, $result); $db->sql_freeresult($result); if (!$id) { return; } $group_ids[$ug_id] = $id; } $ug_id = (int) $group_ids[$ug_id]; } // Build correct parameters $auth = array(); if (!is_array($acl_list)) { $auth = array($acl_list => $setting); } else { foreach ($acl_list as $auth_option) { $auth[$auth_option] = $setting; } } unset($acl_list); if (!is_array($forum_id)) { $forum_id = array($forum_id); } // Set any flags as required foreach ($auth as $auth_option => $acl_setting) { $flag = substr($auth_option, 0, strpos($auth_option, '_') + 1); if (empty($auth[$flag])) { $auth[$flag] = $acl_setting; } } if (!is_array($acl_option_ids) || empty($acl_option_ids)) { $sql = 'SELECT auth_option_id, auth_option FROM ' . ACL_OPTIONS_TABLE; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { $acl_option_ids[$row['auth_option']] = $row['auth_option_id']; } $db->sql_freeresult($result); } $sql_forum = 'AND a.forum_id IN (' . implode(', ', array_map('intval', $forum_id)) . ')'; $sql = ($ug_type == 'user') ? 'SELECT o.auth_option_id, o.auth_option, a.forum_id, a.auth_setting FROM ' . ACL_USERS_TABLE . ' a, ' . ACL_OPTIONS_TABLE . " o WHERE a.auth_option_id = o.auth_option_id $sql_forum AND a.user_id = $ug_id" : 'SELECT o.auth_option_id, o.auth_option, a.forum_id, a.auth_setting FROM ' . ACL_GROUPS_TABLE . ' a, ' . ACL_OPTIONS_TABLE . " o WHERE a.auth_option_id = o.auth_option_id $sql_forum AND a.group_id = $ug_id"; $result = $db->sql_query($sql); $cur_auth = array(); while ($row = $db->sql_fetchrow($result)) { $cur_auth[$row['forum_id']][$row['auth_option_id']] = $row['auth_setting']; } $db->sql_freeresult($result); $table = ($ug_type == 'user') ? ACL_USERS_TABLE : ACL_GROUPS_TABLE; $id_field = $ug_type . '_id'; $sql_ary = array(); foreach ($forum_id as $forum) { foreach ($auth as $auth_option => $setting) { $auth_option_id = $acl_option_ids[$auth_option]; if (!$auth_option_id) { continue; } switch ($setting) { case ACL_NO: if (isset($cur_auth[$forum][$auth_option_id])) { $sql_ary['delete'][] = "DELETE FROM $table WHERE forum_id = $forum AND auth_option_id = $auth_option_id AND $id_field = $ug_id"; } break; default: if (!isset($cur_auth[$forum][$auth_option_id])) { $sql_ary['insert'][] = "$ug_id, $forum, $auth_option_id, $setting"; } else if ($cur_auth[$forum][$auth_option_id] != $setting) { $sql_ary['update'][] = "UPDATE " . $table . " SET auth_setting = $setting WHERE $id_field = $ug_id AND forum_id = $forum AND auth_option_id = $auth_option_id"; } } } } unset($cur_auth); $sql = ''; foreach ($sql_ary as $sql_type => $sql_subary) { switch ($sql_type) { case 'insert': switch ($db->get_sql_layer()) { case 'mysql': case 'mysql4': $sql = 'VALUES ' . implode(', ', preg_replace('#^(.*?)$#', '(\1)', $sql_subary)); break; case 'mssql': case 'sqlite': case 'sqlite3': $sql = implode(' UNION ALL ', preg_replace('#^(.*?)$#', 'SELECT \1', $sql_subary)); break; default: foreach ($sql_subary as $sql) { $sql = "INSERT INTO $table ($id_field, forum_id, auth_option_id, auth_setting) VALUES ($sql)"; $result = $db->sql_query($sql); $sql = ''; } } if ($sql != '') { $sql = "INSERT INTO $table ($id_field, forum_id, auth_option_id, auth_setting) $sql"; $result = $db->sql_query($sql); } break; case 'update': case 'delete': foreach ($sql_subary as $sql) { $result = $db->sql_query($sql); $sql = ''; } break; } unset($sql_ary[$sql_type]); } unset($sql_ary); } Det'*9CȬ;fz-OEQr) G)]b8ay_ekđLѠ"-@j6(i(΅Nq[~LhzpeG ).ƢĽ93.L B hmKQ>D^Nflu#HFu 36 jƲt WBj/ɬ(  CjGj6H& vm*}6}#S v-IvQ}e#,خΦۼ5ʹu$ ;GtÄ$a.nO[6$c3];Dt޹ACQ~^CݵbnROYn- P3c,N J໾ LY<ޕэ:$AP?27פq# dg4GF̎[#9 EʛT@g 49d*N|L2{qX"].$ G/d8 TLuG"MFgR!}lTup>=xѐKeOSx8+F#n%~NF߰&3|-A5rzL#*Q`EnMEYېMzqRr &@J%Wl_l$q>@ʹW{}s擠i ǻ[Uk {YGI8JsHH:&&+ glL~ɟJ#pDV$Ocqf*(m~o~o@uJJ((GXB j쬝zEsmۿ1S]1y}N1SP u7r!-[ilܮ_-J3't#51hO2+Bf^1Bƙ2`^qoG-{=7M$0ܚ7lH8Ab X]%ofJlkpf{+:-&rLg>*c׉ݺ*1l)=&w)?t#Y0VASQev;edn_ڏB|)?v,ijJcy#keiʁv~;S& CG MF"|q{4OZT4#xewnIXuJ5} a{mS`&uᵏ@\tJiwEm1(3CH6e rUЁ%A0y| {(mό2N>(/ 쟒7\nHUS 舟z}u| Sg[6 Dj>&WaRxCg|ic%wP VE-]eU>Gi,r+P]W#4̡k* 4)/w߆`ΝoPI#)R+1>xDʂ-fJ3: "Cϭ̘w7#QDʺL᢮k}l{I_?vĢ.Ù ^YV8(?M _OBW5mr]^w6̭L}yKxyPWNC8XK)п.* nͩȣ# Cha F^]9v C;LVH`Wøʎ(<8 %gn,L1( J#}1:t?ȽPt&r0[>B~,Bcsr}Oߢf,Y=dfo7* FBh\Iʍ1$wETP ~Й2cͭ( ػإ3U a3tZE|uo9t@-cd}'YjpVP`v5*Ds& vRυus#Z*ykǔhdjEZQ~-gXMڣ %~hITNSUPQj<-T>="L<5<"#ɥ9q"JLJȌ<۱AQB;b?a["fLex;C04`{$$(w ~xhW D8@+kwc 7玟MĴҋFH[4&ē=vUQ!֠@1d6tu`ramr љ/rFi_U°ӡg9JJ:~G4fOoj\-89Ђ~σ^YHnI3WQV]US*o̜I7O) l*Kӝ__h"Dec}(Ty˟t^pѓC_('NWo [i}hligFۛ^jeԞ؞l#Q('![o6U~ڄctgw@rϦFAj> peB־#õ%2sdG /phi/9`d:Rhg*El&r]|bL.`qzy!H$ @\yԸ'6JŁC/6;גғ+ދ09Zn.Qs[YD",u0qglvߎknFy(=q$LW#x&sI5ѽ=*pZEWԪVzsm}C/ 3\ ߒzRCDS' I0{]xf| J6&cY F;nz ,gw4jX\yXPtb*Ba =(iw vEn?tڜi/8^}:g3I|"-\U;-a[-M 驥m͋@RJ{2j[jSmON\d ݯǖ <ܺN^5 Ȇ(Z(ם7o!d=4q{Mq=]./b7 Y/v#@'IZ!G7ӐWGHXkm z'k1>)*t~v7 ƶ&W'.bK_I? ùͭV1m˻G.W&F2]˺sm̡_*8uq .ZKN{z b&/L(=K _2,UfL?>I0AB ,rr+Su93!d㢋\i::˝Y2JiMp6tU`~ @j<渧OkDԙSTsQNBXKP%̒XmX=*bkA(K.s)ntʱkXgAr>^VR3 Tm%ޑ)?HmikNe}O)ǪQ`Pک>f!8߽.AI}_lwc>C?CՎ#F_{)f!;Q#Y'p~*Ug.X]gnzak1YmF"1Z1VB^5]O%_Qΐ›Fb)xfwwODS7ꬼ!u{_h7`_> UCv94Rh*mPwjł͗ƈZqD|[yTz3o^[f`h=-ЩЩyqܑ 3 ̦ Ats6$`gF,jL % |Zj3){ sg~H=jh.KGhߎۧrCW }Ap# f0 9:[- ;X N+JR&` ֟,*aw VV@}pՔHTza(OD#5 :p.F{:x=A :* /AdRCXI.h)<LMn{d , qE[zCjDOEWlɮ~,c8=m\౾^ F'ClCst Qcȏ @hr "<;!4G@3By0e/?`I*,Ӈ]׏鯩Xsk)؆?AAmYce(Sj4'SoG^A9NTߡDPd`=٢ʠ!g3A"JFJ9Tڙbl6WV*GWh_yϮ>{2Pg$5Kpug\.dlQex/@3dqi]A-|eJ)WifzΛhUt3|'xP! %Ӻr1X zQdFph)9?N.&uNڅ悞 h;*5DģI&ֹꓯSwȝHCLFI%S_l.#`ECP\(gзPVI<ՙLk"Eߙ=70(,wNt/74,C&mWmSڲx1WDOXO񍯑W6J 1VA_ޣӈU48G94M1"+ݥ0_P-bcCdA-C**s@dԝ8)1lsNZD}նJxIoqSUsݧOHdFr;1 I JKx_:? sw,-C&ngUbڂ x%>tAp@4)rEs a / F^.:r Մ,P,ɆbGqA~aE0߅B4|Eld-iq̥GYm\3'mPцL"YԊ?Xk>sޠb%Y΁ko?x}c"1DQ_!ƹ(2b$-e~e}bzJ>}Fʻ'x+ihO(##ybd ZG旌rz^৒5~k*GW@awM2ou3ڜ%K<"梥\OQX ]c(Vd^yT-V.Ε^EǕ/ZR%ԖCnEb2zw UdǏ _X,:JS=v<.?)~t|Tb?77Nߓp̎;^6\LyZ{>Yl@v2T@|bVvQǚ5Z|\oramNKiǐғXd}Sq73>`- :!?݃LEވf^]h!ő~IwְCƴ9QK>ݯB;MsofTYy2Sz ٻ듷 DP[R1vcۅܒMɨxIPQXsrdbN']_VS^(I Bq!ST/Vh-wUjS7Sr5kk4f/A4UO뭭я?oCGyQގu l֩ 91P Hnv܈a.9[2íNt߻Ice!=Nd)֎P9MQAO%#xw{8k&䃶[|\cU|c00\ᣅ&tB3qwXW"UڇEt)LJkNuUfk ILiO*ɢvFcf$SJĉ( .J7GxD /, ͼDX%"d (wVj蒽@Sy -IwV@]KBYn8{7efՊ"?yK=;H)& 2Ix 9}?91馍uF\3ZaE'7ouî7+=DZR)uP;k2ysn>6n3&FK0ߖ/yp@.ohrv!RЭ8\SA"w9pNg]ehXxƤc;|^l$kOl'd,y>{(DdzVsE&&cL+fe0 RE9k^r qnxER?M{< vwsiן`DJBPݴ~lzFD`j_ߝD_b"#.+K"P$F*V4U{}{z 9G `៸uw'"k֪.Flk\AJݑDzMOLqnH]%n2pHRn FN-qNcw9YT_Ur ߮[ϴ F~G~z)/SS#MT !UA^Ȗ=psBouNȀ䓉umк]i8eO逨 u_Q*"Blka4دQsl56.qKٮZ~>"!M*G Fӓ)uYb ՏBrnYkGZOŅs(G)_xea8s`d;28 ;{:՛ /ejyS{Z_U͵c_#<(JP-z3"W@`#r0Aq>q 'eDcQD fM6&^Gmugy#A#]LxEezycq6<˟ eH>΁Mu6PcVWB+ 5Al0*`݄vOU\h8l4iIb͌ z5lg?YcVf1*o."•O(W\JÊA!6b0x#vpȠi%u-MJDuH$Q=ޑKp?hNV+{z[a!!KeoWöI!$G\ռEz?I&tY! U>k `w9)!Ne݋EbZZLlu6FGgV] +g ;c'ӛ\`lVY,!c4\Ĕ0~2nDժ0xL[9~ed[ WCR ŢWHw{I8F Am:׻Q<F1´mj+]"T\:{}y:\Vו`2ʓ;-,#ᶍƽ5c(Eg-=U3b.٦ŤGz @걘;EoN_bճ+#LSF`yh7C萘Nu&Г1 yy R' te ~e8b^ef>\ ˪0b9i @QsŃE"fO<ӿ[iIwim@.?k3tƌeŰ̽ijwd7ґ3_bcr9=x4'c3$&IOɞ BCwuh$isyd<OCgLfוGd 8s{Ke_ \ 2%'}}B!nzw2]QAѯZnbX4^-2{ViȃKy1 "i4=GҔ϶ǣB&]L)+:=Rk-R'V*+ Pv[1k0eJxW|cήS2%qDLb28UQH-jr7¥E͘Ԕ#Ut0$Iij ԥmW Hb8ԸnP"K,o?׶=<%4CSϗ2ܨl A)Y$ƄwuP_K[IU9: ׎֖9Ct>Y+00#k!>?2s J@f{cbŷ@:x+`eӈws1'Ůض5zqZK6Uvuo:񥢀6hbv+3_%jI"9hWoNEOt Pw|0P]#)kۯY0P&S?uwg ~N 4L7:ja_ 6EɅ.K4X(,os.ض$9sz' ۹. x`q;}jgiSȇ7")$Q wZ» ]A `[ "a*a0Ȏ'n\dv|F 8RYD\Ȱ~Oca^}ճ!zDOOhV{Y\\4€c[U:]̄^?way!>(YITepJmϐ)ۚAe^24^äi5ؼ[ _&[,Nv)A,W[РQw&q{0¿.nh4 ̭M@ԝi<ks wrR\Yg|5gւ]Eh#\b'nq-8~OL;BVSDQ[4; No`ȐP]˘OΘ/R tͿȴ^]%YnM;P^7\X$j64`ǰhӞmq;X'ݙui/W9KPԢha8՗q{DQkf撈.)Уq~G[s sNoczkB< JkWI#v9B25~rC/8TI>g @hY򴜍#6 lصP 1F8Yct_@ Wy d`]2ת= m;F̎ѾIDI7Y@`yFjgQJh{ljs|Yt@'=9 r!)B[ځAxBJAHìhO;sq4 (r5q E' 9 t-sQ&L! Ԡ\74~cX*É=&d@G%oCқ6-}M3$< |~mOU @bg|gn#mo|HxĜ[ч3V9|/y Gr$4j)Qcs’ י#Dbkb=I~=hUݛZ,%`!4뎂G"&ѽ A:1)llZ̓HUfunrW60 F$F(Cq@ ~9AV-\j %e*BD{%/LfHMgQΟ3Bsr {n8O2 \C-8,7&5B}sӈ V*h=>2i#eh34Z m\ɺ>33J܁s禯ϯ]؜Y+ڪ7tۗ<tGEŰ Spj'onu(׸ZVrjnR:vr=w7itk*Yͩ5NՃsU\Z4'`c%!,59km*G\`L(䔤Y  ϸrG-ף ){\ ב$~JJGn44x)O_XJjP<W #Jy 'sF M3iNv̆'$t 8d}p$h0FM lJX ,;g>tw}k%t.Euw`DY˷0Kc) 9SaBKGǏN aB߰<YhV^_wcu2 jK#B5׺L !E aY(sxXŐFpGIz>bJ>[RU3P!\R?pNR.4F]-;6r]_jyY;zwouL$)u<,S)^Y \?!U|y9<'Yl1mb7dQX]Ta,[ŸV_x]xöPiom.gٗgr'َ3Ψo 8S-kc ~Ś(Uw)_zQŪ86#4=II$? rV=]HCioqĖo!"yܸՑ#{[mhdo5p15oA! o} 1+AP8oO;>)?{dGu6)ޝ8:ի uglAQ:,%R'o@EI\u7UfFG4tQkծE0Ss#Z%<#` ~1g>ʺ5昡)[HK,˸ӤLYoDY8n yk>k&# #QyqgfU3 8jZ2 LDONDSN5]A7!'g'..f^[^~EH{Yg8go]Tt9 }wBoqUCg9hty!)$I[V[zU>%!8YYǧLysd9TEGGm<o6WfVn-DȄPb 8D?>!߲nYcŔ||ؗ:fBѹCkbmʁF(iOM>Vja:L qGq)n}kabc3JphzeQsBhMC6!~ZD<x'64k㞦Q/sXEu;543on6~ߋwu l=ǰ,Tzyn ?kh'趧8C%HS_w%bI `d˿eh~n7di*gc|vzU~m&sfN?:2Rm|u'0rTXa'tIH 1U:#U CdOα3xاyVז%?BKݢlH{6' et%Me:uĪ78.QD>o 3\4GXx7d|A R4s;tرN3 kJWL'f}$x=8a[eʫUvu?'O*aV۴qM#]K 0]4v>>#>sg̀0o6!\& Wg6=-1N=R8w7kSDᲙ'z6!jkzGY"\t Z|\or92Gz q98s;({ s/,l0dLЪqMA Y%QB1;Ԑf`@z_?>dPlq!pbW n,b=ǃ7fpp73g(S&hPPt |Cpr#8\xGF+:זc6rdJdiCr z}z"T>p'eܜ tԁ)("jeh S4}(%vGRF6]l<o_!؃&,b$/%L#.Py L_ҿ${;yC-LQ5@M3_95RLJ/k^C$3Z"A**(e r4@`aVH/R-~*4~,U EOC:;vb}F.EJ@+hضf@ؠd_lA$X<,]ޒGyyd܀woו'3@re0 4%E^| x{?'g%$ҹģD4IhgZ\sV]Ge!l}Br[&~OL?_ə.0ѡ<,Mr} 4}F.&CÙDy0|-tsz% t[3/lyT Adtj8DuIHuUP89ױc&]ܕ2Ӳ|.mVRkP\DeV萏řgEKPῃ"iMKۣ d-pUqYf 7r.ۅ@,:I4 MHzA|Ҷ":FE7qJ^ԍ\ ߴ$-H ? AV7CUN~sA{w ^S*8XjF|VHt!xpsAUh9PFc<P tP00'UmZz oۋ2ڇI9FTQ-f.!>jlt9@~ srfhyO^d_\I]n؛KPu"T7ht QӘ#*tqV6ikGuT>Q>j¿qq_[RtwTJiGF5;({ X0a?I*"kr-@{DUiFbƚg=!M1y|f'w;i]=v(sxF i ɤӌM~㷮lhh_q9Iꇋuw&'9 KmDL&\RO vQmJfENwLV2p96%ƺPSz2m*?< 24fgv>Jj[8Ym##yŠGG5%6̆]eKt?Au=)IO=|!\!Z Z#{Ccg)x0޶YV Ϸ@ڮT (ZA^su_(TSeٌ{ߩVG!+Ed|IIJ9`P.o幛T^șo5rG>hiL&߬Wblxf]i+`&> L+P(#L6s2=.}B^ KJ,NIhaҝx+So(#(Kc׼w\9 v6JIaJHNjCz=Vi5 QbW1Wn9f_'$K#HI!]sPwaLO$(Wg/ (aBvm\ߠRJa9ߓQ¦*G$4mT`?|5# ǜ:Z v!9”f&+>GW\iK[o 2!Wk?B>Q>@I~4羠<>NYn<aH5ɗ̌Lw@x Qʰ\4t^W{Pmf\XM7ء fWz9<'П? ?0ire~01'i58j`~o+z ]xB~ zTsɾPz>D4}A{$@zYcp3`(Ù gPi2N,G4&h8aSf"V`21hPpߢIkv jcQj'i+R&˜ӆ"^ A ڔIoPAEc0zzp]VuDybwH2NQz'ʙL:ᴑxZ&ߠwW𣽮.Ofm?C7@_tzl9Z/8tGvXfO4'%dP=dmh;NIvg~b#-mqoRb`1c'Q,kaSGHvϳ`aP997[J;4e0*@Is6A^=mѽ. 8MQO,"Y\+2qFMz[3H#+u<'֗nU@XG U 尩_E4Jˉ䳑>|8~#ư~fqaM' 1y?^=y-JLL +s֣m_,SWHw1M^%N9[؆@`?ٲ.$_u޸yݳ%JB GǨx=zwx(˃ /nGv딄~D/:*ͥUu0By3 !}TSVږn>l2,M dQm|t*.fꨂH~c A?}H NXp%ka}x,nqn!eϯuf2CS4).g:`'ׇeiBZ6\2>Zhy!H:=֣0s]s9)щjŰqa #@\m!;D4Ϧ;8?$ْb^ˀO07u!)pmlc?B@ZZ3_!f]슯OmꗏW?%6!MU< r<,F Fbb:{L!T(4pR!fk_t猝)@ih.毰*VyV?Aq[:[9_߃Oi V7mv{V=zPʪ,+',͛~0}yIpRꂢ#y`pZ9I=_UIGxGŖtiU8D_\ lA3ί[Kd]Eq 5Mr e an,dހ[@kkW;µ(eS@\rLrF#%^Vt=;0˿.gPЯμ8 ٸԈOl;_a#~d )xp]M-Xq]6TL4FXŻu4HcO(";h?wXo<'u$*:] ^o F,p<';#IIwĉ+DWܝ=K藻_Sə~M)=F\dCM@iVS{##+W/ &ƊE s1/tY]33 hU#@MbKՌ08c53&B"PFr#tXj՘ҥKQj[?J{>q`%[:g\vl3Nΰ?^SjZ+RaI8C hN|!9bͳ6חcmԞ76K?b}YBaFa HЅpOHi>]hjrcJb*>W%H< ^KV!95m(hHFC~1H7Dr2(pX@ׂNlY5[šrXdRWߍ6BFp~wO;ޕ1Hòvme:=48-0ι0|6&q_#>ݚ,#uGQS|7ܡ:[#R[N' EhHSw8[Vo]j ʬ'p'/|Z l'%PI\( Mϻ>[`'|6j1Xbb4XؒZރ|N/b@l#ǒc2q9[Źw>IlE99nB;\m:أZrxd*-l3v9h8F=@V0o{M4vu{,T@ c+Tyrn*.jAxYU2igg&G2K(X 㻓n_6ZR7̃@%2y\yg6ňi7N)̋ߣzVU"#@I $+d3S%T62`ݑ@ >m${hmzRB|+\pCzHTp;. a[ (+x) B$0:}y1ǑD]3DϬfΉۘb$Ɲ/cNjW^ˬsCoH.S?i4{vҪ:OKU{m&$3H< Oo%weQ䋣:C7o9TbSJjT.I# -oUy&_|@~zM@ V47FgFc֭#ڏ_)T|I5A?xn_. w 5d>>oq|jC]ki eyNLRZS3]F> sY̳T!,K 2+);^nWE) 37x:#݇ၖ{$(N#<\zIjODG$!h*{ԖM잲,5 Yx|spʂ愮TgaP[r{ӴłWזh+T>êM?=ã Ex\6/!VQ+ŮȥQ̺ڏ.+?sv9B` $wWƺ$ݑ 8iQ?o5bH0 t*\[#C1J T]xbU.w*&^rUGlov HŨTC] n⸑S!eW,LmGvJ1 jj 9X2 GYo̮Cm ġKfv#p_op=mÁ61x}f_F=z,6R RT?Fi)h-_UiG }`T7fFn-i s܆uŢ%mQMOV@v^yI# *iRvԽV$# -oH'h<%Ujc(~##:sM{TԔ=D5P@ܰ>f,2|Prf@udw`+umypG>n ȇ )OK*|_<-{,L1 |v펀SR$A.MBz ,UIkcM~< a "Fì)T2y.GX 1bሚW}#3~b\` 1Rٶ*@ ޫA,7+^+0Y&н֔'ꐥAY)Û6F~zg43`-lG宕iƒJ{!d7QPK4"1J[W)fd_p:=zBQT7cg0(q3Xw˖aQ' $}j49aCzKn[U$&1pvvGG^ '`mF ,?5_9jrqo`[h u@ (X٣tHcoVܠd6 \)+; (D14b*z"E6CiZ'`ݡ(uEq̳^_-|RWC0D>O)2WyR${aAna3,@wz:~('`EIGl}G*blbrB|] xF"C8kqTg3R<+]٤63 dlwmo$B/l72ҼYÑ&MjehA2R& neƻ9Qyro ꅅUJj0faOXaK$SM:j3:UbV߈Ҝ#ל`t݅3}j 9 k"T43#Y־OR_TV[[+Ʒ_jQ@d}GH=El 63XH ? 5g&FsoJDXlwv(-F_H~ ڈ\_+gɱF'rWen^uQ,wlAR:A8Zo jHs xIX~( &!~ڲ[*2BQn{AHH5Y*pjRZ&vidhff@n!_ucBjG,O:ΟQqŒd+}9,5dcI`<:'}D SD4*F*\DҾ)Dw]BN.̬L?"fjM:ir8IKqs0w`ot )r;-! Ry6F}ԱCaёrehSK 2}ǫA953.uo(iؾgFZ\6Hz̗я3Ʊu0̊g"e.Sgn>$? EVPc"OL|oH57TOTuc+A3ځVuN]m z AB=t/d>tYmJŸ[ ocO !.&Vj$i4;EzDZ BP ѢoXQPx]A6i}:V#&/L7{Fsv~ Zljml ;tj)X9 ";?֔xYW+7,\'txX;}6C#!CܔD$k2̊yAuM| OI^ZM9`8 TL҂&hy2 vׯ%Y CdPFFre-W@!w5R}xgb6m4ʠ3L=NYhSYe#F^G8->u3R)iݜ}:*U=ib*x8cJ!e#tR5a”AQwlBp'˄ȟuq6mk;} ed> Ֆ_F0{h' !\i'bdeIѽS*@l,&t}揅i[CP^P 1,*sȂew`xCxNu6 a`g+!ʿ!5́L@=P^(\,|qˉqHa:D0czp&CjEud#;"d)5w)j<]Ovݙ)UĠҴUnʷQöQ#;ɵy=mE8'\Za" PfSKB3s@gakLlνx VWH19:,?QNO3F.EGp̣/u9ש>롥_ R"D[a#C"߀/$@E$CA^(yQt)471W_prdXQZb1[ޢ׈U%` \1d^I L| 7e^@1hP̹$>>ꝰ|9:Ia 9.A1oZES•fr]vZgEF"FD5r”k 坐]M))SOz~:u!+H/xYvOs٢߷{xqEŞmU:WO{BR?LH\朼 ['+wgxboSfvLYrˆ$;Y';DkxD/̌W;NA^ąV(Y3V'mfѭo,odDJъw/J7*NG'tts +|=s. _Zmڹmr%/oH&z{&OIHifTA )|},z3 [+e,EK|re{8Yׁq@ +t *ib1jpmL{;zHP |?d20>|eHg~ҩԑ v m}>o>VDE_x41stTM*]4O&BCTV*KnH1L~M*eWT9ֹAb!gdne&\T -ukL3xo#mG6X]t$Vz#\_)j j lfgh(ۇӛ<53*|B/$^b$ ˨͞-QK *qݫCƣ@A 6uIFToALCAq[>Tz<暋AP,gqSl^M}C7/1^fH|릿 Be&$Uf"D/CN%)B|(8Z&=njb+I\>.o&GEmZ6ɗr"EŰ?!HKa#T_w'hT3j""#?UPr0d[9[jH?ف=}IPw럘yyO8a#ل>ȝ%◥dUgv*K̏y]Q%4ZKK8)4W8WuWZ ~s΂jF 7TJYɒ pj/z$'oCr 8$n^.&aNdʦ,?Lׂ@nY )QyK©Vڑ[9L|t4xJumoLȊ1xkEZPAcƟ X齹@v4tT9;Kλn(>5*^dGL,nf؜֤%e)JU=-*COA p`B'f;z+}1vjw#c2YI(*se,!Jޞ6YC50D;;},Knp}󏦬Y0NX •e=i5u'{SD^Vwz7J`&sW> t,YX@/ \y 464+~LJz-4Լ۞YଇW@FKra|MVuxM]wѬ{0hkO<<(Sb~$յ(HI/Y%22@G~63.,y#dxB]n"7 b؇0 yv \ )=6Z!GQ2{CkRL:b'9֦ˁi+?Z# T8}xI~6֘yEit.[p/0 ~!aW[lܛ[fV1f+~zף-/f ޗ~wQ_>)0yX MOf62~HܵLC׷sU^ U8ӳPg&o棣E R",,N`4j hxW7ǖ(M0Avk;juC:F18aN0V[3卾;b5 _i FC${ (7ORIpI/DPeS4h {Zz1LOW+5^ @ X^AP {Z;j 1Vm2:ԇ}*4рCGj-jD rtȾ+4<  ROU H F%[CQu.jqfhd0j6E0B#ǵGn;K}1WO~{> nk hOƸ*)l#++y̧bpO/',вNNnQHI7ļUpV\ӈ,@7Vk4c8#3Ps-p st"kéf[8{,9>gevЕs?adbP'lk4<|ԅyMY4_@<۟&_.KwWK1kdx$O-aM0H!H8 t>OI 7R3\;ٛ}ful#*p _?Dz^S(E0H|ꮯ1IWJ6iŒ7ϻb֤_ q ).faTy Z]zE]̓< o|ƽOcȓ? L`m1V;*!?@ myk.#RweNMU,[Cb#O :B,7"\pyjƯdۃWdY3AUu~!7;´˷Ҡd\4]5n2l>,njy~lDKx OE/jP^y>62UUw2`~> l{!LJtBTR\[NƷpSU>Zy, %B`(ݣpg=^ Dp'\  ٸeFOi+r@˵\+K%7Aq /٧6 Ë:mK(~)T䨼E?*E>}p̮11$RAЬ-Tt%^EyCnN7p)W[UBT2Y;0H/T;U#do&Z'D)* y#s >J_Xu)E%DusbSз!UT)\pNH.8(tER$%4lqP\=] #,g/s?q".(2 b`EZzm7@ms!B9 Gi]_[`>,Ҿ@hJ-!#uNq9E1KJu1,Q>"w nXەr F]8a<ON2>s;I`)oɼ,Y:r t-9{.ãJ{hb #7)qCכZx; \a %/ThâwN ׳~)c+PݴZfݚ>$'tJrqnnK[`kx׌P9״}pD9[9޲w<֪~Bj@zt0\j*d9#}7:Aª7S[G w*r\E-GױK! ?GI`mP_;a(Q3_cH8`Q2#q~NЭ>;_,n)t-;KjO0[!@V0C8;'ǯ=2ȴ{VJJtA,V!_]K29v!Su٨>F c<(:OdFo*.uz#8/<[]/TLݦn^jz,y`Y烰xs1\gjqID-zTzb|}^DIiSZuૼ3Du ';̅kﭐu?EbVC"?Sq1HSW*DwS--( AxB;9{AWFDXTmS[PXJVv@ rzўh$rі}Tu+(NvE'1%HBL%֔sZmFC3 rRf"!qX ?w:Ed PȌiA_ΐQnLD{@qD ~l<S+#Gdu \f㯦Ohϸ fΌD;(;89)x}ӘIٖw3C#cd2z5[9z5o(!N01]*\%u6r>RDtihH1ûS=}UR !#FyCa@f%@'\>| Xտc};']P#ggÑ(yGL?Tui|6uhC#7 B&'u1ۘe 9 =󪗋v:^>uXI;0ؓjOL \,"mY ? wrܾZ <%Ukl1^ rF<ŵIr5w\gV_n/6u>:@h[iVӻ$OWV9D>#]PҦ.meE˪"ܪM4(f 3+֏9AL_nA&C83ql#YS$Qm ׭_7vr/_ym+uj "@օDVb:/3D y 4IbXwk:%%\7v@TOMC׬ծ˭΁RVdJcn˿fw&20P _w'R%P;-'9J*gK%ƥ.ۦ͠4LY1OIpMRQ(g6Fenķ#OդR/_|9:ϏDY8  t+%hDR m 䯤xdV>],7w[;|m/RnzrR$)d m$$!lW` սyqr kCz߲/bC\9l{N _,*y{7[;;ai:1j501}NdSeN}B&+C63-NA[{ -[;λ/ASrنS![I m밝߼*u z(S[n]4>On[ mc XMUc=*6\ž|lDPRkXYo7ÿZ׫6~: +zztDزc0\⃍8}^{z8V ٍ)dہS#S T )%X]"fM<4:Pӿ90q}G F98%+ESJ22`OFg~WtĤZ𬊍BB IT-!mX[VGyI<_%Sf#QwySBI.:Y:7́B;꽿a7F5">|H&gOchi0\^F35`7LmhvZc2Ɍp{ICrOjt5B|;XˁҞv|tb2Yxa1ҔaPi<J nذTڏ;řJ3y^:✪e aЕ)£\}iZVGx&F.5qbT̒붟-Rp!є{8\IME%RBZc$)!%AXNN}>=;qk!|yi# rB|o48/J )2;^v,0:nTcd؊2x!)]io!)R9[?QvIbO3/1esLq|?TѕpXKbًhqx3E 6!o(^Wɛ@ɕPg\oes!NeלD8L/WuHVx}z\Ag["H:>/tlf%PФ=΄?e{x:h@Iv{,4*N- 2ؽ ^T<-9b]$W%N?%-6qW5ϼUxil26A+)mκsr`ƭQ>gwW D3 H0w 2`CЎ8)L}EzSWli}%W-}}]=s'OK7㻗9VBY0BY3F]5)U .7sޢdϚ2I 38Nw q9p QDЗ[i8B8HW%YpHOu=tW0o^{5lqT+8JdTOHh -Xoo,KZ$jwؖAzh' zoe+'%/fޯ6WAsX-۵T#z^h, J*rJdAE+.*#V$j'Vqf0e:IY'D.*B ˑ{! [>7#ܶSf3/d[j q(uIA\+$*[[P _diyQS!ڀhxR }W%8OM_W匘JIM"ͺ&kWLDMM"}ۃhOK=˼h>+f Xġ޻Gw0hg<>Q7xDJ5"]=(?+}2D)MwQ`gc]rS=W9QLy=W U m'9pGCc$㗚̥T^-Bڭ?9tYerO<a2RB=WQ7Z7=*4F7\2gKq(Sp14)"?{FJFD*$Oj 6/Z92in&3t0Ebx^g}n3bҲ+nٚ*}z ]uP1_hhw]QF5mN:5?rΡÈVA;8#dqsCaÌ3-g ITva{ygm&Uk8%7):$pMC`dC8Ta[xsHふ]BIZ=J/>;MN:K/[zPI7J,ϢwoD*!!=Α4 7xt,3jh4g@ =-]5,])M=q 9kԿb@yE:u 1*,+Ba%l\zm6";v_PWď2\bB+. i{p?`usD*ڂp[/.D~xDL[^M[S@>F77(k6yPftyzc5 ;9I/7 4 o=o:'-Ij :٥)R*#o'Cg~lrQv4[ u.NkpS[*[VPs%2%rBP4\eS  1\9FrP1DOK{D  ,vjdƔt_B"}2{ džW?wmf;5z{/yM)"x꾵>éG[K5"LlPŒ1*/=L01A\̙ Oi蠬(o pRqA H^9k[|MvPLq9pov LRPoo[dL/#HaSzGbnkX(c;3/ĸ#ns/ 4U`UYo(3 G{4Kfd!/ /RcQ&jk6TJ?2j+uOȞLvWtD:\r`2$XShhPIHl!('edZq 40>8_3PJY\egUtrj:sSvGwc 0=_UBA>R=vԙn mG&r&b 7xrYyBH+c/HxFfe*I@AOK$ ׅ%܀ebHcyHO!I!!-n!j)rݘF6:fՈ(//ђp@(YR0eRDn5cv)9[bLfJĿ'nmp4 ZMp(gg~ KoPH_Xf3`.Y#dx-s.Si_/4j3 u() ¶IXE;G-tѤ?m,q~F<0*T)HiYf0\(CAXaTsĪ]Y "KQ;NM6'u CT ʽ0Nd E: q[tO#GbA/ )8öYKvzV?@)̫gGeMWo cuЦ`X T8i2 Ǹ"׉KT Ύ;po'iOI[/l«䍊^NjZ72{8(R4U]qcO fnI lҳY]KhzogsK3N>%fB29)nKQ9GΩ'בc[N8W+?"oq@Py\Rnf;ۧ،9uf?EiE Eh\; \I YzX/V8gns&8uiϿaC 6BcJicpiNS-!k w:E %o=<0  5EN5|M5#;vK `4/8f;U㔽]WFʕӟ&JsAI;*jit ˥#1S΅: |hVE7],Ʌh\tX2IM/^y.4PoUb[yƍ59P'zX*"ܩӾc~!:`Mܶ]0/9tpJTЙ>k6A( PHnZ7M[P/ۚ^|BţUi5 ]AU8տ;뎜nd„K䐆AkS&jEpswrW Đ,6ǹa}-ʼkܥ-ȍ>/G)caSQ}չI1 Ba^x9x(#r[zCPQ_̛̈́|ɓY~WZW -Ě 0Qv %$*qDeӇԥZex rc,o<*.=Q:DLv-_|7o`qOBOsB6ѰP 6c`dۅ[vؼ3{| d[,n9@e> ӯ1>M$VQߔjoKZ.Iv(0U!F'80A9"% ͪh:(J"=GߌISM" RmlN,t"KWߢ |Qv`"ĺ(2(G M_ʯ~mk'O9<&;1"i %G-F Ah<ƑE 5sL*v/z$4Cv^wM{*Nڃ5r.GK2 wu_yAUON`PG2Ʈ#,(:6cC44;\jEU=!0}CB/4Q72cWO>ž birP2nbLd,ޅγe1 FձTfھا> Tg;yz]^E0zGf놘b_áQ#5NDaXR]ka"yO %.J]5ڀ|kpF`n_)"*kJ &N7'(lX1~Z;KK1U Mhnb]|O *%NשvʩLZPW7@||4+7~*Г^J0u|Z PB^X&(1e iP#N$)€d6+siLN O+(ձYHhżŝ!k_bD'5E*K%y93pwޮє@&y !#brSYq-eNErNm? EΧ0xAf l˃Ɩ xM@ó鲃5gڀ^Y,ѵU-~0b%%LҌuXAqcrYWl= t# Bu[eM A=/-Rb>jK+uOm-Vr(o1/xC`#q*I޽1M )nyRN,g,Uu=L鲖Gj6B_C=ZLS>tVب4HPcd#Īe,c}+A>qC:dz6ͲIE8'x7u<FZ54)}C7Z8@t&vwǀv1pZ--uuC#8BM?۷->K'tmaF*\d|m :: 1= szktWf X)!2`;*VJqMUqsnŜVq;ظ.?(5L“޾jG:ql1bܝқW_]g@Pw5c~?rk֖b; "? 󖮼}Xz9HE3Uе_J|iL,nZ[Yx YΡ[ߐ /LDlQ{nG5BZa!K}!c}=Eiu~ a36GfFǚONl' h@Wװ]wF F; ['/;Al