blob: b55369507a14fe9eb30e99f4b134b3b3da772001 [file] [log] [blame]
<!DOCTYPE HTML>
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc (11.0.8) on Thu Oct 22 13:32:16 CDT 2020 -->
<title>CertificateValidator (Jetty :: Javadoc Build 10.0.0.beta3 API)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="dc.created" content="2020-10-22">
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../../../../jquery/jquery-ui.css" title="Style">
<script type="text/javascript" src="../../../../../script.js"></script>
<script type="text/javascript" src="../../../../../jquery/jszip/dist/jszip.min.js"></script>
<script type="text/javascript" src="../../../../../jquery/jszip-utils/dist/jszip-utils.min.js"></script>
<!--[if IE]>
<script type="text/javascript" src="../../../../../jquery/jszip-utils/dist/jszip-utils-ie.min.js"></script>
<![endif]-->
<script type="text/javascript" src="../../../../../jquery/jquery-3.3.1.js"></script>
<script type="text/javascript" src="../../../../../jquery/jquery-migrate-3.0.1.js"></script>
<script type="text/javascript" src="../../../../../jquery/jquery-ui.js"></script>
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="CertificateValidator (Jetty :: Javadoc Build 10.0.0.beta3 API)";
}
}
catch(err) {
}
//-->
var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
var tableTab = "tableTab";
var activeTableTab = "activeTableTab";
var pathtoroot = "../../../../../";
var useModuleDirectories = true;
loadScripts(document, 'script');</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<header role="banner">
<nav role="navigation">
<div class="fixedNav">
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a id="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
<a id="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../index.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="class-use/CertificateValidator.html">Use</a></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" id="allclasses_navbar_top">
<li><a href="../../../../../allclasses.html">All&nbsp;Classes</a></li>
</ul>
<ul class="navListSearch">
<li><label for="search">SEARCH:</label>
<input type="text" id="search" value="search" disabled="disabled">
<input type="reset" id="reset" value="reset" disabled="disabled">
</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>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&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><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a id="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
</div>
<div class="navPadding">&nbsp;</div>
<script type="text/javascript"><!--
$('.navPadding').css('padding-top', $('.fixedNav').css("height"));
//-->
</script>
</nav>
</header>
<!-- ======== START OF CLASS DATA ======== -->
<main role="main">
<div class="header">
<div class="subTitle"><span class="packageLabelInType">Package</span>&nbsp;<a href="package-summary.html">org.eclipse.jetty.util.security</a></div>
<h2 title="Class CertificateValidator" class="title">Class CertificateValidator</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
<li>java.lang.Object</li>
<li>
<ul class="inheritance">
<li>org.eclipse.jetty.util.security.CertificateValidator</li>
</ul>
</li>
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
<hr>
<pre>public class <span class="typeNameLabel">CertificateValidator</span>
extends java.lang.Object</pre>
<div class="block">Convenience class to handle validation of certificates, aliases and keystores
Allows specifying Certificate Revocation List (CRL), as well as enabling
CRL Distribution Points Protocol (CRLDP) certificate extension support,
and also enabling On-Line Certificate Status Protocol (OCSP) support.
IMPORTANT: at least one of the above mechanisms *MUST* be configured and
operational, otherwise certificate validation *WILL FAIL* unconditionally.</div>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="constructor.summary">
<!-- -->
</a>
<h3>Constructor Summary</h3>
<table class="memberSummary">
<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Constructor</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr class="altColor">
<th class="colConstructorName" scope="row"><code><span class="memberNameLink"><a href="#%3Cinit%3E(java.security.KeyStore,java.util.Collection)">CertificateValidator</a></span>&#8203;(java.security.KeyStore&nbsp;trustStore,
java.util.Collection&lt;? extends java.security.cert.CRL&gt;&nbsp;crls)</code></th>
<td class="colLast">
<div class="block">creates an instance of the certificate validator</div>
</td>
</tr>
</table>
</li>
</ul>
</section>
<!-- ========== METHOD SUMMARY =========== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="method.summary">
<!-- -->
</a>
<h3>Method Summary</h3>
<table class="memberSummary">
<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="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colSecond" scope="col">Method</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr id="i0" class="altColor">
<td class="colFirst"><code>java.util.Collection&lt;? extends java.security.cert.CRL&gt;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getCrls()">getCrls</a></span>()</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i1" class="rowColor">
<td class="colFirst"><code>int</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getMaxCertPathLength()">getMaxCertPathLength</a></span>()</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i2" class="altColor">
<td class="colFirst"><code>java.lang.String</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getOcspResponderURL()">getOcspResponderURL</a></span>()</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i3" class="rowColor">
<td class="colFirst"><code>java.security.KeyStore</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getTrustStore()">getTrustStore</a></span>()</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i4" class="altColor">
<td class="colFirst"><code>boolean</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#isEnableCRLDP()">isEnableCRLDP</a></span>()</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i5" class="rowColor">
<td class="colFirst"><code>boolean</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#isEnableOCSP()">isEnableOCSP</a></span>()</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i6" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setEnableCRLDP(boolean)">setEnableCRLDP</a></span>&#8203;(boolean&nbsp;enableCRLDP)</code></th>
<td class="colLast">
<div class="block">Enables CRL Distribution Points Support</div>
</td>
</tr>
<tr id="i7" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setEnableOCSP(boolean)">setEnableOCSP</a></span>&#8203;(boolean&nbsp;enableOCSP)</code></th>
<td class="colLast">
<div class="block">Enables On-Line Certificate Status Protocol support</div>
</td>
</tr>
<tr id="i8" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setMaxCertPathLength(int)">setMaxCertPathLength</a></span>&#8203;(int&nbsp;maxCertPathLength)</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i9" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#setOcspResponderURL(java.lang.String)">setOcspResponderURL</a></span>&#8203;(java.lang.String&nbsp;ocspResponderURL)</code></th>
<td class="colLast">
<div class="block">Set the location of the OCSP Responder.</div>
</td>
</tr>
<tr id="i10" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#validate(java.security.cert.Certificate%5B%5D)">validate</a></span>&#8203;(java.security.cert.Certificate[]&nbsp;certChain)</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i11" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#validate(java.security.KeyStore)">validate</a></span>&#8203;(java.security.KeyStore&nbsp;keyStore)</code></th>
<td class="colLast">
<div class="block">validates all aliases inside of a given keystore</div>
</td>
</tr>
<tr id="i12" class="altColor">
<td class="colFirst"><code>java.lang.String</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#validate(java.security.KeyStore,java.lang.String)">validate</a></span>&#8203;(java.security.KeyStore&nbsp;keyStore,
java.lang.String&nbsp;keyAlias)</code></th>
<td class="colLast">
<div class="block">validates a specific alias inside of the keystore being passed in</div>
</td>
</tr>
<tr id="i13" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#validate(java.security.KeyStore,java.security.cert.Certificate)">validate</a></span>&#8203;(java.security.KeyStore&nbsp;keyStore,
java.security.cert.Certificate&nbsp;cert)</code></th>
<td class="colLast">
<div class="block">validates a specific certificate inside of the keystore being passed in</div>
</td>
</tr>
</table>
<ul class="blockList">
<li class="blockList"><a id="methods.inherited.from.class.java.lang.Object">
<!-- -->
</a>
<h3>Methods inherited from class&nbsp;java.lang.Object</h3>
<code>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</code></li>
</ul>
</li>
</ul>
</section>
</li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="constructor.detail">
<!-- -->
</a>
<h3>Constructor Detail</h3>
<a id="&lt;init&gt;(java.security.KeyStore,java.util.Collection)">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>CertificateValidator</h4>
<pre>public&nbsp;CertificateValidator&#8203;(java.security.KeyStore&nbsp;trustStore,
java.util.Collection&lt;? extends java.security.cert.CRL&gt;&nbsp;crls)</pre>
<div class="block">creates an instance of the certificate validator</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>trustStore</code> - the truststore to use</dd>
<dd><code>crls</code> - the Certificate Revocation List to use</dd>
</dl>
</li>
</ul>
</li>
</ul>
</section>
<!-- ============ METHOD DETAIL ========== -->
<section role="region">
<ul class="blockList">
<li class="blockList"><a id="method.detail">
<!-- -->
</a>
<h3>Method Detail</h3>
<a id="validate(java.security.KeyStore)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>validate</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;validate&#8203;(java.security.KeyStore&nbsp;keyStore)
throws java.security.cert.CertificateException</pre>
<div class="block">validates all aliases inside of a given keystore</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>keyStore</code> - the keystore to validate</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code>java.security.cert.CertificateException</code> - if keystore error and unable to validate</dd>
</dl>
</li>
</ul>
<a id="validate(java.security.KeyStore,java.lang.String)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>validate</h4>
<pre class="methodSignature">public&nbsp;java.lang.String&nbsp;validate&#8203;(java.security.KeyStore&nbsp;keyStore,
java.lang.String&nbsp;keyAlias)
throws java.security.cert.CertificateException</pre>
<div class="block">validates a specific alias inside of the keystore being passed in</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>keyStore</code> - the keystore to validate</dd>
<dd><code>keyAlias</code> - the keyalias in the keystore to valid with</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the keyAlias if valid</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code>java.security.cert.CertificateException</code> - if keystore error and unable to validate</dd>
</dl>
</li>
</ul>
<a id="validate(java.security.KeyStore,java.security.cert.Certificate)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>validate</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;validate&#8203;(java.security.KeyStore&nbsp;keyStore,
java.security.cert.Certificate&nbsp;cert)
throws java.security.cert.CertificateException</pre>
<div class="block">validates a specific certificate inside of the keystore being passed in</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>keyStore</code> - the keystore to validate against</dd>
<dd><code>cert</code> - the certificate to validate</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code>java.security.cert.CertificateException</code> - if keystore error and unable to validate</dd>
</dl>
</li>
</ul>
<a id="validate(java.security.cert.Certificate[])">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>validate</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;validate&#8203;(java.security.cert.Certificate[]&nbsp;certChain)
throws java.security.cert.CertificateException</pre>
<dl>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code>java.security.cert.CertificateException</code></dd>
</dl>
</li>
</ul>
<a id="getTrustStore()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getTrustStore</h4>
<pre class="methodSignature">public&nbsp;java.security.KeyStore&nbsp;getTrustStore()</pre>
</li>
</ul>
<a id="getCrls()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getCrls</h4>
<pre class="methodSignature">public&nbsp;java.util.Collection&lt;? extends java.security.cert.CRL&gt;&nbsp;getCrls()</pre>
</li>
</ul>
<a id="getMaxCertPathLength()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getMaxCertPathLength</h4>
<pre class="methodSignature">public&nbsp;int&nbsp;getMaxCertPathLength()</pre>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>Maximum number of intermediate certificates in
the certification path (-1 for unlimited)</dd>
</dl>
</li>
</ul>
<a id="setMaxCertPathLength(int)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setMaxCertPathLength</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;setMaxCertPathLength&#8203;(int&nbsp;maxCertPathLength)</pre>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>maxCertPathLength</code> - maximum number of intermediate certificates in
the certification path (-1 for unlimited)</dd>
</dl>
</li>
</ul>
<a id="isEnableCRLDP()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>isEnableCRLDP</h4>
<pre class="methodSignature">public&nbsp;boolean&nbsp;isEnableCRLDP()</pre>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>true if CRL Distribution Points support is enabled</dd>
</dl>
</li>
</ul>
<a id="setEnableCRLDP(boolean)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setEnableCRLDP</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;setEnableCRLDP&#8203;(boolean&nbsp;enableCRLDP)</pre>
<div class="block">Enables CRL Distribution Points Support</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>enableCRLDP</code> - true - turn on, false - turns off</dd>
</dl>
</li>
</ul>
<a id="isEnableOCSP()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>isEnableOCSP</h4>
<pre class="methodSignature">public&nbsp;boolean&nbsp;isEnableOCSP()</pre>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>true if On-Line Certificate Status Protocol support is enabled</dd>
</dl>
</li>
</ul>
<a id="setEnableOCSP(boolean)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>setEnableOCSP</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;setEnableOCSP&#8203;(boolean&nbsp;enableOCSP)</pre>
<div class="block">Enables On-Line Certificate Status Protocol support</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>enableOCSP</code> - true - turn on, false - turn off</dd>
</dl>
</li>
</ul>
<a id="getOcspResponderURL()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getOcspResponderURL</h4>
<pre class="methodSignature">public&nbsp;java.lang.String&nbsp;getOcspResponderURL()</pre>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>Location of the OCSP Responder</dd>
</dl>
</li>
</ul>
<a id="setOcspResponderURL(java.lang.String)">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>setOcspResponderURL</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;setOcspResponderURL&#8203;(java.lang.String&nbsp;ocspResponderURL)</pre>
<div class="block">Set the location of the OCSP Responder.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>ocspResponderURL</code> - location of the OCSP Responder</dd>
</dl>
</li>
</ul>
</li>
</ul>
</section>
</li>
</ul>
</div>
</div>
</main>
<!-- ========= END OF CLASS DATA ========= -->
<footer role="contentinfo">
<nav role="navigation">
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a id="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
<a id="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../index.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="class-use/CertificateValidator.html">Use</a></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" id="allclasses_navbar_bottom">
<li><a href="../../../../../allclasses.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>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&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><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a id="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</nav>
<p class="legalCopy"><small>Copyright &#169; 1995&#x2013;2020 <a href="https://webtide.com">Webtide</a>. All rights reserved.</small></p>
</footer>
</body>
</html>