zoom: update zoom info on contentProxy
[metaproxy-moved-to-github.git] / doc / zoom.xml
1 <!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V4.4//EN" 
2     "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" [
3  <!ENTITY copyright SYSTEM "copyright.xml">
4  <!ENTITY % idcommon SYSTEM "common/common.ent">
5      %idcommon;
6 ]>
7 <refentry id="ref-zoom">
8  <refentryinfo>
9   <productname>Metaproxy</productname>
10   <info><orgname>Index Data</orgname></info>
11  </refentryinfo>
12  
13  <refmeta>
14   <refentrytitle>zoom</refentrytitle>
15   <manvolnum>3mp</manvolnum>
16   <refmiscinfo class="manual">Metaproxy Module</refmiscinfo>
17  </refmeta>
18  
19  <refnamediv>
20   <refname>zoom</refname>
21   <refpurpose>Metaproxy ZOOM Module</refpurpose>
22  </refnamediv>
23  
24  <refsect1>
25   <title>DESCRIPTION</title>
26   <para>
27    This filter implements a generic client based on
28    <ulink url="&url.yaz.zoom;">ZOOM</ulink> of YAZ.
29    The client implements the protocols that ZOOM C does: Z39.50, SRU
30    (GET, POST, SOAP) and SOLR .
31   </para>
32   
33   <para>
34    This filter only deals with Z39.50 on input. The following services
35    are supported: init, search, present and close. The backend target
36    is selected based on the database as part search and
37    <emphasis>not</emphasis> as part of init.
38   </para>
39
40   <para>
41    This filter is an alternative to the z3950_client filter but also
42    shares properties of the virt_db - in that the target is selected
43    for a specific database
44   </para>
45
46   <para>
47    The ZOOM filter relies on a target profile description, which is
48    XML based. It picks the profile for a given database from a web service
49    or it may be locally given for each unique database (AKA virtual database
50    in virt_db). Target profiles are directly and indrectly given as part
51    of the <literal>torus</literal> element in the configuration.
52   </para>
53
54  </refsect1>
55
56  <refsect1>
57   <title>CONFIGURATION</title>
58   <para>
59    The configuration consists of six parts: <literal>torus</literal>,
60    <literal>fieldmap</literal>, <literal>cclmap</literal>,
61    <literal>contentProxy</literal>, <literal>log</literal>
62    and <literal>zoom</literal>.
63   </para>
64   <refsect2>
65    <title>torus</title>
66    <para>
67     The <literal>torus</literal> element specifies target profiles
68     and takes the following content:
69    </para>
70    <variablelist>
71     <varlistentry>
72      <term>attribute <literal>url</literal></term>
73      <listitem>
74       <para>
75        URL of Web service to be used when fetch target profiles from
76        a remote service (Torus normally).
77       </para>
78       <para>
79        The sequence <literal>%query</literal> is replaced with a CQL
80        query for the Torus search.
81       </para>
82       <para>
83        The special sequence <literal>%realm</literal> is replaced by value
84        of attribute <literal>realm</literal> or by realm DATABASE argument.
85       </para>
86       <para>
87        The special sequence <literal>%db</literal> is replaced with
88        a single database while searching. Note that this sequence
89        is no longer needed, because the <literal>%query</literal> can already
90        query for a single database by using CQL query
91        <literal>udb==...</literal>.
92       </para>
93      </listitem>
94     </varlistentry>
95     <varlistentry>
96      <term>attribute <literal>content_url</literal></term>
97      <listitem>
98       <para>
99        URL of Web service to be used to fetch target profile
100        for a given database (udb) of type content. Semantics otherwise like
101        <literal>url</literal> attribute above.
102       </para>
103      </listitem>
104     </varlistentry>
105     <varlistentry>
106       <term>attribute <literal>realm</literal></term>
107       <listitem>
108         <para>
109          The default realm value. Used for %realm in URL, unless
110          specified in DATABASE argument.
111         </para>
112       </listitem>
113     </varlistentry>
114     <varlistentry>
115      <term>attribute <literal>proxy</literal></term>
116      <listitem>
117       <para>
118        HTTP proxy to bse used for fetching target profiles.
119       </para>
120      </listitem>
121     </varlistentry>
122     <varlistentry>
123      <term>attribute <literal>xsldir</literal></term>
124      <listitem>
125       <para>
126        Directory that is searched for XSL stylesheets. Stylesheets
127        are specified in the target profile by the
128        <literal>transform</literal> element.
129       </para>
130      </listitem>
131     </varlistentry>
132     <varlistentry>
133      <term>attribute <literal>element_transform</literal></term>
134      <listitem>
135       <para>
136        Specifies the element that triggers retrieval and transform using
137        the parameters elementSet, recordEncoding, requestSyntax, transform
138        from the target profile. Default value
139        is "pz2", due to the fact that for historical reasons the
140        common format is that used in Pazpar2.
141       </para>
142      </listitem>
143     </varlistentry>
144     <varlistentry>
145      <term>attribute <literal>element_raw</literal></term>
146      <listitem>
147       <para>
148        Specifies an element that triggers retrieval using the
149        parameters elementSet, recordEncoding, requestSyntax from the
150        target profile. Same actions as for element_transform, but without
151        the XSL transform. Useful for debugging.
152        The default value is "raw".
153       </para>
154      </listitem>
155     </varlistentry>
156     <varlistentry>
157      <term>attribute <literal>explain_xsl</literal></term>
158      <listitem>
159       <para>
160        Specifies a stylesheet that converts one or more Torus records
161        to ZeeExplain records. The content of recordData is assumed to be
162        holding each Explain record.
163       </para>
164      </listitem>
165     </varlistentry>
166     <varlistentry>
167      <term>attribute <literal>record_xsl</literal></term>
168      <listitem>
169       <para>
170        Specifies a stylesheet that converts retrieval records after
171        transform/literal operations.
172       </para>
173       <para>
174        When Metaproxy creates a content proxy session, the XSL parameter
175        <literal>cproxyhost</literal> is passed to the transform. 
176       </para>
177      </listitem>
178     </varlistentry>
179     <varlistentry>
180      <term>element <literal>records</literal></term>
181      <listitem>
182       <para>
183        Local target profiles. This element may includes zero or
184        more <literal>record</literal> elements (one per target
185        profile). See section TARGET PROFILE.
186       </para>
187      </listitem>
188     </varlistentry>
189    </variablelist>
190   </refsect2>
191   <refsect2 id="fieldmap">
192    <title>fieldmap</title>
193    <para>
194     The <literal>fieldmap</literal> may be specified zero or more times and
195     specifies the map from CQL fields to CCL fields and takes the
196     following content:
197    </para>
198    <variablelist>
199     <varlistentry>
200      <term>attribute <literal>cql</literal></term>
201      <listitem>
202       <para>
203        CQL field that we are mapping "from".
204       </para>
205      </listitem>
206     </varlistentry>
207     <varlistentry>
208      <term>attribute <literal>ccl</literal></term>
209      <listitem>
210       <para>
211        CCL field that we are mapping "to".
212       </para>
213      </listitem>
214     </varlistentry>
215    </variablelist>
216   </refsect2>
217   <refsect2 id="cclmap_base">
218    <title>cclmap</title>
219    <para>
220     The third part of the configuration consists of zero or more
221     <literal>cclmap</literal> elements that specifies
222     <emphasis>base</emphasis> CCL profile to be used for all targets.
223     This configuration, thus, will be combined with cclmap-definitions
224     from the target profile.
225    </para>
226   </refsect2>
227   <refsect2>
228    <title>contentProxy</title>
229    <para>
230     The <literal>contentProxy</literal> element controls content proxy'in.
231     This section
232     is optional and must only be defined if content proxy'ing is enabled.
233    </para>
234    <variablelist>
235     <varlistentry>
236      <term>attribute <literal>config_file</literal></term>
237      <listitem>
238       <para>
239        Specifies the file that configures the cf-proxy system. Metaproxy
240        uses setting <literal>sessiondir</literal> and
241        <literal>proxyhostname</literal> from that file to configure
242        name of proxy host and directory of parameter files for the cf-proxy.
243       </para>
244      </listitem>
245     </varlistentry>
246     <varlistentry>
247      <term>attribute <literal>server</literal></term>
248      <listitem>
249       <para>
250        Specifies the content proxy host. The host is of the form
251        host[:port]. That is without a method (such as HTTP) and optional
252        port number.
253       </para>
254       <note>
255        <para>
256         This setting is deprecated. Use the config_file (above)
257         to inform about the proxy server.
258        </para>
259       </note>
260      </listitem>
261     </varlistentry>
262     <varlistentry>
263      <term>attribute <literal>tmp_file</literal></term>
264      <listitem>
265       <para>
266        Specifies a filename of a session file for content proxy'ing. The
267        file should be an absolute filename that includes
268        <literal>XXXXXX</literal> which is replaced by a unique filename
269        using the mkstemp(3) system call. The default value of this
270        setting is <literal>/tmp/cf.XXXXXX.p</literal>.
271       </para>
272       <note>
273        <para>
274         This setting is deprecated. Use the config_file (above)
275         to inform about the session file area.
276        </para>
277       </note>
278      </listitem>
279     </varlistentry>
280    </variablelist>
281   </refsect2>
282   <refsect2>
283    <title>log</title>
284    <para>
285     The <literal>log</literal> element controls logging for the
286     ZOOM filter.
287    </para>
288    <variablelist>
289     <varlistentry>
290      <term>attribute <literal>apdu</literal></term>
291      <listitem>
292       <para>
293        If the value of apdu is "true", then protocol packages
294        (APDUs and HTTP packages) from the ZOOM filter will be
295        logged to the yaz_log system. A value of "false" will
296        not perform logging of protocol packages (the default
297        behavior).
298       </para>
299      </listitem>
300     </varlistentry>
301    </variablelist>
302   </refsect2>
303
304   <refsect2>
305    <title>zoom</title>
306    <para>
307     The <literal>zoom</literal> element controls settings for the
308     ZOOM.
309    </para>
310    <variablelist>
311     <varlistentry>
312      <term>attribute <literal>timeout</literal></term>
313      <listitem>
314       <para>
315        Is an integer that specifies, in seconds, how long an operation
316        may take before ZOOM gives up. Default value is 40.
317       </para>
318      </listitem>
319     </varlistentry>
320    </variablelist>
321   </refsect2>
322
323  </refsect1>
324  <refsect1>
325   <title>QUERY HANDLING</title>
326   <para>
327    The ZOOM filter accepts three query types: RPN(Type-1), CCL and
328    CQL.
329   </para>
330   <para>
331    Queries are converted in two separate steps. In the first step
332    the input query is converted to RPN/Type-1. This is always
333    the common internal format between step 1 and step 2.
334    In step 2 the query is converted to the native query type of the target.
335   </para>
336   <para>
337    Step 1: for RPN, the query is passed un-modified to the target.
338   </para>
339   <para>
340    Step 1: for CCL, the query is converted to RPN via
341    <link linkend="cclmap"><literal>cclmap</literal></link> elements part of
342    the target profile as well as 
343    <link linkend="cclmap_base">base CCL maps</link>.
344   </para>
345   <para>
346    Step 1: For CQL, the query is converted to CCL. The mappings of
347    CQL fields to CCL fields are handled by
348    <link linkend="fieldmap"><literal>fieldmap</literal></link>
349    elements as part of the target profile. The resulting query, CCL,
350    is the converted to RPN using the schema mentioned earlier (via
351    <literal>cclmap</literal>).
352   </para>
353   <para>
354    Step 2: If the target is Z39.50-based, it is passed verbatim (RPN).
355    If the target is SRU-based, the RPN will be converted to CQL.
356    If the target is SOLR-based, the RPN will be converted to SOLR's query
357    type.
358   </para>
359  </refsect1>
360  
361  <refsect1>
362   <title>SORTING</title>
363   <para>
364    The ZOOM module actively handle CQL sorting - using the SORTBY parameter
365    which was introduced in SRU version 1.2. The conversion from SORTBY clause
366    to native sort for some target is driven by the two parameters: 
367    <link linkend="sortStrategy"><literal>sortStrategy</literal></link>
368    and <link linkend="sortmap"><literal>sortmap_</literal><replaceable>field</replaceable></link>.
369   </para>
370   <para>
371    If a sort field that does not have an equivalent
372    <literal>sortmap_</literal>-mapping is passed un-modified through the
373    conversion. It doesn't throw a diagnostic.
374   </para>
375  </refsect1>
376  
377  <refsect1>
378   <title>TARGET PROFILE</title>
379   <para>
380    The ZOOM module is driven by a number of settings that specifies how
381    to handle each target.
382    Note that unknown elements are silently <emphasis>ignored</emphasis>.
383   </para>
384   <para>
385    The elements, in alphabetical order, are:
386   </para>
387   <variablelist>
388    <varlistentry>
389     <term id="zoom-torus-authentication">authentication</term><listitem>
390     <para>
391      Authentication parameters to be sent to the target. For
392      Z39.50 targets, this will be sent as part of the
393      Init Request. Authentication consists of two components: username
394      and password, separated by a slash.
395     </para>
396     <para>
397      If this value is omitted or empty no authentication information is sent.
398     </para>
399    </listitem>
400    </varlistentry>
401    
402    <varlistentry id="cclmap">
403     <term>cclmap_<replaceable>field</replaceable></term><listitem>
404     <para>
405      This value specifies CCL field (qualifier) definition for some
406      field. For Z39.50 targets this most likely will specify the
407      mapping to a numeric use attribute + a structure attribute.
408      For SRU targets, the use attribute should be string based, in
409      order to make the RPN to CQL conversion work properly (step 2).
410     </para>
411    </listitem>
412    </varlistentry>
413    
414    <varlistentry>
415     <term>cfAuth</term><listitem>
416     <para>
417      When cfAuth is defined, its value will be used as authentication
418      to backend target and authentication setting will be specified
419      as part of a database. This is like a "proxy" for authentication and
420      is used for Connector Framework based targets.
421     </para>
422    </listitem>
423    </varlistentry>
424
425    <varlistentry>
426     <term id="zoom-torus-cfproxy">cfProxy</term><listitem>
427     <para>
428      Specifies HTTP proxy for the target in the form
429      <replaceable>host</replaceable>:<replaceable>port</replaceable>.
430     </para>
431    </listitem>
432    </varlistentry>
433
434    <varlistentry>
435     <term>cfSubDB</term><listitem>
436     <para>
437      Specifies sub database for a Connector Framework based target.
438     </para>
439    </listitem>
440    </varlistentry>
441
442    <varlistentry id="zoom-torus-contentConnector">
443     <term>contentConnector</term><listitem>
444     <para>
445      Specifies a database for content-based proxy'ing.
446     </para>
447    </listitem>
448    </varlistentry>
449
450    <varlistentry>
451     <term>elementSet</term><listitem>
452     <para>
453      Specifies the elementSet to be sent to the target if record
454      transform is enabled (not to be confused' with the record_transform
455      module). The record transform is enabled only if the client uses
456      record syntax = XML and a element set determined by
457      the <literal>element_transform</literal> /
458      <literal>element_raw</literal> from the configuration.
459      By default that is the element sets <literal>pz2</literal>
460      and <literal>raw</literal>.
461      If record transform is not enabled, this setting is 
462      not used and the element set specified by the client
463      is passed verbatim.
464     </para>
465    </listitem>
466    </varlistentry>
467
468    <varlistentry>
469     <term>literalTransform</term><listitem>
470     <para>
471      Specifies a XSL stylesheet to be used if record
472      transform is anabled; see description of elementSet.
473      The XSL transform is only used if the element set is set to the
474      value of <literal>element_transform</literal> in the configuration.
475     </para>
476     <para>
477      The value of literalTransform is the XSL - string encoded.
478     </para>
479    </listitem>
480    </varlistentry>
481    
482    <varlistentry>
483     <term>piggyback</term><listitem>
484     <para>
485      A value of 1/true is a hint to the ZOOM module that this Z39.50
486      target supports piggyback searches, ie Search Response with
487      records. Any other value (false) will prevent the ZOOM module
488      to make use of piggyback (all records part of Present Response).
489     </para>
490    </listitem>
491    </varlistentry>
492    
493    <varlistentry>
494     <term>queryEncoding</term><listitem>
495     <para>
496      If this value is defined, all queries will be converted
497      to this encoding. This should be used for all Z39.50 targets that
498      do not use UTF-8 for query terms.
499     </para>
500    </listitem>
501    </varlistentry>
502    
503    <varlistentry>
504     <term>recordEncoding</term><listitem>
505     <para>
506      Specifies the character encoding of records that are returned
507      by the target. This is primarily used for targets were records
508      are not UTF-8 encoded already. This setting is only used
509      if the record transform is enabled (see description of elementSet).
510     </para>
511    </listitem>
512    </varlistentry>
513
514    <varlistentry>
515     <term>requestSyntax</term><listitem>
516     <para>
517      Specifies the record syntax to be specified for the target
518      if record transform is enabled; see description of elementSet.
519      If record transform is not enabled, the record syntax of the
520      client is passed verbatim to the target.
521     </para>
522    </listitem>
523    </varlistentry>
524
525    <varlistentry id="sortmap">
526     <term>sortmap_<replaceable>field</replaceable></term><listitem>
527     <para>
528      This value the native field for a target. The form of the value is
529      given by <link linkend="sortStrategy">sortStrategy</link>.
530     </para>
531    </listitem>
532    </varlistentry>
533    
534    <varlistentry id="sortStrategy">
535     <term>sortStrategy</term><listitem>
536     <para>
537      Specifies sort strategy for a target. One of:
538      <literal>z3950</literal>, <literal>type7</literal>,
539      <literal>cql</literal>, <literal>sru11</literal> or
540      <literal>embed</literal>. The <literal>embed</literal> chooses type-7
541      or CQL sortby depending on whether Type-1 or CQL is
542      actually sent to the target.
543     </para>
544    </listitem>
545    </varlistentry>
546    
547    <varlistentry>
548     <term>sru</term><listitem>
549     <para>
550      If this setting is set, it specifies that the target is web service
551      based and must be one of : <literal>get</literal>,
552      <literal>post</literal>, <literal>soap</literal>
553      or <literal>solr</literal>.
554     </para>
555    </listitem>
556    </varlistentry>
557
558    <varlistentry>
559     <term>sruVersion</term><listitem>
560     <para>
561      Specifies the SRU version to use. It unset, version 1.2 will be
562      used. Some servers do not support this version, in which case
563      version 1.1 or even 1.0 could be set it.
564     </para>
565    </listitem>
566    </varlistentry>
567
568    <varlistentry>
569     <term>transform</term><listitem>
570     <para>
571      Specifies a XSL stylesheet filename to be used if record
572      transform is anabled; see description of elementSet.
573      The XSL transform is only used if the element set is set to the
574      value of <literal>element_transform</literal> in the configuration.
575     </para>
576    </listitem>
577    </varlistentry>
578
579    <varlistentry>
580     <term>udb</term><listitem>
581     <para>
582      This value is required and specifies the unique database for
583      this profile . All target profiles should hold a unique database.
584     </para>
585    </listitem>
586    </varlistentry>
587
588    <varlistentry id="urlRecipe">
589     <term>urlRecipe</term><listitem>
590     <para>
591      The value of this field is a string that generates a dynamic link
592      based on record content. If the resulting string is non-zero in length
593      a new field, <literal>metadata</literal> with attribute 
594      <literal>type="generated-url"</literal> is generated.
595      The contents of this field is the result of the URL recipe conversion.
596      The urlRecipe value may refer to an existing metadata element by
597      ${field[pattern/result/flags]}, which will take content
598      of field and perform a regular expression conversion using the pattern
599      given. For example: <literal>${md-title[\s+/+/g]}</literal> takes
600      metadata element <literal>title</literal> and converts one or more
601      spaces to a plus character.
602     </para>
603    </listitem>
604    </varlistentry>
605    
606    <varlistentry>
607     <term>zurl</term><listitem>
608     <para>
609      This is setting is mandatory and specifies the ZURL of the
610      target in the form of host/database. The HTTP method should
611      not be provided as this is guessed from the "sru" attribute value.
612     </para>
613    </listitem>
614    </varlistentry>
615   </variablelist>
616  </refsect1>
617  <refsect1>
618   <title>DATABASE parameters</title>
619   <para>
620    Extra information may be carried in the Z39.50 Database or SRU path,
621    such as authentication to be passed to backend etc. Some of
622    the parameters override TARGET profile values. The format is
623   </para>
624   <para>
625    udb,parm1=value1&amp;parm2=value2&amp;...
626   </para>
627   <para>
628    Where udb is the unique database recognised by the backend and parm1,
629    value1, .. are parameters to be passed. The following describes the
630    supported parameters. Like form values in HTTP the parameters and
631    values are URL encoded. The separator, though, between udb and parameters
632    is a comma rather than a question mark. What follows question mark are
633    HTTP arguments (in this case SRU arguments).
634   </para>
635   <variablelist>  
636    <varlistentry>
637     <term>user</term>
638     <listitem>
639      <para>
640       Specifies user to be passed to backend. If this parameter is
641       omitted, the user will be taken from TARGET profile setting
642       <link linkend="zoom-torus-authentication">
643        <literal>authentication</literal>
644       </link>
645       .
646      </para>
647     </listitem>
648    </varlistentry>
649    <varlistentry>
650     <term>password</term>
651     <listitem>
652      <para>
653       Specifies password to be passed to backend. If this parameters is
654       omitted, the password will be taken from TARGET profile setting
655       <link linkend="zoom-torus-authentication">
656        <literal>authentication</literal>
657       </link>
658       .
659      </para>
660     </listitem>
661    </varlistentry>
662    <varlistentry>
663     <term>proxy</term>
664     <listitem>
665      <para>
666       Specifies one or more proxies for backend. If this parameter is
667       omitted, the proxy will be taken from TARGET profile setting
668       <link linkend="zoom-torus-cfproxy">
669        <literal>cfProxy</literal></link>.
670        The parameter is a list of  comma-separated  host:port entries.
671        Bost host and port must be given for each proxy.
672      </para>
673     </listitem>
674    </varlistentry>
675    <varlistentry>
676     <term>cproxysession</term>
677     <listitem>
678      <para>
679       Session ID for content proxy. This parameter is, generally,
680       not used by anything but the content proxy itself.
681      </para>
682     </listitem>
683    </varlistentry>
684    <varlistentry>
685     <term>nocproxy</term>
686     <listitem>
687      <para>
688       If this parameter is specified, content-proyxing is disabled
689       for the search.
690      </para>
691     </listitem>
692    </varlistentry>
693    <varlistentry>
694     <term>realm</term>
695     <listitem>
696      <para>
697       Session realm to be used for this target, changed the resulting
698       URL to be used for getting a target profile, by changing the
699       value that gets substituted for the %realm string.
700      </para>
701     </listitem>
702    </varlistentry>
703    <varlistentry>
704     <term>x-parm</term>
705     <listitem>
706      <para>
707       All parameters that has prefix x, dash are passed verbatim
708       to the backend.
709      </para>
710     </listitem>
711    </varlistentry>
712   </variablelist>  
713  </refsect1>
714  <refsect1>
715   <title>SCHEMA</title>
716   <literallayout><xi:include
717   xi:href="../xml/schema/filter_zoom.rnc"
718   xi:parse="text"  
719   xmlns:xi="http://www.w3.org/2001/XInclude" />
720   </literallayout>
721  </refsect1>
722  
723  <refsect1>
724   <title>EXAMPLES</title>
725   <para>
726    The following configuration illustrates most of the
727    facilities:
728    <screen><![CDATA[
729     <filter type="zoom">
730       <torus
731          url="http://torus.indexdata.com/src/records/?query=%query"
732          proxy="localhost:3128"
733          />
734       <fieldmap cql="cql.anywhere"/>
735       <fieldmap cql="cql.serverChoice"/>
736       <fieldmap cql="dc.creator" ccl="au"/>
737       <fieldmap cql="dc.title" ccl="ti"/>
738       <fieldmap cql="dc.subject" ccl="su"/>
739       
740       <cclmap>
741         <qual name="ocn">
742           <attr type="u" value="12"/>
743           <attr type="s" value="107"/>
744         </qual>
745       </cclmap>
746       <log apdu="true"/>
747       <zoom timeout="40"/>
748     </filter>
749 ]]>
750    </screen>
751   </para>
752   
753  </refsect1> 
754  
755  <refsect1>
756   <title>SEE ALSO</title>
757   <para>
758    <citerefentry>
759     <refentrytitle>metaproxy</refentrytitle>
760     <manvolnum>1</manvolnum>
761    </citerefentry>
762   </para>
763   <para>
764    <citerefentry>
765     <refentrytitle>virt_db</refentrytitle>
766     <manvolnum>3mp</manvolnum>
767    </citerefentry>
768   </para>
769  </refsect1>
770  
771  &copyright;
772 </refentry>
773
774 <!-- Keep this comment at the end of the file
775 Local variables:
776 mode: nxml
777 nxml-child-indent: 1
778 End:
779 -->