From: Anitha Gopi Date: June 3 2011 9:09am Subject: bzr commit into mysql-5.5 branch (anitha.gopi:3424) List-Archive: http://lists.mysql.com/commits/138636 Message-Id: <201106030910.p539A04B007907@acsmt356.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0963431255==" --===============0963431255== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/anitha/mysql/repo/mysql-5.5-mod/ based on revid:anitha.gopi@stripped 3424 Anitha Gopi 2011-06-03 [merge] Merged with tree added: mysql-test/r/archive_debug.result mysql-test/t/archive_debug.test modified: include/mysql/plugin_audit.h include/mysql/plugin_audit.h.pp plugin/audit_null/audit_null.c sql/sql_audit.cc storage/archive/azio.c storage/archive/ha_archive.cc === modified file 'include/mysql/plugin_audit.h' --- a/include/mysql/plugin_audit.h 2010-12-14 14:34:23 +0000 +++ b/include/mysql/plugin_audit.h 2011-06-03 07:27:11 +0000 @@ -24,16 +24,7 @@ #define MYSQL_AUDIT_CLASS_MASK_SIZE 1 -#define MYSQL_AUDIT_INTERFACE_VERSION 0x0200 - -/* - The first word in every event class struct indicates the specific - class of the event. -*/ -struct mysql_event -{ - unsigned int event_class; -}; +#define MYSQL_AUDIT_INTERFACE_VERSION 0x0300 /************************************************************************* @@ -55,7 +46,6 @@ struct mysql_event struct mysql_event_general { - unsigned int event_class; unsigned int event_subclass; int general_error_code; unsigned long general_thread_id; @@ -87,7 +77,6 @@ struct mysql_event_general struct mysql_event_connection { - unsigned int event_class; unsigned int event_subclass; int status; unsigned long thread_id; @@ -118,9 +107,9 @@ struct mysql_event_connection waiting for the next query from the client. event_notify() is invoked whenever an event occurs which is of any - class for which the plugin has interest. The first word of the - mysql_event argument indicates the specific event class and the - remainder of the structure is as required for that class. + class for which the plugin has interest. The second argument + indicates the specific event class and the third argument is data + as required for that class. class_mask is an array of bits used to indicate what event classes that this plugin wants to receive. @@ -130,7 +119,7 @@ struct st_mysql_audit { int interface_version; void (*release_thd)(MYSQL_THD); - void (*event_notify)(MYSQL_THD, const struct mysql_event *); + void (*event_notify)(MYSQL_THD, unsigned int, const void *); unsigned long class_mask[MYSQL_AUDIT_CLASS_MASK_SIZE]; }; === modified file 'include/mysql/plugin_audit.h.pp' --- a/include/mysql/plugin_audit.h.pp 2011-03-04 12:12:31 +0000 +++ b/include/mysql/plugin_audit.h.pp 2011-06-03 07:27:11 +0000 @@ -43,7 +43,7 @@ typedef enum _thd_wait_type_e { THD_WAIT_BINLOG= 8, THD_WAIT_GROUP_COMMIT= 9, THD_WAIT_SYNC= 10, - THD_WAIT_LAST= 11 + THD_WAIT_LAST= 11 } thd_wait_type; extern struct thd_wait_service_st { void (*thd_wait_begin_func)(void*, int); @@ -195,13 +195,8 @@ void mysql_query_cache_invalidate4(void* void *thd_get_ha_data(const void* thd, const struct handlerton *hton); void thd_set_ha_data(void* thd, const struct handlerton *hton, const void *ha_data); -struct mysql_event -{ - unsigned int event_class; -}; struct mysql_event_general { - unsigned int event_class; unsigned int event_subclass; int general_error_code; unsigned long general_thread_id; @@ -217,7 +212,6 @@ struct mysql_event_general }; struct mysql_event_connection { - unsigned int event_class; unsigned int event_subclass; int status; unsigned long thread_id; @@ -240,6 +234,6 @@ struct st_mysql_audit { int interface_version; void (*release_thd)(void*); - void (*event_notify)(void*, const struct mysql_event *); + void (*event_notify)(void*, unsigned int, const void *); unsigned long class_mask[1]; }; === added file 'mysql-test/r/archive_debug.result' --- a/mysql-test/r/archive_debug.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/r/archive_debug.result 2011-05-18 10:01:43 +0000 @@ -0,0 +1,12 @@ +# +# BUG#12402794 - 60976: CRASH, VALGRIND WARNING AND MEMORY LEAK +# WITH PARTITIONED ARCHIVE TABLES +# +CREATE TABLE t1(a INT) ENGINE=ARCHIVE; +INSERT INTO t1 VALUES(1); +SET SESSION debug='d,simulate_archive_open_failure'; +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check error Corrupt +SET SESSION debug=DEFAULT; +DROP TABLE t1; === added file 'mysql-test/t/archive_debug.test' --- a/mysql-test/t/archive_debug.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/t/archive_debug.test 2011-05-18 10:01:43 +0000 @@ -0,0 +1,13 @@ +--source include/have_archive.inc +--source include/have_debug.inc + +--echo # +--echo # BUG#12402794 - 60976: CRASH, VALGRIND WARNING AND MEMORY LEAK +--echo # WITH PARTITIONED ARCHIVE TABLES +--echo # +CREATE TABLE t1(a INT) ENGINE=ARCHIVE; +INSERT INTO t1 VALUES(1); +SET SESSION debug='d,simulate_archive_open_failure'; +CHECK TABLE t1; +SET SESSION debug=DEFAULT; +DROP TABLE t1; === modified file 'plugin/audit_null/audit_null.c' --- a/plugin/audit_null/audit_null.c 2010-08-12 15:19:57 +0000 +++ b/plugin/audit_null/audit_null.c 2011-06-03 07:27:11 +0000 @@ -81,11 +81,12 @@ static int audit_null_plugin_deinit(void */ static void audit_null_notify(MYSQL_THD thd __attribute__((unused)), - const struct mysql_event *event) + unsigned int event_class, + const void *event) { /* prone to races, oh well */ number_of_calls++; - if (event->event_class == MYSQL_AUDIT_GENERAL_CLASS) + if (event_class == MYSQL_AUDIT_GENERAL_CLASS) { const struct mysql_event_general *event_general= (const struct mysql_event_general *) event; === modified file 'sql/sql_audit.cc' --- a/sql/sql_audit.cc 2010-12-14 14:34:23 +0000 +++ b/sql/sql_audit.cc 2011-06-03 07:27:11 +0000 @@ -21,11 +21,18 @@ extern int finalize_audit_plugin(st_plug #ifndef EMBEDDED_LIBRARY +struct st_mysql_event_generic +{ + unsigned int event_class; + const void *event; +}; + unsigned long mysql_global_audit_mask[MYSQL_AUDIT_CLASS_MASK_SIZE]; static mysql_mutex_t LOCK_audit_mask; -static void event_class_dispatch(THD *thd, const struct mysql_event *event); +static void event_class_dispatch(THD *thd, unsigned int event_class, + const void *event); static inline @@ -64,7 +71,6 @@ typedef void (*audit_handler_t)(THD *thd static void general_class_handler(THD *thd, uint event_subtype, va_list ap) { mysql_event_general event; - event.event_class= MYSQL_AUDIT_GENERAL_CLASS; event.event_subclass= event_subtype; event.general_error_code= va_arg(ap, int); event.general_thread_id= thd ? thd->thread_id : 0; @@ -77,14 +83,13 @@ static void general_class_handler(THD *t event.general_query_length= va_arg(ap, unsigned int); event.general_charset= va_arg(ap, struct charset_info_st *); event.general_rows= (unsigned long long) va_arg(ap, ha_rows); - event_class_dispatch(thd, (const mysql_event*) &event); + event_class_dispatch(thd, MYSQL_AUDIT_GENERAL_CLASS, &event); } static void connection_class_handler(THD *thd, uint event_subclass, va_list ap) { mysql_event_connection event; - event.event_class= MYSQL_AUDIT_CONNECTION_CLASS; event.event_subclass= event_subclass; event.status= va_arg(ap, int); event.thread_id= va_arg(ap, unsigned long); @@ -102,7 +107,7 @@ static void connection_class_handler(THD event.ip_length= va_arg(ap, unsigned int); event.database= va_arg(ap, const char *); event.database_length= va_arg(ap, unsigned int); - event_class_dispatch(thd, (const mysql_event *) &event); + event_class_dispatch(thd, MYSQL_AUDIT_CONNECTION_CLASS, &event); } @@ -433,18 +438,19 @@ int finalize_audit_plugin(st_plugin_int static my_bool plugins_dispatch(THD *thd, plugin_ref plugin, void *arg) { - const struct mysql_event *event= (const struct mysql_event *) arg; + const struct st_mysql_event_generic *event_generic= + (const struct st_mysql_event_generic *) arg; unsigned long event_class_mask[MYSQL_AUDIT_CLASS_MASK_SIZE]; st_mysql_audit *data= plugin_data(plugin, struct st_mysql_audit *); - set_audit_mask(event_class_mask, event->event_class); + set_audit_mask(event_class_mask, event_generic->event_class); /* Check to see if the plugin is interested in this event */ if (check_audit_mask(data->class_mask, event_class_mask)) return 0; /* Actually notify the plugin */ - data->event_notify(thd, event); + data->event_notify(thd, event_generic->event_class, event_generic->event); return 0; } @@ -457,15 +463,19 @@ static my_bool plugins_dispatch(THD *thd @param[in] event */ -static void event_class_dispatch(THD *thd, const struct mysql_event *event) +static void event_class_dispatch(THD *thd, unsigned int event_class, + const void *event) { + struct st_mysql_event_generic event_generic; + event_generic.event_class= event_class; + event_generic.event= event; /* Check if we are doing a slow global dispatch. This event occurs when thd == NULL as it is not associated with any particular thread. */ if (unlikely(!thd)) { - plugin_foreach(thd, plugins_dispatch, MYSQL_AUDIT_PLUGIN, (void*) event); + plugin_foreach(thd, plugins_dispatch, MYSQL_AUDIT_PLUGIN, &event_generic); } else { @@ -476,7 +486,7 @@ static void event_class_dispatch(THD *th plugins_last= plugins + thd->audit_class_plugins.elements; for (; plugins < plugins_last; plugins++) - plugins_dispatch(thd, *plugins, (void*) event); + plugins_dispatch(thd, *plugins, &event_generic); } } === modified file 'storage/archive/azio.c' --- a/storage/archive/azio.c 2010-07-26 15:54:20 +0000 +++ b/storage/archive/azio.c 2011-06-03 07:49:05 +0000 @@ -114,6 +114,15 @@ int az_open (azio_stream *s, const char errno = 0; s->file = fd < 0 ? my_open(path, Flags, MYF(0)) : fd; + DBUG_EXECUTE_IF("simulate_archive_open_failure", + { + if (s->file >= 0) + { + my_close(s->file, MYF(0)); + s->file= -1; + my_errno= EMFILE; + } + }); if (s->file < 0 ) { === modified file 'storage/archive/ha_archive.cc' --- a/storage/archive/ha_archive.cc 2011-05-10 13:24:34 +0000 +++ b/storage/archive/ha_archive.cc 2011-06-03 07:49:05 +0000 @@ -1685,11 +1685,12 @@ int ha_archive::check(THD* thd, HA_CHECK azflush(&(share->archive_write), Z_SYNC_FLUSH); mysql_mutex_unlock(&share->mutex); + if (init_archive_reader()) + DBUG_RETURN(HA_ADMIN_CORRUPT); /* Now we will rewind the archive file so that we are positioned at the start of the file. */ - init_archive_reader(); read_data_header(&archive); while (!(rc= get_row(&archive, table->record[0]))) count--; --===============0963431255== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/anitha.gopi@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: anitha.gopi@stripped # target_branch: file:///home/anitha/mysql/repo/mysql-5.5-mod/ # testament_sha1: 9e897ce7ae5d1574235c7ae161fbef8deb6eefd5 # timestamp: 2011-06-03 14:39:44 +0530 # source_branch: file:///home/anitha/mysql/repo/mysql-5.1-mod/ # base_revision_id: anitha.gopi@stripped\ # d9m3vukrdp84wqvt # # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWbn/ogAADuf/gFA4CBJZ9/// f+//4L////pgGIt9PvmT6+qbW99qT7Pnde73Y93dXRoG3cXZIKDuDzXPvZ7G9723NHe8ZuW3Y717 3e3t0UorbCLkO61lrZ21MEkSEynk0NNVPzIk9kNRNT9ETbVNpPQCZPQmg9QA0EkgTJkAJMRpBME9 U9NRpoBoANGjamgAGKMEmlPU1NMp4ZU2pmoxGgAAAMIABoBIiCEAJimJpkapsaJ6ankhP1RpoZqa BoD1NPU0EUiamjTIKfpU/aqe1Mnqm9DE0gjJoAA0GjRoB6QRSEATQARiGhSfkp7U9U9Twpppo0AA 0aaBolXuGS73/VrPnvs/BnPQPsuv3bVh0ImZpWK2N7Km51IAzh3xgbFjM+0+0/sfEuP8jGmjU1dA 8tOJPf8Nf+3O3errzeLKHDaPw2imKCtyfld82Gn/b67n0+KdfeQmIjPCjjrkpbHAl0j4dU9squPV fTjdpO7QSHhBQ9/TlNW/Tnm4xuuz7nBN4bd2g7o3tYDcrJ4TPDVe3KpJIzoMJRCyufOJs0yNLMlr ZGcgCLah83h5G58vbOcg93squxStueq673dXERblNZCjWHQG0p7C+MlSxT9hrW/9HgIsBtAYhjBs bBsbQ2khsJ/L8PigWjHHhyY5IsoG0xpsOPGlE3zmjGJboIpIJdGrCUzM92rfDF2s763arYni0AkX sHF0yshhC86XWLPIxGjRE2tCcIMji1jKGmlXTTdxe4TaBuIhqYeVK1r0qLSVkjNFsaVo5iaRXKjm WGWES8xWDFkOWY5spxwp8UdXV8FwWvp8x6F6Fs0bz61+i+zqKFtMTZG+CulDu6WPyHTqmglW06UY 1ollzdfkhv5o9W9hp7KSxViy5tXJODv9ETUfNW8+sJwDRHPteDn2JlUxdPLHveI8WCdPo7hPwgiM ypF5BnuRTVG723DXAXwv+XziL4odLZBvsIpTa7E0AOIavnX/VJYlgyYl9h0FL6lUEZztxm7iecHM YS3dTFwG7Ya2U3SVS4lK5YaLnz9jb7n7e6OtZz9JCjx3ayRbj3d/c8KGcW3DazxiHD8K5ofhGt7+ PpBGbNm9efH34kIPeySfUMMzdSTuE5EbPnNwGkIdp4t/KWnpxHrZYRVWu3L3def0H7+FQaL5/S6T P6t2Gv0Mg8GRUZYlwyFcJKmKvMnoI64EjHlywgSUBrEVrDq576JWaOEdfTW01tbHiI8GvBrcpMEz oaMwmgQWQcokcm0XsZNj58HwX6V8uTk9qUC3yPnDGyxXJpxp5XkMxueRzG69QzUOA2WUNkPkOcsT ccEv/Dd5Y5cTSVvoN7mup3ZBRFbdIaPMk1lik03E7qNgCThffByNg8gLRMuNeF//dSVDZCXKAfTX 0EOcS3Bj1Vp/Hz75RWwy+zDGwREBENwRFPAd7xXh0cvLyzorTzx03i5O1JBVqWqvzsu0WYYsbElX Jqh7IZ2D0n6Ub8AphSzCV4TFLE/LCZthRJM1O+ZlekEXVAQwApRyjMgYdskjQQpEWLIZJWCYr/c1 AABT7aADA29nhkSRsRINGS1FImyRBKGIWxlEMRpd5spECzysTDCC6JJcJKGkxpDaTmLltPyvLWwz CusQpkWHXKoSByRBSiqg6UanfgJExUZLKPqSgZG7XFDGOREsq5PmtNBrxNIUS/MiexepJXhoOtyX 70CavV3v/mvK8eGNiDmjPm1ZbLLbGqIhCjNqT1EMUEHa9yMjQlDgHJ1JO+StWQp94yyQKkzJkQdc ttvCptmCwMDEAje9gOzNvHFerGNETMWTm4WLMD9oW3XaNw/JRpiljeYWEYRzQ2sA/WJ8E69XPxo6 ke2V8JOk/z2ZztxaMknvFrMnPCI6cD3bCMXoCokWvUVSqmZiVbFA1kSOCa2s1SkaCVXqO8c7myrY lkpE7ii7JYb3VYJXPyTnXkFieXRJPngTeZwuxXLxF+ZduSSL8u2/thwiWXPMi/DTQWpNwvOaMdRG S3xvKD12L3nvPBA+Qx5+C4u275iLqj+mj9b+Lu/hXMXMQnS0rnm+lDQYviVT2Utg4mZ5iCNEASRk 4E+gA/bFjLNFQ6wtCDKqMHs4FtdRKhppLycIifLVVrlF7pIbEq81YdzWY56LOV5I0lZ5LdZuYcDp DFKdS3cbQnniSerRurcksXvIaCo7oltWUKuTeN6lTnjvSzKFSwpM2zOSkGaPJLTY1xpnxYmdD2br yzojU5byMgmgO3iPwXFz+435Wea56jNc0X50cxFRHTynJODQkgBZwGywwi9+RjTZMEI2uCgBG7JY 4GN843UVkoJKZQvGlBXVezhwyo7DBqYFiHmUU8wvfWqMVaTUjEa1Yd8b1dO+481G69klbnHrO/Mz RafJyxMZLMa1ig9O00K13eNCXMqeSzI26SbvgbjCsxK50p7Xlz5ZTampzrtk8nuNe/TwnEHIJu12 rB0bvAesIKk4MyPDcXEK2RZ6BczyTkos0V1Z6L+jnNnKmRcHf7dFO8YL887EBBKMHkNHVO7Q8kbR OFc5HpdbbSywImM17q83xa/N7jMxKJilzz1XDnzesLUML9ZchvSjiLX9xdOxgPoMPHVGn5y+ZBpb FcokiepvWMSjYLNIhpVDEhRmIcg4AwAMYR6FszBx8ixwbK6vSxvgZ0Kj21qYEvdI+E9hI3kdRHLs aJ6uehfXo3c0UMFDkeyVVtURK0lopc8AtfAtgPSmYtcV2F+0zGHWZ3IuLBk8LKyFE00kPHZOB03k tmIQ74hic2iy2vSxM5jMGf4rz8JP2kXbVmsWZg08BvemosGxNmOL3EY2HSUFrjkyLsAK+xEMRiim hig28ztZoNp7k1U0k3kmLi3orfnu992hzRlm7xJRqeOC4uKki/oksGVMUc6w0cVzFcn5NTJgmYMd F1E3gs9qoQ6l6JpEkiF4blhGO7RcSWNS4ns69YWK7k947CzHQOGwukMUdQ3BzHkhz/XfuS6+HQnX c7h6eKgUVWoSiQ5pDLlZUF2FNzAGtX+jXq/vORqwxJOzsXzoSLhx1njtxkl+Ik8KHTzbgrhOqGVj WqpQr3g2VuXV7bPYHQjHMJFYJOtSKAdDVzOVDhAAVL0B1pKUnOSnQeHKA+Gw9Id4WKQAx8yOViHi zx+mobOzZVNzIyxHknQIlc8miMqUnDlgK52HTle4C83MYHrYHhESIiyp7UBhCjjB3t1Ny9dk2WcJ BuZrIykDjxDqvciy8l4hmtkT2zOjWhCAxvvc8hHbVtfCqOtupcSF3GKUnoCxGrVHD+8jE7BDa9cT A6jiu3GeeDr3WMSOosHak9emGxsuOmzhnZEjzNc9Qz40xk0ccDCJgbi3pBuwqkKl5lF+e5QsYF5H DQ4ucRyNGKL2ryXZVVOWW3FHxc/CFoSc6WVGdAYuTLkKjwunqSSHLgiGsdi0BKWts/BbWxn3etaa 7OIIxOm6gymsnT3MzfGEflMPk78rkV9VOUa4ogu40jBjVQO9/DdOHVXgKfpigUIC4rm5xCpa4wKs jczgpt1mDvh8Xu7Ny261MrJPdnNOIyXYZNq7+SU2iyulWZKiasJqoOocpFC4FxbRRGE4C5FWuMCW mQC1ptA74iuJFAItSBMWICigBGCxhpItAmK4vrwO4XWzS13Uj0nNug/E7y5YuYebwAGjLyfDH1/Z hoygVxQ021phttsgGobPUDYMY0lD1mfUQelHggbp7R7V4W/AWct7NAqcrNmAnjWEiXDrdanznt7r 3udEH/F47DEH4NT/f+BkK7Eyn15t1OdkREEBCEDCkRDH71KUSP1F1CsMUmF6WNDGh9mBJ+4ZYvT3 juG2wxf7ga3UhBlJOgvrCr2w3mfufUSKipX6yyzHAYcpZcvjE5GNgvSoM4qmcYVVl9bgwQdJ2v66 PTFle3IsrmMYosG3gnJwc27kXPMwZlN7gNEZ/EFIH1DGz6IcaRWUMnFZYFx3osp5E0caLEkGOoTA De4YG10I4LGxnW7ZHAWYmsEMSeW5qcg0L5J6wenyYL1kWDmEwnEO8T1cDS1RrcRChxp3laJF5Izv XBtJ6pZXFLVDnsiIwHE3rEEi7ZhYlqYySIT/R642vBb8RannjfBdqKTx6g+8Bh7DtR9AhkIR/RlE j3imiSqFUlUCGiIQ0EAk6wQIGmyO2UI9w45yCAPf+v9/4H4n32AD4H3eNv5W+BrOyN7P4PLb+Ebz 9i9NNNr2ao6sEtAHYfSFYn83G31DfoXp6ahMuNZl/K1UTXmLtllbZku+9oYXYYc3rTR2waRYUfsu C/YkVICrcvzl4z0++ZcwjWKvumFKF/r6E9NC+BY/33y3Lx5jdj8Uby+ItlKIlKaUNkWd4oST7AuW WCXt+BoO8qVSrgcGxaMqTAqGDWUpYX51JmWnPU2dzhjpkBjNOHBI0HTILGu35UkEY+faXazFJe7b OJ7D7NR3zepj34HyjLEpaD+f3CsypXAkUvfdTG7rEkYnowMLjKwUyOuYxORJcB2wvwNSAvU/4ULy 0NSR3iKHJJnVBrHLiDMpngOtdsEVudRAyHns0GZrabSIoihkycj39Yy4xO7Y57TiSscDhjur3FRi ES8kaPc9dHnVYTNDLkV5og3xiSOEioxvoszbvbtIkcF0KefTZZo9rMireAnoANX69AAbRsqHOeVh AkQhRUSLRnpEUxFJOA6nfDZ8vk44I6FHV1JauAPMtWiUExsH7XQiEnGjh0qDB3laDbqwpFNtua55 yCYmpVsRy7IZSlm3DiKGnKkBJQTsMxkEibAbaYhUlBl1YaQ5lQZRChF0JHlXgXj+lYVWmvIWZlHm uuB6xyYwSMgr8z7sKQ62R8/YaDj0PV52bwCWbIdArpocc3zoHJ4pQMk/AG8mNbifFbQk6k7TR4RV OeUE9cQ0jkVug9VJgqyzvWNTqsKYNXDorAEpIRoTmGIA8RYpzNNfHl1+f255ZbrA82Bh65BiQMD4 QuINnFjTDf72nhrs1NqQIfJjyYMdPTuOJG0l8vr5ePUjcdDQbSCeG3kEdIipufO2DIYDbTgyDy0T SLBCapgTTUcuDzjbWad+JSivM8w7ru07ogwy2vE4IZ65nYvnfEc08iusTu+AceXgTJHnFp6HYW7P FkWnSJjhyPi0ijsXYjUGoLcQp235ssuaoWarS89cY38OOq7Z9o2Cc9uo10CIJeXYG5WOnaQwDUMI JAkJbAhIUqwlO6b38B4zZP1vsj9qc0AKxfb8Pn+bUNcfHxljlqsoJn9RjnuFtXbCSGJJjXVpGj4n 5vyxNKez6+4KXabVGFLAXJFe5eDIFqyqOlEC4c75R5B2CcDSdLvfIVVHEqowo9J2D6lVXKGfsudx mg7YYZjvXbU0vrzmRgMgsP+bmQ7Lp8/bUv20LyhYscvT3XlEZky4OACZyAN7XVdohnqOIh3AgIp1 4ChjibOEaiFfY6UoxUmlmPkTMlS+MdUJrekOzaeam3kESDI8izBamQEQoESDQrlXRECIsUPcna6L V54WgSTTBnZVTVKtKuZ0mTCqdEA2MG5VyIAJQWADrNKO/ltywlftqQI+xjOW+nMHvLNhaoAKKcg6 1ZhwSmOy1v7+5hEPGlSd0h7xjg8VdbWB0aTdWbjSUDdFRCG3MnngACfSMHoD8yZRCQC2egTG4d59 3lWAcagfaHJe8+oL3x3/i2op1eQYI6XB09gu8ehM+YyJGSpGPShemzHpxyJ8r/fZoTTQDGqXqOga D6AZnJ15nMCxt950G68NViVZ2LAW8aDBVAJqIA4yQwObcHWPWYABfUmgTjXyXP1LqogSb04pLEPA Op5JW7nsWvepageCIFDuJ6TJmNrwDQSwj32LR0VmCl/gpb1qmxPEnDS9etvcdXfmpCREpN4DQRoP bMHqgfIhKxSpu0ql71Rzdhn2xGaFIlKILFRIEyIUNkW7Q1hqCa+I72Q+L2OHnzPUrhIYAiDcbhrH qF/OA0BW8M713cyIna73Q6GocXHwmtHb1IGhuEzh2C6QY4jLwQMdeQyCj7cMc4RiNhgAPTxTw0Bk mvzNhgB1+4k6dIpZKb1GOjTqmYBtjpgdROk6Qk/CryTzNQlBKMSHKJK8IAtGAIoQyAapEp+w7FkN SvBlUrWkZDVI/dQDwrL9KV+jhSqiaRiSF7IIVghVYYEIIFLrViYhZo45agjygo1gXr2rnOy1Ljl7 W19+6T1ea+VmW472/iPUD/hIAAwruUBltgVkT0jJnCEln3zY5Jj6dgE56h5voVEhFkdEI+qdOEhC /H0cyeLYgc+0xB2qZQr5xyogV+u6jDQcih2txuQLmy7sGBIFIrGQFpwgA9wUwvdsLQeKRrmhZ7jW nud2WX0ekOzs7nGHn8XkxcVn60aAyx0Cyoi4pqvDUsa1IvDGtj2rlsmTTotMyvDwCEYUVHkSu29i vNG4YI5HdoIkeffMJgXOlK/hauwJqia4RbLB27F9UrPhcq7zjc3+55BWFoaCrUZX56tXAZdxeqEZ uidB9RoAUPWuQiGUg8GaufMb/t5bE1Bej4SwDl8bz16ZoGovC1OndYmhzERAxeGujd+RK6xDzLcV 5trsbRaTrZQVKO1JlfNS+Fwh+J7IuimxLqTB6miYiIDFBEarfRMXMmStcCbfnNb0yNp6DtQwgTIQ wgGRAQQmQDIgPFDsfWXTeuIiIiCICIDsEvfHSpbn2Dj/wwOQLeIgtx4hyMbBsGxsGzLUZINozXBB GYVNb5iuFKYq4lKahWNqpaLg6JME4WQGUYA3mqVhaEKlVIhqT0FW97AhdaB4zLdm6s8eWvIDpSA+ 6P7StwO4XUIaWTaIAnwVFRc9RtpKSsqG+UiN7z3AfSHELW50DkEzhRVJZChEJRtBDssYAhKucKil UlxBiKqmyzBzbCsnooCTHcFuMCEKt6egknVAdbvrGqA8xkntXoD2YHJsr+FHAKbkWzaIdyIG+/5B bYVkBlIUvEw21iZkD8Dyqe635J9W1WwxDUKvsYEufwgESQcPNauZXrPPlS6xWImXWDndYmwieN0w OSwzhVmYmEBZ1pxuKKbgcbIOaNdrnQLyFaDcCuIhmzJfZ8rpBaiB4DpsBalPjZqcOIAGdq2POWRw t51w7U0vEzYwgN76YvybeTrPozuOaR18d9xmXadqUUcITkM0gZjMADuZoeSb32NDi6lNT7VKABk5 059BIqVyIzWhBgOiUFZEgspQFlYpANOrt8bO//i7kinChIXP/RAA --===============0963431255==--