blob: e3bf9bbd1afa6ceed3113246ed45cf39f2659c14 [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>
<!-- Generated by javadoc (1.8.0_40) on Thu Jul 20 13:15:48 PDT 2017 -->
<title>ConfigStore (gobblin-config-core 0.11.0 API)</title>
<meta name="date" content="2017-07-20">
<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="ConfigStore (gobblin-config-core 0.11.0 API)";
}
}
catch(err) {
}
//-->
var methods = {"i0":6,"i1":6,"i2":6,"i3":6,"i4":6,"i5":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="../../../../gobblin/config/store/api/ConfigKeyPath.html" title="interface in gobblin.config.store.api"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
<li><a href="../../../../gobblin/config/store/api/ConfigStoreCreationException.html" title="class in gobblin.config.store.api"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../../../index.html?gobblin/config/store/api/ConfigStore.html" target="_top">Frames</a></li>
<li><a href="ConfigStore.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">gobblin.config.store.api</div>
<h2 title="Interface ConfigStore" class="title">Interface ConfigStore</h2>
</div>
<div class="contentContainer">
<div class="description">
<ul class="blockList">
<li class="blockList">
<dl>
<dt>All Known Subinterfaces:</dt>
<dd><a href="../../../../gobblin/config/store/api/ConfigStoreWithBatchFetches.html" title="interface in gobblin.config.store.api">ConfigStoreWithBatchFetches</a>, <a href="../../../../gobblin/config/store/api/ConfigStoreWithImportedBy.html" title="interface in gobblin.config.store.api">ConfigStoreWithImportedBy</a>, <a href="../../../../gobblin/config/store/api/ConfigStoreWithImportedByRecursively.html" title="interface in gobblin.config.store.api">ConfigStoreWithImportedByRecursively</a>, <a href="../../../../gobblin/config/store/api/ConfigStoreWithResolution.html" title="interface in gobblin.config.store.api">ConfigStoreWithResolution</a></dd>
</dl>
<dl>
<dt>All Known Implementing Classes:</dt>
<dd><a href="../../../../gobblin/config/store/hdfs/SimpleHadoopFilesystemConfigStore.html" title="class in gobblin.config.store.hdfs">SimpleHadoopFilesystemConfigStore</a></dd>
</dl>
<hr>
<br>
<pre><a href="http://linkedin.github.io/gobblin/javadoc/0.11.0/gobblin-api/gobblin/annotation/Alpha.html?is-external=true" title="class or interface in gobblin.annotation">@Alpha</a>
public interface <span class="typeNameLabel">ConfigStore</span></pre>
<div class="block">The ConfigStore interface used to describe a configuration store. A configuration store is a
responsible for:
<ul>
<li>Storing and fetching the values for configuration keys
<li>Storing and fetching the tags for configuration keys
<li>Maintaining different versions of the above mappings
</ul>
This API defines the minimum functionality that a store has to implement. There are also
a number of additional APIS (such as <a href="../../../../gobblin/config/store/api/ConfigStoreWithBatchFetches.html" title="interface in gobblin.config.store.api"><code>ConfigStoreWithBatchFetches</code></a>,
<a href="../../../../gobblin/config/store/api/ConfigStoreWithImportedBy.html" title="interface in gobblin.config.store.api"><code>ConfigStoreWithImportedBy</code></a>, <a href="../../../../gobblin/config/store/api/ConfigStoreWithImportedByRecursively.html" title="interface in gobblin.config.store.api"><code>ConfigStoreWithImportedByRecursively</code></a>,
<a href="../../../../gobblin/config/store/api/ConfigStoreWithResolution.html" title="interface in gobblin.config.store.api"><code>ConfigStoreWithResolution</code></a>, <a href="../../../../gobblin/config/store/api/ConfigStoreWithStableVersioning.html" title="annotation in gobblin.config.store.api"><code>ConfigStoreWithStableVersioning</code></a>) that denote that the
store supports additional operations efficiently and the config client library should delegate
those to the store rather than implementing those itself.</div>
</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="https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../gobblin/config/store/api/ConfigKeyPath.html" title="interface in gobblin.config.store.api">ConfigKeyPath</a>&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../gobblin/config/store/api/ConfigStore.html#getChildren-gobblin.config.store.api.ConfigKeyPath-java.lang.String-">getChildren</a></span>(<a href="../../../../gobblin/config/store/api/ConfigKeyPath.html" title="interface in gobblin.config.store.api">ConfigKeyPath</a>&nbsp;configKey,
<a href="https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;version)</code>
<div class="block">Obtains the direct children config keys for a given config key.</div>
</td>
</tr>
<tr id="i1" class="rowColor">
<td class="colFirst"><code><a href="https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../gobblin/config/store/api/ConfigStore.html#getCurrentVersion--">getCurrentVersion</a></span>()</code>&nbsp;</td>
</tr>
<tr id="i2" class="altColor">
<td class="colFirst"><code><a href="http://typesafehub.github.io/config/latest/api/com/typesafe/config/Config.html?is-external=true" title="class or interface in com.typesafe.config">Config</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../gobblin/config/store/api/ConfigStore.html#getOwnConfig-gobblin.config.store.api.ConfigKeyPath-java.lang.String-">getOwnConfig</a></span>(<a href="../../../../gobblin/config/store/api/ConfigKeyPath.html" title="interface in gobblin.config.store.api">ConfigKeyPath</a>&nbsp;configKey,
<a href="https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;version)</code>
<div class="block">Obtains the configuration properties directly associated with a given config keys.</div>
</td>
</tr>
<tr id="i3" class="rowColor">
<td class="colFirst"><code><a href="https://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../gobblin/config/store/api/ConfigKeyPath.html" title="interface in gobblin.config.store.api">ConfigKeyPath</a>&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../gobblin/config/store/api/ConfigStore.html#getOwnImports-gobblin.config.store.api.ConfigKeyPath-java.lang.String-">getOwnImports</a></span>(<a href="../../../../gobblin/config/store/api/ConfigKeyPath.html" title="interface in gobblin.config.store.api">ConfigKeyPath</a>&nbsp;configKey,
<a href="https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;version)</code>
<div class="block">Obtains the list of all config keys with which are given config key is tagged/annotated.</div>
</td>
</tr>
<tr id="i4" class="altColor">
<td class="colFirst"><code><a href="https://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../gobblin/config/store/api/ConfigKeyPath.html" title="interface in gobblin.config.store.api">ConfigKeyPath</a>&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../gobblin/config/store/api/ConfigStore.html#getOwnImports-gobblin.config.store.api.ConfigKeyPath-java.lang.String-com.google.common.base.Optional-">getOwnImports</a></span>(<a href="../../../../gobblin/config/store/api/ConfigKeyPath.html" title="interface in gobblin.config.store.api">ConfigKeyPath</a>&nbsp;configKey,
<a href="https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;version,
<a href="http://google.github.io/guava/releases/15.0/api/docs/com/google/common/base/Optional.html?is-external=true" title="class or interface in com.google.common.base">Optional</a>&lt;<a href="http://typesafehub.github.io/config/latest/api/com/typesafe/config/Config.html?is-external=true" title="class or interface in com.typesafe.config">Config</a>&gt;&nbsp;runtimeConfig)</code>&nbsp;</td>
</tr>
<tr id="i5" class="rowColor">
<td class="colFirst"><code><a href="https://docs.oracle.com/javase/7/docs/api/java/net/URI.html?is-external=true" title="class or interface in java.net">URI</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../gobblin/config/store/api/ConfigStore.html#getStoreURI--">getStoreURI</a></span>()</code>
<div class="block">Obtains the config store root URI.</div>
</td>
</tr>
</table>
</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="getCurrentVersion--">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getCurrentVersion</h4>
<pre><a href="https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;getCurrentVersion()</pre>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the current version for that configuration store.</dd>
</dl>
</li>
</ul>
<a name="getStoreURI--">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getStoreURI</h4>
<pre><a href="https://docs.oracle.com/javase/7/docs/api/java/net/URI.html?is-external=true" title="class or interface in java.net">URI</a>&nbsp;getStoreURI()</pre>
<div class="block">Obtains the config store root URI. This represents the logical location of the store.</div>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the configuration store root URI .</dd>
</dl>
</li>
</ul>
<a name="getChildren-gobblin.config.store.api.ConfigKeyPath-java.lang.String-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getChildren</h4>
<pre><a href="https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../gobblin/config/store/api/ConfigKeyPath.html" title="interface in gobblin.config.store.api">ConfigKeyPath</a>&gt;&nbsp;getChildren(<a href="../../../../gobblin/config/store/api/ConfigKeyPath.html" title="interface in gobblin.config.store.api">ConfigKeyPath</a>&nbsp;configKey,
<a href="https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;version)
throws <a href="../../../../gobblin/config/store/api/VersionDoesNotExistException.html" title="class in gobblin.config.store.api">VersionDoesNotExistException</a></pre>
<div class="block">Obtains the direct children config keys for a given config key. For example, the child
paths for /data/tracking may be /data/tracking/ImpressionEvent and /data/tracking/ClickEvent .
<p>Note that this method should not be used for "service discovery", i.e. it need not return
all possible child paths but only those defined in the store. For example, the configuration
for /data/tracking/ConversionEvent may be implicitly inherited from /data/tracking and
/data/tracking/ConversionEvent may not be returned by this method.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>configKey</code> - the config key path whose children are necessary.</dd>
<dd><code>version</code> - specify the configuration version in the configuration store.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the direct children config key paths</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code><a href="../../../../gobblin/config/store/api/VersionDoesNotExistException.html" title="class in gobblin.config.store.api">VersionDoesNotExistException</a></code> - if the requested config version does not exist (any longer)</dd>
</dl>
</li>
</ul>
<a name="getOwnImports-gobblin.config.store.api.ConfigKeyPath-java.lang.String-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getOwnImports</h4>
<pre><a href="https://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../gobblin/config/store/api/ConfigKeyPath.html" title="interface in gobblin.config.store.api">ConfigKeyPath</a>&gt;&nbsp;getOwnImports(<a href="../../../../gobblin/config/store/api/ConfigKeyPath.html" title="interface in gobblin.config.store.api">ConfigKeyPath</a>&nbsp;configKey,
<a href="https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;version)
throws <a href="../../../../gobblin/config/store/api/VersionDoesNotExistException.html" title="class in gobblin.config.store.api">VersionDoesNotExistException</a></pre>
<div class="block">Obtains the list of all config keys with which are given config key is tagged/annotated.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>configKey</code> - the config key path whose tags are needed</dd>
<dd><code>version</code> - the configuration version in the configuration store.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the paths of the directly imported config keys for the specified config key and
version. Note that order is significant the earlier ConfigKeyPath in the List will have higher priority
when resolving configuration conflicts.</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code><a href="../../../../gobblin/config/store/api/VersionDoesNotExistException.html" title="class in gobblin.config.store.api">VersionDoesNotExistException</a></code> - if the requested config version does not exist (any longer)</dd>
</dl>
</li>
</ul>
<a name="getOwnImports-gobblin.config.store.api.ConfigKeyPath-java.lang.String-com.google.common.base.Optional-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getOwnImports</h4>
<pre><a href="https://docs.oracle.com/javase/7/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../gobblin/config/store/api/ConfigKeyPath.html" title="interface in gobblin.config.store.api">ConfigKeyPath</a>&gt;&nbsp;getOwnImports(<a href="../../../../gobblin/config/store/api/ConfigKeyPath.html" title="interface in gobblin.config.store.api">ConfigKeyPath</a>&nbsp;configKey,
<a href="https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;version,
<a href="http://google.github.io/guava/releases/15.0/api/docs/com/google/common/base/Optional.html?is-external=true" title="class or interface in com.google.common.base">Optional</a>&lt;<a href="http://typesafehub.github.io/config/latest/api/com/typesafe/config/Config.html?is-external=true" title="class or interface in com.typesafe.config">Config</a>&gt;&nbsp;runtimeConfig)
throws <a href="../../../../gobblin/config/store/api/VersionDoesNotExistException.html" title="class in gobblin.config.store.api">VersionDoesNotExistException</a></pre>
<dl>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code><a href="../../../../gobblin/config/store/api/VersionDoesNotExistException.html" title="class in gobblin.config.store.api">VersionDoesNotExistException</a></code></dd>
</dl>
</li>
</ul>
<a name="getOwnConfig-gobblin.config.store.api.ConfigKeyPath-java.lang.String-">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>getOwnConfig</h4>
<pre><a href="http://typesafehub.github.io/config/latest/api/com/typesafe/config/Config.html?is-external=true" title="class or interface in com.typesafe.config">Config</a>&nbsp;getOwnConfig(<a href="../../../../gobblin/config/store/api/ConfigKeyPath.html" title="interface in gobblin.config.store.api">ConfigKeyPath</a>&nbsp;configKey,
<a href="https://docs.oracle.com/javase/7/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;version)
throws <a href="../../../../gobblin/config/store/api/VersionDoesNotExistException.html" title="class in gobblin.config.store.api">VersionDoesNotExistException</a></pre>
<div class="block">Obtains the configuration properties directly associated with a given config keys. These <b>
will not</b> include any properties/values which can be obtained from the ancestors or imported
config keys.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>configKey</code> - the config key path whose properties are needed.</dd>
<dd><code>version</code> - the configuration version in the configuration store.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the directly specified configuration in <a href="http://typesafehub.github.io/config/latest/api/com/typesafe/config/Config.html?is-external=true" title="class or interface in com.typesafe.config"><code>Config</code></a> format for input uri
against input configuration version</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code><a href="../../../../gobblin/config/store/api/VersionDoesNotExistException.html" title="class in gobblin.config.store.api">VersionDoesNotExistException</a></code> - if the requested config version does not exist (any longer)</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="../../../../gobblin/config/store/api/ConfigKeyPath.html" title="interface in gobblin.config.store.api"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
<li><a href="../../../../gobblin/config/store/api/ConfigStoreCreationException.html" title="class in gobblin.config.store.api"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
</ul>
<ul class="navList">
<li><a href="../../../../index.html?gobblin/config/store/api/ConfigStore.html" target="_top">Frames</a></li>
<li><a href="ConfigStore.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>