<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=us-ascii">
<META content="MSHTML 6.00.2900.3243" name=GENERATOR></HEAD>
<BODY>
<DIV><BR><FONT face=Arial size=2> ACE VERSION:
5.5.6</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2> HOST MACHINE and OPERATING
SYSTEM: i386, Linux 2.6.20-1.2933.fc6 </FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2> TARGET MACHINE and OPERATING
SYSTEM, if different from HOST:<SPAN class=426535114-26022008>
same.</SPAN></FONT></DIV>
<DIV><FONT face=Arial size=2><SPAN
class=426535114-26022008></SPAN><BR> COMPILER NAME AND VERSION
(AND PATCHLEVEL): gcc 4.1.1</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2> CONTENTS OF
$ACE_ROOT/ace/config.h: config-linux.h</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2> CONTENTS OF
$ACE_ROOT/include/makeinclude/platform_macros.GNU (unless<BR>
this isn't used in this case, e.g., with Microsoft Visual
C++):<BR> platform-linux.GNU<BR>
<BR> AREA/CLASS/EXAMPLE AFFECTED: <BR>
Message_Queue_T.cpp / ACE_Message_Queue<ACE_SYNCH_USE> /
enqueue_prio<BR> ( But I think
also:<BR> ::enqueue_head,
<BR>
::enqueue_deadline,<BR> ::enqueue_tail
)</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2> See
DESCRIPTION. </FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2> DOES THE PROBLEM
AFFECT:<BR> COMPILATION?
NO<BR>
LINKING?
NO<BR> EXECUTION?
YES<BR> OTHER (please specify)?
NO</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2> SYNOPSIS:<BR>
Application sometimes hangs when main Reactor gets more busy.
<BR> (e.g. due to significant increasing external
events)<BR> Coredump shows:<BR> 1) Main
Reactor thread is blocking to get the ACE_Message_Queue
lock.<BR> 2) Multiple threads block on
ACE_Select_Reactor_Notify-> which ends up
in<BR> ->ACE::send() ->
write().<BR> Result is deadlock. We have to kill the
application for shutdown.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2> I've read Sidebar17 of C++
Network Programming Volume 2 but our situation <BR> is
different from what is stated there (no notify called from handle_*
of<BR> event_handler<SPAN class=426535114-26022008> but
producer-consumer deadlock</SPAN>).</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><BR><FONT face=Arial size=2> DESCRIPTION:</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2> The application in
short.<BR> -------------------------<BR> The
part of our program where this deadlock appears is dealing with
<BR> processing messages from an embedded (CAN) network.
<BR> There is a thread per CAN message center (hardware
communication channel)<BR> which puts the received message
into ACE_Message_Queue's, depending on who<BR> wants to
observe the messages. These are the producer threads.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2> The message queues belongs to
observers who all have registered to get<BR> notified by one
Reactor which runs in one main Reactor thread (consumer).<BR>
(they also have registered themselves by the message center threads as
being<BR> interested in the messages).</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2> Problem
cause<BR> --------------<BR> What can happen
now is that the main Reactor, which is used for many other
<BR> things in our application, temporarily got other work
todo, and therefore<BR> the message center threads may fill up
the ACE_Select_Reactor notification<BR> PIPE. This causes the
message center threads (producers) to block on the <BR> (FULL)
PIPE write().</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2> The main Reactor thread
(consumer), when ready with the other work, wants to <BR>
proceed with handling the pending notifications, and so emptying the PIPE,
<BR> but cannot do this because the current notification code
also holds the <BR> message QUEUE lock! <BR>
<BR> See code description below:</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><BR><FONT face=Arial size=2> In
Message_Queue_T.cpp<BR>
======================<BR>
ACE_Message_Queue<ACE_SYNCH_USE>::enqueue_prio,<BR> (
But also the code reveals:<BR>
::enqueue_head, <BR>
::enqueue_deadline,<BR> ::enqueue_tail
)</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>-------------------------------<BR>DEADLOCK CODE:
(Above rev. 46096 until HEAD code)</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>template <ACE_SYNCH_DECL>
int<BR>ACE_Message_Queue<ACE_SYNCH_USE>::enqueue_prio (ACE_Message_Block
*new_item,<BR>
ACE_Time_Value *timeout)<BR>{<BR> ACE_TRACE
("ACE_Message_Queue<ACE_SYNCH_USE>::enqueue_prio");<BR> int
queue_count = 0;<BR> {<BR> ACE_GUARD_RETURN
(ACE_SYNCH_MUTEX_T, ace_mon, this->lock_, -1);</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2> if (this->state_ ==
ACE_Message_Queue_Base::DEACTIVATED)<BR>
{<BR> errno =
ESHUTDOWN;<BR> return
-1;<BR> }</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2> if (this->wait_not_full_cond
(ace_mon, timeout) == -1)<BR> return
-1;</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2> queue_count = this->enqueue_i
(new_item);</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2> if (queue_count ==
-1)<BR> return -1;</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2> this->notify ();
<<<< ERROR DEADLOCK (When blocking on notify in scope of
<BR>
buffer lock...)<BR> }<BR> return queue_count;<BR>}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><BR><FONT face=Arial size=2> In above code snippet:
<BR> this->notify (); Causes DEADLOCK when blocking on full
notification pipe.<BR> This happens because <notify()>
is now called within the scope of the <BR>
ACE_GUARD_RETURN.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2> In older versions of ACE, e.g.
5.3.1, the <notify()> was outside the scope<BR> of the
GUARD and we never had this deadlock.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2> In SUBVERSION ACE, I can see
this has been changed after revision<BR> r.46096 of
Message_Queue_T.cpp (ChangeLogTag:Sat Mar 22 11:58:12
2003)<BR> But I don't know why.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2> See Message_Queue_T.cpp
<BR> : enqueue_prio, enqueue_head,
enqueue_deadline, enqueue_tail</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>-------------------------------<BR>NON DEADLOCK
CODE (rev. 46096)<BR>
... <BR>
... <BR>
if (queue_count == -1)<BR> return -1;</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2> } // e.o. scope ACE_GUARD_RETURN for
queue lock.<BR> this->notify (); // NO deadlock here, notify will
unblock as soon PIPE is
<BR>
// emptied.<BR> return queue_count;<BR>}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><BR><FONT face=Arial size=2>-------------------------------<BR>Concerning
Coredump parts:</FONT></DIV>
<DIV><FONT face=Arial size=2><SPAN
class=426535114-26022008></SPAN></FONT> </DIV>
<DIV><FONT face=Arial size=2><SPAN class=426535114-26022008>[ consumer
]</SPAN></FONT></DIV>
<DIV><FONT face=Arial size=2>Thread 1 (process 16785):<BR>#0 0x009bc5d9 in
__lll_mutex_lock_wait () from /lib/libpthread.so.0<BR>#1 0x009b8636 in
_L_mutex_lock_85 () from /lib/libpthread.so.0<BR>#2 0x009b817d in
pthread_mutex_lock () from /lib/libpthread.so.0<BR>#3 0x00a9f922 in
ACE_OS::mutex_lock () from /usr/lib/libACE.so.5.5.6<BR>#4 0x00fd83c8 in
ACE_Message_Queue<ACE_MT_SYNCH>::is_empty ()<BR> from
/opt/lib/libgcp_datadump.so<BR>#5 0x0142d881 in
can::CCanSvcDriverObserver::handle_output ()<BR> from
/opt/lib/libcanResourceManager.so.2<BR>#6 0x00ac03f6 in
ACE_Select_Reactor_Notify::dispatch_notify ()<BR> from
/usr/lib/libACE.so.5.5.6<BR>#7 0x00ac057a in
ACE_Select_Reactor_Notify::handle_input ()<BR> from
/usr/lib/libACE.so.5.5.6<BR>#8 0x00ac14da in
ACE_Select_Reactor_Notify::dispatch_notifications ()<BR> from
/usr/lib/libACE.so.5.5.6<BR>#9 0x00a5ef8e in
ACE_Asynch_Pseudo_Task::ACE_Asynch_Pseudo_Task$base ()<BR> from
/usr/lib/libACE.so.5.5.6<BR>#10 0x00a5f5fd in
ACE_Asynch_Pseudo_Task::ACE_Asynch_Pseudo_Task$base ()<BR> from
/usr/lib/libACE.so.5.5.6<BR>#11 0x00a65b03 in ACE_OS::gettimeofday () from
/usr/lib/libACE.so.5.5.6<BR>#12 0x00abd0d3 in
ACE_Reactor::run_reactor_event_loop ()<BR> from
/usr/lib/libACE.so.5.5.6<BR>#13 0x0804ae36 in main ()</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2></FONT><BR><FONT face=Arial size=2>
<DIV><FONT face=Arial size=2><SPAN class=426535114-26022008>[ producer
]</SPAN></FONT></DIV>Thread 28 (process 17023):<BR>#0 0x009bc8f1 in write
() from /lib/libpthread.so.0<BR>#1 0x00a55a3a in ACE::send () from
/usr/lib/libACE.so.5.5.6<BR>#2 0x00ac082e in
ACE_Select_Reactor_Notify::notify ()<BR> from
/usr/lib/libACE.so.5.5.6<BR>#3 0x00a5edcc in
ACE_Asynch_Pseudo_Task::ACE_Asynch_Pseudo_Task$base ()<BR> from
/usr/lib/libACE.so.5.5.6<BR>#4 0x00abdce6 in ACE_Reactor::notify () from
/usr/lib/libACE.so.5.5.6<BR>#5 0x00abeace in
ACE_Reactor_Notification_Strategy::notify ()<BR> from
/usr/lib/libACE.so.5.5.6<BR>#6 0x0804b42a in
ACE_Message_Queue<ACE_MT_SYNCH>::notify ()<BR>#7 0x00fd7fa2 in
ACE_Message_Queue<ACE_MT_SYNCH>::enqueue_prio ()<BR> from
/opt/lib/libgcp_datadump.so<BR>#8 0x0142d6f3 in
can::CCanSvcDriverObserver::update ()<BR> from
/opt/lib/libcanResourceManager.so.2<BR>#9 0x0143078d in
can::CCanSvcDriver_Base::svc_Read ()<BR> from
/opt/lib/libcanResourceManager.so.2<BR>#10 0x0143087f in
can::CCanSvcDriverRemoteRequestImpl::svc ()<BR> from
/opt/lib/libcanResourceManager.so.2<BR>#11 0x00ad3026 in ACE_Task_Base::svc_run
() from /usr/lib/libACE.so.5.5.6<BR>#12 0x00ad39e8 in
ACE_Thread_Adapter::invoke_i ()<BR> from
/usr/lib/libACE.so.5.5.6<BR>#13 0x00ad3bb6 in ACE_Thread_Adapter::invoke () from
/usr/lib/libACE.so.5.5.6<BR>#14 0x00a67511 in ace_thread_adapter () from
/usr/lib/libACE.so.5.5.6<BR>#15 0x009b626a in start_thread () from
/lib/libpthread.so.0<BR>#16 0x92fff470 in ?? ()<BR>#17 0x92fff470 in ??
()<BR>#18 0x92fff470 in ?? ()<BR>#19 0x92fff470 in ?? ()<BR>#20 0x00000000 in ??
()</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>
<DIV><FONT face=Arial size=2><SPAN class=426535114-26022008>[ producer
]</SPAN></FONT></DIV>Thread 34 (process 17012):<BR>#0 0x009bc8f1 in write
() from /lib/libpthread.so.0<BR>#1 0x00a55a3a in ACE::send () from
/usr/lib/libACE.so.5.5.6<BR>#2 0x00ac082e in
ACE_Select_Reactor_Notify::notify ()<BR> from
/usr/lib/libACE.so.5.5.6<BR>#3 0x00a5edcc in
ACE_Asynch_Pseudo_Task::ACE_Asynch_Pseudo_Task$base ()<BR> from
/usr/lib/libACE.so.5.5.6<BR>#4 0x00abdce6 in ACE_Reactor::notify () from
/usr/lib/libACE.so.5.5.6<BR>#5 0x00abeace in
ACE_Reactor_Notification_Strategy::notify ()<BR> from
/usr/lib/libACE.so.5.5.6<BR>#6 0x0804b42a in
ACE_Message_Queue<ACE_MT_SYNCH>::notify ()<BR>#7 0x00fd7fa2 in
ACE_Message_Queue<ACE_MT_SYNCH>::enqueue_prio ()<BR> from
/opt/lib/libgcp_datadump.so<BR>#8 0x0142d6f3 in
can::CCanSvcDriverObserver::update ()<BR> from
/opt/lib/libcanResourceManager.so.2<BR>#9 0x0143062b in
can::CCanSvcDriver_Base::svc_Read ()<BR> from
/opt/lib/libcanResourceManager.so.2<BR>#10 0x014308cd in
can::CCanSvcDriverReadImpl::svc ()<BR> from
/opt/lib/libcanResourceManager.so.2<BR>#11 0x00ad3026 in ACE_Task_Base::svc_run
() from /usr/lib/libACE.so.5.5.6<BR>#12 0x00ad39e8 in
ACE_Thread_Adapter::invoke_i ()<BR> from
/usr/lib/libACE.so.5.5.6<BR>#13 0x00ad3bb6 in ACE_Thread_Adapter::invoke () from
/usr/lib/libACE.so.5.5.6<BR>#14 0x00a67511 in ace_thread_adapter () from
/usr/lib/libACE.so.5.5.6<BR>#15 0x009b626a in start_thread () from
/lib/libpthread.so.0<BR>#16 0x96bff470 in ?? ()<BR>#17 0x96bff470 in ??
()<BR>#18 0x96bff470 in ?? ()<BR>#19 0x96bff470 in ?? ()<BR>#20 0x00000000 in ??
()</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2>
<DIV><FONT face=Arial size=2><SPAN class=426535114-26022008>[ producer
]</SPAN></FONT></DIV>Thread 26 (process 17025):<BR>#0 0x009bc8f1 in write
() from /lib/libpthread.so.0<BR>#1 0x00a55a3a in ACE::send () from
/usr/lib/libACE.so.5.5.6<BR>#2 0x00ac082e in
ACE_Select_Reactor_Notify::notify ()<BR> from
/usr/lib/libACE.so.5.5.6<BR>#3 0x00a5edcc in
ACE_Asynch_Pseudo_Task::ACE_Asynch_Pseudo_Task$base ()<BR> from
/usr/lib/libACE.so.5.5.6<BR>#4 0x00abdce6 in ACE_Reactor::notify () from
/usr/lib/libACE.so.5.5.6<BR>#5 0x00abeace in
ACE_Reactor_Notification_Strategy::notify ()<BR> from
/usr/lib/libACE.so.5.5.6<BR>#6 0x0804b42a in
ACE_Message_Queue<ACE_MT_SYNCH>::notify ()<BR>#7 0x00fd7fa2 in
ACE_Message_Queue<ACE_MT_SYNCH>::enqueue_prio ()<BR> from
/opt/lib/libgcp_datadump.so<BR>#8 0x0142d6f3 in
can::CCanSvcDriverObserver::update ()<BR> from
/opt/lib/libcanResourceManager.so.2<BR>#9 0x0143078d in
can::CCanSvcDriver_Base::svc_Read ()<BR> from
/opt/lib/libcanResourceManager.so.2<BR>#10 0x0143087f in
can::CCanSvcDriverRemoteRequestImpl::svc ()<BR> from
/opt/lib/libcanResourceManager.so.2<BR>#11 0x00ad3026 in ACE_Task_Base::svc_run
() from /usr/lib/libACE.so.5.5.6<BR>#12 0x00ad39e8 in
ACE_Thread_Adapter::invoke_i ()<BR> from
/usr/lib/libACE.so.5.5.6<BR>#13 0x00ad3bb6 in ACE_Thread_Adapter::invoke () from
/usr/lib/libACE.so.5.5.6<BR>#14 0x00a67511 in ace_thread_adapter () from
/usr/lib/libACE.so.5.5.6<BR>#15 0x009b626a in start_thread () from
/lib/libpthread.so.0<BR>#16 0x91bff470 in ?? ()<BR>#17 0x91bff470 in ??
()<BR>#18 0x91bff470 in ?? ()<BR>#19 0x91bff470 in ?? ()<BR>#20 0x00000000 in ??
()</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><BR><FONT face=Arial size=2> REPEAT
BY:<BR> See description</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT face=Arial size=2> SAMPLE
FIX/WORKAROUND:<BR> Change ACE code so that
<this->notify();> is outside of GUARD scope<SPAN
class=426535114-26022008>?</SPAN><BR> (like it was before<SPAN
class=426535114-26022008> in rev. 46096</SPAN>).<BR></FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV><FONT><SPAN class=426535114-26022008><FONT face=Arial
size=2></FONT></SPAN></FONT> </DIV>
<DIV><FONT face=Arial size=2><SPAN class=426535114-26022008>[* end of PRF
*]</SPAN></FONT></DIV>
<DIV><FONT face=Arial size=2><SPAN
class=426535114-26022008></SPAN></FONT> </DIV>
<DIV><FONT><SPAN class=426535114-26022008><FONT face=Arial
size=2></FONT></SPAN></FONT> </DIV>
<DIV><FONT face=Arial size=2><SPAN class=426535114-26022008>Aside from this
deadlock problem:</SPAN></FONT></DIV>
<DIV><FONT><SPAN class=426535114-26022008>
<DIV><SPAN class=426535114-26022008><FONT face=Arial size=2>One thing what also
comes up now is that I have to look at the notification pipe</FONT></SPAN></DIV>
<DIV><SPAN class=426535114-26022008><FONT face=Arial size=2>buffer length too
when I want to increase the </FONT></SPAN><SPAN
class=426535114-26022008><FONT face=Arial size=2> ACE_Message_Queue
size?</FONT></SPAN></DIV>
<DIV><FONT face=Arial size=2><SPAN class=426535114-26022008>(enqueue will block
if notification pipe is full). </SPAN></FONT></DIV>
<DIV><FONT face=Arial size=2><SPAN class=426535114-26022008>Or, I have to
use #define ACE_HAS_REACTOR_NOTIFICATION_QUEUE and</SPAN></FONT></DIV>
<DIV><FONT face=Arial size=2><SPAN class=426535114-26022008>recompile
ACE?</SPAN></FONT></DIV>
<DIV><FONT face=Arial size=2></FONT> </DIV>
<DIV></SPAN></FONT><FONT><SPAN class=426535114-26022008><FONT face=Arial
size=2>Best regards,</FONT></SPAN></FONT></DIV></DIV>
<DIV><FONT><SPAN class=426535114-26022008><FONT face=Arial
size=2></FONT></SPAN></FONT> </DIV>
<DIV><FONT><SPAN class=426535114-26022008>
<DIV align=left><SPAN class=904435009-11112005><FONT face=Arial
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=904435009-11112005><SPAN class=904435009-11112005><SPAN
class=904435009-11112005><SPAN class=904435009-11112005><STRONG><FONT
face=Arial><FONT size=2><SPAN
class=426535114-26022008>Rudy</SPAN> Pot</FONT></FONT></STRONG></SPAN></DIV>
<DIV>
<DIV>
<DIV>
<DIV>
<DIV align=left>
<DIV><SPAN class=904435009-11112005><FONT face=Arial size=2>Embedded Computer
Systems</FONT></SPAN></DIV>
<DIV><SPAN class=904435009-11112005><FONT face=Arial
size=2></FONT></SPAN> </DIV>
<DIV><SPAN class=904435009-11112005><FONT face=Arial size=2><STRONG>AWETA
G&P b.v</STRONG></FONT></SPAN></DIV>
<DIV><SPAN class=904435009-11112005>
<DIV><FONT face=Arial size=2><SPAN class=203213811-11042007>Postbox
17</SPAN></FONT></DIV>
<DIV><FONT face=Arial size=2><SPAN class=203213811-11042007>NL-2630 AA
Nootdorp</SPAN></FONT></DIV></SPAN></DIV>
<DIV><SPAN class=904435009-11112005>
<DIV><SPAN class=904435009-11112005><FONT face=Arial size=2>tel +31 (0)15
3109961 </FONT>
<DIV><SPAN class=904435009-11112005><FONT face=Arial size=2>fax +31 (0)15
310<SPAN class=904435009-11112005>7321</SPAN> </FONT>
<DIV><SPAN class=904435009-11112005><FONT face=Arial size=2>mail </FONT><A
href="mailto:rpot@aweta.nl"><FONT face=Arial
size=2>rpot@aweta.nl</FONT></A></SPAN></DIV>
<DIV>
<DIV><FONT face=Arial><FONT size=2>w<SPAN class=248343315-01122005>eb <A
href="blocked::http://www.aweta.com">www.aweta.com</A></SPAN></FONT></FONT></DIV></SPAN></SPAN></SPAN></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV></SPAN></SPAN></SPAN></SPAN></DIV></FONT></BODY></HTML>