зеркало из https://github.com/mozilla/gecko-dev.git
473 строки
18 KiB
HTML
473 строки
18 KiB
HTML
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
|
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
|
<meta name="GENERATOR" content="Mozilla/4.72 [en] (WinNT; I) [Netscape]">
|
|
<meta name="Author" content="Jacob Rosenschein">
|
|
<meta name="Description" content="Release Notes for version 4.1 of the Directory SDK for Java">
|
|
<meta name="KeyWords" content="Java SDK, Directory SDK, LDAP SDK, SDK, LDAP, Directory, Netscape Directory, Netscape SDK, Java LDAP SDK">
|
|
<title>Directory SDK 4.1 for Java Source Code Release Notes</title>
|
|
</head>
|
|
<body text="#000000" bgcolor="#FFFFFF" link="#0000EE" vlink="#551A8B" alink="#FF0000">
|
|
|
|
<center>
|
|
<h2>
|
|
<font face="Arial,Helvetica">Directory SDK 4.1 for Java Source Code Release
|
|
Notes</font></h2></center>
|
|
|
|
<center>Last Updated May 06, 2000</center>
|
|
|
|
<p>These release notes contain information about:
|
|
<ul>
|
|
<li>
|
|
<a href="#new41">What's New in Version 4.1</a></li>
|
|
|
|
<li>
|
|
<a href="#fixed40">Bugs Fixed Since Version 4.0</a></li>
|
|
|
|
<li>
|
|
<a href="#new">What's New in Version 4.0</a></li>
|
|
|
|
<li>
|
|
<a href="#fixed305">Bugs Fixed Since Version 3.05</a></li>
|
|
|
|
<li>
|
|
<a href="#install">Downloading and Building the Source</a></li>
|
|
|
|
<li>
|
|
<a href="#update">Updating Java Classes in Netscape Communicator</a></li>
|
|
|
|
<li>
|
|
<a href="#report">Reporting Problems</a></li>
|
|
|
|
<li>
|
|
<a href="#newsgroup">Accessing the Directory Developers Newsgroup</a></li>
|
|
</ul>
|
|
For the latest documentation, see the <i><a href="http://developer.iplanet.com/docs/manuals/dirsdk/jsdk40/contents.htm" TARGET="_top">Netscape
|
|
Directory SDK 4.0 for Java Programmer's Guide</a></i>, which is available
|
|
on the iPlanet Developer Documentation site.
|
|
<p>Reference materials for the Directory SDK 4.x for Java are produced
|
|
using the Javadoc utility. They are available in the <tt>/dist/doc/</tt>
|
|
directory where you installed the SDK or online at:
|
|
<br><tt><a href="http://developer.iplanet.com/docs/manuals/dirsdk/jsdk40/Reference/index.html">http://developer.iplanet.com/docs/manuals/dirsdk/jsdk40/Reference/index.html</a>.</tt>
|
|
<p>If you only want the Directory SDK 4.x for Java (not the source code),
|
|
you can download it from the <a href="http://www.iplanet.com/downloads/developer/index.html">iPlanet
|
|
Developer Downloads</a> site.
|
|
<p>
|
|
<hr SIZE=1 NOSHADE WIDTH="100%">
|
|
<br><a NAME="new41"></a><b><font face="Arial,Helvetica"><font size=+1>What's
|
|
New in Version 4.1</font></font></b>
|
|
<p>The Directory SDK 4.1 for Java is a bug fix relase. Please check the
|
|
list of <a href="#fixed40">Bugs Fixed Since Version 4.0</a>. The following
|
|
new features have been added in this release:
|
|
<ul>
|
|
<li>
|
|
A new class, <tt>netscape.ldap.factory.JSSESocketFactory</tt>. It implements
|
|
the <tt>LDAPSocketFactory</tt> interface using the Java Secure Socket Extension
|
|
(JSSE) intefaces as the SSL provider. A JSSE implementation is not
|
|
packaged with the Directory SDK classes; you will need to have one in your
|
|
CLASSPATH to be able to use <tt>JSSESocketFactory</tt>. A reference
|
|
implementation of JSSE interfaces is available at <a href="http://java.sun.com/products/jsse/">http://java.sun.com/products/jsse/</a>.</li>
|
|
|
|
<li>
|
|
A new interface, <tt>netscape.ldap.LDAPTraceWriter,</tt> enables
|
|
logging of LDAP trace messages in environments where an <tt>OutputStream</tt>
|
|
cannot be used. The interface is meant primarily for integrating LDAP tracing
|
|
with the servlet log facility.</li>
|
|
|
|
<li>
|
|
A new method <tt>setConnectTimeout() </tt>has been added to <tt>LDAPConnection.
|
|
</tt>This
|
|
method allows you to limit the amount of time that application code
|
|
waits for <tt>LDAPConnection.connnect() </tt>to establish a connection.
|
|
By setting the connect timeout, an application can avoid blocking for a
|
|
long period of time when a Directory Server host is down or unreachable.</li>
|
|
|
|
<li>
|
|
All base classes in the <tt>netscape.ldap</tt> and <tt>netscape.ldap.util</tt>
|
|
package are now serializable.</li>
|
|
</ul>
|
|
|
|
<hr SIZE=1 NOSHADE WIDTH="100%">
|
|
<br><a NAME="fixed40"></a><b><font face="Arial,Helvetica"><font size=+1>Bugs
|
|
Fixed Since Version 4.0</font></font></b>
|
|
<p>The following bugs have been fixed since the release of the Directory
|
|
SDK 4.0 for Java. iPlanet bug numbers are shown in parentheses.
|
|
<ul>
|
|
<li>
|
|
Bugzilla <a href="http://bugzilla.mozilla.org/show_bug.cgi?id=28001">28001</a>:
|
|
Parsing in <tt>LDAPUrl(String url)</tt> ignores attributes if DN is empty.</li>
|
|
|
|
<li>
|
|
Bugzilla <a href="http://bugzilla.mozilla.org/show_bug.cgi?id=28005">28005</a>:
|
|
Exceptions thrown in <tt>connect()</tt> and <tt>disconnect()</tt>.</li>
|
|
|
|
<li>
|
|
Bugzilla <a href="http://bugzilla.mozilla.org/show_bug.cgi?id=13546">13546</a>:
|
|
<tt>JDAPFilterOpers</tt>
|
|
throws StringIndexOutOfBoundsException.</li>
|
|
|
|
<li>
|
|
Bugzilla <a href="http://bugzilla.mozilla.org/show_bug.cgi?id=16514">16514</a>:
|
|
<tt>LDAPAttributeSet.removeElementAt()</tt>
|
|
doesn't remove the attribute completely.</li>
|
|
|
|
<li>
|
|
Bugzilla <a href="http://bugzilla.mozilla.org/show_bug.cgi?id=34326">34326:</a><tt>
|
|
LDAPDN.unEscapeRDN()</tt> removes all /'s - not just the escape characters.</li>
|
|
|
|
<li>
|
|
Bugzilla <a href="http://bugzilla.mozilla.org/show_bug.cgi?id=29262">29262:</a><tt>
|
|
LDAPSearch</tt> doesn't apply base64-encoding to to nonprintable DNs.</li>
|
|
|
|
<li>
|
|
Wrong user DN supplied for referral on bind operation. (364869)</li>
|
|
|
|
<li>
|
|
4.0 LDAPMatchingRuleSchema not binary compatible with 3.x. (365423)</li>
|
|
|
|
<li>
|
|
LDAP JDK does not properly abandon operation. (341439)</li>
|
|
|
|
<li>
|
|
<tt>RDN.equals()</tt> assumes case-insensitivity, ignores multiple values.
|
|
(365574)</li>
|
|
|
|
<li>
|
|
<tt>authenticate()</tt> with bad password does not throw exception. (366578)</li>
|
|
|
|
<li>
|
|
Should provide DSML option for LDAPSearch. (368416)</li>
|
|
|
|
<li>
|
|
Incorrect signature for <tt>LDAPResponseListener.merge()</tt>. (364775)</li>
|
|
|
|
<li>
|
|
MS JVM throws <tt>LDAPSortControl</tt> runtime exception. (365574)</li>
|
|
|
|
<li>
|
|
Need new method <tt>LDAPDN.equals( String dn1, String dn2)</tt>. (365575)</li>
|
|
|
|
<li>
|
|
Some 3.x <tt>LDAPSchema</tt> public methods are protected in 4.x. (381574)</li>
|
|
|
|
<li>
|
|
Server using VLV for non-search operations - 'Critical extension unavailable'
|
|
error in log. (382605)</li>
|
|
|
|
<li>
|
|
<tt>LDAPSearchResults.getCount()</tt> returns wrong count. (355336)</li>
|
|
|
|
<li>
|
|
<tt>LDAPCache.cleanup()</tt> throws NullPointerException. (388736)</li>
|
|
|
|
<li>
|
|
<tt>LDAPConnection.read()</tt> doesn't return subentries (387722)</li>
|
|
|
|
<li>
|
|
LDAP SDK 4.0 causes NAS crash. (390128)</li>
|
|
|
|
<li>
|
|
NullPointerException in <tt>deleteThreadConnEntry()</tt>. (389228)</li>
|
|
|
|
<li>
|
|
<tt>LDAPSchema.getSyntaxes()</tt> missing (I-D conformance). (388463)</li>
|
|
|
|
<li>
|
|
SASL bugs found at CMU. (391585)</li>
|
|
|
|
<li>
|
|
<tt>LDAPCompareAttrNames</tt> not consistently case-sensitive. (390382)</li>
|
|
|
|
<li>
|
|
<tt>LDAPEntry</tt> throws a null exception when reading non existing attribute
|
|
(388577)</li>
|
|
|
|
<li>
|
|
NullPointerException with Malformed Filter. (390249)</li>
|
|
|
|
<li>
|
|
LDAP objects not really serializable. (356821)</li>
|
|
|
|
<li>
|
|
<tt>LDAPSearch -l</tt> option does not work correctly (393676)</li>
|
|
|
|
<li>
|
|
NullPointerException in <tt>LDAPSearch</tt> (387453)</li>
|
|
|
|
<li>
|
|
<tt>java-object-schema.conf</tt> is not packaged with SDK. (390154)</li>
|
|
|
|
<li>
|
|
JNDI SP: <tt>LdapContextImpl.reconnect(null)</tt> throw null pointer exceptions
|
|
(383788)</li>
|
|
</ul>
|
|
|
|
<hr SIZE=1 NOSHADE WIDTH="100%">
|
|
<p><a NAME="new"></a><b><font face="Arial,Helvetica"><font size=+1>What's
|
|
New in Version 4.0</font></font></b>
|
|
<p>The Directory SDK 4.0 for Java provides programmers with the tools to
|
|
develop directory-enabled software. This release includes:
|
|
<ul>
|
|
<li>
|
|
Application Program Interface (API) updates to match the newest LDAP (Lightweight
|
|
Directory Access Protocol) internet drafts</li>
|
|
|
|
<li>
|
|
an asynchronous interface to LDAP</li>
|
|
|
|
<li>
|
|
a new SASL (Simple Authentication and Security Layer) API</li>
|
|
|
|
<li>
|
|
the Netscape LDAP Service Provider for LDAP.</li>
|
|
</ul>
|
|
Additional improvements and changes to the Directory SDK are listed under
|
|
<a href="#fixed305">Bugs
|
|
Fixed Since Version 3.05</a>.
|
|
<p><b><font face="Arial,Helvetica">API updates</font></b>
|
|
<p>The Directory SDK 4.0 for Java supports these changes to the LDAP API:
|
|
<ul>
|
|
<li>
|
|
Sophisticated client-side management of referral authentication using the
|
|
<tt>LDAPBind</tt>
|
|
interface.</li>
|
|
|
|
<li>
|
|
Dynamic registration and instantiation of server response controls using
|
|
the <tt>register</tt> and <tt>newInstance</tt> methods of <tt>LDAPControl</tt>.</li>
|
|
|
|
<li>
|
|
The separation of the constraint class into <tt>LDAPConstraints</tt> and
|
|
its subclass <tt>LDAPSearchConstraints</tt>. <tt>LDAPConstraints</tt> contains
|
|
only those methods implemented in the interface that apply to <i>all </i>operations.
|
|
<tt>LDAPSearchConstraints</tt>
|
|
is unchanged. All <tt>LDAPConnection</tt> methods that used to take <tt>LDAPSearchConstraints</tt>
|
|
as an argument (except for read and search methods) now pass <tt>LDAPConstraints</tt>
|
|
instead.</li>
|
|
|
|
<li>
|
|
When using <tt>LDAPConnection</tt> for searching, retrieval of server response
|
|
controls is now handled by <tt>LDAPSearchResults</tt>. Although the SDK
|
|
is backward compatible, you should call <tt>LDAPSearchResults.getResponseControls()</tt>
|
|
instead of <tt>LDAPConnection.getResponseControls()</tt>when writing new
|
|
code.</li>
|
|
|
|
<li>
|
|
<tt>LDAPConnection.getServerControls()</tt> now automatically parses controls.
|
|
As a result, calling <tt>parseResponse()</tt> is no longer necessary.</li>
|
|
|
|
<li>
|
|
Support for transparent failover connection policies. The available policies
|
|
are: (1) serial, (2) parallel with no delay, and (3) parallel with delay.
|
|
For more information, see <tt>LDAPConnection.setConnSetupDelay()</tt> in
|
|
the javadocs.</li>
|
|
|
|
<li>
|
|
<tt>LDAPConnection</tt> has a new method called <tt>reconnect()</tt>. This
|
|
method first disconnects and then connects and binds again using the same
|
|
parameters and mechanisms as the original connection..</li>
|
|
|
|
<li>
|
|
Support for connection pools. For more information see <tt>netscape.ldap.util.ConnectionPool</tt>
|
|
in the javadocs.</li>
|
|
|
|
<li>
|
|
The addition of <tt>LDAPInterruptedException</tt>, which is thrown if an
|
|
LDAP operation is interrupted.</li>
|
|
|
|
<li>
|
|
The addition of <tt>LDAPProxiedAuthControl</tt>, which can execute operations,
|
|
using different credentials, without rebinding.</li>
|
|
|
|
<li>
|
|
<tt>LDAPConnection</tt> now runs as a daemon thread. You no longer need
|
|
to call <tt>System.exit</tt> when terminating your program.</li>
|
|
</ul>
|
|
<b><font face="Arial,Helvetica">Asynchronous API</font></b>
|
|
<p>The Directory SDK 4.0 for Java provides an interface called
|
|
<tt>LDAPAsynchronousConnection</tt>.
|
|
This interface contains methods for performing LDAP operations asynchronously.
|
|
Instead of blocking while waiting for a response, methods in <tt>LDAPAsynchronousConnection</tt>
|
|
return control to an application before they complete. For more information
|
|
on the asynchronous interface, see "<a href="http://developer.netscape.com/docs/manuals/dirsdk/jsdk40/asynch.htm">Using
|
|
the Asynchronous Interface</a>" in the <i><a href="http://developer.netscape.com/docs/manuals/dirsdk/jsdk40/contents.htm">Netscape
|
|
Directory SDK 4.0 for Java Programmer's Guide</a></i>.
|
|
<p><b><font face="Arial,Helvetica">SASL API</font></b>
|
|
<p>SASL allows clients and servers to communicate securely. The API accomplishes
|
|
this by finding a common authentication scheme and facilitating a series
|
|
of challenge and response interchanges between the client and server. If
|
|
these interchanges complete successfully, the client is authenticated.
|
|
For more information on SASL see "<a href="http://developer.netscape.com/docs/manuals/dirsdk/jsdk40/sasl.htm">Using
|
|
SASL Authentication</a>" in the <i><a href="http://developer.netscape.com/docs/manuals/dirsdk/jsdk40/contents.htm">Netscape
|
|
Directory SDK 4.0 for Java Programmer's Guide</a></i>.
|
|
<p><b><font face="Arial,Helvetica">JNDI Service Provider for LDAP</font></b>
|
|
<p>JNDI is a Java API that provides a common way for programmers to access
|
|
a variety of naming and directory services. This is accomplished via a
|
|
layer of software called a Service Provider. The Directory SDK includes
|
|
a Service Provider for LDAP.
|
|
<p>The following JNDI features are not implemented in this release of the
|
|
Netscape LDAP Service Provider:
|
|
<ul>
|
|
<li>
|
|
Support for federated names</li>
|
|
|
|
<li>
|
|
Support for the "code base" attribute for objects stored in an LDAP directory.
|
|
The class name specified by the <tt>javaClassName</tt> attribute must exist
|
|
in the local <tt>CLASSPATH</tt></li>
|
|
|
|
<li>
|
|
The <tt>search()</tt> method for schema directory contexts. To perform
|
|
searches in a schema directory context use a <tt>Context.lookup()</tt>
|
|
request instead of <tt>DirContext.search()</tt>.</li>
|
|
</ul>
|
|
For more information see "<a href="http://developer.netscape.com/docs/manuals/dirsdk/jsdk40/JNDIchap.htm">Using
|
|
the JNDI Service Provider</a>" in the <i><a href="http://developer.netscape.com/docs/manuals/dirsdk/jsdk40/contents.htm">Netscape
|
|
Directory SDK 4.0 for Java Programmer's Guide</a></i>.
|
|
<p>
|
|
<hr SIZE=1 NOSHADE WIDTH="100%">
|
|
<p><a NAME="fixed305"></a><b><font face="Arial,Helvetica"><font size=+1>Bugs
|
|
Fixed Since Version 3.05</font></font></b>
|
|
<p>The following bugs have been fixed since the release of the Directory
|
|
SDK 3.05 for Java. Bug numbers are shown in parentheses.
|
|
<ul>
|
|
<li>
|
|
<tt>LDAPSearchResults.getCount()</tt> returns 0 for synchronous searches.
|
|
(355365)</li>
|
|
|
|
<li>
|
|
Applets in Communicator can't fetch an error string. (351004)</li>
|
|
|
|
<li>
|
|
<tt>DN.contains()</tt> is implemented and documented incorrectly. (354615)</li>
|
|
|
|
<li>
|
|
Search timeout is not handled correctly. (350998)</li>
|
|
|
|
<li>
|
|
<tt>LDAPSchemaElement</tt> needs a <tt>modify()</tt> method. (350997)</li>
|
|
|
|
<li>
|
|
<tt>LDAPBasePropertySupport</tt> should enable referrals. (350996, 350995)</li>
|
|
|
|
<li>
|
|
Cannot set the cache once <tt>LDAPConnection</tt> has connected. (355904)</li>
|
|
|
|
<li>
|
|
<tt>LDAPCache</tt> changes the contents of returned attributes. (355942)</li>
|
|
|
|
<li>
|
|
The SDK calls <tt>Thread.stop()</tt>, <tt>suspend()</tt>, and <tt>resume()</tt>.
|
|
(354503)</li>
|
|
|
|
<li>
|
|
VLV controls don't support the optional context field. (355215)</li>
|
|
|
|
<li>
|
|
The SDK doesn't support all the schema options described in RFC 2252. (354347)</li>
|
|
|
|
<li>
|
|
LDAP Beans don't handle referrals. (353306)</li>
|
|
|
|
<li>
|
|
<tt>LDAPIsMember</tt> doesn't handle dynamic groups. (353305)</li>
|
|
|
|
<li>
|
|
The <tt>netscape.ldap.util.DN</tt> class does not consider <tt>""</tt>
|
|
to be a valid DN. (352804)</li>
|
|
|
|
<li>
|
|
<tt>LDAPCompareAttrNames</tt> should allow for the specification of a locale.
|
|
(351022)</li>
|
|
|
|
<li>
|
|
<tt>LDAPSearch</tt> aborts on a size limit exception. (350624)</li>
|
|
|
|
<li>
|
|
<tt>LDAPModificationSet</tt> is missing a <tt>toString</tt> method. (353308,
|
|
351719)</li>
|
|
|
|
<li>
|
|
<tt>LDAPGetEntries</tt> should allow a choice of which attributes to return.
|
|
(353307)</li>
|
|
|
|
<li>
|
|
The SDK should support the latest LDIF specification. (356470, 352056)</li>
|
|
|
|
<li>
|
|
The SDK should treat a <tt>"null"</tt> filter as meaning <tt>"objectclass=*"</tt>.
|
|
(354682)</li>
|
|
|
|
<li>
|
|
<tt>LDAPSchema</tt> contains unnecessary public <tt>"add"</tt> methods.
|
|
(354997)</li>
|
|
</ul>
|
|
|
|
<hr SIZE=1 NOSHADE WIDTH="100%">
|
|
<br><a NAME="install"></a><b><font face="Arial,Helvetica"><font size=+1>Downloading
|
|
and Building the Source</font></font></b>
|
|
<p>The Directory SDK source code is available on the Mozilla website. You
|
|
can download it at <a href="http://www.mozilla.org/directory/javasdk.html">http://www.mozilla.org/directory/javasdk.html</a>.
|
|
<p>Follow the instructions at <a href="http://www.mozilla.org/directory/buildjsdk-4.0.txt">http://www.mozilla.org/directory/buildjsdk-4.0.txt</a>
|
|
to build the Netscape Directory SDK.
|
|
<p>
|
|
<hr SIZE=1 NOSHADE WIDTH="100%"><a NAME="update"></a><b><font face="Arial,Helvetica"><font size=+1>Updating
|
|
Java Classes in Netscape Communicator</font></font></b>
|
|
<p>The LDAP Java classes contained in Netscape Communicator 4.7 and earlier
|
|
are outdated. You can upgrade these class files to the latest versions
|
|
using Communicator's SmartUpdate feature.
|
|
<p>The SmartUpdate page for the LDAP Java classes is at: <a href="http://developer.netscape.com/software/ldap/ldap.html">http://developer.netscape.com/software/ldap/ldap.html</a>
|
|
<p><b>Note: </b>This page uses Communicator's SmartUpdate feature to update
|
|
the classes. Before visiting this page, you must enable SmartUpdate, Java,
|
|
JavaScript, and cookies in Communicator.
|
|
<p><b><font face="Arial,Helvetica">To enable SmartUpdate, Java, JavaScript,
|
|
and cookies:</font></b>
|
|
<ul>
|
|
<li>
|
|
Go to the Edit menu and choose Preferences.</li>
|
|
|
|
<li>
|
|
Select Advanced and make sure that Accept all cookies is active (it's radio
|
|
button is filled).</li>
|
|
|
|
<li>
|
|
Make sure that Enable Java and Enable JavaScript are checked.</li>
|
|
|
|
<li>
|
|
Choose Advanced | SmartUpdate from the left-hand panel.</li>
|
|
|
|
<li>
|
|
Make sure that Enable SmartUpdate is checked.</li>
|
|
|
|
<li>
|
|
Click OK.</li>
|
|
</ul>
|
|
|
|
<hr SIZE=1 NOSHADE WIDTH="100%"><a NAME="report"></a><b><font face="Arial,Helvetica"><font size=+1>Reporting
|
|
Problems</font></font></b>
|
|
<p>Please submit your problem via the the <a href="http://bugzilla.mozilla.org">Bugzilla</a>
|
|
bugsystem . Use the "LDAP Java SDK" component.
|
|
<p>
|
|
<hr SIZE=1 NOSHADE WIDTH="100%"><a NAME="newsgroup"></a><b><font face="Arial,Helvetica"><font size=+1>Accessing
|
|
the Directory Developers Newsgroup</font></font></b>
|
|
<p>If you have additional questions or need more information about the
|
|
Netscape Directory SDK 4.x for Java, please visit the Mozilla <a href="news://news.mozilla.org/netscape.public.mozilla.directory">Directory
|
|
newsgroup</a> and the DevEdge <a href="http://developer.netscape.com/support/newsgroups/" TARGET="_top">Directory
|
|
Server newsgroups</a>.
|
|
<center>
|
|
<p>
|
|
<hr SIZE=1 NOSHADE WIDTH="100%"><font size=-1>Contains OROMatcher®
|
|
regular expression software from ORO Java Software. <nobr>© </nobr>Copyright
|
|
1997 by ORO Java Software.</font>
|
|
<br><font size=-1>Redistribution separate from Netscape Directory SDK for
|
|
Java or direct use of OROMatcher interfaces</font>
|
|
<br><font size=-1>requires a license from ORO Java Software. <a href="http://www.oroinc.com/" TARGET="_top">http://www.oroinc.com</a>.
|
|
OROMatcher® is a trademark of Original Reusable Objects, Inc.</font>
|
|
<p><font size=-1>For more Internet development resources, try <a href="http://home.netscape.com/computing/techsearch/index.html?cp=dev01bnts" TARGET="_top">Netscape
|
|
TechSearch</a>.</font></center>
|
|
|
|
<hr SIZE=0 WIDTH="100%">
|
|
</body>
|
|
</html>
|