blob: 84db53f72c2527d77d1124f2d037ae5510d8114c [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage -->
<html lang="en">
<head>
<title>TopicConnection</title>
<link rel="stylesheet" type="text/css" href="../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../script.js"></script>
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="TopicConnection";
}
}
catch(err) {
}
//-->
var methods = {"i0":6,"i1":6,"i2":6};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
var tableTab = "tableTab";
var activeTableTab = "activeTableTab";
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
<a name="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../index-all.html">Index</a></li>
<li><a href="../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li><a href="../../javax/jms/Topic.html" title="interface in javax.jms"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
<li><a href="../../javax/jms/TopicConnectionFactory.html" title="interface in javax.jms"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../index.html?javax/jms/TopicConnection.html" target="_top">Frames</a></li>
<li><a href="TopicConnection.html" target="_top">No&nbsp;Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../allclasses-noframe.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a name="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
<div class="subTitle">javax.jms</div>
<h2 title="Interface TopicConnection" class="title">Interface TopicConnection</h2>
</div>
<div class="contentContainer">
<div class="description">
<ul class="blockList">
<li class="blockList">
<dl>
<dt>All Superinterfaces:</dt>
<dd>java.lang.AutoCloseable, <a href="../../javax/jms/Connection.html" title="interface in javax.jms">Connection</a></dd>
</dl>
<dl>
<dt>All Known Subinterfaces:</dt>
<dd><a href="../../javax/jms/XATopicConnection.html" title="interface in javax.jms">XATopicConnection</a></dd>
</dl>
<dl>
<dt>All Known Implementing Classes:</dt>
<dd><a href="../../org/apache/openejb/resource/activemq/jms2/TomEEManagedConnectionProxy.html" title="class in org.apache.openejb.resource.activemq.jms2">TomEEManagedConnectionProxy</a></dd>
</dl>
<hr>
<br>
<pre>public interface <span class="typeNameLabel">TopicConnection</span>
extends <a href="../../javax/jms/Connection.html" title="interface in javax.jms">Connection</a></pre>
<div class="block">A <code>TopicConnection</code> object is an active connection to a publish/subscribe JMS provider. A client uses a
<code>TopicConnection</code> object to create one or more <code>TopicSession</code> objects for producing and consuming
messages.
<p>
A <code>TopicConnection</code> can be used to create a <code>TopicSession</code>, from which specialized topic-related objects
can be created. A more general, and recommended approach is to use the <code>Connection</code> object.
<p>
The <code>TopicConnection</code> object should be used to support existing code.</div>
<dl>
<dt><span class="simpleTagLabel">Since:</span></dt>
<dd>JMS 1.0</dd>
<dt><span class="seeLabel">See Also:</span></dt>
<dd><a href="../../javax/jms/Connection.html" title="interface in javax.jms"><code>Connection</code></a>,
<a href="../../javax/jms/ConnectionFactory.html" title="interface in javax.jms"><code>ConnectionFactory</code></a>,
<a href="../../javax/jms/TopicConnectionFactory.html" title="interface in javax.jms"><code>TopicConnectionFactory</code></a></dd>
</dl>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- ========== METHOD SUMMARY =========== -->
<ul class="blockList">
<li class="blockList"><a name="method.summary">
<!-- -->
</a>
<h3>Method Summary</h3>
<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t3" class="tableTab"><span><a href="javascript:show(4);">Abstract Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colLast" scope="col">Method and Description</th>
</tr>
<tr id="i0" class="altColor">
<td class="colFirst"><code><a href="../../javax/jms/ConnectionConsumer.html" title="interface in javax.jms">ConnectionConsumer</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../javax/jms/TopicConnection.html#createConnectionConsumer-javax.jms.Topic-java.lang.String-javax.jms.ServerSessionPool-int-">createConnectionConsumer</a></span>(<a href="../../javax/jms/Topic.html" title="interface in javax.jms">Topic</a>&nbsp;topic,
java.lang.String&nbsp;messageSelector,
<a href="../../javax/jms/ServerSessionPool.html" title="interface in javax.jms">ServerSessionPool</a>&nbsp;sessionPool,
int&nbsp;maxMessages)</code>
<div class="block">Creates a connection consumer for this connection (optional operation).</div>
</td>
</tr>
<tr id="i1" class="rowColor">
<td class="colFirst"><code><a href="../../javax/jms/ConnectionConsumer.html" title="interface in javax.jms">ConnectionConsumer</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../javax/jms/TopicConnection.html#createDurableConnectionConsumer-javax.jms.Topic-java.lang.String-java.lang.String-javax.jms.ServerSessionPool-int-">createDurableConnectionConsumer</a></span>(<a href="../../javax/jms/Topic.html" title="interface in javax.jms">Topic</a>&nbsp;topic,
java.lang.String&nbsp;subscriptionName,
java.lang.String&nbsp;messageSelector,
<a href="../../javax/jms/ServerSessionPool.html" title="interface in javax.jms">ServerSessionPool</a>&nbsp;sessionPool,
int&nbsp;maxMessages)</code>
<div class="block">Create a durable connection consumer for this connection (optional operation).</div>
</td>
</tr>
<tr id="i2" class="altColor">
<td class="colFirst"><code><a href="../../javax/jms/TopicSession.html" title="interface in javax.jms">TopicSession</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../javax/jms/TopicConnection.html#createTopicSession-boolean-int-">createTopicSession</a></span>(boolean&nbsp;transacted,
int&nbsp;acknowledgeMode)</code>
<div class="block">Creates a <code>TopicSession</code> object, specifying <code>transacted</code> and <code>acknowledgeMode</code>.</div>
</td>
</tr>
</table>
<ul class="blockList">
<li class="blockList"><a name="methods.inherited.from.class.javax.jms.Connection">
<!-- -->
</a>
<h3>Methods inherited from interface&nbsp;javax.jms.<a href="../../javax/jms/Connection.html" title="interface in javax.jms">Connection</a></h3>
<code><a href="../../javax/jms/Connection.html#close--">close</a>, <a href="../../javax/jms/Connection.html#createConnectionConsumer-javax.jms.Destination-java.lang.String-javax.jms.ServerSessionPool-int-">createConnectionConsumer</a>, <a href="../../javax/jms/Connection.html#createSession--">createSession</a>, <a href="../../javax/jms/Connection.html#createSession-boolean-int-">createSession</a>, <a href="../../javax/jms/Connection.html#createSession-int-">createSession</a>, <a href="../../javax/jms/Connection.html#createSharedConnectionConsumer-javax.jms.Topic-java.lang.String-java.lang.String-javax.jms.ServerSessionPool-int-">createSharedConnectionConsumer</a>, <a href="../../javax/jms/Connection.html#createSharedDurableConnectionConsumer-javax.jms.Topic-java.lang.String-java.lang.String-javax.jms.ServerSessionPool-int-">createSharedDurableConnectionConsumer</a>, <a href="../../javax/jms/Connection.html#getClientID--">getClientID</a>, <a href="../../javax/jms/Connection.html#getExceptionListener--">getExceptionListener</a>, <a href="../../javax/jms/Connection.html#getMetaData--">getMetaData</a>, <a href="../../javax/jms/Connection.html#setClientID-java.lang.String-">setClientID</a>, <a href="../../javax/jms/Connection.html#setExceptionListener-javax.jms.ExceptionListener-">setExceptionListener</a>, <a href="../../javax/jms/Connection.html#start--">start</a>, <a href="../../javax/jms/Connection.html#stop--">stop</a></code></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ============ METHOD DETAIL ========== -->
<ul class="blockList">
<li class="blockList"><a name="method.detail">
<!-- -->
</a>
<h3>Method Detail</h3>
<a name="createTopicSession-boolean-int-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>createTopicSession</h4>
<pre><a href="../../javax/jms/TopicSession.html" title="interface in javax.jms">TopicSession</a>&nbsp;createTopicSession(boolean&nbsp;transacted,
int&nbsp;acknowledgeMode)
throws <a href="../../javax/jms/JMSException.html" title="class in javax.jms">JMSException</a></pre>
<div class="block">Creates a <code>TopicSession</code> object, specifying <code>transacted</code> and <code>acknowledgeMode</code>.
<p>
The effect of setting the <code>transacted</code> and <code>acknowledgeMode</code> arguments depends on whether this method is
called in a Java SE environment, in the Java EE application client container, or in the Java EE web or EJB container.
If this method is called in the Java EE web or EJB container then the effect of setting the transacted} and
<code>acknowledgeMode</code> arguments also depends on whether or not there is an active JTA transaction in progress.
<p>
In a <b>Java SE environment</b> or in <b>the Java EE application client container</b>:
<ul>
<li>If <code>transacted</code> is set to <code>true</code> then the session will use a local transaction which may subsequently
be committed or rolled back by calling the session's <code>commit</code> or <code>rollback</code> methods. The argument
<code>acknowledgeMode</code> is ignored.
<li>If <code>transacted</code> is set to <code>false</code> then the session will be non-transacted. In this case the argument
<code>acknowledgeMode</code> is used to specify how messages received by this session will be acknowledged. The permitted
values are <code>Session.CLIENT_ACKNOWLEDGE</code>, <code>Session.AUTO_ACKNOWLEDGE</code> and
<code>Session.DUPS_OK_ACKNOWLEDGE</code>. For a definition of the meaning of these acknowledgement modes see the links
below.
</ul>
<p>
In a <b>Java EE web or EJB container, when there is an active JTA transaction in progress</b>:
<ul>
<li>Both arguments <code>transacted</code> and <code>acknowledgeMode</code> are ignored. The session will participate in the
JTA transaction and will be committed or rolled back when that transaction is committed or rolled back, not by
calling the session's <code>commit</code> or <code>rollback</code> methods. Since both arguments are ignored, developers are
recommended to use <code>createSession()</code>, which has no arguments, instead of this method.
</ul>
<p>
In the <b>Java EE web or EJB container, when there is no active JTA transaction in progress</b>:
<ul>
<li>If <code>transacted</code> is set to false and <code>acknowledgeMode</code> is set to <code>JMSContext.AUTO_ACKNOWLEDGE</code>
or <code>Session.DUPS_OK_ACKNOWLEDGE</code> then the session will be non-transacted and messages will be acknowledged
according to the value of <code>acknowledgeMode</code>.
<li>If <code>transacted</code> is set to false and <code>acknowledgeMode</code> is set to <code>JMSContext.CLIENT_ACKNOWLEDGE</code>
then the JMS provider is recommended to ignore the specified parameters and instead provide a non-transacted,
auto-acknowledged session. However the JMS provider may alternatively provide a non-transacted session with client
acknowledgement.
<li>If <code>transacted</code> is set to true, then the JMS provider is recommended to ignore the specified parameters and
instead provide a non-transacted, auto-acknowledged session. However the JMS provider may alternatively provide a
local transacted session.
<li>Applications are recommended to set <code>transacted</code> to false and <code>acknowledgeMode</code> to
<code>JMSContext.AUTO_ACKNOWLEDGE</code> or <code>Session.DUPS_OK_ACKNOWLEDGE</code> since since applications which set
<code>transacted</code> to false and set <code>acknowledgeMode</code> to <code>JMSContext.CLIENT_ACKNOWLEDGE</code>, or which set
<code>transacted</code> to true, may not be portable.
</ul>
<p>
Applications running in the Java EE web and EJB containers must not attempt to create more than one active (not
closed) <code>Session</code> object per connection. If this method is called in a Java EE web or EJB container when an
active <code>Session</code> object already exists for this connection then a <code>JMSException</code> may be thrown.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>transacted</code> - indicates whether the session will use a local transaction, except in the cases described above
when this value is ignored.</dd>
<dd><code>acknowledgeMode</code> - when transacted is false, indicates how messages received by the session will be acknowledged,
except in the cases described above when this value is ignored.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>a newly created <code>TopicSession</code></dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code><a href="../../javax/jms/JMSException.html" title="class in javax.jms">JMSException</a></code> - if the <code>TopicConnection</code> object fails to create a <code>TopicSession</code> due to
<ul>
<li>some internal error,
<li>lack of support for the specific transaction and acknowledgement mode, or
<li>because this method is being called in a Java EE web or EJB application and an active session already exists for
this connection.
</ul></dd>
<dt><span class="simpleTagLabel">Since:</span></dt>
<dd>JMS 1.1</dd>
<dt><span class="seeLabel">See Also:</span></dt>
<dd><a href="../../javax/jms/Session.html#AUTO_ACKNOWLEDGE"><code>Session.AUTO_ACKNOWLEDGE</code></a>,
<a href="../../javax/jms/Session.html#CLIENT_ACKNOWLEDGE"><code>Session.CLIENT_ACKNOWLEDGE</code></a>,
<a href="../../javax/jms/Session.html#DUPS_OK_ACKNOWLEDGE"><code>Session.DUPS_OK_ACKNOWLEDGE</code></a></dd>
</dl>
</li>
</ul>
<a name="createConnectionConsumer-javax.jms.Topic-java.lang.String-javax.jms.ServerSessionPool-int-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>createConnectionConsumer</h4>
<pre><a href="../../javax/jms/ConnectionConsumer.html" title="interface in javax.jms">ConnectionConsumer</a>&nbsp;createConnectionConsumer(<a href="../../javax/jms/Topic.html" title="interface in javax.jms">Topic</a>&nbsp;topic,
java.lang.String&nbsp;messageSelector,
<a href="../../javax/jms/ServerSessionPool.html" title="interface in javax.jms">ServerSessionPool</a>&nbsp;sessionPool,
int&nbsp;maxMessages)
throws <a href="../../javax/jms/JMSException.html" title="class in javax.jms">JMSException</a></pre>
<div class="block">Creates a connection consumer for this connection (optional operation). This is an expert facility not used by
regular JMS clients.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>topic</code> - the topic to access</dd>
<dd><code>messageSelector</code> - only messages with properties matching the message selector expression are delivered. A value
of null or an empty string indicates that there is no message selector for the message consumer.</dd>
<dd><code>sessionPool</code> - the server session pool to associate with this connection consumer</dd>
<dd><code>maxMessages</code> - the maximum number of messages that can be assigned to a server session at one time</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the connection consumer</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code><a href="../../javax/jms/JMSException.html" title="class in javax.jms">JMSException</a></code> - if the <code>TopicConnection</code> object fails to create a connection consumer due to some
internal error or invalid arguments for <code>sessionPool</code> and <code>messageSelector</code>.</dd>
<dd><code><a href="../../javax/jms/InvalidDestinationException.html" title="class in javax.jms">InvalidDestinationException</a></code> - if an invalid topic is specified.</dd>
<dd><code><a href="../../javax/jms/InvalidSelectorException.html" title="class in javax.jms">InvalidSelectorException</a></code> - if the message selector is invalid.</dd>
<dt><span class="seeLabel">See Also:</span></dt>
<dd><a href="../../javax/jms/ConnectionConsumer.html" title="interface in javax.jms"><code>ConnectionConsumer</code></a></dd>
</dl>
</li>
</ul>
<a name="createDurableConnectionConsumer-javax.jms.Topic-java.lang.String-java.lang.String-javax.jms.ServerSessionPool-int-">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>createDurableConnectionConsumer</h4>
<pre><a href="../../javax/jms/ConnectionConsumer.html" title="interface in javax.jms">ConnectionConsumer</a>&nbsp;createDurableConnectionConsumer(<a href="../../javax/jms/Topic.html" title="interface in javax.jms">Topic</a>&nbsp;topic,
java.lang.String&nbsp;subscriptionName,
java.lang.String&nbsp;messageSelector,
<a href="../../javax/jms/ServerSessionPool.html" title="interface in javax.jms">ServerSessionPool</a>&nbsp;sessionPool,
int&nbsp;maxMessages)
throws <a href="../../javax/jms/JMSException.html" title="class in javax.jms">JMSException</a></pre>
<div class="block">Create a durable connection consumer for this connection (optional operation). This is an expert facility not used by
regular JMS clients.</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../../javax/jms/Connection.html#createDurableConnectionConsumer-javax.jms.Topic-java.lang.String-java.lang.String-javax.jms.ServerSessionPool-int-">createDurableConnectionConsumer</a></code>&nbsp;in interface&nbsp;<code><a href="../../javax/jms/Connection.html" title="interface in javax.jms">Connection</a></code></dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>topic</code> - the topic to access</dd>
<dd><code>subscriptionName</code> - durable subscription name</dd>
<dd><code>messageSelector</code> - only messages with properties matching the message selector expression are delivered. A value
of null or an empty string indicates that there is no message selector for the message consumer.</dd>
<dd><code>sessionPool</code> - the server session pool to associate with this durable connection consumer</dd>
<dd><code>maxMessages</code> - the maximum number of messages that can be assigned to a server session at one time</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the durable connection consumer</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code><a href="../../javax/jms/JMSException.html" title="class in javax.jms">JMSException</a></code> - if the <code>TopicConnection</code> object fails to create a connection consumer due to some
internal error or invalid arguments for <code>sessionPool</code> and <code>messageSelector</code>.</dd>
<dd><code><a href="../../javax/jms/InvalidDestinationException.html" title="class in javax.jms">InvalidDestinationException</a></code> - if an invalid topic is specified.</dd>
<dd><code><a href="../../javax/jms/InvalidSelectorException.html" title="class in javax.jms">InvalidSelectorException</a></code> - if the message selector is invalid.</dd>
<dt><span class="seeLabel">See Also:</span></dt>
<dd><a href="../../javax/jms/ConnectionConsumer.html" title="interface in javax.jms"><code>ConnectionConsumer</code></a></dd>
</dl>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<!-- ========= END OF CLASS DATA ========= -->
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
<a name="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../index-all.html">Index</a></li>
<li><a href="../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li><a href="../../javax/jms/Topic.html" title="interface in javax.jms"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
<li><a href="../../javax/jms/TopicConnectionFactory.html" title="interface in javax.jms"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../index.html?javax/jms/TopicConnection.html" target="_top">Frames</a></li>
<li><a href="TopicConnection.html" target="_top">No&nbsp;Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../allclasses-noframe.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</body>
</html>