summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPietro Abate <pietro.abate@pps.jussieu.fr>2009-03-20 14:09:38 +0100
committerPietro Abate <pietro.abate@pps.jussieu.fr>2009-03-20 14:09:38 +0100
commit52bcb81c2b13da5bc8303497caebfa25ed902253 (patch)
tree021e8083b1c1cfdd6476751787ffdc5dea30a0eb
Import xmlrpc-light_0.6.1.orig.tar.gz
[dgit import orig xmlrpc-light_0.6.1.orig.tar.gz]
-rw-r--r--LICENSE199
-rw-r--r--META6
-rw-r--r--Makefile18
-rw-r--r--OCamlMakefile1154
-rw-r--r--README.txt84
-rw-r--r--XmlRpc.ml575
-rw-r--r--XmlRpc.mli338
-rw-r--r--XmlRpcBase64.ml138
-rw-r--r--XmlRpcBase64.mli73
-rw-r--r--XmlRpcDateTime.ml109
-rw-r--r--XmlRpcDateTime.mli97
-rw-r--r--XmlRpcServer.ml394
-rw-r--r--XmlRpcServer.mli146
-rw-r--r--doc/xmlrpc-light/html/XmlRpc.client.html124
-rw-r--r--doc/xmlrpc-light/html/XmlRpc.html179
-rw-r--r--doc/xmlrpc-light/html/XmlRpc.multicall.html100
-rw-r--r--doc/xmlrpc-light/html/XmlRpcBase64.html72
-rw-r--r--doc/xmlrpc-light/html/XmlRpcDateTime.html124
-rw-r--r--doc/xmlrpc-light/html/XmlRpcServer.base.html98
-rw-r--r--doc/xmlrpc-light/html/XmlRpcServer.cgi.html32
-rw-r--r--doc/xmlrpc-light/html/XmlRpcServer.html82
-rw-r--r--doc/xmlrpc-light/html/XmlRpcServer.netplex.html30
-rw-r--r--doc/xmlrpc-light/html/XmlRpcServer.server.html34
-rw-r--r--doc/xmlrpc-light/html/index.html50
-rw-r--r--doc/xmlrpc-light/html/index_attributes.html92
-rw-r--r--doc/xmlrpc-light/html/index_class_types.html30
-rw-r--r--doc/xmlrpc-light/html/index_classes.html53
-rw-r--r--doc/xmlrpc-light/html/index_exceptions.html49
-rw-r--r--doc/xmlrpc-light/html/index_methods.html195
-rw-r--r--doc/xmlrpc-light/html/index_module_types.html24
-rw-r--r--doc/xmlrpc-light/html/index_modules.html45
-rw-r--r--doc/xmlrpc-light/html/index_types.html62
-rw-r--r--doc/xmlrpc-light/html/index_values.html215
-rw-r--r--doc/xmlrpc-light/html/style.css33
-rw-r--r--doc/xmlrpc-light/html/type_XmlRpc.client.html48
-rw-r--r--doc/xmlrpc-light/html/type_XmlRpc.html105
-rw-r--r--doc/xmlrpc-light/html/type_XmlRpc.multicall.html26
-rw-r--r--doc/xmlrpc-light/html/type_XmlRpcBase64.html32
-rw-r--r--doc/xmlrpc-light/html/type_XmlRpcDateTime.html39
-rw-r--r--doc/xmlrpc-light/html/type_XmlRpcServer.base.html44
-rw-r--r--doc/xmlrpc-light/html/type_XmlRpcServer.cgi.html19
-rw-r--r--doc/xmlrpc-light/html/type_XmlRpcServer.html90
-rw-r--r--doc/xmlrpc-light/html/type_XmlRpcServer.netplex.html20
-rw-r--r--doc/xmlrpc-light/html/type_XmlRpcServer.server.html44
-rw-r--r--doc/xmlrpc-light/latex/doc.aux116
-rw-r--r--doc/xmlrpc-light/latex/doc.dvibin0 -> 30196 bytes
-rw-r--r--doc/xmlrpc-light/latex/doc.log128
-rw-r--r--doc/xmlrpc-light/latex/doc.pdfbin0 -> 119656 bytes
-rw-r--r--doc/xmlrpc-light/latex/doc.ps3723
-rw-r--r--doc/xmlrpc-light/latex/doc.tex1551
-rw-r--r--doc/xmlrpc-light/latex/doc.toc17
-rw-r--r--doc/xmlrpc-light/latex/ocamldoc.sty75
-rw-r--r--examples/README.txt9
-rw-r--r--examples/adder/Makefile9
-rw-r--r--examples/adder/OCamlMakefile1154
-rw-r--r--examples/adder/adder.conf43
-rw-r--r--examples/adder/adder.ml37
-rwxr-xr-xexamples/adder/run.sh2
-rw-r--r--examples/genclient/Makefile7
-rw-r--r--examples/genclient/OCamlMakefile1154
-rw-r--r--examples/genclient/genclient.ml266
-rw-r--r--examples/ubigraph/Makefile7
-rw-r--r--examples/ubigraph/OCamlMakefile1154
-rw-r--r--examples/ubigraph/Ubigraph.ml169
-rw-r--r--examples/ubigraph/Ubigraph.mli51
-rw-r--r--examples/ubigraph/test.ml54
-rw-r--r--examples/wordpress/Makefile7
-rw-r--r--examples/wordpress/OCamlMakefile1154
-rw-r--r--examples/wordpress/WordPress.ml746
-rw-r--r--examples/wordpress/WordPress.mli242
-rw-r--r--examples/wordpress/test.ml34
-rw-r--r--test/test.ml40
-rw-r--r--test/test_base64.ml46
-rw-r--r--test/test_datetime.ml198
-rw-r--r--test/test_message.ml236
-rw-r--r--test/test_serve.ml85
-rw-r--r--test/test_value.ml284
77 files changed, 18319 insertions, 0 deletions
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..256edef
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,199 @@
+The Library is distributed under the terms of the GNU Library General
+Public License version 2 (included below).
+
+As a special exception to the GNU Library General Public License, you
+may link, statically or dynamically, a "work that uses the Library"
+with a publicly distributed version of the Library to produce an
+executable file containing portions of the Library, and distribute
+that executable file under terms of your choice, without any of the
+additional requirements listed in clause 6 of the GNU Library General
+Public License. By "a publicly distributed version of the Library",
+we mean either the unmodified Library as distributed, or a
+modified version of the Library that is distributed under the
+conditions defined in clause 3 of the GNU Library General Public
+License. This exception does not however invalidate any other reasons
+why the executable file might be covered by the GNU Library General
+Public License.
+
+------------
+
+GNU LESSER GENERAL PUBLIC LICENSE
+Version 2.1, February 1999
+
+
+Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+Preamble
+The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
+
+This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
+
+When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
+
+To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
+
+For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
+
+We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
+
+To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
+
+Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
+
+Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
+
+When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
+
+We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
+
+For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
+
+In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
+
+Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
+
+The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
+
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
+
+A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
+
+The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
+
+"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
+
+Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
+
+1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
+
+You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
+
+
+a) The modified work must itself be a software library.
+b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
+c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
+d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
+(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
+
+3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
+
+Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
+
+This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
+
+4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
+
+If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
+
+5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
+
+However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
+
+When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
+
+If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
+
+Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
+
+6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
+
+You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
+
+
+a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
+b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
+c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
+d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
+e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
+For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
+
+It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
+
+7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
+
+
+a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
+b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
+8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
+
+9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
+
+10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
+
+11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
+
+This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
+
+12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
+
+13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
+
+14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+
+END OF TERMS AND CONDITIONS
+How to Apply These Terms to Your New Libraries
+If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
+
+To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
+
+
+one line to give the library's name and an idea of what it does.
+Copyright (C) year name of author
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
+
+
+Yoyodyne, Inc., hereby disclaims all copyright interest in
+the library `Frob' (a library for tweaking knobs) written
+by James Random Hacker.
+
+signature of Ty Coon, 1 April 1990
+Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/META b/META
new file mode 100644
index 0000000..9e153c9
--- /dev/null
+++ b/META
@@ -0,0 +1,6 @@
+name = "xmlrpc-light"
+version = "0.6.1"
+description = "XML-RPC client based on Xml-Light"
+requires = "xml-light,netclient,nethttpd-for-netcgi2"
+archive(byte) = "xmlrpc-light.cma"
+archive(native) = "xmlrpc-light.cmxa"
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..e9f50e6
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,18 @@
+OCAMLMAKEFILE = OCamlMakefile
+
+RESULT = xmlrpc-light
+SOURCES = XmlRpcBase64.mli XmlRpcBase64.ml XmlRpcDateTime.mli XmlRpcDateTime.ml XmlRpc.mli XmlRpc.ml XmlRpcServer.mli XmlRpcServer.ml
+PACKS = xml-light,netclient,nethttpd-for-netcgi2
+LIBINSTALL_FILES = XmlRpcBase64.mli XmlRpcBase64.cmi XmlRpcDateTime.mli XmlRpcDateTime.cmi XmlRpc.mli XmlRpc.cmi XmlRpcServer.mli XmlRpcServer.cmi xmlrpc-light.cma xmlrpc-light.cmxa xmlrpc-light.a
+OCAMLDOC = ocamlfind ocamldoc -package xml-light,nethttpd-for-netcgi2
+DOC_FILES = XmlRpc.mli XmlRpcServer.mli XmlRpcDateTime.mli XmlRpcBase64.mli
+
+all: native-code-library byte-code-library
+install: libinstall
+uninstall: libuninstall
+
+.PHONY: test
+test: byte-code-library
+ ocaml test/test.ml
+
+include $(OCAMLMAKEFILE)
diff --git a/OCamlMakefile b/OCamlMakefile
new file mode 100644
index 0000000..9955029
--- /dev/null
+++ b/OCamlMakefile
@@ -0,0 +1,1154 @@
+###########################################################################
+# OCamlMakefile
+# Copyright (C) 1999-2004 Markus Mottl
+#
+# For updates see:
+# http://www.ocaml.info/home/ocaml_sources.html
+#
+# $Id: OCamlMakefile,v 1.72 2005/12/09 15:30:50 mottl Exp $
+#
+###########################################################################
+
+# Modified by damien for .glade.ml compilation
+
+# Set these variables to the names of the sources to be processed and
+# the result variable. Order matters during linkage!
+
+ifndef SOURCES
+ SOURCES := foo.ml
+endif
+export SOURCES
+
+ifndef RES_CLIB_SUF
+ RES_CLIB_SUF := _stubs
+endif
+export RES_CLIB_SUF
+
+ifndef RESULT
+ RESULT := foo
+endif
+export RESULT
+
+export LIB_PACK_NAME
+
+ifndef DOC_FILES
+ DOC_FILES := $(filter %.mli, $(SOURCES))
+endif
+export DOC_FILES
+
+export BCSUFFIX
+export NCSUFFIX
+
+ifndef TOPSUFFIX
+ TOPSUFFIX := .top
+endif
+export TOPSUFFIX
+
+# Eventually set include- and library-paths, libraries to link,
+# additional compilation-, link- and ocamlyacc-flags
+# Path- and library information needs not be written with "-I" and such...
+# Define THREADS if you need it, otherwise leave it unset (same for
+# USE_CAMLP4)!
+
+export THREADS
+export VMTHREADS
+export ANNOTATE
+export USE_CAMLP4
+
+export INCDIRS
+export LIBDIRS
+export EXTLIBDIRS
+export RESULTDEPS
+export OCAML_DEFAULT_DIRS
+
+export LIBS
+export CLIBS
+
+export OCAMLFLAGS
+export OCAMLNCFLAGS
+export OCAMLBCFLAGS
+
+export OCAMLLDFLAGS
+export OCAMLNLDFLAGS
+export OCAMLBLDFLAGS
+
+ifndef OCAMLCPFLAGS
+ OCAMLCPFLAGS := a
+endif
+
+export OCAMLCPFLAGS
+
+export PPFLAGS
+
+export YFLAGS
+export IDLFLAGS
+
+export OCAMLDOCFLAGS
+
+export OCAMLFIND_INSTFLAGS
+
+export DVIPSFLAGS
+
+export STATIC
+
+# Add a list of optional trash files that should be deleted by "make clean"
+export TRASH
+
+#################### variables depending on your OCaml-installation
+
+ifdef MINGW
+ export MINGW
+ WIN32 := 1
+ CFLAGS_WIN32 := -mno-cygwin
+endif
+ifdef MSVC
+ export MSVC
+ WIN32 := 1
+ ifndef STATIC
+ CPPFLAGS_WIN32 := -DCAML_DLL
+ endif
+ CFLAGS_WIN32 += -nologo
+ EXT_OBJ := obj
+ EXT_LIB := lib
+ ifeq ($(CC),gcc)
+ # work around GNU Make default value
+ ifdef THREADS
+ CC := cl -MT
+ else
+ CC := cl
+ endif
+ endif
+ ifeq ($(CXX),g++)
+ # work around GNU Make default value
+ CXX := $(CC)
+ endif
+ CFLAG_O := -Fo
+endif
+ifdef WIN32
+ EXT_CXX := cpp
+ EXE := .exe
+endif
+
+ifndef EXT_OBJ
+ EXT_OBJ := o
+endif
+ifndef EXT_LIB
+ EXT_LIB := a
+endif
+ifndef EXT_CXX
+ EXT_CXX := cc
+endif
+ifndef EXE
+ EXE := # empty
+endif
+ifndef CFLAG_O
+ CFLAG_O := -o # do not delete this comment (preserves trailing whitespace)!
+endif
+
+export CC
+export CXX
+export CFLAGS
+export CXXFLAGS
+export LDFLAGS
+export CPPFLAGS
+
+ifndef RPATH_FLAG
+ RPATH_FLAG := -R
+endif
+export RPATH_FLAG
+
+ifndef MSVC
+ifndef PIC_CFLAGS
+ PIC_CFLAGS := -fPIC
+endif
+ifndef PIC_CPPFLAGS
+ PIC_CPPFLAGS := -DPIC
+endif
+endif
+
+export PIC_CFLAGS
+export PIC_CPPFLAGS
+
+BCRESULT := $(addsuffix $(BCSUFFIX), $(RESULT))
+NCRESULT := $(addsuffix $(NCSUFFIX), $(RESULT))
+TOPRESULT := $(addsuffix $(TOPSUFFIX), $(RESULT))
+
+ifndef OCAMLFIND
+ OCAMLFIND := ocamlfind
+endif
+export OCAMLFIND
+
+ifndef OCAMLC
+ OCAMLC := ocamlc
+endif
+export OCAMLC
+
+ifndef OCAMLOPT
+ OCAMLOPT := ocamlopt
+endif
+export OCAMLOPT
+
+ifndef OCAMLMKTOP
+ OCAMLMKTOP := ocamlmktop
+endif
+export OCAMLMKTOP
+
+ifndef OCAMLCP
+ OCAMLCP := ocamlcp
+endif
+export OCAMLCP
+
+ifndef OCAMLDEP
+ OCAMLDEP := ocamldep
+endif
+export OCAMLDEP
+
+ifndef OCAMLLEX
+ OCAMLLEX := ocamllex
+endif
+export OCAMLLEX
+
+ifndef OCAMLYACC
+ OCAMLYACC := ocamlyacc
+endif
+export OCAMLYACC
+
+ifndef OCAMLMKLIB
+ OCAMLMKLIB := ocamlmklib
+endif
+export OCAMLMKLIB
+
+ifndef OCAML_GLADECC
+ OCAML_GLADECC := lablgladecc2
+endif
+export OCAML_GLADECC
+
+ifndef OCAML_GLADECC_FLAGS
+ OCAML_GLADECC_FLAGS :=
+endif
+export OCAML_GLADECC_FLAGS
+
+ifndef CAMELEON_REPORT
+ CAMELEON_REPORT := report
+endif
+export CAMELEON_REPORT
+
+ifndef CAMELEON_REPORT_FLAGS
+ CAMELEON_REPORT_FLAGS :=
+endif
+export CAMELEON_REPORT_FLAGS
+
+ifndef CAMELEON_ZOGGY
+ CAMELEON_ZOGGY := camlp4o pa_zog.cma pr_o.cmo
+endif
+export CAMELEON_ZOGGY
+
+ifndef CAMELEON_ZOGGY_FLAGS
+ CAMELEON_ZOGGY_FLAGS :=
+endif
+export CAMELEON_ZOGGY_FLAGS
+
+ifndef OXRIDL
+ OXRIDL := oxridl
+endif
+export OXRIDL
+
+ifndef CAMLIDL
+ CAMLIDL := camlidl
+endif
+export CAMLIDL
+
+ifndef CAMLIDLDLL
+ CAMLIDLDLL := camlidldll
+endif
+export CAMLIDLDLL
+
+ifndef NOIDLHEADER
+ MAYBE_IDL_HEADER := -header
+endif
+export NOIDLHEADER
+
+export NO_CUSTOM
+
+ifndef CAMLP4
+ CAMLP4 := camlp4
+endif
+export CAMLP4
+
+ifndef REAL_OCAMLFIND
+ ifdef PACKS
+ ifndef CREATE_LIB
+ ifdef THREADS
+ PACKS += threads
+ endif
+ endif
+ empty :=
+ space := $(empty) $(empty)
+ comma := ,
+ ifdef PREDS
+ PRE_OCAML_FIND_PREDICATES := $(subst $(space),$(comma),$(PREDS))
+ PRE_OCAML_FIND_PACKAGES := $(subst $(space),$(comma),$(PACKS))
+ OCAML_FIND_PREDICATES := -predicates $(PRE_OCAML_FIND_PREDICATES)
+ # OCAML_DEP_PREDICATES := -syntax $(PRE_OCAML_FIND_PREDICATES)
+ OCAML_FIND_PACKAGES := $(OCAML_FIND_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES)
+ OCAML_DEP_PACKAGES := $(OCAML_DEP_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES)
+ else
+ OCAML_FIND_PACKAGES := -package $(subst $(space),$(comma),$(PACKS))
+ OCAML_DEP_PACKAGES :=
+ endif
+ OCAML_FIND_LINKPKG := -linkpkg
+ REAL_OCAMLFIND := $(OCAMLFIND)
+ endif
+endif
+
+export OCAML_FIND_PACKAGES
+export OCAML_DEP_PACKAGES
+export OCAML_FIND_LINKPKG
+export REAL_OCAMLFIND
+
+ifndef OCAMLDOC
+ OCAMLDOC := ocamldoc
+endif
+export OCAMLDOC
+
+ifndef LATEX
+ LATEX := latex
+endif
+export LATEX
+
+ifndef DVIPS
+ DVIPS := dvips
+endif
+export DVIPS
+
+ifndef PS2PDF
+ PS2PDF := ps2pdf
+endif
+export PS2PDF
+
+ifndef OCAMLMAKEFILE
+ OCAMLMAKEFILE := OCamlMakefile
+endif
+export OCAMLMAKEFILE
+
+ifndef OCAMLLIBPATH
+ OCAMLLIBPATH := \
+ $(shell $(OCAMLC) 2>/dev/null -where || echo /usr/lib/ocaml)
+endif
+export OCAMLLIBPATH
+
+ifndef OCAML_LIB_INSTALL
+ OCAML_LIB_INSTALL := $(OCAMLLIBPATH)/contrib
+endif
+export OCAML_LIB_INSTALL
+
+###########################################################################
+
+#################### change following sections only if
+#################### you know what you are doing!
+
+# delete target files when a build command fails
+.PHONY: .DELETE_ON_ERROR
+.DELETE_ON_ERROR:
+
+# for pedants using "--warn-undefined-variables"
+export MAYBE_IDL
+export REAL_RESULT
+export CAMLIDLFLAGS
+export THREAD_FLAG
+export RES_CLIB
+export MAKEDLL
+export ANNOT_FLAG
+export C_OXRIDL
+export SUBPROJS
+export CFLAGS_WIN32
+export CPPFLAGS_WIN32
+
+INCFLAGS :=
+
+SHELL := /bin/sh
+
+MLDEPDIR := ._d
+BCDIDIR := ._bcdi
+NCDIDIR := ._ncdi
+
+FILTER_EXTNS := %.mli %.ml %.mll %.mly %.idl %.oxridl %.c %.$(EXT_CXX) %.rep %.zog %.glade
+
+FILTERED := $(filter $(FILTER_EXTNS), $(SOURCES))
+SOURCE_DIRS := $(filter-out ./, $(sort $(dir $(FILTERED))))
+
+FILTERED_REP := $(filter %.rep, $(FILTERED))
+DEP_REP := $(FILTERED_REP:%.rep=$(MLDEPDIR)/%.d)
+AUTO_REP := $(FILTERED_REP:.rep=.ml)
+
+FILTERED_ZOG := $(filter %.zog, $(FILTERED))
+DEP_ZOG := $(FILTERED_ZOG:%.zog=$(MLDEPDIR)/%.d)
+AUTO_ZOG := $(FILTERED_ZOG:.zog=.ml)
+
+FILTERED_GLADE := $(filter %.glade, $(FILTERED))
+DEP_GLADE := $(FILTERED_GLADE:%.glade=$(MLDEPDIR)/%.d)
+AUTO_GLADE := $(FILTERED_GLADE:.glade=.ml)
+
+FILTERED_ML := $(filter %.ml, $(FILTERED))
+DEP_ML := $(FILTERED_ML:%.ml=$(MLDEPDIR)/%.d)
+
+FILTERED_MLI := $(filter %.mli, $(FILTERED))
+DEP_MLI := $(FILTERED_MLI:.mli=.di)
+
+FILTERED_MLL := $(filter %.mll, $(FILTERED))
+DEP_MLL := $(FILTERED_MLL:%.mll=$(MLDEPDIR)/%.d)
+AUTO_MLL := $(FILTERED_MLL:.mll=.ml)
+
+FILTERED_MLY := $(filter %.mly, $(FILTERED))
+DEP_MLY := $(FILTERED_MLY:%.mly=$(MLDEPDIR)/%.d) $(FILTERED_MLY:.mly=.di)
+AUTO_MLY := $(FILTERED_MLY:.mly=.mli) $(FILTERED_MLY:.mly=.ml)
+
+FILTERED_IDL := $(filter %.idl, $(FILTERED))
+DEP_IDL := $(FILTERED_IDL:%.idl=$(MLDEPDIR)/%.d) $(FILTERED_IDL:.idl=.di)
+C_IDL := $(FILTERED_IDL:%.idl=%_stubs.c)
+ifndef NOIDLHEADER
+ C_IDL += $(FILTERED_IDL:.idl=.h)
+endif
+OBJ_C_IDL := $(FILTERED_IDL:%.idl=%_stubs.$(EXT_OBJ))
+AUTO_IDL := $(FILTERED_IDL:.idl=.mli) $(FILTERED_IDL:.idl=.ml) $(C_IDL)
+
+FILTERED_OXRIDL := $(filter %.oxridl, $(FILTERED))
+DEP_OXRIDL := $(FILTERED_OXRIDL:%.oxridl=$(MLDEPDIR)/%.d) $(FILTERED_OXRIDL:.oxridl=.di)
+AUTO_OXRIDL := $(FILTERED_OXRIDL:.oxridl=.mli) $(FILTERED_OXRIDL:.oxridl=.ml) $(C_OXRIDL)
+
+FILTERED_C_CXX := $(filter %.c %.$(EXT_CXX), $(FILTERED))
+OBJ_C_CXX := $(FILTERED_C_CXX:.c=.$(EXT_OBJ))
+OBJ_C_CXX := $(OBJ_C_CXX:.$(EXT_CXX)=.$(EXT_OBJ))
+
+PRE_TARGETS += $(AUTO_MLL) $(AUTO_MLY) $(AUTO_IDL) $(AUTO_OXRIDL) $(AUTO_ZOG) $(AUTO_REP) $(AUTO_GLADE)
+
+ALL_DEPS := $(DEP_ML) $(DEP_MLI) $(DEP_MLL) $(DEP_MLY) $(DEP_IDL) $(DEP_OXRIDL) $(DEP_ZOG) $(DEP_REP) $(DEP_GLADE)
+
+MLDEPS := $(filter %.d, $(ALL_DEPS))
+MLIDEPS := $(filter %.di, $(ALL_DEPS))
+BCDEPIS := $(MLIDEPS:%.di=$(BCDIDIR)/%.di)
+NCDEPIS := $(MLIDEPS:%.di=$(NCDIDIR)/%.di)
+
+ALLML := $(filter %.mli %.ml %.mll %.mly %.idl %.oxridl %.rep %.zog %.glade, $(FILTERED))
+
+IMPLO_INTF := $(ALLML:%.mli=%.mli.__)
+IMPLO_INTF := $(foreach file, $(IMPLO_INTF), \
+ $(basename $(file)).cmi $(basename $(file)).cmo)
+IMPLO_INTF := $(filter-out %.mli.cmo, $(IMPLO_INTF))
+IMPLO_INTF := $(IMPLO_INTF:%.mli.cmi=%.cmi)
+
+IMPLX_INTF := $(IMPLO_INTF:.cmo=.cmx)
+
+INTF := $(filter %.cmi, $(IMPLO_INTF))
+IMPL_CMO := $(filter %.cmo, $(IMPLO_INTF))
+IMPL_CMX := $(IMPL_CMO:.cmo=.cmx)
+IMPL_ASM := $(IMPL_CMO:.cmo=.asm)
+IMPL_S := $(IMPL_CMO:.cmo=.s)
+
+OBJ_LINK := $(OBJ_C_IDL) $(OBJ_C_CXX)
+OBJ_FILES := $(IMPL_CMO:.cmo=.$(EXT_OBJ)) $(OBJ_LINK)
+
+EXECS := $(addsuffix $(EXE), \
+ $(sort $(TOPRESULT) $(BCRESULT) $(NCRESULT)))
+ifdef WIN32
+ EXECS += $(BCRESULT).dll $(NCRESULT).dll
+endif
+
+CLIB_BASE := $(RESULT)$(RES_CLIB_SUF)
+ifneq ($(strip $(OBJ_LINK)),)
+ RES_CLIB := lib$(CLIB_BASE).$(EXT_LIB)
+endif
+
+ifdef WIN32
+DLLSONAME := $(CLIB_BASE).dll
+else
+DLLSONAME := dll$(CLIB_BASE).so
+endif
+
+NONEXECS := $(INTF) $(IMPL_CMO) $(IMPL_CMX) $(IMPL_ASM) $(IMPL_S) \
+ $(OBJ_FILES) $(PRE_TARGETS) $(BCRESULT).cma $(NCRESULT).cmxa \
+ $(NCRESULT).$(EXT_LIB) $(BCRESULT).cmi $(BCRESULT).cmo \
+ $(NCRESULT).cmi $(NCRESULT).cmx $(NCRESULT).o \
+ $(RES_CLIB) $(IMPL_CMO:.cmo=.annot) \
+ $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(LIB_PACK_NAME).cmx $(LIB_PACK_NAME).o
+
+ifndef STATIC
+ NONEXECS += $(DLLSONAME)
+endif
+
+ifndef LIBINSTALL_FILES
+ LIBINSTALL_FILES := $(RESULT).mli $(RESULT).cmi $(RESULT).cma \
+ $(RESULT).cmxa $(RESULT).$(EXT_LIB) $(RES_CLIB)
+ ifndef STATIC
+ ifneq ($(strip $(OBJ_LINK)),)
+ LIBINSTALL_FILES += $(DLLSONAME)
+ endif
+ endif
+endif
+
+export LIBINSTALL_FILES
+
+ifdef WIN32
+ # some extra stuff is created while linking DLLs
+ NONEXECS += $(BCRESULT).$(EXT_LIB) $(BCRESULT).exp $(NCRESULT).exp $(CLIB_BASE).exp $(CLIB_BASE).lib
+endif
+
+TARGETS := $(EXECS) $(NONEXECS)
+
+# If there are IDL-files
+ifneq ($(strip $(FILTERED_IDL)),)
+ MAYBE_IDL := -cclib -lcamlidl
+endif
+
+ifdef USE_CAMLP4
+ CAMLP4PATH := \
+ $(shell $(CAMLP4) -where 2>/dev/null || echo /usr/lib/camlp4)
+ INCFLAGS := -I $(CAMLP4PATH)
+ CINCFLAGS := -I$(CAMLP4PATH)
+endif
+
+DINCFLAGS := $(INCFLAGS) $(SOURCE_DIRS:%=-I %) $(OCAML_DEFAULT_DIRS:%=-I %)
+INCFLAGS := $(DINCFLAGS) $(INCDIRS:%=-I %)
+CINCFLAGS += $(SOURCE_DIRS:%=-I%) $(INCDIRS:%=-I%) $(OCAML_DEFAULT_DIRS:%=-I%)
+
+ifndef MSVC
+CLIBFLAGS += $(SOURCE_DIRS:%=-L%) $(LIBDIRS:%=-L%) \
+ $(EXTLIBDIRS:%=-L%) $(EXTLIBDIRS:%=-Wl,$(RPATH_FLAG)%) \
+ $(OCAML_DEFAULT_DIRS:%=-L%)
+endif
+
+ifndef PROFILING
+ INTF_OCAMLC := $(OCAMLC)
+else
+ ifndef THREADS
+ INTF_OCAMLC := $(OCAMLCP) -p $(OCAMLCPFLAGS)
+ else
+ # OCaml does not support profiling byte code
+ # with threads (yet), therefore we force an error.
+ ifndef REAL_OCAMLC
+ $(error Profiling of multithreaded byte code not yet supported by OCaml)
+ endif
+ INTF_OCAMLC := $(OCAMLC)
+ endif
+endif
+
+ifndef MSVC
+COMMON_LDFLAGS := $(LDFLAGS:%=-ccopt %) $(SOURCE_DIRS:%=-ccopt -L%) \
+ $(LIBDIRS:%=-ccopt -L%) $(EXTLIBDIRS:%=-ccopt -L%) \
+ $(EXTLIBDIRS:%=-ccopt -Wl,$(RPATH_FLAG)%) \
+ $(OCAML_DEFAULT_DIRS:%=-ccopt -L%)
+else
+COMMON_LDFLAGS := -ccopt "/link -NODEFAULTLIB:LIBC $(LDFLAGS:%=%) $(SOURCE_DIRS:%=-LIBPATH:%) \
+ $(LIBDIRS:%=-LIBPATH:%) $(EXTLIBDIRS:%=-LIBPATH:%) \
+ $(OCAML_DEFAULT_DIRS:%=-LIBPATH:%) "
+endif
+
+CLIBS_OPTS := $(CLIBS:%=-cclib -l%)
+ifdef MSVC
+ ifndef STATIC
+ # MSVC libraries do not have 'lib' prefix
+ CLIBS_OPTS := $(CLIBS:%=-cclib %.lib)
+ endif
+endif
+
+ifneq ($(strip $(OBJ_LINK)),)
+ ifdef CREATE_LIB
+ OBJS_LIBS := -cclib -l$(CLIB_BASE) $(CLIBS_OPTS) $(MAYBE_IDL)
+ else
+ OBJS_LIBS := $(OBJ_LINK) $(CLIBS_OPTS) $(MAYBE_IDL)
+ endif
+else
+ OBJS_LIBS := $(CLIBS_OPTS) $(MAYBE_IDL)
+endif
+
+# If we have to make byte-code
+ifndef REAL_OCAMLC
+ BYTE_OCAML := y
+
+ # EXTRADEPS is added dependencies we have to insert for all
+ # executable files we generate. Ideally it should be all of the
+ # libraries we use, but it's hard to find the ones that get searched on
+ # the path since I don't know the paths built into the compiler, so
+ # just include the ones with slashes in their names.
+ EXTRADEPS := $(addsuffix .cma,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i))))
+ SPECIAL_OCAMLFLAGS := $(OCAMLBCFLAGS)
+
+ REAL_OCAMLC := $(INTF_OCAMLC)
+
+ REAL_IMPL := $(IMPL_CMO)
+ REAL_IMPL_INTF := $(IMPLO_INTF)
+ IMPL_SUF := .cmo
+
+ DEPFLAGS :=
+ MAKE_DEPS := $(MLDEPS) $(BCDEPIS)
+
+ ifdef CREATE_LIB
+ override CFLAGS := $(PIC_CFLAGS) $(CFLAGS)
+ override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS)
+ ifndef STATIC
+ ifneq ($(strip $(OBJ_LINK)),)
+ MAKEDLL := $(DLLSONAME)
+ ALL_LDFLAGS := -dllib $(DLLSONAME)
+ endif
+ endif
+ endif
+
+ ifndef NO_CUSTOM
+ ifneq "$(strip $(OBJ_LINK) $(THREADS) $(MAYBE_IDL) $(CLIBS))" ""
+ ALL_LDFLAGS += -custom
+ endif
+ endif
+
+ ALL_LDFLAGS += $(INCFLAGS) $(OCAMLLDFLAGS) $(OCAMLBLDFLAGS) \
+ $(COMMON_LDFLAGS) $(LIBS:%=%.cma)
+ CAMLIDLDLLFLAGS :=
+
+ ifdef THREADS
+ ifdef VMTHREADS
+ THREAD_FLAG := -vmthread
+ else
+ THREAD_FLAG := -thread
+ endif
+ ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS)
+ ifndef CREATE_LIB
+ ifndef REAL_OCAMLFIND
+ ALL_LDFLAGS := unix.cma threads.cma $(ALL_LDFLAGS)
+ endif
+ endif
+ endif
+
+# we have to make native-code
+else
+ EXTRADEPS := $(addsuffix .cmxa,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i))))
+ ifndef PROFILING
+ SPECIAL_OCAMLFLAGS := $(OCAMLNCFLAGS)
+ PLDFLAGS :=
+ else
+ SPECIAL_OCAMLFLAGS := -p $(OCAMLNCFLAGS)
+ PLDFLAGS := -p
+ endif
+
+ REAL_IMPL := $(IMPL_CMX)
+ REAL_IMPL_INTF := $(IMPLX_INTF)
+ IMPL_SUF := .cmx
+
+ override CPPFLAGS := -DNATIVE_CODE $(CPPFLAGS)
+
+ DEPFLAGS := -native
+ MAKE_DEPS := $(MLDEPS) $(NCDEPIS)
+
+ ALL_LDFLAGS := $(PLDFLAGS) $(INCFLAGS) $(OCAMLLDFLAGS) \
+ $(OCAMLNLDFLAGS) $(COMMON_LDFLAGS)
+ CAMLIDLDLLFLAGS := -opt
+
+ ifndef CREATE_LIB
+ ALL_LDFLAGS += $(LIBS:%=%.cmxa)
+ else
+ override CFLAGS := $(PIC_CFLAGS) $(CFLAGS)
+ override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS)
+ endif
+
+ ifdef THREADS
+ THREAD_FLAG := -thread
+ ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS)
+ ifndef CREATE_LIB
+ ifndef REAL_OCAMLFIND
+ ALL_LDFLAGS := unix.cmxa threads.cmxa $(ALL_LDFLAGS)
+ endif
+ endif
+ endif
+endif
+
+export MAKE_DEPS
+
+ifdef ANNOTATE
+ ANNOT_FLAG := -dtypes
+else
+endif
+
+ALL_OCAMLCFLAGS := $(THREAD_FLAG) $(ANNOT_FLAG) $(OCAMLFLAGS) \
+ $(INCFLAGS) $(SPECIAL_OCAMLFLAGS)
+
+ifdef make_deps
+ -include $(MAKE_DEPS)
+ PRE_TARGETS :=
+endif
+
+###########################################################################
+# USER RULES
+
+# Call "OCamlMakefile QUIET=" to get rid of all of the @'s.
+QUIET=@
+
+# generates byte-code (default)
+byte-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes
+bc: byte-code
+
+byte-code-nolink: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes
+bcnl: byte-code-nolink
+
+top: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(TOPRESULT) \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes
+
+# generates native-code
+
+native-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ make_deps=yes
+nc: native-code
+
+native-code-nolink: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ make_deps=yes
+ncnl: native-code-nolink
+
+# generates byte-code libraries
+byte-code-library: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(BCRESULT).cma \
+ REAL_RESULT="$(BCRESULT)" \
+ CREATE_LIB=yes \
+ make_deps=yes
+bcl: byte-code-library
+
+# generates native-code libraries
+native-code-library: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(NCRESULT).cmxa \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ CREATE_LIB=yes \
+ make_deps=yes
+ncl: native-code-library
+
+ifdef WIN32
+# generates byte-code dll
+byte-code-dll: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(BCRESULT).dll \
+ REAL_RESULT="$(BCRESULT)" \
+ make_deps=yes
+bcd: byte-code-dll
+
+# generates native-code dll
+native-code-dll: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(NCRESULT).dll \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ make_deps=yes
+ncd: native-code-dll
+endif
+
+# generates byte-code with debugging information
+debug-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes \
+ OCAMLFLAGS="-g $(OCAMLFLAGS)" \
+ OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
+dc: debug-code
+
+debug-code-nolink: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes \
+ OCAMLFLAGS="-g $(OCAMLFLAGS)" \
+ OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
+dcnl: debug-code-nolink
+
+# generates byte-code libraries with debugging information
+debug-code-library: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(BCRESULT).cma \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes \
+ CREATE_LIB=yes \
+ OCAMLFLAGS="-g $(OCAMLFLAGS)" \
+ OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
+dcl: debug-code-library
+
+# generates byte-code for profiling
+profiling-byte-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \
+ REAL_RESULT="$(BCRESULT)" PROFILING="y" \
+ make_deps=yes
+pbc: profiling-byte-code
+
+# generates native-code
+
+profiling-native-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ PROFILING="y" \
+ make_deps=yes
+pnc: profiling-native-code
+
+# generates byte-code libraries
+profiling-byte-code-library: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(BCRESULT).cma \
+ REAL_RESULT="$(BCRESULT)" PROFILING="y" \
+ CREATE_LIB=yes \
+ make_deps=yes
+pbcl: profiling-byte-code-library
+
+# generates native-code libraries
+profiling-native-code-library: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(NCRESULT).cmxa \
+ REAL_RESULT="$(NCRESULT)" PROFILING="y" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ CREATE_LIB=yes \
+ make_deps=yes
+pncl: profiling-native-code-library
+
+# packs byte-code objects
+pack-byte-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT).cmo \
+ REAL_RESULT="$(BCRESULT)" \
+ PACK_LIB=yes make_deps=yes
+pabc: pack-byte-code
+
+# packs native-code objects
+pack-native-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(NCRESULT).cmx $(NCRESULT).o \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ PACK_LIB=yes make_deps=yes
+panc: pack-native-code
+
+# generates HTML-documentation
+htdoc: doc/$(RESULT)/html
+
+# generates Latex-documentation
+ladoc: doc/$(RESULT)/latex
+
+# generates PostScript-documentation
+psdoc: doc/$(RESULT)/latex/doc.ps
+
+# generates PDF-documentation
+pdfdoc: doc/$(RESULT)/latex/doc.pdf
+
+# generates all supported forms of documentation
+doc: htdoc ladoc psdoc pdfdoc
+
+###########################################################################
+# LOW LEVEL RULES
+
+$(REAL_RESULT): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) $(RESULTDEPS)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) \
+ $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \
+ $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \
+ $(REAL_IMPL)
+
+nolink: $(REAL_IMPL_INTF) $(OBJ_LINK)
+
+ifdef WIN32
+$(REAL_RESULT).dll: $(REAL_IMPL_INTF) $(OBJ_LINK)
+ $(CAMLIDLDLL) $(CAMLIDLDLLFLAGS) $(OBJ_LINK) $(CLIBS) \
+ -o $@ $(REAL_IMPL)
+endif
+
+%$(TOPSUFFIX): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS)
+ $(REAL_OCAMLFIND) $(OCAMLMKTOP) \
+ $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \
+ $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \
+ $(REAL_IMPL)
+
+.SUFFIXES: .mli .ml .cmi .cmo .cmx .cma .cmxa .$(EXT_OBJ) \
+ .mly .di .d .$(EXT_LIB) .idl %.oxridl .c .$(EXT_CXX) .h .so \
+ .rep .zog .glade
+
+ifndef STATIC
+ifdef MINGW
+$(DLLSONAME): $(OBJ_LINK)
+ $(CC) $(CFLAGS) $(CFLAGS_WIN32) $(OBJ_LINK) -shared -o $@ \
+ -Wl,--whole-archive $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/lib%.a))) \
+ $(OCAMLLIBPATH)/ocamlrun.a \
+ -Wl,--export-all-symbols \
+ -Wl,--no-whole-archive
+else
+ifdef MSVC
+$(DLLSONAME): $(OBJ_LINK)
+ link /NOLOGO /DLL /OUT:$@ $(OBJ_LINK) \
+ $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/%.lib))) \
+ $(OCAMLLIBPATH)/ocamlrun.lib
+
+else
+$(DLLSONAME): $(OBJ_LINK)
+ $(OCAMLMKLIB) $(INCFLAGS) $(CLIBFLAGS) \
+ -o $(CLIB_BASE) $(OBJ_LINK) $(CLIBS:%=-l%) \
+ $(OCAMLMKLIB_FLAGS)
+endif
+endif
+endif
+
+ifndef LIB_PACK_NAME
+$(RESULT).cma: $(REAL_IMPL_INTF) $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) \
+ $(OBJS_LIBS) -o $@ $(OCAMLBLDFLAGS) $(REAL_IMPL)
+
+$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(REAL_IMPL_INTF) $(EXTRADEPS) $(RESULTDEPS)
+ $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) \
+ $(OCAMLNLDFLAGS) -o $@ $(REAL_IMPL)
+else
+ifdef BYTE_OCAML
+$(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo: $(REAL_IMPL_INTF)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmo $(REAL_IMPL)
+else
+$(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx: $(REAL_IMPL_INTF)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmx $(REAL_IMPL)
+endif
+
+$(RESULT).cma: $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) \
+ $(OBJS_LIBS) -o $@ $(OCAMLBLDFLAGS) $(LIB_PACK_NAME).cmo
+
+$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx $(EXTRADEPS) $(RESULTDEPS)
+ $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) \
+ $(OCAMLNLDFLAGS) -o $@ $(LIB_PACK_NAME).cmx
+endif
+
+$(RES_CLIB): $(OBJ_LINK)
+ifndef MSVC
+ ifneq ($(strip $(OBJ_LINK)),)
+ $(AR) rcs $@ $(OBJ_LINK)
+ endif
+else
+ ifneq ($(strip $(OBJ_LINK)),)
+ lib -nologo -debugtype:cv -out:$(RES_CLIB) $(OBJ_LINK)
+ endif
+endif
+
+.mli.cmi: $(EXTRADEPS)
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c $(THREAD_FLAG) $(ANNOT_FLAG) \
+ $(OCAMLFLAGS) $(INCFLAGS) $<; \
+ $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c $(THREAD_FLAG) $(ANNOT_FLAG) \
+ $(OCAMLFLAGS) $(INCFLAGS) $<; \
+ else \
+ echo $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c -pp \"$$pp $(PPFLAGS)\" $(THREAD_FLAG) $(ANNOT_FLAG) \
+ $(OCAMLFLAGS) $(INCFLAGS) $<; \
+ $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c -pp "$$pp $(PPFLAGS)" $(THREAD_FLAG) $(ANNOT_FLAG) \
+ $(OCAMLFLAGS) $(INCFLAGS) $<; \
+ fi
+
+.ml.cmi .ml.$(EXT_OBJ) .ml.cmx .ml.cmo: $(EXTRADEPS)
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c $(ALL_OCAMLCFLAGS) $<; \
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c $(ALL_OCAMLCFLAGS) $<; \
+ else \
+ echo $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c -pp \"$$pp $(PPFLAGS)\" $(ALL_OCAMLCFLAGS) $<; \
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c -pp "$$pp $(PPFLAGS)" $(ALL_OCAMLCFLAGS) $<; \
+ fi
+
+ifdef PACK_LIB
+$(REAL_RESULT).cmo $(REAL_RESULT).cmx $(REAL_RESULT).o: $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack $(ALL_LDFLAGS) \
+ $(OBJS_LIBS) -o $@ $(REAL_IMPL)
+endif
+
+.PRECIOUS: %.ml
+%.ml: %.mll
+ $(OCAMLLEX) $<
+
+.PRECIOUS: %.ml %.mli
+%.ml %.mli: %.mly
+ $(OCAMLYACC) $(YFLAGS) $<
+ $(QUIET)pp=`sed -n -e 's/.*(\*pp \([^*]*\) \*).*/\1/p;q' $<`; \
+ if [ ! -z "$$pp" ]; then \
+ mv $*.ml $*.ml.temporary; \
+ echo "(*pp $$pp $(PPFLAGS)*)" > $*.ml; \
+ cat $*.ml.temporary >> $*.ml; \
+ rm $*.ml.temporary; \
+ mv $*.mli $*.mli.temporary; \
+ echo "(*pp $$pp $(PPFLAGS)*)" > $*.mli; \
+ cat $*.mli.temporary >> $*.mli; \
+ rm $*.mli.temporary; \
+ fi
+
+
+.PRECIOUS: %.ml
+%.ml: %.rep
+ $(CAMELEON_REPORT) $(CAMELEON_REPORT_FLAGS) -gen $<
+
+.PRECIOUS: %.ml
+%.ml: %.zog
+ $(CAMELEON_ZOGGY) $(CAMELEON_ZOGGY_FLAGS) -impl $< > $@
+
+.PRECIOUS: %.ml
+%.ml: %.glade
+ $(OCAML_GLADECC) $(OCAML_GLADECC_FLAGS) $< > $@
+
+.PRECIOUS: %.ml %.mli
+%.ml %.mli: %.oxridl
+ $(OXRIDL) $<
+
+.PRECIOUS: %.ml %.mli %_stubs.c %.h
+%.ml %.mli %_stubs.c %.h: %.idl
+ $(CAMLIDL) $(MAYBE_IDL_HEADER) $(IDLFLAGS) \
+ $(CAMLIDLFLAGS) $<
+ $(QUIET)if [ $(NOIDLHEADER) ]; then touch $*.h; fi
+
+.c.$(EXT_OBJ):
+ $(OCAMLC) -c -cc "$(CC)" -ccopt "$(CFLAGS) \
+ $(CPPFLAGS) $(CPPFLAGS_WIN32) \
+ $(CFLAGS_WIN32) $(CINCFLAGS) $(CFLAG_O)$@ " $<
+
+.$(EXT_CXX).$(EXT_OBJ):
+ $(CXX) -c $(CXXFLAGS) $(CINCFLAGS) $(CPPFLAGS) \
+ -I'$(OCAMLLIBPATH)' \
+ $< $(CFLAG_O)$@
+
+$(MLDEPDIR)/%.d: %.ml
+ $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
+ $(DINCFLAGS) $< \> $@; \
+ $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
+ $(DINCFLAGS) $< > $@; \
+ else \
+ echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
+ -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \
+ $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
+ -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \
+ fi
+
+$(BCDIDIR)/%.di $(NCDIDIR)/%.di: %.mli
+ $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< \> $@; \
+ $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< > $@; \
+ else \
+ echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \
+ -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \
+ $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \
+ -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \
+ fi
+
+doc/$(RESULT)/html: $(DOC_FILES)
+ mkdir -p $@
+ find $@ -maxdepth 1 -type f -delete
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(OCAMLDOC) -html -d $@ $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \
+ $(OCAMLDOC) -html -d $@ $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \
+ else \
+ echo $(OCAMLDOC) -pp \"$$pp $(PPFLAGS)\" -html -d $@ $(OCAMLDOCFLAGS) \
+ $(INCFLAGS) $(DOC_FILES); \
+ $(OCAMLDOC) -pp "$$pp $(PPFLAGS)" -html -d $@ $(OCAMLDOCFLAGS) \
+ $(INCFLAGS) $(DOC_FILES); \
+ fi
+
+doc/$(RESULT)/latex: $(DOC_FILES)
+ mkdir -p $@
+ find $@ -maxdepth 1 -type f -delete
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(OCAMLDOC) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) \
+ $(DOC_FILES) -o $@/doc.tex; \
+ $(OCAMLDOC) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES) \
+ -o $@/doc.tex; \
+ else \
+ echo $(OCAMLDOC) -pp \"$$pp $(PPFLAGS)\" -latex $(OCAMLDOCFLAGS) \
+ $(INCFLAGS) $(DOC_FILES) -o $@/doc.tex; \
+ $(OCAMLDOC) -pp "$$pp $(PPFLAGS)" -latex $(OCAMLDOCFLAGS) \
+ $(INCFLAGS) $(DOC_FILES) -o $@/doc.tex; \
+ fi
+
+doc/$(RESULT)/latex/doc.ps: doc/$(RESULT)/latex
+ cd doc/$(RESULT)/latex && \
+ $(LATEX) doc.tex && \
+ $(LATEX) doc.tex && \
+ $(DVIPS) $(DVIPSFLAGS) doc.dvi -o $(@F)
+
+doc/$(RESULT)/latex/doc.pdf: doc/$(RESULT)/latex/doc.ps
+ cd doc/$(RESULT)/latex && $(PS2PDF) $(<F)
+
+define make_subproj
+.PHONY:
+subproj_$(1):
+ $$(eval $$(call PROJ_$(1)))
+ $(QUIET)if [ "$(SUBTARGET)" != "all" ]; then \
+ $(MAKE) -f $(OCAMLMAKEFILE) $(SUBTARGET); \
+ fi
+endef
+
+$(foreach subproj,$(SUBPROJS),$(eval $(call make_subproj,$(subproj))))
+
+.PHONY:
+subprojs: $(SUBPROJS:%=subproj_%)
+
+###########################################################################
+# (UN)INSTALL RULES FOR LIBRARIES
+
+.PHONY: libinstall
+libinstall: all
+ $(QUIET)printf "\nInstalling library with ocamlfind\n"
+ $(OCAMLFIND) install $(OCAMLFIND_INSTFLAGS) $(RESULT) META $(LIBINSTALL_FILES)
+ $(QUIET)printf "\nInstallation successful.\n"
+
+.PHONY: libuninstall
+libuninstall:
+ $(QUIET)printf "\nUninstalling library with ocamlfind\n"
+ $(OCAMLFIND) remove $(OCAMLFIND_INSTFLAGS) $(RESULT)
+ $(QUIET)printf "\nUninstallation successful.\n"
+
+.PHONY: rawinstall
+rawinstall: all
+ $(QUIET)printf "\nInstalling library to: $(OCAML_LIB_INSTALL)\n"
+ -install -d $(OCAML_LIB_INSTALL)
+ for i in $(LIBINSTALL_FILES); do \
+ if [ -f $$i ]; then \
+ install -c -m 0644 $$i $(OCAML_LIB_INSTALL); \
+ fi; \
+ done
+ $(QUIET)printf "\nInstallation successful.\n"
+
+.PHONY: rawuninstall
+rawuninstall:
+ $(QUIET)printf "\nUninstalling library from: $(OCAML_LIB_INSTALL)\n"
+ cd $(OCAML_LIB_INSTALL) && rm $(notdir $(LIBINSTALL_FILES))
+ $(QUIET)printf "\nUninstallation successful.\n"
+
+###########################################################################
+# MAINTAINANCE RULES
+
+.PHONY: clean
+clean::
+ rm -f $(TARGETS) $(TRASH)
+ rm -rf $(BCDIDIR) $(NCDIDIR) $(MLDEPDIR)
+
+.PHONY: cleanup
+cleanup::
+ rm -f $(NONEXECS) $(TRASH)
+ rm -rf $(BCDIDIR) $(NCDIDIR) $(MLDEPDIR)
+
+.PHONY: clean-doc
+clean-doc::
+ rm -rf doc
+
+.PHONY: nobackup
+nobackup:
+ rm -f *.bak *~ *.dup
diff --git a/README.txt b/README.txt
new file mode 100644
index 0000000..6ec8b74
--- /dev/null
+++ b/README.txt
@@ -0,0 +1,84 @@
+XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet
+====================================================================
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version,,
+ * with the special exception on linking described in file LICENSE.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+What is XmlRpc Light?
+---------------------
+
+XmlRpc-Light is an XmlRpc client and server library written in
+OCaml. It is based on the the Xml-Light and Ocamlnet libraries.
+
+Installation:
+-------------
+
+Debian binary:
+
+ sudo apt-get install libxmlrpc-light-ocaml-dev
+
+Debian source:
+
+ sudo apt-get install libxml-light-ocaml-dev libnethttpd-ocaml-dev
+ make
+ sudo make install
+
+Fedora binary:
+
+ sudo yum install ocaml-xmlrpc-light
+
+For other environments, install xml-light and ocamlnet from sources available
+at the following locations:
+
+ Xml-Light: http://tech.motion-twin.com/xmllight.html
+ Ocamlnet: http://projects.camlcity.org/projects/ocamlnet.html
+
+And then run, as usual:
+
+ make
+ sudo make install
+
+To uninstall XmlRpc-Light, which you will also need to do if you have
+already installed a previous version, type:
+
+ sudo make uninstall
+
+Usage:
+------
+
+Client example:
+
+ let rpc = new XmlRpc.client "http://localhost:8000" in
+ let result = rpc#call "echo" [`String "hello!"] in
+ print_endline (XmlRpc.dump result) ]}
+
+Server example:
+
+ let server = new XmlRpcServer.cgi () in
+ server#register "demo.sayHello"
+ (fun _ -> `String "Hello!");
+ server#run ()
+
+See the Ocamldoc-generated documentation in the "doc" directory for more
+details.
+
+Contributors:
+-------------
+
+Dave Benjamin (dave@ramenlabs.com)
+
+License:
+--------
+
+See LICENSE
diff --git a/XmlRpc.ml b/XmlRpc.ml
new file mode 100644
index 0000000..b398318
--- /dev/null
+++ b/XmlRpc.ml
@@ -0,0 +1,575 @@
+(*
+ * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet
+ * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *)
+
+let version = "0.6.1"
+
+exception Error of (int * string)
+
+type value =
+ [ `Array of value list
+ | `Binary of string
+ | `Boolean of bool
+ | `DateTime of XmlRpcDateTime.t
+ | `Double of float
+ | `Int of int
+ | `Int32 of int32
+ | `Nil
+ | `String of string
+ | `Struct of (string * value) list ]
+
+type message =
+ | MethodCall of (string * value list)
+ | MethodResponse of value
+ | Fault of (int * string)
+
+let safe_map f xs =
+ List.rev (List.rev_map f xs)
+
+let invalid_xml () =
+ raise (Error (-32700, "parse error. not well formed"))
+
+let invalid_xmlrpc () =
+ raise (Error (-32600,
+ "server error. invalid xml-rpc. not conforming to spec"))
+
+let rec dump = function
+ | `String data -> data
+ | `Int data -> string_of_int data
+ | `Int32 data -> Int32.to_string data
+ | `Nil -> "(nil)"
+ | `Boolean data -> if data then "true" else "false"
+ | `Double data -> string_of_float data
+ | `Binary data -> data
+ | `Array data -> "[" ^ (String.concat ", "
+ (safe_map dump data)) ^ "]"
+ | `Struct data -> "{" ^ (String.concat ", "
+ (safe_map
+ (fun (n, v) ->
+ n ^ ": " ^ (dump v))
+ data)) ^ "}"
+ | `DateTime data -> XmlRpcDateTime.to_string data
+
+let rec xml_element_of_value
+ ?(base64_encoder=fun s -> XmlRpcBase64.str_encode s)
+ ?(datetime_encoder=XmlRpcDateTime.to_string)
+ value =
+ Xml.Element
+ (match value with
+ | `String data -> ("string", [], [Xml.PCData data])
+ | `Int data -> ("int", [], [Xml.PCData (string_of_int data)])
+ | `Int32 data -> ("int", [], [Xml.PCData (Int32.to_string data)])
+ | `Nil -> ("nil", [], [])
+ | `Boolean data -> ("boolean", [], [Xml.PCData
+ (if data then "1" else "0")])
+ | `Double data -> ("double", [], [Xml.PCData (string_of_float data)])
+ | `Binary data -> ("base64", [], [Xml.PCData (base64_encoder data)])
+ | `Array data ->
+ ("array", [], [Xml.Element
+ ("data", [],
+ safe_map
+ (fun item ->
+ Xml.Element ("value", [],
+ [xml_element_of_value
+ ~base64_encoder
+ ~datetime_encoder
+ item]))
+ data)])
+ | `Struct data ->
+ ("struct", [],
+ safe_map
+ (fun (name, value) ->
+ Xml.Element
+ ("member", [],
+ [Xml.Element ("name", [], [Xml.PCData name]);
+ Xml.Element ("value", [],
+ [xml_element_of_value
+ ~base64_encoder
+ ~datetime_encoder
+ value])]))
+ data)
+ | `DateTime data ->
+ ("dateTime.iso8601", [],
+ [Xml.PCData (datetime_encoder data)]))
+
+let rec value_of_xml_element
+ ?(base64_decoder=fun s -> XmlRpcBase64.str_decode s)
+ ?(datetime_decoder=XmlRpcDateTime.of_string)
+ = function
+ | Xml.Element ("string", [], []) -> `String ""
+ | Xml.Element ("string", [], [Xml.PCData data]) -> `String data
+ | Xml.Element ("int", [], [Xml.PCData data])
+ | Xml.Element ("i4", [], [Xml.PCData data]) ->
+ (try `Int (int_of_string data)
+ with Failure "int_of_string" -> `Int32 (Int32.of_string data))
+ | Xml.Element ("nil", [], []) -> `Nil
+ | Xml.Element ("boolean", [], [Xml.PCData data]) ->
+ `Boolean (data <> "0")
+ | Xml.Element ("double", [], [Xml.PCData data]) ->
+ `Double (float_of_string data)
+ | Xml.Element ("base64", [], []) -> `Binary ""
+ | Xml.Element ("base64", [], [Xml.PCData data]) ->
+ `Binary (base64_decoder data)
+ | Xml.Element ("array", [], [Xml.Element ("data", [], data)]) ->
+ `Array
+ (safe_map
+ (function
+ | Xml.Element ("value", [], []) ->
+ (* Empty value is assumed to be an empty string. *)
+ `String ""
+ | Xml.Element ("value", [], [value]) ->
+ value_of_xml_element
+ ~base64_decoder
+ ~datetime_decoder
+ value
+ | _ -> invalid_xmlrpc ())
+ data)
+ | Xml.Element ("struct", [], members) ->
+ `Struct
+ (safe_map
+ (function
+ | Xml.Element ("member", [],
+ [Xml.Element ("name", [], []);
+ Xml.Element ("value", [], [])]) ->
+ (* Empty value is assumed to be an empty string. *)
+ ("", `String "")
+ | Xml.Element ("member", [],
+ [Xml.Element ("name", [], [Xml.PCData name]);
+ Xml.Element ("value", [], [])]) ->
+ (* Empty value is assumed to be an empty string. *)
+ (name, `String "")
+ | Xml.Element ("member", [],
+ [Xml.Element ("name", [], []);
+ Xml.Element ("value", [], [value])]) ->
+ ("",
+ value_of_xml_element
+ ~base64_decoder
+ ~datetime_decoder
+ value)
+ | Xml.Element ("member", [],
+ [Xml.Element ("name", [], [Xml.PCData name]);
+ Xml.Element ("value", [], [value])]) ->
+ (name,
+ value_of_xml_element
+ ~base64_decoder
+ ~datetime_decoder
+ value)
+ | _ -> invalid_xmlrpc ())
+ members)
+ | Xml.Element ("dateTime.iso8601", [], [Xml.PCData data])
+ | Xml.Element ("dateTime:iso8601", [], [Xml.PCData data]) ->
+ (* The colon above is intentional. (See fix_dotted_tags.) *)
+ `DateTime (datetime_decoder data)
+ | Xml.PCData data ->
+ (* Untyped data is assumed to be a string. *)
+ `String data
+ | _ -> invalid_xmlrpc ()
+
+let xml_element_of_message
+ ?(base64_encoder=fun s -> XmlRpcBase64.str_encode s)
+ ?(datetime_encoder=XmlRpcDateTime.to_string)
+ message =
+ let make_param param =
+ Xml.Element ("param", [],
+ [Xml.Element ("value", [],
+ [xml_element_of_value
+ ~base64_encoder
+ ~datetime_encoder
+ param])]) in
+ let make_fault code string =
+ Xml.Element ("value", [],
+ [xml_element_of_value ~base64_encoder ~datetime_encoder
+ (`Struct ["faultCode", `Int code;
+ "faultString", `String string])]) in
+ match message with
+ | MethodCall (name, params) ->
+ Xml.Element
+ ("methodCall", [],
+ [Xml.Element ("methodName", [], [Xml.PCData name]);
+ Xml.Element ("params", [], safe_map make_param params)])
+ | MethodResponse value ->
+ Xml.Element
+ ("methodResponse", [],
+ [Xml.Element ("params", [], [make_param value])])
+ | Fault (code, string) ->
+ Xml.Element ("methodResponse", [],
+ [Xml.Element ("fault", [], [make_fault code string])])
+
+let message_of_xml_element
+ ?(base64_decoder=fun s -> XmlRpcBase64.str_decode s)
+ ?(datetime_decoder=XmlRpcDateTime.of_string)
+ xml_element =
+ let parse_params params =
+ safe_map
+ (function
+ | Xml.Element ("param", [], [Xml.Element ("value", [], [])]) ->
+ (* Empty value is assumed to be an empty string. *)
+ `String ""
+ | Xml.Element ("param", [],
+ [Xml.Element ("value", [], [element])]) ->
+ value_of_xml_element ~base64_decoder ~datetime_decoder element
+ | _ -> invalid_xmlrpc ())
+ params in
+ let parse_fault = function
+ | [Xml.Element ("value", [], [element])] ->
+ (match value_of_xml_element ~base64_decoder ~datetime_decoder element
+ with
+ | `Struct ["faultCode", `Int code;
+ "faultString", `String string]
+ | `Struct ["faultString", `String string;
+ "faultCode", `Int code] ->
+ (code, string)
+ | _ -> invalid_xmlrpc ())
+ | _ -> invalid_xmlrpc () in
+ match xml_element with
+ | Xml.Element ("methodCall", [],
+ [Xml.Element ("methodName", [], [Xml.PCData name]);
+ Xml.Element ("params", [], params)]) ->
+ MethodCall (name, parse_params params)
+ | Xml.Element ("methodCall", [],
+ [Xml.Element ("methodName", [], [Xml.PCData name])]) ->
+ MethodCall (name, [])
+ | Xml.Element ("methodResponse", [],
+ [Xml.Element ("params", [], params)]) ->
+ MethodResponse (List.hd (parse_params params))
+ | Xml.Element (_, [], [Xml.Element ("fault", [], fault)]) ->
+ Fault (parse_fault fault)
+ | _ -> invalid_xmlrpc ()
+
+(* Workaround for Xml-Light, which doesn't like dots in tag names. *)
+let fix_dotted_tags s =
+ let len = String.length s in
+ let in_tag = ref false in
+ for i = 0 to len - 1 do
+ match s.[i] with
+ | '<' -> in_tag := true
+ | '>' -> in_tag := false
+ | '.' when !in_tag -> s.[i] <- ':'
+ | _ -> ()
+ done
+
+let pipe_process command data =
+ let (in_channel, out_channel) = Unix.open_process command in
+ try
+ output_string out_channel data;
+ close_out out_channel;
+ let buffer_size = 2048 in
+ let buffer = Buffer.create buffer_size in
+ let string = String.create buffer_size in
+ let chars_read = ref 1 in
+ while !chars_read <> 0 do
+ chars_read := input in_channel string 0 buffer_size;
+ Buffer.add_substring buffer string 0 !chars_read
+ done;
+ let status = Unix.close_process (in_channel, out_channel) in
+ (status, Buffer.contents buffer)
+ with e ->
+ ignore (Unix.close_process (in_channel, out_channel));
+ raise e
+
+let shell_escape =
+ let unsafe = String.contains "\"$\\`" in
+ fun arg ->
+ let buf = Buffer.create 32 in
+ Buffer.add_char buf '"';
+ String.iter
+ (fun c ->
+ if unsafe c then Buffer.add_char buf '\\';
+ Buffer.add_char buf c)
+ arg;
+ Buffer.add_char buf '"';
+ Buffer.contents buf
+
+class client
+ ?(debug=false)
+ ?(headers=[])
+ ?(insecure_ssl=false)
+ ?(timeout=300.0)
+ ?(useragent="XmlRpc-Light/" ^ version)
+ url =
+object (self)
+ val url = url
+
+ val mutable debug = debug
+ val mutable headers = headers
+ val mutable insecure_ssl = insecure_ssl
+ val mutable timeout = timeout
+ val mutable useragent = useragent
+
+ val mutable base64_encoder = fun s -> XmlRpcBase64.str_encode s
+ val mutable base64_decoder = fun s -> XmlRpcBase64.str_decode s
+
+ val mutable datetime_encoder = XmlRpcDateTime.to_string
+ val mutable datetime_decoder = XmlRpcDateTime.of_string
+
+ method url =
+ let parsed_url = Neturl.parse_url url in
+ try
+ let password = Neturl.url_password parsed_url in
+ Neturl.string_of_url
+ (Neturl.modify_url
+ ~password:(String.make (String.length password) '.')
+ parsed_url)
+ with Not_found ->
+ url
+
+ method debug = debug
+ method headers = headers
+ method insecure_ssl = insecure_ssl
+ method timeout = timeout
+ method useragent = useragent
+
+ method set_debug debug' = debug <- debug'
+ method set_headers headers' = headers <- headers'
+ method set_insecure_ssl insecure_ssl' = insecure_ssl <- insecure_ssl'
+ method set_timeout timeout' = timeout <- timeout'
+ method set_useragent useragent' = useragent <- useragent'
+
+ method set_base64_encoder f = base64_encoder <- f
+ method set_base64_decoder f = base64_decoder <- f
+
+ method set_datetime_encoder f = datetime_encoder <- f
+ method set_datetime_decoder f = datetime_decoder <- f
+
+ method call name params =
+ let xml_element =
+ xml_element_of_message
+ ~base64_encoder
+ ~datetime_encoder
+ (MethodCall (name, params)) in
+
+ let xml =
+ "<?xml version=\"1.0\"?>\n"
+ ^ Xml.to_string_fmt xml_element in
+
+ if String.length url >= 5 && String.sub url 0 5 = "https"
+ then
+ begin
+ let command =
+ String.concat " "
+ (["curl";
+ "--user-agent"; shell_escape useragent;
+ "--header"; "\"Content-Type: text/xml\""]
+ @ (List.flatten
+ (List.map
+ (fun (n, v) ->
+ ["--header"; shell_escape (n ^ ": " ^ v)])
+ headers))
+ @ ["--connect-timeout"; string_of_float timeout;
+ "--fail";
+ if debug then "--verbose" else "--silent";
+ if insecure_ssl then "--insecure" else "";
+ "--data-binary"; "@-";
+ shell_escape url]) in
+
+ if debug then (prerr_endline command; prerr_endline xml);
+ let (status, contents) = pipe_process command xml in
+
+ match status with
+ | Unix.WEXITED 0 ->
+ if debug then prerr_endline contents;
+ fix_dotted_tags contents;
+ (match (message_of_xml_element
+ ~base64_decoder
+ ~datetime_decoder
+ (Xml.parse_string contents))
+ with
+ | MethodResponse value -> value
+ | Fault (code, string) -> raise (Error (code, string))
+ | _ -> invalid_xmlrpc ())
+ | Unix.WEXITED 22 ->
+ raise (Error (-32300, "transport error. client error"))
+ | Unix.WEXITED code ->
+ (if debug then Printf.eprintf "Received exit code %d\n" code);
+ raise (Error (-32300, "transport error. protocol error"))
+ | Unix.WSIGNALED _
+ | Unix.WSTOPPED _ ->
+ raise (Error (-32300, "transport error. client error"))
+ end
+ else
+ begin
+ let parsed_url = Neturl.parse_url url in
+ let basic_auth =
+ try
+ Some (Neturl.url_user parsed_url,
+ Neturl.url_password parsed_url)
+ with Not_found ->
+ None in
+ let url =
+ Neturl.string_of_url
+ (Neturl.remove_from_url ~user:true ~password:true parsed_url) in
+
+ let call = new Http_client.post_raw url xml in
+ call#set_req_header "User-Agent" useragent;
+ call#set_req_header "Content-Type" "text/xml";
+ List.iter (fun (n, v) -> call#set_req_header n v) headers;
+
+ begin
+ match basic_auth with
+ | Some (user, password) ->
+ call#set_req_header "Authorization"
+ ("Basic " ^
+ Netencoding.Base64.encode (user ^ ":" ^ password))
+ | None -> ()
+ end;
+
+ let pipeline = new Http_client.pipeline in
+ pipeline#set_proxy_from_environment ();
+
+ let opt = pipeline#get_options in
+ pipeline#set_options
+ {opt with Http_client.
+ connection_timeout = timeout;
+ };
+
+ if debug then
+ begin
+ let opt = pipeline#get_options in
+ pipeline#set_options
+ {opt with Http_client.
+ verbose_status = true;
+ verbose_request_header = true;
+ verbose_response_header = true;
+ verbose_request_contents = true;
+ verbose_response_contents = true;
+ verbose_connection = true;
+ }
+ end;
+
+ pipeline#add call;
+ pipeline#run ();
+
+ match call#status with
+ | `Successful ->
+ let contents = call#get_resp_body () in
+ fix_dotted_tags contents;
+ (match (message_of_xml_element
+ ~base64_decoder
+ ~datetime_decoder
+ (Xml.parse_string contents))
+ with
+ | MethodResponse value -> value
+ | Fault (code, string) -> raise (Error (code, string))
+ | _ -> invalid_xmlrpc ())
+ | `Client_error ->
+ raise (Error (-32300, ("transport error. client error. "
+ ^ (string_of_int
+ (call#response_status_code))
+ ^ " " ^ call#response_status_text)))
+ | `Http_protocol_error e ->
+ raise (Error (-32300, "transport error. protocol error"))
+ | `Redirection ->
+ raise (Error (-32300, "transport error. redirected"))
+ | `Server_error ->
+ raise (Error (-32300, "transport error. server error"))
+ | `Unserved ->
+ assert false
+ end
+end
+
+class multicall (client : client) =
+object (self)
+ val client = client
+ val mutable queue = []
+ val mutable executed = false
+ val mutable results = None
+ val counter = ref 0
+
+ method call name params =
+ if self#executed then failwith "multicall#call: already executed";
+ let num = !counter in
+ incr counter;
+ queue <- (name, params) :: queue;
+ lazy (self#result num)
+
+ method execute () =
+ if self#completed then failwith "multicall#execute: already completed";
+ executed <- true;
+ let calls = List.rev queue in
+ let args = [`Array
+ (safe_map
+ (fun (name, params) ->
+ `Struct ["methodName", `String name;
+ "params", `Array params])
+ calls)] in
+ match client#call "system.multicall" args with
+ | `Array values -> results <- Some (Array.of_list values)
+ | _ -> invalid_xmlrpc ()
+
+ method result num =
+ if not self#completed then self#execute ();
+ match results with
+ | Some values ->
+ (match values.(num) with
+ | `Array [v] -> v
+ | `Struct ["faultCode", `Int code;
+ "faultString", `String string]
+ | `Struct ["faultString", `String string;
+ "faultCode", `Int code] ->
+ raise (Error (code, string))
+ | _ -> invalid_xmlrpc ())
+ | None -> assert false
+
+ method executed = executed
+ method completed = results <> None
+end
+
+let default_error_handler e =
+ raise (Error (-32500, "application error. " ^ Printexc.to_string e))
+
+let quiet_error_handler e =
+ raise e
+
+let serve_message ?(error_handler=default_error_handler) f message =
+ try
+ match message with
+ | MethodCall (name, params) ->
+ (try MethodResponse (f name params) with
+ | Error _ as e -> raise e
+ | e -> error_handler e)
+ | _ -> invalid_xmlrpc ()
+ with Error (code, string) ->
+ Fault (code, string)
+
+let serve
+ ?(base64_encoder=fun s -> XmlRpcBase64.str_encode s)
+ ?(base64_decoder=fun s -> XmlRpcBase64.str_decode s)
+ ?(datetime_encoder=XmlRpcDateTime.to_string)
+ ?(datetime_decoder=XmlRpcDateTime.of_string)
+ ?(error_handler=default_error_handler)
+ f s =
+ fix_dotted_tags s;
+ try
+ begin
+ try
+ let message =
+ message_of_xml_element
+ ~base64_decoder
+ ~datetime_decoder
+ (Xml.parse_string s) in
+ let response =
+ xml_element_of_message
+ ~base64_encoder
+ ~datetime_encoder
+ (serve_message ~error_handler f message) in
+ Xml.to_string_fmt response
+ with Xml.Error _ ->
+ invalid_xml ()
+ end
+ with Error (code, string) ->
+ Xml.to_string_fmt (xml_element_of_message (Fault (code, string)))
diff --git a/XmlRpc.mli b/XmlRpc.mli
new file mode 100644
index 0000000..e7ad56e
--- /dev/null
+++ b/XmlRpc.mli
@@ -0,0 +1,338 @@
+(*
+ * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet
+ * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *)
+
+(** XmlRpc Light.
+
+ XmlRpc Light is a minimal XmlRpc library based on Xml Light and Ocamlnet.
+
+ It provides a type for values, a client class with a simple calling
+ interface, and low-level tools that can be used to implement a server.
+
+ {i (c) 2007-2009 Dave Benjamin}
+*)
+
+(** Version of XmlRpc-Light as a string. *)
+val version : string
+
+(** {2 High-level interface} *)
+
+(** Example: {[
+ let rpc = new XmlRpc.client "http://localhost:8000" in
+ let result = rpc#call "echo" [`String "hello!"] in
+ print_endline (XmlRpc.dump result) ]}
+*)
+
+(** Raised for all errors including XmlRpc faults (code, string). *)
+exception Error of (int * string)
+
+(** Polymorphic variant type for XmlRpc values:
+ - [`Array]: An ordered list of values
+ - [`Binary]: A string containing binary data
+ - [`Boolean]: A boolean
+ - [`DateTime]: A date/time value
+ - [`Double]: A floating-point value
+ - [`Int]: An integer
+ - [`Int32]: A 32-bit integer
+ - [`Nil]: A null value
+ - [`String]: A string
+ - [`Struct]: An association list of (name, value) pairs
+
+ Note that base64-encoding of [`Binary] values is done automatically.
+ You do not need to do the encoding yourself.
+*)
+type value =
+ [ `Array of value list
+ | `Binary of string
+ | `Boolean of bool
+ | `DateTime of XmlRpcDateTime.t
+ | `Double of float
+ | `Int of int
+ | `Int32 of int32
+ | `Nil
+ | `String of string
+ | `Struct of (string * value) list ]
+
+(** Class for XmlRpc clients. Takes a single mandatory argument, [url].
+
+ If [url] is of the form "http://username:password@...", basic
+ authentication will be used.
+
+ If [url] starts with "https", Curl will be used instead of Ocamlnet.
+ The "curl" command-line program must be in your path for this to work.
+ You can use the [insecure_ssl] setting to allow connections to servers
+ with self-signed certificates; by default this is false and certificates
+ must be valid.
+
+ [timeout] can be used to specify the maximum amount of time
+ elapsed before a connection is cancelled. It defaults to 300.0 seconds.
+
+ [headers] may contain an array of (name, value) pairs of additional
+ headers to send with each request.
+
+ The [useragent] setting provides a convenient way to change the
+ User-Agent header, which defaults to "XmlRpc-Light/<version>".
+
+ The [debug] setting, if true, will enable verbose debugging output to
+ the standard error stream.
+*)
+class client :
+ ?debug:bool ->
+ ?headers:(string * string) list ->
+ ?insecure_ssl:bool ->
+ ?timeout:float ->
+ ?useragent:string ->
+ string ->
+object
+ (** Url of the remote XmlRpc server. *)
+ val url : string
+
+ (** If true, Xml messages will be printed to standard error. *)
+ val mutable debug : bool
+
+ (** List of custom HTTP headers to send with each request. *)
+ val mutable headers : (string * string) list
+
+ (** If true, SSL will be allowed even if the certificate is self-signed. *)
+ val mutable insecure_ssl : bool
+
+ (** Maximum time to wait for a request to complete, in seconds. *)
+ val mutable timeout : float
+
+ (** User-agent to send in request headers. *)
+ val mutable useragent : string
+
+ (** Gets [url]. *)
+ method url : string
+
+ (** Gets [debug]. *)
+ method debug : bool
+
+ (** Sets [debug]. *)
+ method set_debug : bool -> unit
+
+ (** Gets [headers]. *)
+ method headers : (string * string) list
+
+ (** Sets [headers]. *)
+ method set_headers : (string * string) list -> unit
+
+ (** Gets [insecure_ssl]. *)
+ method insecure_ssl : bool
+
+ (** Sets [insecure_ssl]. *)
+ method set_insecure_ssl : bool -> unit
+
+ (** Gets [timeout]. *)
+ method timeout : float
+
+ (** Sets [timeout]. *)
+ method set_timeout : float -> unit
+
+ (** Gets [useragent]. *)
+ method useragent : string
+
+ (** Sets [useragent]. *)
+ method set_useragent : string -> unit
+
+ (** Sets an alternate Base-64 binary encoding function. *)
+ method set_base64_encoder : (string -> string) -> unit
+
+ (** Sets an alternate Base-64 binary decoding function. *)
+ method set_base64_decoder : (string -> string) -> unit
+
+ (** Sets an alternate ISO-8601 date/time encoding function. *)
+ method set_datetime_encoder : (XmlRpcDateTime.t -> string) -> unit
+
+ (** Sets an alternate ISO-8601 date/time decoding function. *)
+ method set_datetime_decoder : (string -> XmlRpcDateTime.t) -> unit
+
+ (** [call name params] invokes an XmlRpc method and returns the result,
+ or raises {!XmlRpc.Error} on error. *)
+ method call : string -> value list -> value
+end
+
+(** Convenience class for [system.multicall] calls.
+
+ Instances take an {!XmlRpc.client} as an argument: {[
+ # let mc = new XmlRpc.multicall client;;
+ val mc : XmlRpc.multicall = <obj>
+ ]}
+ The "call" method works like [client#call], but it returns a lazy
+ value: {[
+ # let a = mc#call "demo.addTwoNumbers" [`Int 3; `Int 4];;
+ val a : XmlRpc.value Lazy.t = <lazy>
+ # let b = mc#call "demo.addTwoNumbers" [`Int 42; `String "oh noes!"];;
+ val b : XmlRpc.value Lazy.t = <lazy>
+ # let c = mc#call "demo.addTwoNumbers" [`Double 3.0; `Double 4.0];;
+ val c : XmlRpc.value Lazy.t = <lazy>
+ ]}
+ At this point, the call has not been executed yet: {[
+ # mc#executed;;
+ -- : bool = false
+ ]}
+ As soon as one of the return values is forced, the call is executed: {[
+ # Lazy.force a;;
+ -- : XmlRpc.value = `Int 7
+ # mc#executed;;
+ -- : bool = true
+ ]}
+ Once a call has been executed, this instance cannot be used to make any
+ further calls; instead, a new [multicall] instance must be created: {[
+ # mc#call "demo.addTwoNumbers" [`Int 2; `Int 2];;
+ Exception: Failure "multicall#call: already executed".
+ ]}
+ If an XmlRpc fault occurred, the exception will be thrown when the lazy
+ value is forced: {[
+ # Lazy.force b;;
+ Exception: XmlRpc.Error (-32602, "server error. invalid method parameters").
+ ]}
+ This will not prevent further methods from executing successfully: {[
+ # Lazy.force c;;
+ -- : XmlRpc.value = `Double 7.
+ ]}
+ It is possible for a [multicall] to be executed but not completed, for
+ example if a transport error occurs. Aside from catching the exception,
+ the [completed] property indicates if the call actually went through
+ or not: {[
+ # mc#completed;;
+ -- : bool = true
+ ]}
+ It is not necessary to use lazy values. Instead, the call can be
+ executed explicitly, and the results can be retrieved by number: {[
+ # let mc = new XmlRpc.multicall client;;
+ val mc : XmlRpc.multicall = <obj>
+ # ignore (mc#call "demo.addTwoNumbers" [`Int 2; `Int 2]);;
+ -- : unit = ()
+ # ignore (mc#call "demo.addTwoNumbers" [`Int 3; `Int 3]);;
+ -- : unit = ()
+ # mc#result 1;;
+ -- : XmlRpc.value = `Int 6
+ ]}
+*)
+class multicall : client ->
+object
+ (** Adds a call to this [multicall] instance.
+ If the call has already executed, the following exception will
+ be raised:
+ Failure "multicall#call: already executed". *)
+ method call : string -> value list -> value Lazy.t
+
+ (** Forces the call to execute immediately.
+ If the call has already executed and completed successfully, the
+ following exception will be raised:
+ Failure "multicall#execute: already completed". *)
+ method execute : unit -> unit
+
+ (** Returns a [multicall] result, executing the call if necessary.
+ The results are numbered starting with zero. *)
+ method result : int -> value
+
+ (** True if the call has executed, whether or not it succeeded. *)
+ method executed : bool
+
+ (** True of the call has executed and completed successfully. *)
+ method completed : bool
+end
+
+(** {2 Utility functions} *)
+
+(** Converts an XmlRpc value to a human-readable string. *)
+val dump : value -> string
+
+(** {2 Low-level interface} *)
+
+(** Type for XmlRpc messages. *)
+type message =
+ | MethodCall of (string * value list)
+ | MethodResponse of value
+ | Fault of (int * string)
+
+(** Converts an Xml Light element to an XmlRpc message. *)
+val message_of_xml_element :
+ ?base64_decoder:(string -> string) ->
+ ?datetime_decoder:(string -> XmlRpcDateTime.t) ->
+ Xml.xml -> message
+
+(** Converts an XmlRpc message to an Xml Light element. *)
+val xml_element_of_message :
+ ?base64_encoder:(string -> string) ->
+ ?datetime_encoder:(XmlRpcDateTime.t -> string) ->
+ message -> Xml.xml
+
+(** Converts an Xml Light element to an XmlRpc value. *)
+val value_of_xml_element :
+ ?base64_decoder:(string -> string) ->
+ ?datetime_decoder:(string -> XmlRpcDateTime.t) ->
+ Xml.xml -> value
+
+(** Converts an XmlRpc value to an Xml Light element. *)
+val xml_element_of_value :
+ ?base64_encoder:(string -> string) ->
+ ?datetime_encoder:(XmlRpcDateTime.t -> string) ->
+ value -> Xml.xml
+
+(** {2 Server tools} *)
+
+(** Creates a function from string (Xml representing a [MethodCall]) to
+ string (Xml representing a [MethodResult] or [Fault]) given a function
+ of the form: ([name] -> [params] -> [result]), where [name] is the
+ name of the method, [params] is a list of parameter values, and
+ [result] is the result value.
+
+ This function can be used to build many different kinds of XmlRpc
+ servers since it makes no assumptions about the network library
+ or other communications method used.
+
+ If an exception other than {!XmlRpc.Error} occurs, the exception is
+ passed to [error_handler]. If [error_handler] returns a message,
+ the message will be used as the result. If an {!XmlRpc.Error} is
+ raised by either the main function or [error_handler], it will be
+ converted to an XmlRpc [Fault]. Any other exception raised by
+ [error_handler] is allowed to escape.
+
+ For a full-featured, easy-to-use, network-capable server implementation,
+ see the {!XmlRpcServer} module. *)
+val serve :
+ ?base64_encoder:(string -> string) ->
+ ?base64_decoder:(string -> string) ->
+ ?datetime_encoder:(XmlRpcDateTime.t -> string) ->
+ ?datetime_decoder:(string -> XmlRpcDateTime.t) ->
+ ?error_handler:(exn -> message) ->
+ (string -> value list -> value) -> string -> string
+
+(** Performs the same function as [serve], but operates on typed messages
+ instead of strings. *)
+val serve_message :
+ ?error_handler:(exn -> message) ->
+ (string -> value list -> value) -> message -> message
+
+(** The default error handler for [serve].
+
+ This error handler catches all exceptions and converts them into
+ faults by wrapping them in [XmlRpc.Error]. *)
+val default_error_handler : exn -> message
+
+(** A "quiet" error handler for [serve].
+
+ This error handler simply re-raises the exception. Use this if you
+ want exceptions to remain unhandled so that they will escape to the
+ error log. The client will receive a generic "transport error",
+ which is more secure since it does not reveal any information about
+ the specific exception that occurred. *)
+val quiet_error_handler : exn -> message
diff --git a/XmlRpcBase64.ml b/XmlRpcBase64.ml
new file mode 100644
index 0000000..91c53a3
--- /dev/null
+++ b/XmlRpcBase64.ml
@@ -0,0 +1,138 @@
+(*
+ * XmlRpcBase64 - Base64 codec for XmlRpc
+ * Copyright (C) 2007-2009 Dave Benjamin
+ * Copyright (C) 2003 Nicolas Cannasse
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version,
+ * with the special exception on linking described in file LICENSE.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * This module is based on the ExtLib Base64 codec, written by
+ * Nicolas Cannasse, with the following modifications to enable
+ * compatibility with various XmlRpc implementations:
+ *
+ * - For encoding, output is padded with '=' to a multiple of four characters.
+ * - For decoding, the input characters '\r', '\n', and '=' are ignored.
+ *
+ * To avoid a dependency on ExtLib, this version uses OCaml's built-in Stream
+ * type instead of ExtLib's IO type.
+ *
+ * Original copyright:
+ *
+ * Base64 - Base64 codec
+ * Copyright (C) 2003 Nicolas Cannasse
+ *)
+
+exception Invalid_char
+exception Invalid_table
+
+external unsafe_char_of_int : int -> char = "%identity"
+
+type encoding_table = char array
+type decoding_table = int array
+
+let chars = [|
+ 'A';'B';'C';'D';'E';'F';'G';'H';'I';'J';'K';'L';'M';'N';'O';'P';
+ 'Q';'R';'S';'T';'U';'V';'W';'X';'Y';'Z';'a';'b';'c';'d';'e';'f';
+ 'g';'h';'i';'j';'k';'l';'m';'n';'o';'p';'q';'r';'s';'t';'u';'v';
+ 'w';'x';'y';'z';'0';'1';'2';'3';'4';'5';'6';'7';'8';'9';'+';'/'
+ |]
+
+let make_decoding_table tbl =
+ if Array.length tbl <> 64 then raise Invalid_table;
+ let d = Array.make 256 (-1) in
+ for i = 0 to 63 do
+ Array.unsafe_set d (int_of_char (Array.unsafe_get tbl i)) i;
+ done;
+ d
+
+let inv_chars = make_decoding_table chars
+
+let encode ?(tbl=chars) strm =
+ if Array.length tbl <> 64 then raise Invalid_table;
+ let data = ref 0 in
+ let count = ref 0 in
+ let pad = ref None in
+ let rec next i =
+ if !count >= 6
+ then
+ begin
+ count := !count - 6;
+ let d = (!data asr !count) land 63 in
+ Some (Array.unsafe_get tbl d)
+ end
+ else
+ begin
+ try
+ let c = int_of_char (Stream.next strm) in
+ data := (!data lsl 8) lor c;
+ count := !count + 2;
+ let d = (!data asr !count) land 63 in
+ Some (Array.unsafe_get tbl d)
+ with Stream.Failure ->
+ match !pad with
+ | Some 0 ->
+ None
+ | Some n ->
+ pad := Some (n - 1);
+ Some '='
+ | None ->
+ if !count > 0
+ then (pad := Some (3 - (i mod 4));
+ let d = (!data lsl (6 - !count)) land 63 in
+ Some (Array.unsafe_get tbl d))
+ else None
+ end in
+ Stream.from next
+
+let decode ?(tbl=inv_chars) strm =
+ if Array.length tbl <> 256 then raise Invalid_table;
+ let data = ref 0 in
+ let count = ref 0 in
+ let rec next i =
+ if !count >= 8
+ then
+ begin
+ count := !count - 8;
+ let d = (!data asr !count) land 0xFF in
+ Some (unsafe_char_of_int d)
+ end
+ else
+ begin
+ try
+ match Stream.next strm with
+ | '\r' | '\n' | '=' ->
+ next i
+ | c ->
+ let c = int_of_char c in
+ let c = Array.unsafe_get tbl c in
+ if c = -1 then raise Invalid_char;
+ data := (!data lsl 6) lor c;
+ count := !count + 6;
+ next i
+ with Stream.Failure ->
+ None
+ end in
+ Stream.from next
+
+let string_of_stream stream =
+ let buffer = Buffer.create 16 in
+ Stream.iter (Buffer.add_char buffer) stream;
+ Buffer.contents buffer
+
+let str_encode ?(tbl=chars) s =
+ string_of_stream (encode ~tbl (Stream.of_string s))
+
+let str_decode ?(tbl=inv_chars) s =
+ string_of_stream (decode ~tbl (Stream.of_string s))
diff --git a/XmlRpcBase64.mli b/XmlRpcBase64.mli
new file mode 100644
index 0000000..1614d4c
--- /dev/null
+++ b/XmlRpcBase64.mli
@@ -0,0 +1,73 @@
+(*
+ * XmlRpcBase64 - Base64 codec for XmlRpc
+ * Copyright (C) 2007-2009 Dave Benjamin
+ * Copyright (C) 2003 Nicolas Cannasse
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version,
+ * with the special exception on linking described in file LICENSE.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * This module is based on the ExtLib Base64 codec, written by
+ * Nicolas Cannasse, with the following modifications to enable
+ * compatibility with various XmlRpc implementations:
+ *
+ * - For encoding, output is padded with '=' to a multiple of four characters.
+ * - For decoding, the input characters '\r', '\n', and '=' are ignored.
+ *
+ * To avoid a dependency on ExtLib, this version uses OCaml's built-in Stream
+ * type instead of ExtLib's IO type.
+ *
+ * Original copyright:
+ *
+ * Base64 - Base64 codec
+ * Copyright (C) 2003 Nicolas Cannasse
+ *)
+
+(** Base64 codec.
+
+ 8-bit characters are encoded into 6-bit ones using ASCII lookup tables.
+ Default tables maps 0..63 values on characters A-Z, a-z, 0-9, '+' and '/'
+ (in that order).
+*)
+
+(** This exception is raised when reading an invalid character
+ from a base64 input. *)
+exception Invalid_char
+
+(** This exception is raised if the encoding or decoding table
+ size is not correct. *)
+exception Invalid_table
+
+(** An encoding table maps integers 0..63 to the corresponding char. *)
+type encoding_table = char array
+
+(** A decoding table maps chars 0..255 to the corresponding 0..63 value
+ or -1 if the char is not accepted. *)
+type decoding_table = int array
+
+(** Encode a string into Base64. *)
+val str_encode : ?tbl:encoding_table -> string -> string
+
+(** Decode a string encoded into Base64, raise [Invalid_char] if a
+ character in the input string is not a valid one. *)
+val str_decode : ?tbl:decoding_table -> string -> string
+
+(** Generic base64 encoding over a character stream. *)
+val encode : ?tbl:encoding_table -> char Stream.t -> char Stream.t
+
+(** Generic base64 decoding over a character stream. *)
+val decode : ?tbl:decoding_table -> char Stream.t -> char Stream.t
+
+(** Create a valid decoding table from an encoding one. *)
+val make_decoding_table : encoding_table -> decoding_table
diff --git a/XmlRpcDateTime.ml b/XmlRpcDateTime.ml
new file mode 100644
index 0000000..d38d7b0
--- /dev/null
+++ b/XmlRpcDateTime.ml
@@ -0,0 +1,109 @@
+(*
+ * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet
+ * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *)
+
+exception Parse_error of string
+
+type t = (int * int * int * int * int * int * int)
+
+let local_tz_offset () =
+ let time = Unix.time () in
+ let utc = fst (Unix.mktime (Unix.gmtime time)) in
+ int_of_float (time -. utc) / 60
+
+let from_unixtm tm =
+ (tm.Unix.tm_year + 1900,
+ tm.Unix.tm_mon + 1,
+ tm.Unix.tm_mday,
+ tm.Unix.tm_hour,
+ tm.Unix.tm_min,
+ tm.Unix.tm_sec,
+ local_tz_offset ())
+
+let from_unixtm_utc tm =
+ (tm.Unix.tm_year + 1900,
+ tm.Unix.tm_mon + 1,
+ tm.Unix.tm_mday,
+ tm.Unix.tm_hour,
+ tm.Unix.tm_min,
+ tm.Unix.tm_sec,
+ 0)
+
+let from_unixfloat time = from_unixtm (Unix.localtime time)
+let from_unixfloat_utc time = from_unixtm_utc (Unix.localtime time)
+
+let to_unixfloat_utc (y, m, d, h, m', s, tz) =
+ fst (Unix.mktime {Unix.tm_year=y - 1900;
+ tm_mon=m - 1;
+ tm_mday=d;
+ tm_hour=h;
+ tm_min=m';
+ tm_sec=s;
+ tm_wday=0;
+ tm_yday=0;
+ tm_isdst=false}) -. (float tz *. 60.0)
+
+let to_unixfloat dt =
+ to_unixfloat_utc dt +. (float (local_tz_offset ()) *. 60.0)
+
+let to_unixtm dt = Unix.localtime (to_unixfloat dt)
+let to_unixtm_utc dt = Unix.localtime (to_unixfloat_utc dt)
+
+let now () = from_unixfloat (Unix.time ())
+let now_utc () =
+ from_unixfloat_utc (Unix.time () -. (float (local_tz_offset ()) *. 60.0))
+
+let set_tz_offset offset dt =
+ let time = to_unixfloat_utc dt +. (float offset *. 60.0) in
+ match from_unixfloat_utc time
+ with (y, m, d, h, m', s, _) -> (y, m, d, h, m', s, offset)
+
+let fix_tz_offset offset dt =
+ match dt with (y, m, d, h, m', s, _) -> (y, m, d, h, m', s, offset)
+
+let compare a b = compare (to_unixfloat_utc a) (to_unixfloat_utc b)
+let equal a b = (to_unixfloat_utc a) = (to_unixfloat_utc b)
+let hash a = Hashtbl.hash (to_unixfloat_utc a)
+
+let string_of_tz_offset offset =
+ if offset = 0 then "" else
+ Printf.sprintf "%c%02d:%02d"
+ (if offset >= 0 then '+' else '-')
+ (abs (offset / 60))
+ (abs (offset mod 60))
+
+let tz_offset_of_string = function
+ | "" | "Z" -> 0
+ | string ->
+ Scanf.sscanf string "%c%02d%_[:]%02d"
+ (fun sign hour min ->
+ min + hour * (if sign = '-' then -60 else 60))
+
+let to_string (y, m, d, h, m', s, tz_offset) =
+ Printf.sprintf "%04d%02d%02dT%02d:%02d:%02d%s"
+ y m d h m' s (string_of_tz_offset tz_offset)
+
+let of_string string =
+ try
+ Scanf.sscanf string "%04d%_[-]%02d%_[-]%02d%_[T ]%02d:%02d:%02d%s"
+ (fun y m d h m' s tz ->
+ (y, m, d, h, m', s, (tz_offset_of_string tz)))
+ with
+ | Scanf.Scan_failure _
+ | End_of_file ->
+ raise (Parse_error string)
diff --git a/XmlRpcDateTime.mli b/XmlRpcDateTime.mli
new file mode 100644
index 0000000..f90cf14
--- /dev/null
+++ b/XmlRpcDateTime.mli
@@ -0,0 +1,97 @@
+(*
+ * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet
+ * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *)
+
+(** Date/time type. *)
+
+(** {2 Types} *)
+
+(** Raised by {!of_string} if a string could not be parsed. The exception
+ contains the input string. *)
+exception Parse_error of string
+
+(** Type of XmlRpc-compatible date/time values.
+ (year, month, day, hour, minute, second, time zone offset in minutes) *)
+type t = (int * int * int * int * int * int * int)
+
+(** {2 Comparison} *)
+
+(** Standard comparator for date/time values. Converts all values to UTC
+ before comparing to ensure correct behavior with values of differing
+ time zones. *)
+val compare : t -> t -> int
+
+(** Standard equality function for date/time values. Converts all values
+ to UTC before comparing. *)
+val equal : t -> t -> bool
+
+(** Standard hash function for date/time values. Converts values to UTC
+ before hashing. *)
+val hash : t -> int
+
+(** {2 Current date and time} *)
+
+(** Returns the current date and time in the local time zone. *)
+val now : unit -> t
+
+(** Returns the current date and time in UTC. *)
+val now_utc : unit -> t
+
+(** {2 Time zone adjustments} *)
+
+(** Adjusts the time zone offset, preserving equality. *)
+val set_tz_offset : int -> t -> t
+
+(** Forces the time zone offset to a different value, ignoring all other
+ fields. Use this to correct the time zone of a date/time value that
+ was received without a time zone offset and is known not to be UTC. *)
+val fix_tz_offset : int -> t -> t
+
+(** {2 Conversion} *)
+
+(** Builds a date/time value from epoch seconds in the local time zone. *)
+val from_unixfloat : float -> t
+
+(** Builds a date/time value from epoch seconds in UTC. *)
+val from_unixfloat_utc : float -> t
+
+(** Converts a date/time value to epoch seconds in the local time zone. *)
+val to_unixfloat : t -> float
+
+(** Converts a date/time value to epoch seconds in UTC. *)
+val to_unixfloat_utc : t -> float
+
+(** Builds a date/time value from a Unix.tm value in the local time zone. *)
+val from_unixtm : Unix.tm -> t
+
+(** Builds a date/time value from a Unix.tm value in UTC. *)
+val from_unixtm_utc : Unix.tm -> t
+
+(** Converts a date/time value to a Unix.tm value in the local time zone. *)
+val to_unixtm : t -> Unix.tm
+
+(** Converts a date/time value to a Unix.tm value in UTC. *)
+val to_unixtm_utc : t -> Unix.tm
+
+(** {2 ISO-8601 parsing and generation} *)
+
+(** Parses an (XmlRpc-flavor) ISO-8601 date/time value from a string. *)
+val of_string : string -> t
+
+(** Generates an ISO-8601 string from a date/time value. *)
+val to_string : t -> string
diff --git a/XmlRpcServer.ml b/XmlRpcServer.ml
new file mode 100644
index 0000000..3d4f130
--- /dev/null
+++ b/XmlRpcServer.ml
@@ -0,0 +1,394 @@
+(*
+ * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet
+ * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *)
+
+type param_type =
+ [ `Array
+ | `Binary
+ | `Boolean
+ | `DateTime
+ | `Double
+ | `Int
+ | `String
+ | `Struct
+ | `Undefined ]
+
+let invalid_method name =
+ raise
+ (XmlRpc.Error
+ (-32601, "server error. requested method " ^ name ^ " not found"))
+
+let invalid_params () =
+ raise
+ (XmlRpc.Error
+ (-32602, "server error. invalid method parameters"))
+
+let wrong_num_params () =
+ raise
+ (XmlRpc.Error
+ (-32602, "server error. wrong number of method parameters"))
+
+let system_get_capabilities introspection _ =
+ let capabilities =
+ [
+ "system.multicall",
+ `Struct
+ [
+ "specUrl", `String "http://www.xmlrpc.com/discuss/msgReader$1208";
+ "specVersion", `Int 1;
+ ];
+
+ "xmlrpc",
+ `Struct
+ [
+ "specUrl", `String "http://www.xmlrpc.com/spec";
+ "specVersion", `Int 1;
+ ];
+
+ "faults_interop",
+ `Struct
+ [
+ "specUrl", `String "http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php";
+ "specVersion", `Int 20010516;
+ ];
+
+ "nil",
+ `Struct
+ [
+ "specUrl", `String "http://www.ontosys.com/xml-rpc/extensions.php";
+ "specVersion", `Int 20010518;
+ ];
+ ] in
+ let capabilities =
+ if introspection
+ then capabilities @
+ [
+ "introspection",
+ `Struct
+ [
+ "specUrl", `String "http://xmlrpc.usefulinc.com/doc/reserved.html";
+ "specVersion", `Int 1
+ ]
+ ]
+ else capabilities in
+ `Struct capabilities
+
+let system_list_methods methods _ =
+ let names = ref [] in
+ Hashtbl.iter
+ (fun n _ -> names := `String n :: !names)
+ methods;
+ `Array (List.sort compare !names)
+
+let system_method_help method_help = function
+ | [`String name] ->
+ (try `String (Hashtbl.find method_help name)
+ with Not_found -> invalid_method name)
+ | _ -> invalid_params ()
+
+let system_method_signature method_signatures = function
+ | [`String name] ->
+ (try `Array (List.map
+ (fun signature ->
+ `Array
+ (List.map
+ (function
+ | `Array -> `String "array"
+ | `Binary -> `String "base64"
+ | `Boolean -> `String "boolean"
+ | `DateTime -> `String "dateTime.iso8601"
+ | `Double -> `String "double"
+ | `Int -> `String "int"
+ | `String -> `String "string"
+ | `Struct -> `String "struct"
+ | `Undefined -> `String "undefined")
+ signature))
+ (Hashtbl.find method_signatures name))
+ with Not_found -> invalid_method name)
+ | _ -> invalid_params ()
+
+let system_multicall methods = function
+ | [`Array calls] ->
+ `Array
+ (List.map
+ (function
+ | `Struct ["methodName", `String name;
+ "params", `Array params]
+ | `Struct ["params", `Array params;
+ "methodName", `String name] ->
+ (try `Array [(try Hashtbl.find methods name
+ with Not_found -> invalid_method name)
+ params]
+ with
+ | XmlRpc.Error (code, string) ->
+ `Struct ["faultCode", `Int code;
+ "faultString", `String string]
+ | e ->
+ `Struct ["faultCode", `Int (-32500);
+ "faultString",
+ `String
+ ("application error. "
+ ^ Printexc.to_string e)])
+ | _ -> invalid_params ())
+ calls)
+ | _ -> invalid_params ()
+
+let check_signatures signatures f params =
+ let num_params = List.length params in
+
+ let valid_num_params signature =
+ List.length signature - 1 = num_params in
+
+ let valid_params signature =
+ let passed = ref true in
+ begin
+ match signature with
+ | [] -> ()
+ | _ :: param_types ->
+ List.iter2
+ (fun expected actual ->
+ match (expected, actual) with
+ | (`Array, `Array _)
+ | (`Binary, `Binary _)
+ | (`Boolean, `Boolean _)
+ | (`DateTime, `DateTime _)
+ | (`Double, `Double _)
+ | (`Int, `Int _)
+ | (`Int, `Int32 _)
+ | (`String, `String _)
+ | (`Struct, `Struct _)
+ | (`Undefined, _)
+ | (_, `Nil)
+ -> ()
+ | _ -> passed := false)
+ param_types
+ params
+ end;
+ !passed in
+
+ if signatures = []
+ then ()
+ else if not (List.exists valid_num_params signatures)
+ then wrong_num_params ()
+ else if not (List.exists valid_params signatures)
+ then invalid_params ();
+
+ f params
+
+let rec parse_version ver =
+ try let i = String.index ver '.' in
+ int_of_string (String.sub ver 0 i) ::
+ parse_version (String.sub ver (i + 1) (String.length ver - i - 1))
+ with Not_found -> [int_of_string ver]
+
+let ocamlnet_version = parse_version Netconst.ocamlnet_version
+
+class virtual base =
+object (self)
+ val methods =
+ (Hashtbl.create 0 : (string, XmlRpc.value list -> XmlRpc.value) Hashtbl.t)
+ val method_help =
+ (Hashtbl.create 0 : (string, string) Hashtbl.t)
+ val method_signatures =
+ (Hashtbl.create 0 : (string, param_type list list) Hashtbl.t)
+
+ val mutable base64_encoder = fun s -> XmlRpcBase64.str_encode s
+ val mutable base64_decoder = fun s -> XmlRpcBase64.str_decode s
+
+ val mutable datetime_encoder = XmlRpcDateTime.to_string
+ val mutable datetime_decoder = XmlRpcDateTime.of_string
+
+ val mutable error_handler = XmlRpc.default_error_handler
+
+ method set_base64_encoder f = base64_encoder <- f
+ method set_base64_decoder f = base64_decoder <- f
+
+ method set_datetime_encoder f = datetime_encoder <- f
+ method set_datetime_decoder f = datetime_decoder <- f
+
+ method set_error_handler f = error_handler <- f
+
+ method serve f input =
+ XmlRpc.serve
+ ~base64_encoder ~base64_decoder
+ ~datetime_encoder ~datetime_decoder
+ ~error_handler
+ f input
+
+ method serve_message f input =
+ XmlRpc.serve_message
+ ~error_handler
+ f input
+
+ method register name ?(help="") ?(signature=[]) ?(signatures=[]) f =
+ if help <> ""
+ then (Hashtbl.replace method_help name help;
+ self#enable_introspection ());
+ let signatures =
+ if signature <> []
+ then signature :: signatures
+ else signatures in
+ if signatures <> []
+ then (Hashtbl.replace method_signatures name signatures;
+ self#enable_introspection ());
+ Hashtbl.replace methods name (if signatures <> []
+ then check_signatures signatures f
+ else f)
+
+ method unregister name =
+ Hashtbl.remove methods name;
+ Hashtbl.remove method_help name;
+ Hashtbl.remove method_signatures name
+
+ method virtual run : unit -> unit
+
+ val mutable introspection = false
+
+ method private enable_introspection () =
+ if not introspection
+ then
+ begin
+ introspection <- true;
+ self#register "system.getCapabilities"
+ ~help:"Returns a struct describing the XML-RPC specifications supported by this server"
+ ~signature:[`Struct]
+ (system_get_capabilities true);
+ self#register "system.listMethods"
+ ~help:"Returns an array of available methods on this server"
+ ~signature:[`Array]
+ (system_list_methods methods);
+ self#register "system.methodHelp"
+ ~help:"Returns a documentation string for the specified method"
+ ~signature:[`String; `String]
+ (system_method_help method_help);
+ self#register "system.methodSignature"
+ ~help:"Returns an array describing the return type and required parameters of a method"
+ ~signature:[`Array; `String]
+ (system_method_signature method_signatures);
+ self#register "system.multicall"
+ ~help:"Boxcar multiple RPC calls in one request"
+ ~signature:[`Array; `Array]
+ (system_multicall methods);
+ end
+
+ initializer
+ self#register "system.getCapabilities" (system_get_capabilities false);
+ self#register "system.listMethods" (system_list_methods methods);
+ self#register "system.multicall" (system_multicall methods);
+end
+
+class type server =
+object
+ inherit base
+ method run : unit -> unit
+end
+
+class cgi () =
+object (self)
+ inherit base
+
+ method private process (cgi : Netcgi.cgi) =
+ match cgi#request_method with
+ | `POST ->
+ let input = cgi#argument_value "BODY" in
+ let output =
+ self#serve
+ (fun name ->
+ try Hashtbl.find methods name
+ with Not_found -> invalid_method name)
+ input in
+ cgi#set_header ~content_type:"text/xml" ();
+ cgi#output#output_string "<?xml version=\"1.0\"?>\n";
+ cgi#output#output_string output;
+ cgi#output#commit_work ()
+ | _ ->
+ cgi#output#output_string
+ "XML-RPC server accepts POST requests only.\n";
+ cgi#output#commit_work ()
+
+ method run () =
+ let config =
+ { Netcgi.default_config with
+ Netcgi_common.permitted_input_content_types = [ "text/xml" ]
+ } in
+
+ let buffered _ ch = new Netchannels.buffered_trans_channel ch in
+ Netcgi_cgi.run ~config ~output_type:(`Transactional buffered) self#process
+end
+
+open Netcgi1_compat
+
+class netplex ?(parallelizer=Netplex_mp.mp()) ?(handler="xmlrpc") () =
+object (self)
+ inherit base
+
+ method private process env (cgi : Netcgi_types.cgi_activation) =
+ match cgi#request_method with
+ | `POST ->
+ let input = cgi#argument_value "BODY" in
+ let output =
+ self#serve
+ (fun name ->
+ try Hashtbl.find methods name
+ with Not_found -> invalid_method name)
+ input in
+ if ocamlnet_version < [2; 2; 8]
+ then env#send_output_header ()
+ else (cgi#set_header ~content_type:"text/xml" ();
+ cgi#output#output_string "<?xml version=\"1.0\"?>\n");
+ cgi#output#output_string output;
+ cgi#output#commit_work ()
+ | _ ->
+ if ocamlnet_version < [2; 2; 8]
+ then env#send_output_header ();
+ cgi#output#output_string
+ "XML-RPC server accepts POST requests only.\n";
+ cgi#output#commit_work ()
+
+ method run () =
+ let (opt_list, cmdline_cfg) = Netplex_main.args () in
+ Arg.parse
+ opt_list
+ (fun s -> raise (Arg.Bad ("Don't know what to do with: " ^ s)))
+ ("usage: " ^ Sys.executable_name ^ " [options]");
+
+ let xmlrpc =
+ { Nethttpd_services.dyn_handler = self#process;
+ dyn_activation =
+ Nethttpd_services.std_activation `Std_activation_buffered;
+ dyn_uri = None;
+ dyn_translator = (fun _ -> "");
+ dyn_accept_all_conditionals = false
+ } in
+
+ let config_cgi =
+ { Netcgi_env.default_config with
+ Netcgi_env.permitted_input_content_types = [ "text/xml" ]
+ } in
+
+ let handlers = [handler, xmlrpc] in
+
+ Sys.set_signal Sys.sigpipe Sys.Signal_ignore;
+
+ Netplex_main.startup
+ parallelizer
+ Netplex_log.logger_factories
+ Netplex_workload.workload_manager_factories
+ [ Nethttpd_plex.nethttpd_factory ~config_cgi ~handlers () ]
+ cmdline_cfg
+end
diff --git a/XmlRpcServer.mli b/XmlRpcServer.mli
new file mode 100644
index 0000000..52a8615
--- /dev/null
+++ b/XmlRpcServer.mli
@@ -0,0 +1,146 @@
+(*
+ * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet
+ * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *)
+
+(** XmlRpc Light server. *)
+
+(** Example: {[
+ let server = new XmlRpcServer.cgi () in
+ server#register "demo.sayHello"
+ (fun _ -> `String "Hello!");
+ server#run () ]}
+
+ By inheriting from {!XmlRpcServer.base}, all servers provide
+ the following introspection functions by default: [system.listMethods],
+ [system.getCapabilities]. To prevent their use, use [server#unregister].
+
+ Additionally, the methods [system.methodHelp] and [system.methodSignature]
+ will be made available if at least one method help or method signature is
+ provided.
+*)
+
+(** Type of parameters used in method signatures. *)
+type param_type =
+ [ `Array | `Binary | `Boolean | `DateTime | `Double
+ | `Int | `String | `Struct | `Undefined ]
+
+(** {2 Base classes} *)
+
+(** Abstract base class for XmlRpc servers. *)
+class virtual base :
+object
+ (** Hashtable mapping method names to implementation functions. *)
+ val methods : (string, XmlRpc.value list -> XmlRpc.value) Hashtbl.t
+
+ (** Base-64 binary encoding function. *)
+ val mutable base64_encoder : string -> string
+
+ (** Base-64 binary decoding function. *)
+ val mutable base64_decoder : string -> string
+
+ (** ISO-8601 date/time encoding function. *)
+ val mutable datetime_encoder : XmlRpcDateTime.t -> string
+
+ (** ISO-8601 date/time decoding function. *)
+ val mutable datetime_decoder : string -> XmlRpcDateTime.t
+
+ (** Handler for unhandled exceptions. *)
+ val mutable error_handler : exn -> XmlRpc.message
+
+ (** Sets an alternate Base-64 binary encoding function. *)
+ method set_base64_encoder : (string -> string) -> unit
+
+ (** Sets an alternate Base-64 binary decoding function. *)
+ method set_base64_decoder : (string -> string) -> unit
+
+ (** Sets an alternate ISO-8601 date/time encoding function. *)
+ method set_datetime_encoder : (XmlRpcDateTime.t -> string) -> unit
+
+ (** Sets an alternate ISO-8601 date/time decoding function. *)
+ method set_datetime_decoder : (string -> XmlRpcDateTime.t) -> unit
+
+ (** Sets an alternate handler for unhandled exceptions.
+ See {!XmlRpc.default_error_handler} and
+ {!XmlRpc.quiet_error_handler} for examples. *)
+ method set_error_handler : (exn -> XmlRpc.message) -> unit
+
+ (** For use in subclasses; calls {!XmlRpc.serve} with the current
+ encoders, decoders, and error handler. *)
+ method serve :
+ (string -> XmlRpc.value list -> XmlRpc.value) -> string -> string
+
+ (** Like [serve], but operates on messages instead of strings. *)
+ method serve_message :
+ (string -> XmlRpc.value list -> XmlRpc.value) ->
+ XmlRpc.message -> XmlRpc.message
+
+ (** Registers a method with the server.
+
+ If a [help] string is specified, its contents will be returned for
+ calls to [system.methodHelp] for this method.
+
+ If [signature] is specified, this method's signature will be published
+ by [system.methodSignature] and (shallow) type-checking will be enabled
+ for parameters passed into this method.
+
+ Multiple signatures can be supplied via [signatures] if desired to
+ provide for overloaded methods.
+
+ Signatures are of the form [return-type; param1-type; param2-type; ...]
+ where each type is an instance of the {!param_type} variant. *)
+ method register :
+ string ->
+ ?help:string ->
+ ?signature:param_type list ->
+ ?signatures:param_type list list ->
+ (XmlRpc.value list -> XmlRpc.value) -> unit
+
+ (** Removes a method from the server. *)
+ method unregister : string -> unit
+
+ (** Starts the main server process. *)
+ method virtual run : unit -> unit
+end
+
+(** Type of concrete XmlRpc server classes. *)
+class type server =
+object
+ inherit base
+
+ (** Starts the main server process. *)
+ method run : unit -> unit
+end
+
+(** {2 Server implementations} *)
+
+(** CGI XmlRpc server based on Netcgi2. *)
+class cgi : unit -> server
+
+(** Stand-alone XmlRpc server based on Netplex. *)
+class netplex :
+ ?parallelizer:Netplex_types.parallelizer ->
+ ?handler:string ->
+ unit -> server
+
+(** {2 Utility functions} *)
+
+(** Raise an {!XmlRpc.Error} indicating a method name not found. *)
+val invalid_method : string -> 'a
+
+(** Raise an {!XmlRpc.Error} indicating invalid method parameters. *)
+val invalid_params : unit -> 'a
diff --git a/doc/xmlrpc-light/html/XmlRpc.client.html b/doc/xmlrpc-light/html/XmlRpc.client.html
new file mode 100644
index 0000000..73c8eef
--- /dev/null
+++ b/doc/xmlrpc-light/html/XmlRpc.client.html
@@ -0,0 +1,124 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="next" href="XmlRpc.multicall.html">
+<link rel="Up" href="XmlRpc.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>XmlRpc.client</title>
+</head>
+<body>
+<div class="navbar">&nbsp;<a href="XmlRpc.html">Up</a>
+&nbsp;<a href="XmlRpc.multicall.html">Next</a>
+</div>
+<center><h1>Class <a href="type_XmlRpc.client.html">XmlRpc.client</a></h1></center>
+<br>
+<pre><span class="keyword">class</span> <a name="TYPEclient"></a>client : <code class="type">?debug:bool -> ?headers:(string * string) list -> ?insecure_ssl:bool -> ?timeout:float -> ?useragent:string -> string -> </code><code class="code">object</code> <a href="XmlRpc.client.html">..</a> <code class="code">end</code></pre>Class for XmlRpc clients. Takes a single mandatory argument, <code class="code">url</code>.
+<p>
+
+ If <code class="code">url</code> is of the form "http://username:password@...", basic
+ authentication will be used.
+<p>
+
+ If <code class="code">url</code> starts with "https", Curl will be used instead of Ocamlnet.
+ The "curl" command-line program must be in your path for this to work.
+ You can use the <code class="code">insecure_ssl</code> setting to allow connections to servers
+ with self-signed certificates; by default this is false and certificates
+ must be valid.
+<p>
+
+ <code class="code">timeout</code> can be used to specify the maximum amount of time
+ elapsed before a connection is cancelled. It defaults to 300.0 seconds.
+<p>
+
+ <code class="code">headers</code> may contain an array of (name, value) pairs of additional
+ headers to send with each request.
+<p>
+
+ The <code class="code">useragent</code> setting provides a convenient way to change the
+ User-Agent header, which defaults to "XmlRpc-Light/&lt;version&gt;".
+<p>
+
+ The <code class="code">debug</code> setting, if true, will enable verbose debugging output to
+ the standard error stream.<br>
+<hr width="100%">
+<pre><span class="keyword">val</span> <a name="ATTurl"></a>url : <code class="type">string</code></pre><div class="info">
+Url of the remote XmlRpc server.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="ATTdebug"></a><span class="keyword">mutable</span> debug : <code class="type">bool</code></pre><div class="info">
+If true, Xml messages will be printed to standard error.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="ATTheaders"></a><span class="keyword">mutable</span> headers : <code class="type">(string * string) list</code></pre><div class="info">
+List of custom HTTP headers to send with each request.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="ATTinsecure_ssl"></a><span class="keyword">mutable</span> insecure_ssl : <code class="type">bool</code></pre><div class="info">
+If true, SSL will be allowed even if the certificate is self-signed.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="ATTtimeout"></a><span class="keyword">mutable</span> timeout : <code class="type">float</code></pre><div class="info">
+Maximum time to wait for a request to complete, in seconds.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="ATTuseragent"></a><span class="keyword">mutable</span> useragent : <code class="type">string</code></pre><div class="info">
+User-agent to send in request headers.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODurl"></a>url : <code class="type">string</code></pre><div class="info">
+Gets <code class="code">url</code>.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODdebug"></a>debug : <code class="type">bool</code></pre><div class="info">
+Gets <code class="code">debug</code>.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODset_debug"></a>set_debug : <code class="type">bool -> unit</code></pre><div class="info">
+Sets <code class="code">debug</code>.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODheaders"></a>headers : <code class="type">(string * string) list</code></pre><div class="info">
+Gets <code class="code">headers</code>.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODset_headers"></a>set_headers : <code class="type">(string * string) list -> unit</code></pre><div class="info">
+Sets <code class="code">headers</code>.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODinsecure_ssl"></a>insecure_ssl : <code class="type">bool</code></pre><div class="info">
+Gets <code class="code">insecure_ssl</code>.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODset_insecure_ssl"></a>set_insecure_ssl : <code class="type">bool -> unit</code></pre><div class="info">
+Sets <code class="code">insecure_ssl</code>.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODtimeout"></a>timeout : <code class="type">float</code></pre><div class="info">
+Gets <code class="code">timeout</code>.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODset_timeout"></a>set_timeout : <code class="type">float -> unit</code></pre><div class="info">
+Sets <code class="code">timeout</code>.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODuseragent"></a>useragent : <code class="type">string</code></pre><div class="info">
+Gets <code class="code">useragent</code>.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODset_useragent"></a>set_useragent : <code class="type">string -> unit</code></pre><div class="info">
+Sets <code class="code">useragent</code>.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODset_base64_encoder"></a>set_base64_encoder : <code class="type">(string -> string) -> unit</code></pre><div class="info">
+Sets an alternate Base-64 binary encoding function.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODset_base64_decoder"></a>set_base64_decoder : <code class="type">(string -> string) -> unit</code></pre><div class="info">
+Sets an alternate Base-64 binary decoding function.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODset_datetime_encoder"></a>set_datetime_encoder : <code class="type">(<a href="XmlRpcDateTime.html#TYPEt">XmlRpcDateTime.t</a> -> string) -> unit</code></pre><div class="info">
+Sets an alternate ISO-8601 date/time encoding function.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODset_datetime_decoder"></a>set_datetime_decoder : <code class="type">(string -> <a href="XmlRpcDateTime.html#TYPEt">XmlRpcDateTime.t</a>) -> unit</code></pre><div class="info">
+Sets an alternate ISO-8601 date/time decoding function.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODcall"></a>call : <code class="type">string -> <a href="XmlRpc.html#TYPEvalue">value</a> list -> <a href="XmlRpc.html#TYPEvalue">value</a></code></pre><div class="info">
+<code class="code">call name params</code> invokes an XmlRpc method and returns the result,
+ or raises <a href="XmlRpc.html#EXCEPTIONError"><code class="code">XmlRpc.Error</code></a> on error.<br>
+</div>
+</body></html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/XmlRpc.html b/doc/xmlrpc-light/html/XmlRpc.html
new file mode 100644
index 0000000..1c58cff
--- /dev/null
+++ b/doc/xmlrpc-light/html/XmlRpc.html
@@ -0,0 +1,179 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="next" href="XmlRpcServer.html">
+<link rel="Up" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><link title="High-level interface" rel="Section" href="#2_Highlevelinterface">
+<link title="Utility functions" rel="Section" href="#2_Utilityfunctions">
+<link title="Low-level interface" rel="Section" href="#2_Lowlevelinterface">
+<link title="Server tools" rel="Section" href="#2_Servertools">
+<title>XmlRpc</title>
+</head>
+<body>
+<div class="navbar">&nbsp;<a href="index.html">Up</a>
+&nbsp;<a href="XmlRpcServer.html">Next</a>
+</div>
+<center><h1>Module <a href="type_XmlRpc.html">XmlRpc</a></h1></center>
+<br>
+<pre><span class="keyword">module</span> XmlRpc: <code class="code">sig</code> <a href="XmlRpc.html">..</a> <code class="code">end</code></pre>XmlRpc Light.
+<p>
+
+ XmlRpc Light is a minimal XmlRpc library based on Xml Light and Ocamlnet.
+<p>
+
+ It provides a type for values, a client class with a simple calling
+ interface, and low-level tools that can be used to implement a server.
+<p>
+
+ <i>(c) 2007-2009 Dave Benjamin</i><br>
+<hr width="100%">
+<pre><span class="keyword">val</span> <a name="VALversion"></a>version : <code class="type">string</code></pre><div class="info">
+Version of XmlRpc-Light as a string.<br>
+</div>
+<br>
+<a name="2_Highlevelinterface"></a>
+<h2>High-level interface</h2><br>
+<br>
+Example: <pre><code class="code"> let rpc = new XmlRpc.client "http://localhost:8000" in
+ let result = rpc#call "echo" [`String "hello!"] in
+ print_endline (XmlRpc.dump result) </code></pre><br>
+<pre><span class="keyword">exception</span> <a name="EXCEPTIONError"></a>Error <span class="keyword">of</span> <code class="type">(int * string)</code></pre>
+<div class="info">
+Raised for all errors including XmlRpc faults (code, string).<br>
+</div>
+<pre><span class="keyword">type</span> <a name="TYPEvalue"></a><code class="type"></code>value = <code class="type">[ `Array of <a href="XmlRpc.html#TYPEvalue">value</a> list<br> | `Binary of string<br> | `Boolean of bool<br> | `DateTime of <a href="XmlRpcDateTime.html#TYPEt">XmlRpcDateTime.t</a><br> | `Double of float<br> | `Int of int<br> | `Int32 of int32<br> | `Nil<br> | `String of string<br> | `Struct of (string * <a href="XmlRpc.html#TYPEvalue">value</a>) list ]</code> </pre>
+<div class="info">
+Polymorphic variant type for XmlRpc values:<ul>
+<li><code class="code">`Array</code>: An ordered list of values</li>
+<li><code class="code">`Binary</code>: A string containing binary data</li>
+<li><code class="code">`Boolean</code>: A boolean</li>
+<li><code class="code">`DateTime</code>: A date/time value</li>
+<li><code class="code">`Double</code>: A floating-point value</li>
+<li><code class="code">`Int</code>: An integer</li>
+<li><code class="code">`Int32</code>: A 32-bit integer</li>
+<li><code class="code">`Nil</code>: A null value</li>
+<li><code class="code">`String</code>: A string</li>
+<li><code class="code">`Struct</code>: An association list of (name, value) pairs</li>
+</ul>
+
+ Note that base64-encoding of <code class="code">`Binary</code> values is done automatically.
+ You do not need to do the encoding yourself.<br>
+</div>
+
+<pre><span class="keyword">class</span> <a name="TYPEclient"></a><a href="XmlRpc.client.html">client</a> : <code class="type">?debug:bool -> ?headers:(string * string) list -> ?insecure_ssl:bool -> ?timeout:float -> ?useragent:string -> string -> </code><code class="code">object</code> <a href="XmlRpc.client.html">..</a> <code class="code">end</code></pre><div class="info">
+Class for XmlRpc clients.
+</div>
+<pre><span class="keyword">class</span> <a name="TYPEmulticall"></a><a href="XmlRpc.multicall.html">multicall</a> : <code class="type"><a href="XmlRpc.client.html">client</a> -> </code><code class="code">object</code> <a href="XmlRpc.multicall.html">..</a> <code class="code">end</code></pre><div class="info">
+Convenience class for <code class="code">system.multicall</code> calls.
+</div>
+<br>
+<a name="2_Utilityfunctions"></a>
+<h2>Utility functions</h2><br>
+<pre><span class="keyword">val</span> <a name="VALdump"></a>dump : <code class="type"><a href="XmlRpc.html#TYPEvalue">value</a> -> string</code></pre><div class="info">
+Converts an XmlRpc value to a human-readable string.<br>
+</div>
+<br>
+<a name="2_Lowlevelinterface"></a>
+<h2>Low-level interface</h2><br>
+<br><code><span class="keyword">type</span> <a name="TYPEmessage"></a><code class="type"></code>message = </code><table class="typetable">
+<tr>
+<td align="left" valign="top" >
+<code><span class="keyword">|</span></code></td>
+<td align="left" valign="top" >
+<code><span class="constructor">MethodCall</span> <span class="keyword">of</span> <code class="type">(string * <a href="XmlRpc.html#TYPEvalue">value</a> list)</code></code></td>
+
+</tr>
+<tr>
+<td align="left" valign="top" >
+<code><span class="keyword">|</span></code></td>
+<td align="left" valign="top" >
+<code><span class="constructor">MethodResponse</span> <span class="keyword">of</span> <code class="type"><a href="XmlRpc.html#TYPEvalue">value</a></code></code></td>
+
+</tr>
+<tr>
+<td align="left" valign="top" >
+<code><span class="keyword">|</span></code></td>
+<td align="left" valign="top" >
+<code><span class="constructor">Fault</span> <span class="keyword">of</span> <code class="type">(int * string)</code></code></td>
+
+</tr></table>
+
+<div class="info">
+Type for XmlRpc messages.<br>
+</div>
+
+<pre><span class="keyword">val</span> <a name="VALmessage_of_xml_element"></a>message_of_xml_element : <code class="type">?base64_decoder:(string -> string) -><br> ?datetime_decoder:(string -> <a href="XmlRpcDateTime.html#TYPEt">XmlRpcDateTime.t</a>) -> Xml.xml -> <a href="XmlRpc.html#TYPEmessage">message</a></code></pre><div class="info">
+Converts an Xml Light element to an XmlRpc message.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="VALxml_element_of_message"></a>xml_element_of_message : <code class="type">?base64_encoder:(string -> string) -><br> ?datetime_encoder:(<a href="XmlRpcDateTime.html#TYPEt">XmlRpcDateTime.t</a> -> string) -> <a href="XmlRpc.html#TYPEmessage">message</a> -> Xml.xml</code></pre><div class="info">
+Converts an XmlRpc message to an Xml Light element.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="VALvalue_of_xml_element"></a>value_of_xml_element : <code class="type">?base64_decoder:(string -> string) -><br> ?datetime_decoder:(string -> <a href="XmlRpcDateTime.html#TYPEt">XmlRpcDateTime.t</a>) -> Xml.xml -> <a href="XmlRpc.html#TYPEvalue">value</a></code></pre><div class="info">
+Converts an Xml Light element to an XmlRpc value.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="VALxml_element_of_value"></a>xml_element_of_value : <code class="type">?base64_encoder:(string -> string) -><br> ?datetime_encoder:(<a href="XmlRpcDateTime.html#TYPEt">XmlRpcDateTime.t</a> -> string) -> <a href="XmlRpc.html#TYPEvalue">value</a> -> Xml.xml</code></pre><div class="info">
+Converts an XmlRpc value to an Xml Light element.<br>
+</div>
+<br>
+<a name="2_Servertools"></a>
+<h2>Server tools</h2><br>
+<pre><span class="keyword">val</span> <a name="VALserve"></a>serve : <code class="type">?base64_encoder:(string -> string) -><br> ?base64_decoder:(string -> string) -><br> ?datetime_encoder:(<a href="XmlRpcDateTime.html#TYPEt">XmlRpcDateTime.t</a> -> string) -><br> ?datetime_decoder:(string -> <a href="XmlRpcDateTime.html#TYPEt">XmlRpcDateTime.t</a>) -><br> ?error_handler:(exn -> <a href="XmlRpc.html#TYPEmessage">message</a>) -><br> (string -> <a href="XmlRpc.html#TYPEvalue">value</a> list -> <a href="XmlRpc.html#TYPEvalue">value</a>) -> string -> string</code></pre><div class="info">
+Creates a function from string (Xml representing a <code class="code">MethodCall</code>) to
+ string (Xml representing a <code class="code">MethodResult</code> or <code class="code">Fault</code>) given a function
+ of the form: (<code class="code">name</code> -&gt; <code class="code">params</code> -&gt; <code class="code">result</code>), where <code class="code">name</code> is the
+ name of the method, <code class="code">params</code> is a list of parameter values, and
+ <code class="code">result</code> is the result value.
+<p>
+
+ This function can be used to build many different kinds of XmlRpc
+ servers since it makes no assumptions about the network library
+ or other communications method used.
+<p>
+
+ If an exception other than <a href="XmlRpc.html#EXCEPTIONError"><code class="code">XmlRpc.Error</code></a> occurs, the exception is
+ passed to <code class="code">error_handler</code>. If <code class="code">error_handler</code> returns a message,
+ the message will be used as the result. If an <a href="XmlRpc.html#EXCEPTIONError"><code class="code">XmlRpc.Error</code></a> is
+ raised by either the main function or <code class="code">error_handler</code>, it will be
+ converted to an XmlRpc <code class="code">Fault</code>. Any other exception raised by
+ <code class="code">error_handler</code> is allowed to escape.
+<p>
+
+ For a full-featured, easy-to-use, network-capable server implementation,
+ see the <a href="XmlRpcServer.html"><code class="code">XmlRpcServer</code></a> module.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="VALserve_message"></a>serve_message : <code class="type">?error_handler:(exn -> <a href="XmlRpc.html#TYPEmessage">message</a>) -><br> (string -> <a href="XmlRpc.html#TYPEvalue">value</a> list -> <a href="XmlRpc.html#TYPEvalue">value</a>) -><br> <a href="XmlRpc.html#TYPEmessage">message</a> -> <a href="XmlRpc.html#TYPEmessage">message</a></code></pre><div class="info">
+Performs the same function as <code class="code">serve</code>, but operates on typed messages
+ instead of strings.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="VALdefault_error_handler"></a>default_error_handler : <code class="type">exn -> <a href="XmlRpc.html#TYPEmessage">message</a></code></pre><div class="info">
+The default error handler for <code class="code">serve</code>.
+<p>
+
+ This error handler catches all exceptions and converts them into
+ faults by wrapping them in <code class="code">XmlRpc.Error</code>.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="VALquiet_error_handler"></a>quiet_error_handler : <code class="type">exn -> <a href="XmlRpc.html#TYPEmessage">message</a></code></pre><div class="info">
+A "quiet" error handler for <code class="code">serve</code>.
+<p>
+
+ This error handler simply re-raises the exception. Use this if you
+ want exceptions to remain unhandled so that they will escape to the
+ error log. The client will receive a generic "transport error",
+ which is more secure since it does not reveal any information about
+ the specific exception that occurred.<br>
+</div>
+</body></html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/XmlRpc.multicall.html b/doc/xmlrpc-light/html/XmlRpc.multicall.html
new file mode 100644
index 0000000..849e163
--- /dev/null
+++ b/doc/xmlrpc-light/html/XmlRpc.multicall.html
@@ -0,0 +1,100 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="previous" href="XmlRpc.client.html">
+<link rel="Up" href="XmlRpc.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>XmlRpc.multicall</title>
+</head>
+<body>
+<div class="navbar"><a href="XmlRpc.client.html">Previous</a>
+&nbsp;<a href="XmlRpc.html">Up</a>
+&nbsp;</div>
+<center><h1>Class <a href="type_XmlRpc.multicall.html">XmlRpc.multicall</a></h1></center>
+<br>
+<pre><span class="keyword">class</span> <a name="TYPEmulticall"></a>multicall : <code class="type"><a href="XmlRpc.client.html">client</a> -> </code><code class="code">object</code> <a href="XmlRpc.multicall.html">..</a> <code class="code">end</code></pre>Convenience class for <code class="code">system.multicall</code> calls.
+<p>
+
+ Instances take an <a href="XmlRpc.client.html"><code class="code">XmlRpc.client</code></a> as an argument: <pre><code class="code"> # let mc = new XmlRpc.multicall client;;
+ val mc : XmlRpc.multicall = &lt;obj&gt;
+ </code></pre>
+ The "call" method works like <code class="code">client#call</code>, but it returns a lazy
+ value: <pre><code class="code"> # let a = mc#call "demo.addTwoNumbers" [`Int 3; `Int 4];;
+ val a : XmlRpc.value Lazy.t = &lt;lazy&gt;
+ # let b = mc#call "demo.addTwoNumbers" [`Int 42; `String "oh noes!"];;
+ val b : XmlRpc.value Lazy.t = &lt;lazy&gt;
+ # let c = mc#call "demo.addTwoNumbers" [`Double 3.0; `Double 4.0];;
+ val c : XmlRpc.value Lazy.t = &lt;lazy&gt;
+ </code></pre>
+ At this point, the call has not been executed yet: <pre><code class="code"> # mc#executed;;
+ -- : bool = false
+ </code></pre>
+ As soon as one of the return values is forced, the call is executed: <pre><code class="code"> # Lazy.force a;;
+ -- : XmlRpc.value = `Int 7
+ # mc#executed;;
+ -- : bool = true
+ </code></pre>
+ Once a call has been executed, this instance cannot be used to make any
+ further calls; instead, a new <code class="code">multicall</code> instance must be created: <pre><code class="code"> # mc#call "demo.addTwoNumbers" [`Int 2; `Int 2];;
+ Exception: Failure "multicall#call: already executed".
+ </code></pre>
+ If an XmlRpc fault occurred, the exception will be thrown when the lazy
+ value is forced: <pre><code class="code"> # Lazy.force b;;
+ Exception: XmlRpc.Error (-32602, "server error. invalid method parameters").
+ </code></pre>
+ This will not prevent further methods from executing successfully: <pre><code class="code"> # Lazy.force c;;
+ -- : XmlRpc.value = `Double 7.
+ </code></pre>
+ It is possible for a <code class="code">multicall</code> to be executed but not completed, for
+ example if a transport error occurs. Aside from catching the exception,
+ the <code class="code">completed</code> property indicates if the call actually went through
+ or not: <pre><code class="code"> # mc#completed;;
+ -- : bool = true
+ </code></pre>
+ It is not necessary to use lazy values. Instead, the call can be
+ executed explicitly, and the results can be retrieved by number: <pre><code class="code"> # let mc = new XmlRpc.multicall client;;
+ val mc : XmlRpc.multicall = &lt;obj&gt;
+ # ignore (mc#call "demo.addTwoNumbers" [`Int 2; `Int 2]);;
+ -- : unit = ()
+ # ignore (mc#call "demo.addTwoNumbers" [`Int 3; `Int 3]);;
+ -- : unit = ()
+ # mc#result 1;;
+ -- : XmlRpc.value = `Int 6
+ </code></pre><br>
+<hr width="100%">
+<pre><span class="keyword">method</span> <a name="METHODcall"></a>call : <code class="type">string -> <a href="XmlRpc.html#TYPEvalue">value</a> list -> <a href="XmlRpc.html#TYPEvalue">value</a> Lazy.t</code></pre><div class="info">
+Adds a call to this <code class="code">multicall</code> instance.
+ If the call has already executed, the following exception will
+ be raised:
+ Failure "multicall#call: already executed".<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODexecute"></a>execute : <code class="type">unit -> unit</code></pre><div class="info">
+Forces the call to execute immediately.
+ If the call has already executed and completed successfully, the
+ following exception will be raised:
+ Failure "multicall#execute: already completed".<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODresult"></a>result : <code class="type">int -> <a href="XmlRpc.html#TYPEvalue">value</a></code></pre><div class="info">
+Returns a <code class="code">multicall</code> result, executing the call if necessary.
+ The results are numbered starting with zero.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODexecuted"></a>executed : <code class="type">bool</code></pre><div class="info">
+True if the call has executed, whether or not it succeeded.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODcompleted"></a>completed : <code class="type">bool</code></pre><div class="info">
+True of the call has executed and completed successfully.<br>
+</div>
+</body></html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/XmlRpcBase64.html b/doc/xmlrpc-light/html/XmlRpcBase64.html
new file mode 100644
index 0000000..3cd397a
--- /dev/null
+++ b/doc/xmlrpc-light/html/XmlRpcBase64.html
@@ -0,0 +1,72 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="previous" href="XmlRpcDateTime.html">
+<link rel="Up" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>XmlRpcBase64</title>
+</head>
+<body>
+<div class="navbar"><a href="XmlRpcDateTime.html">Previous</a>
+&nbsp;<a href="index.html">Up</a>
+&nbsp;</div>
+<center><h1>Module <a href="type_XmlRpcBase64.html">XmlRpcBase64</a></h1></center>
+<br>
+<pre><span class="keyword">module</span> XmlRpcBase64: <code class="code">sig</code> <a href="XmlRpcBase64.html">..</a> <code class="code">end</code></pre>Base64 codec.
+<p>
+
+ 8-bit characters are encoded into 6-bit ones using ASCII lookup tables.
+ Default tables maps 0..63 values on characters A-Z, a-z, 0-9, '+' and '/'
+ (in that order).<br>
+<hr width="100%">
+<pre><span class="keyword">exception</span> <a name="EXCEPTIONInvalid_char"></a>Invalid_char</pre>
+<div class="info">
+This exception is raised when reading an invalid character
+ from a base64 input.<br>
+</div>
+<pre><span class="keyword">exception</span> <a name="EXCEPTIONInvalid_table"></a>Invalid_table</pre>
+<div class="info">
+This exception is raised if the encoding or decoding table
+ size is not correct.<br>
+</div>
+<pre><span class="keyword">type</span> <a name="TYPEencoding_table"></a><code class="type"></code>encoding_table = <code class="type">char array</code> </pre>
+<div class="info">
+An encoding table maps integers 0..63 to the corresponding char.<br>
+</div>
+
+<pre><span class="keyword">type</span> <a name="TYPEdecoding_table"></a><code class="type"></code>decoding_table = <code class="type">int array</code> </pre>
+<div class="info">
+A decoding table maps chars 0..255 to the corresponding 0..63 value
+ or -1 if the char is not accepted.<br>
+</div>
+
+<pre><span class="keyword">val</span> <a name="VALstr_encode"></a>str_encode : <code class="type">?tbl:<a href="XmlRpcBase64.html#TYPEencoding_table">encoding_table</a> -> string -> string</code></pre><div class="info">
+Encode a string into Base64.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="VALstr_decode"></a>str_decode : <code class="type">?tbl:<a href="XmlRpcBase64.html#TYPEdecoding_table">decoding_table</a> -> string -> string</code></pre><div class="info">
+Decode a string encoded into Base64, raise <code class="code">Invalid_char</code> if a
+ character in the input string is not a valid one.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="VALencode"></a>encode : <code class="type">?tbl:<a href="XmlRpcBase64.html#TYPEencoding_table">encoding_table</a> -> char Stream.t -> char Stream.t</code></pre><div class="info">
+Generic base64 encoding over a character stream.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="VALdecode"></a>decode : <code class="type">?tbl:<a href="XmlRpcBase64.html#TYPEdecoding_table">decoding_table</a> -> char Stream.t -> char Stream.t</code></pre><div class="info">
+Generic base64 decoding over a character stream.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="VALmake_decoding_table"></a>make_decoding_table : <code class="type"><a href="XmlRpcBase64.html#TYPEencoding_table">encoding_table</a> -> <a href="XmlRpcBase64.html#TYPEdecoding_table">decoding_table</a></code></pre><div class="info">
+Create a valid decoding table from an encoding one.<br>
+</div>
+</body></html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/XmlRpcDateTime.html b/doc/xmlrpc-light/html/XmlRpcDateTime.html
new file mode 100644
index 0000000..3ff0ab1
--- /dev/null
+++ b/doc/xmlrpc-light/html/XmlRpcDateTime.html
@@ -0,0 +1,124 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="previous" href="XmlRpcServer.html">
+<link rel="next" href="XmlRpcBase64.html">
+<link rel="Up" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><link title="Types" rel="Section" href="#2_Types">
+<link title="Comparison" rel="Section" href="#2_Comparison">
+<link title="Current date and time" rel="Section" href="#2_Currentdateandtime">
+<link title="Time zone adjustments" rel="Section" href="#2_Timezoneadjustments">
+<link title="Conversion" rel="Section" href="#2_Conversion">
+<link title="ISO-8601 parsing and generation" rel="Section" href="#2_ISO8601parsingandgeneration">
+<title>XmlRpcDateTime</title>
+</head>
+<body>
+<div class="navbar"><a href="XmlRpcServer.html">Previous</a>
+&nbsp;<a href="index.html">Up</a>
+&nbsp;<a href="XmlRpcBase64.html">Next</a>
+</div>
+<center><h1>Module <a href="type_XmlRpcDateTime.html">XmlRpcDateTime</a></h1></center>
+<br>
+<pre><span class="keyword">module</span> XmlRpcDateTime: <code class="code">sig</code> <a href="XmlRpcDateTime.html">..</a> <code class="code">end</code></pre>Date/time type.<br>
+<hr width="100%">
+<br>
+<a name="2_Types"></a>
+<h2>Types</h2><br>
+<pre><span class="keyword">exception</span> <a name="EXCEPTIONParse_error"></a>Parse_error <span class="keyword">of</span> <code class="type">string</code></pre>
+<div class="info">
+Raised by <a href="XmlRpcDateTime.html#VALof_string"><code class="code">XmlRpcDateTime.of_string</code></a> if a string could not be parsed. The exception
+ contains the input string.<br>
+</div>
+<pre><span class="keyword">type</span> <a name="TYPEt"></a><code class="type"></code>t = <code class="type">int * int * int * int * int * int * int</code> </pre>
+<div class="info">
+Type of XmlRpc-compatible date/time values.
+ (year, month, day, hour, minute, second, time zone offset in minutes)<br>
+</div>
+
+<br>
+<a name="2_Comparison"></a>
+<h2>Comparison</h2><br>
+<pre><span class="keyword">val</span> <a name="VALcompare"></a>compare : <code class="type"><a href="XmlRpcDateTime.html#TYPEt">t</a> -> <a href="XmlRpcDateTime.html#TYPEt">t</a> -> int</code></pre><div class="info">
+Standard comparator for date/time values. Converts all values to UTC
+ before comparing to ensure correct behavior with values of differing
+ time zones.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="VALequal"></a>equal : <code class="type"><a href="XmlRpcDateTime.html#TYPEt">t</a> -> <a href="XmlRpcDateTime.html#TYPEt">t</a> -> bool</code></pre><div class="info">
+Standard equality function for date/time values. Converts all values
+ to UTC before comparing.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="VALhash"></a>hash : <code class="type"><a href="XmlRpcDateTime.html#TYPEt">t</a> -> int</code></pre><div class="info">
+Standard hash function for date/time values. Converts values to UTC
+ before hashing.<br>
+</div>
+<br>
+<a name="2_Currentdateandtime"></a>
+<h2>Current date and time</h2><br>
+<pre><span class="keyword">val</span> <a name="VALnow"></a>now : <code class="type">unit -> <a href="XmlRpcDateTime.html#TYPEt">t</a></code></pre><div class="info">
+Returns the current date and time in the local time zone.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="VALnow_utc"></a>now_utc : <code class="type">unit -> <a href="XmlRpcDateTime.html#TYPEt">t</a></code></pre><div class="info">
+Returns the current date and time in UTC.<br>
+</div>
+<br>
+<a name="2_Timezoneadjustments"></a>
+<h2>Time zone adjustments</h2><br>
+<pre><span class="keyword">val</span> <a name="VALset_tz_offset"></a>set_tz_offset : <code class="type">int -> <a href="XmlRpcDateTime.html#TYPEt">t</a> -> <a href="XmlRpcDateTime.html#TYPEt">t</a></code></pre><div class="info">
+Adjusts the time zone offset, preserving equality.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="VALfix_tz_offset"></a>fix_tz_offset : <code class="type">int -> <a href="XmlRpcDateTime.html#TYPEt">t</a> -> <a href="XmlRpcDateTime.html#TYPEt">t</a></code></pre><div class="info">
+Forces the time zone offset to a different value, ignoring all other
+ fields. Use this to correct the time zone of a date/time value that
+ was received without a time zone offset and is known not to be UTC.<br>
+</div>
+<br>
+<a name="2_Conversion"></a>
+<h2>Conversion</h2><br>
+<pre><span class="keyword">val</span> <a name="VALfrom_unixfloat"></a>from_unixfloat : <code class="type">float -> <a href="XmlRpcDateTime.html#TYPEt">t</a></code></pre><div class="info">
+Builds a date/time value from epoch seconds in the local time zone.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="VALfrom_unixfloat_utc"></a>from_unixfloat_utc : <code class="type">float -> <a href="XmlRpcDateTime.html#TYPEt">t</a></code></pre><div class="info">
+Builds a date/time value from epoch seconds in UTC.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="VALto_unixfloat"></a>to_unixfloat : <code class="type"><a href="XmlRpcDateTime.html#TYPEt">t</a> -> float</code></pre><div class="info">
+Converts a date/time value to epoch seconds in the local time zone.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="VALto_unixfloat_utc"></a>to_unixfloat_utc : <code class="type"><a href="XmlRpcDateTime.html#TYPEt">t</a> -> float</code></pre><div class="info">
+Converts a date/time value to epoch seconds in UTC.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="VALfrom_unixtm"></a>from_unixtm : <code class="type">Unix.tm -> <a href="XmlRpcDateTime.html#TYPEt">t</a></code></pre><div class="info">
+Builds a date/time value from a Unix.tm value in the local time zone.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="VALfrom_unixtm_utc"></a>from_unixtm_utc : <code class="type">Unix.tm -> <a href="XmlRpcDateTime.html#TYPEt">t</a></code></pre><div class="info">
+Builds a date/time value from a Unix.tm value in UTC.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="VALto_unixtm"></a>to_unixtm : <code class="type"><a href="XmlRpcDateTime.html#TYPEt">t</a> -> Unix.tm</code></pre><div class="info">
+Converts a date/time value to a Unix.tm value in the local time zone.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="VALto_unixtm_utc"></a>to_unixtm_utc : <code class="type"><a href="XmlRpcDateTime.html#TYPEt">t</a> -> Unix.tm</code></pre><div class="info">
+Converts a date/time value to a Unix.tm value in UTC.<br>
+</div>
+<br>
+<a name="2_ISO8601parsingandgeneration"></a>
+<h2>ISO-8601 parsing and generation</h2><br>
+<pre><span class="keyword">val</span> <a name="VALof_string"></a>of_string : <code class="type">string -> <a href="XmlRpcDateTime.html#TYPEt">t</a></code></pre><div class="info">
+Parses an (XmlRpc-flavor) ISO-8601 date/time value from a string.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="VALto_string"></a>to_string : <code class="type"><a href="XmlRpcDateTime.html#TYPEt">t</a> -> string</code></pre><div class="info">
+Generates an ISO-8601 string from a date/time value.<br>
+</div>
+</body></html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/XmlRpcServer.base.html b/doc/xmlrpc-light/html/XmlRpcServer.base.html
new file mode 100644
index 0000000..e677dfe
--- /dev/null
+++ b/doc/xmlrpc-light/html/XmlRpcServer.base.html
@@ -0,0 +1,98 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="next" href="XmlRpcServer.cgi.html">
+<link rel="Up" href="XmlRpcServer.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>XmlRpcServer.base</title>
+</head>
+<body>
+<div class="navbar">&nbsp;<a href="XmlRpcServer.html">Up</a>
+&nbsp;<a href="XmlRpcServer.cgi.html">Next</a>
+</div>
+<center><h1>Class virtual <a href="type_XmlRpcServer.base.html">XmlRpcServer.base</a></h1></center>
+<br>
+<pre><span class="keyword">class</span> <a name="TYPEbase"></a><span class="keyword">virtual</span> base : <code class="type"></code><code class="code">object</code> <a href="XmlRpcServer.base.html">..</a> <code class="code">end</code></pre>Abstract base class for XmlRpc servers.<br>
+<hr width="100%">
+<pre><span class="keyword">val</span> <a name="ATTmethods"></a>methods : <code class="type">(string, <a href="XmlRpc.html#TYPEvalue">XmlRpc.value</a> list -> <a href="XmlRpc.html#TYPEvalue">XmlRpc.value</a>) Hashtbl.t</code></pre><div class="info">
+Hashtable mapping method names to implementation functions.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="ATTbase64_encoder"></a><span class="keyword">mutable</span> base64_encoder : <code class="type">string -> string</code></pre><div class="info">
+Base-64 binary encoding function.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="ATTbase64_decoder"></a><span class="keyword">mutable</span> base64_decoder : <code class="type">string -> string</code></pre><div class="info">
+Base-64 binary decoding function.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="ATTdatetime_encoder"></a><span class="keyword">mutable</span> datetime_encoder : <code class="type"><a href="XmlRpcDateTime.html#TYPEt">XmlRpcDateTime.t</a> -> string</code></pre><div class="info">
+ISO-8601 date/time encoding function.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="ATTdatetime_decoder"></a><span class="keyword">mutable</span> datetime_decoder : <code class="type">string -> <a href="XmlRpcDateTime.html#TYPEt">XmlRpcDateTime.t</a></code></pre><div class="info">
+ISO-8601 date/time decoding function.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="ATTerror_handler"></a><span class="keyword">mutable</span> error_handler : <code class="type">exn -> <a href="XmlRpc.html#TYPEmessage">XmlRpc.message</a></code></pre><div class="info">
+Handler for unhandled exceptions.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODset_base64_encoder"></a>set_base64_encoder : <code class="type">(string -> string) -> unit</code></pre><div class="info">
+Sets an alternate Base-64 binary encoding function.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODset_base64_decoder"></a>set_base64_decoder : <code class="type">(string -> string) -> unit</code></pre><div class="info">
+Sets an alternate Base-64 binary decoding function.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODset_datetime_encoder"></a>set_datetime_encoder : <code class="type">(<a href="XmlRpcDateTime.html#TYPEt">XmlRpcDateTime.t</a> -> string) -> unit</code></pre><div class="info">
+Sets an alternate ISO-8601 date/time encoding function.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODset_datetime_decoder"></a>set_datetime_decoder : <code class="type">(string -> <a href="XmlRpcDateTime.html#TYPEt">XmlRpcDateTime.t</a>) -> unit</code></pre><div class="info">
+Sets an alternate ISO-8601 date/time decoding function.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODset_error_handler"></a>set_error_handler : <code class="type">(exn -> <a href="XmlRpc.html#TYPEmessage">XmlRpc.message</a>) -> unit</code></pre><div class="info">
+Sets an alternate handler for unhandled exceptions.
+ See <a href="XmlRpc.html#VALdefault_error_handler"><code class="code">XmlRpc.default_error_handler</code></a> and
+ <a href="XmlRpc.html#VALquiet_error_handler"><code class="code">XmlRpc.quiet_error_handler</code></a> for examples.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODserve"></a>serve : <code class="type">(string -> <a href="XmlRpc.html#TYPEvalue">XmlRpc.value</a> list -> <a href="XmlRpc.html#TYPEvalue">XmlRpc.value</a>) -> string -> string</code></pre><div class="info">
+For use in subclasses; calls <a href="XmlRpc.html#VALserve"><code class="code">XmlRpc.serve</code></a> with the current
+ encoders, decoders, and error handler.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODserve_message"></a>serve_message : <code class="type">(string -> <a href="XmlRpc.html#TYPEvalue">XmlRpc.value</a> list -> <a href="XmlRpc.html#TYPEvalue">XmlRpc.value</a>) -><br> <a href="XmlRpc.html#TYPEmessage">XmlRpc.message</a> -> <a href="XmlRpc.html#TYPEmessage">XmlRpc.message</a></code></pre><div class="info">
+Like <code class="code">serve</code>, but operates on messages instead of strings.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODregister"></a>register : <code class="type">string -><br> ?help:string -><br> ?signature:<a href="XmlRpcServer.html#TYPEparam_type">param_type</a> list -><br> ?signatures:<a href="XmlRpcServer.html#TYPEparam_type">param_type</a> list list -><br> (<a href="XmlRpc.html#TYPEvalue">XmlRpc.value</a> list -> <a href="XmlRpc.html#TYPEvalue">XmlRpc.value</a>) -> unit</code></pre><div class="info">
+Registers a method with the server.
+<p>
+
+ If a <code class="code">help</code> string is specified, its contents will be returned for
+ calls to <code class="code">system.methodHelp</code> for this method.
+<p>
+
+ If <code class="code">signature</code> is specified, this method's signature will be published
+ by <code class="code">system.methodSignature</code> and (shallow) type-checking will be enabled
+ for parameters passed into this method.
+<p>
+
+ Multiple signatures can be supplied via <code class="code">signatures</code> if desired to
+ provide for overloaded methods.
+<p>
+
+ Signatures are of the form <code class="code">return-type; param1-type; param2-type; ...</code>
+ where each type is an instance of the <a href="XmlRpcServer.html#TYPEparam_type"><code class="code">XmlRpcServer.param_type</code></a> variant.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODunregister"></a>unregister : <code class="type">string -> unit</code></pre><div class="info">
+Removes a method from the server.<br>
+</div>
+<pre><span class="keyword">method</span> <a name="METHODrun"></a><span class="keyword">virtual</span> run : <code class="type">unit -> unit</code></pre><div class="info">
+Starts the main server process.<br>
+</div>
+</body></html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/XmlRpcServer.cgi.html b/doc/xmlrpc-light/html/XmlRpcServer.cgi.html
new file mode 100644
index 0000000..d8449f9
--- /dev/null
+++ b/doc/xmlrpc-light/html/XmlRpcServer.cgi.html
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="previous" href="XmlRpcServer.base.html">
+<link rel="next" href="XmlRpcServer.netplex.html">
+<link rel="Up" href="XmlRpcServer.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>XmlRpcServer.cgi</title>
+</head>
+<body>
+<div class="navbar"><a href="XmlRpcServer.base.html">Previous</a>
+&nbsp;<a href="XmlRpcServer.html">Up</a>
+&nbsp;<a href="XmlRpcServer.netplex.html">Next</a>
+</div>
+<center><h1>Class <a href="type_XmlRpcServer.cgi.html">XmlRpcServer.cgi</a></h1></center>
+<br>
+<pre><span class="keyword">class</span> <a name="TYPEcgi"></a>cgi : <code class="type">unit -> </code><code class="type"><a href="XmlRpcServer.server.html">server</a></code></pre>CGI XmlRpc server based on Netcgi2.<br>
+<hr width="100%">
+</body></html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/XmlRpcServer.html b/doc/xmlrpc-light/html/XmlRpcServer.html
new file mode 100644
index 0000000..3feff10
--- /dev/null
+++ b/doc/xmlrpc-light/html/XmlRpcServer.html
@@ -0,0 +1,82 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="previous" href="XmlRpc.html">
+<link rel="next" href="XmlRpcDateTime.html">
+<link rel="Up" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><link title="Base classes" rel="Section" href="#2_Baseclasses">
+<link title="Server implementations" rel="Section" href="#2_Serverimplementations">
+<link title="Utility functions" rel="Section" href="#2_Utilityfunctions">
+<title>XmlRpcServer</title>
+</head>
+<body>
+<div class="navbar"><a href="XmlRpc.html">Previous</a>
+&nbsp;<a href="index.html">Up</a>
+&nbsp;<a href="XmlRpcDateTime.html">Next</a>
+</div>
+<center><h1>Module <a href="type_XmlRpcServer.html">XmlRpcServer</a></h1></center>
+<br>
+<pre><span class="keyword">module</span> XmlRpcServer: <code class="code">sig</code> <a href="XmlRpcServer.html">..</a> <code class="code">end</code></pre>XmlRpc Light server.<br>
+<hr width="100%">
+<br>
+Example: <pre><code class="code"> let server = new XmlRpcServer.cgi () in
+ server#register "demo.sayHello"
+ (fun _ -&gt; `String "Hello!");
+ server#run () </code></pre>
+<p>
+
+ By inheriting from <a href="XmlRpcServer.base.html"><code class="code">XmlRpcServer.base</code></a>, all servers provide
+ the following introspection functions by default: <code class="code">system.listMethods</code>,
+ <code class="code">system.getCapabilities</code>. To prevent their use, use <code class="code">server#unregister</code>.
+<p>
+
+ Additionally, the methods <code class="code">system.methodHelp</code> and <code class="code">system.methodSignature</code>
+ will be made available if at least one method help or method signature is
+ provided.<br>
+<pre><span class="keyword">type</span> <a name="TYPEparam_type"></a><code class="type"></code>param_type = <code class="type">[ `Array<br> | `Binary<br> | `Boolean<br> | `DateTime<br> | `Double<br> | `Int<br> | `String<br> | `Struct<br> | `Undefined ]</code> </pre>
+<div class="info">
+Type of parameters used in method signatures.<br>
+</div>
+
+<br>
+<a name="2_Baseclasses"></a>
+<h2>Base classes</h2><br>
+<pre><span class="keyword">class</span> <a name="TYPEbase"></a><span class="keyword">virtual</span> <a href="XmlRpcServer.base.html">base</a> : <code class="type"></code><code class="code">object</code> <a href="XmlRpcServer.base.html">..</a> <code class="code">end</code></pre><div class="info">
+Abstract base class for XmlRpc servers.
+</div>
+<pre><span class="keyword">class type</span> <a name="TYPEserver"></a><a href="XmlRpcServer.server.html">server</a> = <code class="code">object</code> <a href="XmlRpcServer.server.html">..</a> <code class="code">end</code></pre><div class="info">
+Type of concrete XmlRpc server classes.
+</div>
+<br>
+<a name="2_Serverimplementations"></a>
+<h2>Server implementations</h2><br>
+<pre><span class="keyword">class</span> <a name="TYPEcgi"></a><a href="XmlRpcServer.cgi.html">cgi</a> : <code class="type">unit -> </code><code class="type"><a href="XmlRpcServer.server.html">server</a></code></pre><div class="info">
+CGI XmlRpc server based on Netcgi2.
+</div>
+<pre><span class="keyword">class</span> <a name="TYPEnetplex"></a><a href="XmlRpcServer.netplex.html">netplex</a> : <code class="type">?parallelizer:Netplex_types.parallelizer -> ?handler:string -> unit -> </code><code class="type"><a href="XmlRpcServer.server.html">server</a></code></pre><div class="info">
+Stand-alone XmlRpc server based on Netplex.
+</div>
+<br>
+<a name="2_Utilityfunctions"></a>
+<h2>Utility functions</h2><br>
+<pre><span class="keyword">val</span> <a name="VALinvalid_method"></a>invalid_method : <code class="type">string -> 'a</code></pre><div class="info">
+Raise an <a href="XmlRpc.html#EXCEPTIONError"><code class="code">XmlRpc.Error</code></a> indicating a method name not found.<br>
+</div>
+<pre><span class="keyword">val</span> <a name="VALinvalid_params"></a>invalid_params : <code class="type">unit -> 'a</code></pre><div class="info">
+Raise an <a href="XmlRpc.html#EXCEPTIONError"><code class="code">XmlRpc.Error</code></a> indicating invalid method parameters.<br>
+</div>
+</body></html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/XmlRpcServer.netplex.html b/doc/xmlrpc-light/html/XmlRpcServer.netplex.html
new file mode 100644
index 0000000..82876ed
--- /dev/null
+++ b/doc/xmlrpc-light/html/XmlRpcServer.netplex.html
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="previous" href="XmlRpcServer.cgi.html">
+<link rel="Up" href="XmlRpcServer.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>XmlRpcServer.netplex</title>
+</head>
+<body>
+<div class="navbar"><a href="XmlRpcServer.cgi.html">Previous</a>
+&nbsp;<a href="XmlRpcServer.html">Up</a>
+&nbsp;</div>
+<center><h1>Class <a href="type_XmlRpcServer.netplex.html">XmlRpcServer.netplex</a></h1></center>
+<br>
+<pre><span class="keyword">class</span> <a name="TYPEnetplex"></a>netplex : <code class="type">?parallelizer:Netplex_types.parallelizer -> ?handler:string -> unit -> </code><code class="type"><a href="XmlRpcServer.server.html">server</a></code></pre>Stand-alone XmlRpc server based on Netplex.<br>
+<hr width="100%">
+</body></html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/XmlRpcServer.server.html b/doc/xmlrpc-light/html/XmlRpcServer.server.html
new file mode 100644
index 0000000..a355870
--- /dev/null
+++ b/doc/xmlrpc-light/html/XmlRpcServer.server.html
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="Up" href="XmlRpcServer.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>XmlRpcServer.server</title>
+</head>
+<body>
+<div class="navbar">&nbsp;<a href="XmlRpcServer.html">Up</a>
+&nbsp;</div>
+<center><h1>Class type <a href="type_XmlRpcServer.server.html">XmlRpcServer.server</a></h1></center>
+<br>
+<pre><span class="keyword">class type</span> <a name="TYPEserver"></a>server = <code class="code">object</code> <a href="XmlRpcServer.server.html">..</a> <code class="code">end</code></pre>Type of concrete XmlRpc server classes.<br>
+<b>Inherits</b><ul>
+<li><a href="XmlRpcServer.base.html"><code class="code">XmlRpcServer.base</code></a></li>
+</ul>
+<hr width="100%">
+<pre><span class="keyword">method</span> <a name="METHODrun"></a>run : <code class="type">unit -> unit</code></pre><div class="info">
+Starts the main server process.<br>
+</div>
+</body></html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/index.html b/doc/xmlrpc-light/html/index.html
new file mode 100644
index 0000000..3984511
--- /dev/null
+++ b/doc/xmlrpc-light/html/index.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title></title>
+</head>
+<body>
+<center><h1></h1></center>
+<a href="index_types.html">Index of types</a><br>
+<a href="index_exceptions.html">Index of exceptions</a><br>
+<a href="index_values.html">Index of values</a><br>
+<a href="index_attributes.html">Index of class attributes</a><br>
+<a href="index_methods.html">Index of class methods</a><br>
+<a href="index_classes.html">Index of classes</a><br>
+<a href="index_class_types.html">Index of class types</a><br>
+<a href="index_modules.html">Index of modules</a><br>
+<br/><br>
+<table class="indextable">
+<tr><td><a href="XmlRpc.html">XmlRpc</a></td><td><div class="info">
+XmlRpc Light.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcServer.html">XmlRpcServer</a></td><td><div class="info">
+XmlRpc Light server.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcDateTime.html">XmlRpcDateTime</a></td><td><div class="info">
+Date/time type.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcBase64.html">XmlRpcBase64</a></td><td><div class="info">
+Base64 codec.
+</div>
+</td></tr>
+</table>
+</body>
+</html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/index_attributes.html b/doc/xmlrpc-light/html/index_attributes.html
new file mode 100644
index 0000000..bd9a14b
--- /dev/null
+++ b/doc/xmlrpc-light/html/index_attributes.html
@@ -0,0 +1,92 @@
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>Index of class attributes</title>
+</head>
+<body>
+<center><h1>Index of class attributes</h1></center>
+<table>
+<tr><td align="left"><br>B</td></tr>
+<tr><td><a href="XmlRpcServer.base.html#ATTbase64_decoder">base64_decoder</a> [<a href="XmlRpcServer.base.html">XmlRpcServer.base</a>]</td>
+<td><div class="info">
+Base-64 binary decoding function.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcServer.base.html#ATTbase64_encoder">base64_encoder</a> [<a href="XmlRpcServer.base.html">XmlRpcServer.base</a>]</td>
+<td><div class="info">
+Base-64 binary encoding function.
+</div>
+</td></tr>
+<tr><td align="left"><br>D</td></tr>
+<tr><td><a href="XmlRpcServer.base.html#ATTdatetime_decoder">datetime_decoder</a> [<a href="XmlRpcServer.base.html">XmlRpcServer.base</a>]</td>
+<td><div class="info">
+ISO-8601 date/time decoding function.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcServer.base.html#ATTdatetime_encoder">datetime_encoder</a> [<a href="XmlRpcServer.base.html">XmlRpcServer.base</a>]</td>
+<td><div class="info">
+ISO-8601 date/time encoding function.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpc.client.html#ATTdebug">debug</a> [<a href="XmlRpc.client.html">XmlRpc.client</a>]</td>
+<td><div class="info">
+If true, Xml messages will be printed to standard error.
+</div>
+</td></tr>
+<tr><td align="left"><br>E</td></tr>
+<tr><td><a href="XmlRpcServer.base.html#ATTerror_handler">error_handler</a> [<a href="XmlRpcServer.base.html">XmlRpcServer.base</a>]</td>
+<td><div class="info">
+Handler for unhandled exceptions.
+</div>
+</td></tr>
+<tr><td align="left"><br>H</td></tr>
+<tr><td><a href="XmlRpc.client.html#ATTheaders">headers</a> [<a href="XmlRpc.client.html">XmlRpc.client</a>]</td>
+<td><div class="info">
+List of custom HTTP headers to send with each request.
+</div>
+</td></tr>
+<tr><td align="left"><br>I</td></tr>
+<tr><td><a href="XmlRpc.client.html#ATTinsecure_ssl">insecure_ssl</a> [<a href="XmlRpc.client.html">XmlRpc.client</a>]</td>
+<td><div class="info">
+If true, SSL will be allowed even if the certificate is self-signed.
+</div>
+</td></tr>
+<tr><td align="left"><br>M</td></tr>
+<tr><td><a href="XmlRpcServer.base.html#ATTmethods">methods</a> [<a href="XmlRpcServer.base.html">XmlRpcServer.base</a>]</td>
+<td><div class="info">
+Hashtable mapping method names to implementation functions.
+</div>
+</td></tr>
+<tr><td align="left"><br>T</td></tr>
+<tr><td><a href="XmlRpc.client.html#ATTtimeout">timeout</a> [<a href="XmlRpc.client.html">XmlRpc.client</a>]</td>
+<td><div class="info">
+Maximum time to wait for a request to complete, in seconds.
+</div>
+</td></tr>
+<tr><td align="left"><br>U</td></tr>
+<tr><td><a href="XmlRpc.client.html#ATTurl">url</a> [<a href="XmlRpc.client.html">XmlRpc.client</a>]</td>
+<td><div class="info">
+Url of the remote XmlRpc server.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpc.client.html#ATTuseragent">useragent</a> [<a href="XmlRpc.client.html">XmlRpc.client</a>]</td>
+<td><div class="info">
+User-agent to send in request headers.
+</div>
+</td></tr>
+</table><br>
+</body>
+</html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/index_class_types.html b/doc/xmlrpc-light/html/index_class_types.html
new file mode 100644
index 0000000..be00f5f
--- /dev/null
+++ b/doc/xmlrpc-light/html/index_class_types.html
@@ -0,0 +1,30 @@
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>Index of class types</title>
+</head>
+<body>
+<center><h1>Index of class types</h1></center>
+<table>
+<tr><td align="left"><br>S</td></tr>
+<tr><td><a href="XmlRpcServer.server.html">server</a> [<a href="XmlRpcServer.html">XmlRpcServer</a>]</td>
+<td><div class="info">
+Type of concrete XmlRpc server classes.
+</div>
+</td></tr>
+</table><br>
+</body>
+</html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/index_classes.html b/doc/xmlrpc-light/html/index_classes.html
new file mode 100644
index 0000000..e60a220
--- /dev/null
+++ b/doc/xmlrpc-light/html/index_classes.html
@@ -0,0 +1,53 @@
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>Index of classes</title>
+</head>
+<body>
+<center><h1>Index of classes</h1></center>
+<table>
+<tr><td align="left"><br>B</td></tr>
+<tr><td><a href="XmlRpcServer.base.html">base</a> [<a href="XmlRpcServer.html">XmlRpcServer</a>]</td>
+<td><div class="info">
+Abstract base class for XmlRpc servers.
+</div>
+</td></tr>
+<tr><td align="left"><br>C</td></tr>
+<tr><td><a href="XmlRpcServer.cgi.html">cgi</a> [<a href="XmlRpcServer.html">XmlRpcServer</a>]</td>
+<td><div class="info">
+CGI XmlRpc server based on Netcgi2.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpc.client.html">client</a> [<a href="XmlRpc.html">XmlRpc</a>]</td>
+<td><div class="info">
+Class for XmlRpc clients.
+</div>
+</td></tr>
+<tr><td align="left"><br>M</td></tr>
+<tr><td><a href="XmlRpc.multicall.html">multicall</a> [<a href="XmlRpc.html">XmlRpc</a>]</td>
+<td><div class="info">
+Convenience class for <code class="code">system.multicall</code> calls.
+</div>
+</td></tr>
+<tr><td align="left"><br>N</td></tr>
+<tr><td><a href="XmlRpcServer.netplex.html">netplex</a> [<a href="XmlRpcServer.html">XmlRpcServer</a>]</td>
+<td><div class="info">
+Stand-alone XmlRpc server based on Netplex.
+</div>
+</td></tr>
+</table><br>
+</body>
+</html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/index_exceptions.html b/doc/xmlrpc-light/html/index_exceptions.html
new file mode 100644
index 0000000..d2eabd2
--- /dev/null
+++ b/doc/xmlrpc-light/html/index_exceptions.html
@@ -0,0 +1,49 @@
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>Index of exceptions</title>
+</head>
+<body>
+<center><h1>Index of exceptions</h1></center>
+<table>
+<tr><td align="left"><br>E</td></tr>
+<tr><td><a href="XmlRpc.html#EXCEPTIONError">Error</a> [<a href="XmlRpc.html">XmlRpc</a>]</td>
+<td><div class="info">
+Raised for all errors including XmlRpc faults (code, string).
+</div>
+</td></tr>
+<tr><td align="left"><br>I</td></tr>
+<tr><td><a href="XmlRpcBase64.html#EXCEPTIONInvalid_char">Invalid_char</a> [<a href="XmlRpcBase64.html">XmlRpcBase64</a>]</td>
+<td><div class="info">
+This exception is raised when reading an invalid character
+ from a base64 input.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcBase64.html#EXCEPTIONInvalid_table">Invalid_table</a> [<a href="XmlRpcBase64.html">XmlRpcBase64</a>]</td>
+<td><div class="info">
+This exception is raised if the encoding or decoding table
+ size is not correct.
+</div>
+</td></tr>
+<tr><td align="left"><br>P</td></tr>
+<tr><td><a href="XmlRpcDateTime.html#EXCEPTIONParse_error">Parse_error</a> [<a href="XmlRpcDateTime.html">XmlRpcDateTime</a>]</td>
+<td><div class="info">
+Raised by <a href="XmlRpcDateTime.html#VALof_string"><code class="code">XmlRpcDateTime.of_string</code></a> if a string could not be parsed.
+</div>
+</td></tr>
+</table><br>
+</body>
+</html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/index_methods.html b/doc/xmlrpc-light/html/index_methods.html
new file mode 100644
index 0000000..e8054b5
--- /dev/null
+++ b/doc/xmlrpc-light/html/index_methods.html
@@ -0,0 +1,195 @@
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>Index of class methods</title>
+</head>
+<body>
+<center><h1>Index of class methods</h1></center>
+<table>
+<tr><td align="left"><br>C</td></tr>
+<tr><td><a href="XmlRpc.multicall.html#METHODcall">call</a> [<a href="XmlRpc.multicall.html">XmlRpc.multicall</a>]</td>
+<td><div class="info">
+Adds a call to this <code class="code">multicall</code> instance.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpc.client.html#METHODcall">call</a> [<a href="XmlRpc.client.html">XmlRpc.client</a>]</td>
+<td><div class="info">
+<code class="code">call name params</code> invokes an XmlRpc method and returns the result,
+ or raises <a href="XmlRpc.html#EXCEPTIONError"><code class="code">XmlRpc.Error</code></a> on error.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpc.multicall.html#METHODcompleted">completed</a> [<a href="XmlRpc.multicall.html">XmlRpc.multicall</a>]</td>
+<td><div class="info">
+True of the call has executed and completed successfully.
+</div>
+</td></tr>
+<tr><td align="left"><br>D</td></tr>
+<tr><td><a href="XmlRpc.client.html#METHODdebug">debug</a> [<a href="XmlRpc.client.html">XmlRpc.client</a>]</td>
+<td><div class="info">
+Gets <code class="code">debug</code>.
+</div>
+</td></tr>
+<tr><td align="left"><br>E</td></tr>
+<tr><td><a href="XmlRpc.multicall.html#METHODexecute">execute</a> [<a href="XmlRpc.multicall.html">XmlRpc.multicall</a>]</td>
+<td><div class="info">
+Forces the call to execute immediately.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpc.multicall.html#METHODexecuted">executed</a> [<a href="XmlRpc.multicall.html">XmlRpc.multicall</a>]</td>
+<td><div class="info">
+True if the call has executed, whether or not it succeeded.
+</div>
+</td></tr>
+<tr><td align="left"><br>H</td></tr>
+<tr><td><a href="XmlRpc.client.html#METHODheaders">headers</a> [<a href="XmlRpc.client.html">XmlRpc.client</a>]</td>
+<td><div class="info">
+Gets <code class="code">headers</code>.
+</div>
+</td></tr>
+<tr><td align="left"><br>I</td></tr>
+<tr><td><a href="XmlRpc.client.html#METHODinsecure_ssl">insecure_ssl</a> [<a href="XmlRpc.client.html">XmlRpc.client</a>]</td>
+<td><div class="info">
+Gets <code class="code">insecure_ssl</code>.
+</div>
+</td></tr>
+<tr><td align="left"><br>R</td></tr>
+<tr><td><a href="XmlRpcServer.base.html#METHODregister">register</a> [<a href="XmlRpcServer.base.html">XmlRpcServer.base</a>]</td>
+<td><div class="info">
+Registers a method with the server.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpc.multicall.html#METHODresult">result</a> [<a href="XmlRpc.multicall.html">XmlRpc.multicall</a>]</td>
+<td><div class="info">
+Returns a <code class="code">multicall</code> result, executing the call if necessary.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcServer.server.html#METHODrun">run</a> [<a href="XmlRpcServer.server.html">XmlRpcServer.server</a>]</td>
+<td><div class="info">
+Starts the main server process.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcServer.base.html#METHODrun">run</a> [<a href="XmlRpcServer.base.html">XmlRpcServer.base</a>]</td>
+<td><div class="info">
+Starts the main server process.
+</div>
+</td></tr>
+<tr><td align="left"><br>S</td></tr>
+<tr><td><a href="XmlRpcServer.base.html#METHODserve">serve</a> [<a href="XmlRpcServer.base.html">XmlRpcServer.base</a>]</td>
+<td><div class="info">
+For use in subclasses; calls <a href="XmlRpc.html#VALserve"><code class="code">XmlRpc.serve</code></a> with the current
+ encoders, decoders, and error handler.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcServer.base.html#METHODserve_message">serve_message</a> [<a href="XmlRpcServer.base.html">XmlRpcServer.base</a>]</td>
+<td><div class="info">
+Like <code class="code">serve</code>, but operates on messages instead of strings.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcServer.base.html#METHODset_base64_decoder">set_base64_decoder</a> [<a href="XmlRpcServer.base.html">XmlRpcServer.base</a>]</td>
+<td><div class="info">
+Sets an alternate Base-64 binary decoding function.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpc.client.html#METHODset_base64_decoder">set_base64_decoder</a> [<a href="XmlRpc.client.html">XmlRpc.client</a>]</td>
+<td><div class="info">
+Sets an alternate Base-64 binary decoding function.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcServer.base.html#METHODset_base64_encoder">set_base64_encoder</a> [<a href="XmlRpcServer.base.html">XmlRpcServer.base</a>]</td>
+<td><div class="info">
+Sets an alternate Base-64 binary encoding function.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpc.client.html#METHODset_base64_encoder">set_base64_encoder</a> [<a href="XmlRpc.client.html">XmlRpc.client</a>]</td>
+<td><div class="info">
+Sets an alternate Base-64 binary encoding function.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcServer.base.html#METHODset_datetime_decoder">set_datetime_decoder</a> [<a href="XmlRpcServer.base.html">XmlRpcServer.base</a>]</td>
+<td><div class="info">
+Sets an alternate ISO-8601 date/time decoding function.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpc.client.html#METHODset_datetime_decoder">set_datetime_decoder</a> [<a href="XmlRpc.client.html">XmlRpc.client</a>]</td>
+<td><div class="info">
+Sets an alternate ISO-8601 date/time decoding function.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcServer.base.html#METHODset_datetime_encoder">set_datetime_encoder</a> [<a href="XmlRpcServer.base.html">XmlRpcServer.base</a>]</td>
+<td><div class="info">
+Sets an alternate ISO-8601 date/time encoding function.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpc.client.html#METHODset_datetime_encoder">set_datetime_encoder</a> [<a href="XmlRpc.client.html">XmlRpc.client</a>]</td>
+<td><div class="info">
+Sets an alternate ISO-8601 date/time encoding function.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpc.client.html#METHODset_debug">set_debug</a> [<a href="XmlRpc.client.html">XmlRpc.client</a>]</td>
+<td><div class="info">
+Sets <code class="code">debug</code>.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcServer.base.html#METHODset_error_handler">set_error_handler</a> [<a href="XmlRpcServer.base.html">XmlRpcServer.base</a>]</td>
+<td><div class="info">
+Sets an alternate handler for unhandled exceptions.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpc.client.html#METHODset_headers">set_headers</a> [<a href="XmlRpc.client.html">XmlRpc.client</a>]</td>
+<td><div class="info">
+Sets <code class="code">headers</code>.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpc.client.html#METHODset_insecure_ssl">set_insecure_ssl</a> [<a href="XmlRpc.client.html">XmlRpc.client</a>]</td>
+<td><div class="info">
+Sets <code class="code">insecure_ssl</code>.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpc.client.html#METHODset_timeout">set_timeout</a> [<a href="XmlRpc.client.html">XmlRpc.client</a>]</td>
+<td><div class="info">
+Sets <code class="code">timeout</code>.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpc.client.html#METHODset_useragent">set_useragent</a> [<a href="XmlRpc.client.html">XmlRpc.client</a>]</td>
+<td><div class="info">
+Sets <code class="code">useragent</code>.
+</div>
+</td></tr>
+<tr><td align="left"><br>T</td></tr>
+<tr><td><a href="XmlRpc.client.html#METHODtimeout">timeout</a> [<a href="XmlRpc.client.html">XmlRpc.client</a>]</td>
+<td><div class="info">
+Gets <code class="code">timeout</code>.
+</div>
+</td></tr>
+<tr><td align="left"><br>U</td></tr>
+<tr><td><a href="XmlRpcServer.base.html#METHODunregister">unregister</a> [<a href="XmlRpcServer.base.html">XmlRpcServer.base</a>]</td>
+<td><div class="info">
+Removes a method from the server.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpc.client.html#METHODurl">url</a> [<a href="XmlRpc.client.html">XmlRpc.client</a>]</td>
+<td><div class="info">
+Gets <code class="code">url</code>.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpc.client.html#METHODuseragent">useragent</a> [<a href="XmlRpc.client.html">XmlRpc.client</a>]</td>
+<td><div class="info">
+Gets <code class="code">useragent</code>.
+</div>
+</td></tr>
+</table><br>
+</body>
+</html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/index_module_types.html b/doc/xmlrpc-light/html/index_module_types.html
new file mode 100644
index 0000000..6fcbe62
--- /dev/null
+++ b/doc/xmlrpc-light/html/index_module_types.html
@@ -0,0 +1,24 @@
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>Index of module types</title>
+</head>
+<body>
+<center><h1>Index of module types</h1></center>
+<table>
+</table><br>
+</body>
+</html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/index_modules.html b/doc/xmlrpc-light/html/index_modules.html
new file mode 100644
index 0000000..b2f5eb5
--- /dev/null
+++ b/doc/xmlrpc-light/html/index_modules.html
@@ -0,0 +1,45 @@
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>Index of modules</title>
+</head>
+<body>
+<center><h1>Index of modules</h1></center>
+<table>
+<tr><td align="left"><br>X</td></tr>
+<tr><td><a href="XmlRpc.html">XmlRpc</a> </td>
+<td><div class="info">
+XmlRpc Light.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcBase64.html">XmlRpcBase64</a> </td>
+<td><div class="info">
+Base64 codec.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcDateTime.html">XmlRpcDateTime</a> </td>
+<td><div class="info">
+Date/time type.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcServer.html">XmlRpcServer</a> </td>
+<td><div class="info">
+XmlRpc Light server.
+</div>
+</td></tr>
+</table><br>
+</body>
+</html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/index_types.html b/doc/xmlrpc-light/html/index_types.html
new file mode 100644
index 0000000..a5125e6
--- /dev/null
+++ b/doc/xmlrpc-light/html/index_types.html
@@ -0,0 +1,62 @@
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>Index of types</title>
+</head>
+<body>
+<center><h1>Index of types</h1></center>
+<table>
+<tr><td align="left"><br>D</td></tr>
+<tr><td><a href="XmlRpcBase64.html#TYPEdecoding_table">decoding_table</a> [<a href="XmlRpcBase64.html">XmlRpcBase64</a>]</td>
+<td><div class="info">
+A decoding table maps chars 0..255 to the corresponding 0..63 value
+ or -1 if the char is not accepted.
+</div>
+</td></tr>
+<tr><td align="left"><br>E</td></tr>
+<tr><td><a href="XmlRpcBase64.html#TYPEencoding_table">encoding_table</a> [<a href="XmlRpcBase64.html">XmlRpcBase64</a>]</td>
+<td><div class="info">
+An encoding table maps integers 0..63 to the corresponding char.
+</div>
+</td></tr>
+<tr><td align="left"><br>M</td></tr>
+<tr><td><a href="XmlRpc.html#TYPEmessage">message</a> [<a href="XmlRpc.html">XmlRpc</a>]</td>
+<td><div class="info">
+Type for XmlRpc messages.
+</div>
+</td></tr>
+<tr><td align="left"><br>P</td></tr>
+<tr><td><a href="XmlRpcServer.html#TYPEparam_type">param_type</a> [<a href="XmlRpcServer.html">XmlRpcServer</a>]</td>
+<td><div class="info">
+Type of parameters used in method signatures.
+</div>
+</td></tr>
+<tr><td align="left"><br>T</td></tr>
+<tr><td><a href="XmlRpcDateTime.html#TYPEt">t</a> [<a href="XmlRpcDateTime.html">XmlRpcDateTime</a>]</td>
+<td><div class="info">
+Type of XmlRpc-compatible date/time values.
+</div>
+</td></tr>
+<tr><td align="left"><br>V</td></tr>
+<tr><td><a href="XmlRpc.html#TYPEvalue">value</a> [<a href="XmlRpc.html">XmlRpc</a>]</td>
+<td><div class="info">
+Polymorphic variant type for XmlRpc values: <code class="code">`Array</code>: An ordered list of values, <code class="code">`Binary</code>: A string containing binary data, <code class="code">`Boolean</code>: A boolean, <code class="code">`DateTime</code>: A date/time value, <code class="code">`Double</code>: A floating-point value, <code class="code">`Int</code>: An integer, <code class="code">`Int32</code>: A 32-bit integer, <code class="code">`Nil</code>: A null value, <code class="code">`String</code>: A string, <code class="code">`Struct</code>: An association list of (name, value) pairs
+ Note that base64-encoding of <code class="code">`Binary</code> values is done automatically.
+</div>
+</td></tr>
+</table><br>
+</body>
+</html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/index_values.html b/doc/xmlrpc-light/html/index_values.html
new file mode 100644
index 0000000..c8a4bd9
--- /dev/null
+++ b/doc/xmlrpc-light/html/index_values.html
@@ -0,0 +1,215 @@
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>Index of values</title>
+</head>
+<body>
+<center><h1>Index of values</h1></center>
+<table>
+<tr><td align="left"><br>C</td></tr>
+<tr><td><a href="XmlRpcDateTime.html#VALcompare">compare</a> [<a href="XmlRpcDateTime.html">XmlRpcDateTime</a>]</td>
+<td><div class="info">
+Standard comparator for date/time values.
+</div>
+</td></tr>
+<tr><td align="left"><br>D</td></tr>
+<tr><td><a href="XmlRpcBase64.html#VALdecode">decode</a> [<a href="XmlRpcBase64.html">XmlRpcBase64</a>]</td>
+<td><div class="info">
+Generic base64 decoding over a character stream.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpc.html#VALdefault_error_handler">default_error_handler</a> [<a href="XmlRpc.html">XmlRpc</a>]</td>
+<td><div class="info">
+The default error handler for <code class="code">serve</code>.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpc.html#VALdump">dump</a> [<a href="XmlRpc.html">XmlRpc</a>]</td>
+<td><div class="info">
+Converts an XmlRpc value to a human-readable string.
+</div>
+</td></tr>
+<tr><td align="left"><br>E</td></tr>
+<tr><td><a href="XmlRpcBase64.html#VALencode">encode</a> [<a href="XmlRpcBase64.html">XmlRpcBase64</a>]</td>
+<td><div class="info">
+Generic base64 encoding over a character stream.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcDateTime.html#VALequal">equal</a> [<a href="XmlRpcDateTime.html">XmlRpcDateTime</a>]</td>
+<td><div class="info">
+Standard equality function for date/time values.
+</div>
+</td></tr>
+<tr><td align="left"><br>F</td></tr>
+<tr><td><a href="XmlRpcDateTime.html#VALfix_tz_offset">fix_tz_offset</a> [<a href="XmlRpcDateTime.html">XmlRpcDateTime</a>]</td>
+<td><div class="info">
+Forces the time zone offset to a different value, ignoring all other
+ fields.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcDateTime.html#VALfrom_unixfloat">from_unixfloat</a> [<a href="XmlRpcDateTime.html">XmlRpcDateTime</a>]</td>
+<td><div class="info">
+Builds a date/time value from epoch seconds in the local time zone.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcDateTime.html#VALfrom_unixfloat_utc">from_unixfloat_utc</a> [<a href="XmlRpcDateTime.html">XmlRpcDateTime</a>]</td>
+<td><div class="info">
+Builds a date/time value from epoch seconds in UTC.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcDateTime.html#VALfrom_unixtm">from_unixtm</a> [<a href="XmlRpcDateTime.html">XmlRpcDateTime</a>]</td>
+<td><div class="info">
+Builds a date/time value from a Unix.tm value in the local time zone.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcDateTime.html#VALfrom_unixtm_utc">from_unixtm_utc</a> [<a href="XmlRpcDateTime.html">XmlRpcDateTime</a>]</td>
+<td><div class="info">
+Builds a date/time value from a Unix.tm value in UTC.
+</div>
+</td></tr>
+<tr><td align="left"><br>H</td></tr>
+<tr><td><a href="XmlRpcDateTime.html#VALhash">hash</a> [<a href="XmlRpcDateTime.html">XmlRpcDateTime</a>]</td>
+<td><div class="info">
+Standard hash function for date/time values.
+</div>
+</td></tr>
+<tr><td align="left"><br>I</td></tr>
+<tr><td><a href="XmlRpcServer.html#VALinvalid_method">invalid_method</a> [<a href="XmlRpcServer.html">XmlRpcServer</a>]</td>
+<td><div class="info">
+Raise an <a href="XmlRpc.html#EXCEPTIONError"><code class="code">XmlRpc.Error</code></a> indicating a method name not found.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcServer.html#VALinvalid_params">invalid_params</a> [<a href="XmlRpcServer.html">XmlRpcServer</a>]</td>
+<td><div class="info">
+Raise an <a href="XmlRpc.html#EXCEPTIONError"><code class="code">XmlRpc.Error</code></a> indicating invalid method parameters.
+</div>
+</td></tr>
+<tr><td align="left"><br>M</td></tr>
+<tr><td><a href="XmlRpcBase64.html#VALmake_decoding_table">make_decoding_table</a> [<a href="XmlRpcBase64.html">XmlRpcBase64</a>]</td>
+<td><div class="info">
+Create a valid decoding table from an encoding one.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpc.html#VALmessage_of_xml_element">message_of_xml_element</a> [<a href="XmlRpc.html">XmlRpc</a>]</td>
+<td><div class="info">
+Converts an Xml Light element to an XmlRpc message.
+</div>
+</td></tr>
+<tr><td align="left"><br>N</td></tr>
+<tr><td><a href="XmlRpcDateTime.html#VALnow">now</a> [<a href="XmlRpcDateTime.html">XmlRpcDateTime</a>]</td>
+<td><div class="info">
+Returns the current date and time in the local time zone.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcDateTime.html#VALnow_utc">now_utc</a> [<a href="XmlRpcDateTime.html">XmlRpcDateTime</a>]</td>
+<td><div class="info">
+Returns the current date and time in UTC.
+</div>
+</td></tr>
+<tr><td align="left"><br>O</td></tr>
+<tr><td><a href="XmlRpcDateTime.html#VALof_string">of_string</a> [<a href="XmlRpcDateTime.html">XmlRpcDateTime</a>]</td>
+<td><div class="info">
+Parses an (XmlRpc-flavor) ISO-8601 date/time value from a string.
+</div>
+</td></tr>
+<tr><td align="left"><br>Q</td></tr>
+<tr><td><a href="XmlRpc.html#VALquiet_error_handler">quiet_error_handler</a> [<a href="XmlRpc.html">XmlRpc</a>]</td>
+<td><div class="info">
+A "quiet" error handler for <code class="code">serve</code>.
+</div>
+</td></tr>
+<tr><td align="left"><br>S</td></tr>
+<tr><td><a href="XmlRpc.html#VALserve">serve</a> [<a href="XmlRpc.html">XmlRpc</a>]</td>
+<td><div class="info">
+Creates a function from string (Xml representing a <code class="code">MethodCall</code>) to
+ string (Xml representing a <code class="code">MethodResult</code> or <code class="code">Fault</code>) given a function
+ of the form: (<code class="code">name</code> -&gt; <code class="code">params</code> -&gt; <code class="code">result</code>), where <code class="code">name</code> is the
+ name of the method, <code class="code">params</code> is a list of parameter values, and
+ <code class="code">result</code> is the result value.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpc.html#VALserve_message">serve_message</a> [<a href="XmlRpc.html">XmlRpc</a>]</td>
+<td><div class="info">
+Performs the same function as <code class="code">serve</code>, but operates on typed messages
+ instead of strings.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcDateTime.html#VALset_tz_offset">set_tz_offset</a> [<a href="XmlRpcDateTime.html">XmlRpcDateTime</a>]</td>
+<td><div class="info">
+Adjusts the time zone offset, preserving equality.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcBase64.html#VALstr_decode">str_decode</a> [<a href="XmlRpcBase64.html">XmlRpcBase64</a>]</td>
+<td><div class="info">
+Decode a string encoded into Base64, raise <code class="code">Invalid_char</code> if a
+ character in the input string is not a valid one.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcBase64.html#VALstr_encode">str_encode</a> [<a href="XmlRpcBase64.html">XmlRpcBase64</a>]</td>
+<td><div class="info">
+Encode a string into Base64.
+</div>
+</td></tr>
+<tr><td align="left"><br>T</td></tr>
+<tr><td><a href="XmlRpcDateTime.html#VALto_string">to_string</a> [<a href="XmlRpcDateTime.html">XmlRpcDateTime</a>]</td>
+<td><div class="info">
+Generates an ISO-8601 string from a date/time value.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcDateTime.html#VALto_unixfloat">to_unixfloat</a> [<a href="XmlRpcDateTime.html">XmlRpcDateTime</a>]</td>
+<td><div class="info">
+Converts a date/time value to epoch seconds in the local time zone.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcDateTime.html#VALto_unixfloat_utc">to_unixfloat_utc</a> [<a href="XmlRpcDateTime.html">XmlRpcDateTime</a>]</td>
+<td><div class="info">
+Converts a date/time value to epoch seconds in UTC.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcDateTime.html#VALto_unixtm">to_unixtm</a> [<a href="XmlRpcDateTime.html">XmlRpcDateTime</a>]</td>
+<td><div class="info">
+Converts a date/time value to a Unix.tm value in the local time zone.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpcDateTime.html#VALto_unixtm_utc">to_unixtm_utc</a> [<a href="XmlRpcDateTime.html">XmlRpcDateTime</a>]</td>
+<td><div class="info">
+Converts a date/time value to a Unix.tm value in UTC.
+</div>
+</td></tr>
+<tr><td align="left"><br>V</td></tr>
+<tr><td><a href="XmlRpc.html#VALvalue_of_xml_element">value_of_xml_element</a> [<a href="XmlRpc.html">XmlRpc</a>]</td>
+<td><div class="info">
+Converts an Xml Light element to an XmlRpc value.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpc.html#VALversion">version</a> [<a href="XmlRpc.html">XmlRpc</a>]</td>
+<td><div class="info">
+Version of XmlRpc-Light as a string.
+</div>
+</td></tr>
+<tr><td align="left"><br>X</td></tr>
+<tr><td><a href="XmlRpc.html#VALxml_element_of_message">xml_element_of_message</a> [<a href="XmlRpc.html">XmlRpc</a>]</td>
+<td><div class="info">
+Converts an XmlRpc message to an Xml Light element.
+</div>
+</td></tr>
+<tr><td><a href="XmlRpc.html#VALxml_element_of_value">xml_element_of_value</a> [<a href="XmlRpc.html">XmlRpc</a>]</td>
+<td><div class="info">
+Converts an XmlRpc value to an Xml Light element.
+</div>
+</td></tr>
+</table><br>
+</body>
+</html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/style.css b/doc/xmlrpc-light/html/style.css
new file mode 100644
index 0000000..c0a80f3
--- /dev/null
+++ b/doc/xmlrpc-light/html/style.css
@@ -0,0 +1,33 @@
+a:visited {color : #416DFF; text-decoration : none; }
+a:link {color : #416DFF; text-decoration : none;}
+a:hover {color : Red; text-decoration : none; background-color: #5FFF88}
+a:active {color : Red; text-decoration : underline; }
+.keyword { font-weight : bold ; color : Red }
+.keywordsign { color : #C04600 }
+.superscript { font-size : 4 }
+.subscript { font-size : 4 }
+.comment { color : Green }
+.constructor { color : Blue }
+.type { color : #5C6585 }
+.string { color : Maroon }
+.warning { color : Red ; font-weight : bold }
+.info { margin-left : 3em; margin-right : 3em }
+.param_info { margin-top: 4px; margin-left : 3em; margin-right : 3em }
+.code { color : #465F91 ; }
+h1 { font-size : 20pt ; text-align: center; }
+h2 { font-size : 20pt ; border: 1px solid #000000; margin-top: 5px; margin-bottom: 2px;text-align: center; background-color: #90BDFF ;padding: 2px; }
+h3 { font-size : 20pt ; border: 1px solid #000000; margin-top: 5px; margin-bottom: 2px;text-align: center; background-color: #90DDFF ;padding: 2px; }
+h4 { font-size : 20pt ; border: 1px solid #000000; margin-top: 5px; margin-bottom: 2px;text-align: center; background-color: #90EDFF ;padding: 2px; }
+h5 { font-size : 20pt ; border: 1px solid #000000; margin-top: 5px; margin-bottom: 2px;text-align: center; background-color: #90FDFF ;padding: 2px; }
+h6 { font-size : 20pt ; border: 1px solid #000000; margin-top: 5px; margin-bottom: 2px;text-align: center; background-color: #C0FFFF ; padding: 2px; }
+div.h7 { font-size : 20pt ; border: 1px solid #000000; margin-top: 5px; margin-bottom: 2px;text-align: center; background-color: #E0FFFF ; padding: 2px; }
+div.h8 { font-size : 20pt ; border: 1px solid #000000; margin-top: 5px; margin-bottom: 2px;text-align: center; background-color: #F0FFFF ; padding: 2px; }
+div.h9 { font-size : 20pt ; border: 1px solid #000000; margin-top: 5px; margin-bottom: 2px;text-align: center; background-color: #FFFFFF ; padding: 2px; }
+.typetable { border-style : hidden }
+.indextable { border-style : hidden }
+.paramstable { border-style : hidden ; padding: 5pt 5pt}
+body { background-color : White }
+tr { background-color : White }
+td.typefieldcomment { background-color : #FFFFFF ; font-size: smaller ;}
+pre { margin-bottom: 4px }
+div.sig_block {margin-left: 2em} \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/type_XmlRpc.client.html b/doc/xmlrpc-light/html/type_XmlRpc.client.html
new file mode 100644
index 0000000..ce6e2a8
--- /dev/null
+++ b/doc/xmlrpc-light/html/type_XmlRpc.client.html
@@ -0,0 +1,48 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>XmlRpc.client</title>
+</head>
+<body>
+<code class="code">?debug:bool&nbsp;<span class="keywordsign">-&gt;</span><br>
+?headers:(string&nbsp;*&nbsp;string)&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span><br>
+?insecure_ssl:bool&nbsp;<span class="keywordsign">-&gt;</span><br>
+?timeout:float&nbsp;<span class="keywordsign">-&gt;</span><br>
+?useragent:string&nbsp;<span class="keywordsign">-&gt;</span><br>
+string&nbsp;<span class="keywordsign">-&gt;</span><br>
+<span class="keyword">object</span><br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;debug&nbsp;:&nbsp;bool<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;headers&nbsp;:&nbsp;(string&nbsp;*&nbsp;string)&nbsp;list<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;insecure_ssl&nbsp;:&nbsp;bool<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;timeout&nbsp;:&nbsp;float<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;url&nbsp;:&nbsp;string<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;useragent&nbsp;:&nbsp;string<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;call&nbsp;:&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;debug&nbsp;:&nbsp;bool<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;headers&nbsp;:&nbsp;(string&nbsp;*&nbsp;string)&nbsp;list<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;insecure_ssl&nbsp;:&nbsp;bool<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_base64_decoder&nbsp;:&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_base64_encoder&nbsp;:&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_datetime_decoder&nbsp;:&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_datetime_encoder&nbsp;:&nbsp;(<span class="constructor">XmlRpcDateTime</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_debug&nbsp;:&nbsp;bool&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_headers&nbsp;:&nbsp;(string&nbsp;*&nbsp;string)&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_insecure_ssl&nbsp;:&nbsp;bool&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_timeout&nbsp;:&nbsp;float&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_useragent&nbsp;:&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;timeout&nbsp;:&nbsp;float<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;url&nbsp;:&nbsp;string<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;useragent&nbsp;:&nbsp;string<br>
+<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/type_XmlRpc.html b/doc/xmlrpc-light/html/type_XmlRpc.html
new file mode 100644
index 0000000..5dcf84a
--- /dev/null
+++ b/doc/xmlrpc-light/html/type_XmlRpc.html
@@ -0,0 +1,105 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>XmlRpc</title>
+</head>
+<body>
+<code class="code"><span class="keyword">sig</span><br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;version&nbsp;:&nbsp;string<br>
+&nbsp;&nbsp;<span class="keyword">exception</span>&nbsp;<span class="constructor">Error</span>&nbsp;<span class="keyword">of</span>&nbsp;(int&nbsp;*&nbsp;string)<br>
+&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;value&nbsp;=<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;<span class="keywordsign">`</span><span class="constructor">Array</span>&nbsp;<span class="keyword">of</span>&nbsp;<span class="constructor">XmlRpc</span>.value&nbsp;list<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Binary</span>&nbsp;<span class="keyword">of</span>&nbsp;string<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Boolean</span>&nbsp;<span class="keyword">of</span>&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">DateTime</span>&nbsp;<span class="keyword">of</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Double</span>&nbsp;<span class="keyword">of</span>&nbsp;float<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Int</span>&nbsp;<span class="keyword">of</span>&nbsp;int<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Int32</span>&nbsp;<span class="keyword">of</span>&nbsp;int32<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Nil</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">String</span>&nbsp;<span class="keyword">of</span>&nbsp;string<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Struct</span>&nbsp;<span class="keyword">of</span>&nbsp;(string&nbsp;*&nbsp;<span class="constructor">XmlRpc</span>.value)&nbsp;list&nbsp;]<br>
+&nbsp;&nbsp;<span class="keyword">class</span>&nbsp;client&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?debug:bool&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;?headers:(string&nbsp;*&nbsp;string)&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;?insecure_ssl:bool&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;?timeout:float&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;?useragent:string&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">object</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;debug&nbsp;:&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;headers&nbsp;:&nbsp;(string&nbsp;*&nbsp;string)&nbsp;list<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;insecure_ssl&nbsp;:&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;timeout&nbsp;:&nbsp;float<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;url&nbsp;:&nbsp;string<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;useragent&nbsp;:&nbsp;string<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;call&nbsp;:&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;debug&nbsp;:&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;headers&nbsp;:&nbsp;(string&nbsp;*&nbsp;string)&nbsp;list<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;insecure_ssl&nbsp;:&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_base64_decoder&nbsp;:&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_base64_encoder&nbsp;:&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_datetime_decoder&nbsp;:&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_datetime_encoder&nbsp;:&nbsp;(<span class="constructor">XmlRpcDateTime</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_debug&nbsp;:&nbsp;bool&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_headers&nbsp;:&nbsp;(string&nbsp;*&nbsp;string)&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_insecure_ssl&nbsp;:&nbsp;bool&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_timeout&nbsp;:&nbsp;float&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_useragent&nbsp;:&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;timeout&nbsp;:&nbsp;float<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;url&nbsp;:&nbsp;string<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;useragent&nbsp;:&nbsp;string<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;<span class="keyword">class</span>&nbsp;multicall&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">XmlRpc</span>.client&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">object</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;call&nbsp;:&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value&nbsp;<span class="constructor">Lazy</span>.t<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;completed&nbsp;:&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;execute&nbsp;:&nbsp;unit&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;executed&nbsp;:&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;result&nbsp;:&nbsp;int&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dump&nbsp;:&nbsp;<span class="constructor">XmlRpc</span>.value&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string<br>
+&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;message&nbsp;=<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">MethodCall</span>&nbsp;<span class="keyword">of</span>&nbsp;(string&nbsp;*&nbsp;<span class="constructor">XmlRpc</span>.value&nbsp;list)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">MethodResponse</span>&nbsp;<span class="keyword">of</span>&nbsp;<span class="constructor">XmlRpc</span>.value<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="constructor">Fault</span>&nbsp;<span class="keyword">of</span>&nbsp;(int&nbsp;*&nbsp;string)<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;message_of_xml_element&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?base64_decoder:(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;?datetime_decoder:(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">Xml</span>.xml&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.message<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;xml_element_of_message&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?base64_encoder:(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;?datetime_encoder:(<span class="constructor">XmlRpcDateTime</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">XmlRpc</span>.message&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Xml</span>.xml<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;value_of_xml_element&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?base64_decoder:(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;?datetime_decoder:(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Xml</span>.xml&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;xml_element_of_value&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?base64_encoder:(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;?datetime_encoder:(<span class="constructor">XmlRpcDateTime</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Xml</span>.xml<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;serve&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?base64_encoder:(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;?base64_decoder:(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;?datetime_encoder:(<span class="constructor">XmlRpcDateTime</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;?datetime_decoder:(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;?error_handler:(exn&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.message)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;serve_message&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?error_handler:(exn&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.message)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">XmlRpc</span>.message&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.message<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;default_error_handler&nbsp;:&nbsp;exn&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.message<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;quiet_error_handler&nbsp;:&nbsp;exn&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.message<br>
+<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/type_XmlRpc.multicall.html b/doc/xmlrpc-light/html/type_XmlRpc.multicall.html
new file mode 100644
index 0000000..39b0102
--- /dev/null
+++ b/doc/xmlrpc-light/html/type_XmlRpc.multicall.html
@@ -0,0 +1,26 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>XmlRpc.multicall</title>
+</head>
+<body>
+<code class="code"><span class="constructor">XmlRpc</span>.client&nbsp;<span class="keywordsign">-&gt;</span><br>
+<span class="keyword">object</span><br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;call&nbsp;:&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value&nbsp;<span class="constructor">Lazy</span>.t<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;completed&nbsp;:&nbsp;bool<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;execute&nbsp;:&nbsp;unit&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;executed&nbsp;:&nbsp;bool<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;result&nbsp;:&nbsp;int&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value<br>
+<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/type_XmlRpcBase64.html b/doc/xmlrpc-light/html/type_XmlRpcBase64.html
new file mode 100644
index 0000000..973bb1f
--- /dev/null
+++ b/doc/xmlrpc-light/html/type_XmlRpcBase64.html
@@ -0,0 +1,32 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>XmlRpcBase64</title>
+</head>
+<body>
+<code class="code"><span class="keyword">sig</span><br>
+&nbsp;&nbsp;<span class="keyword">exception</span>&nbsp;<span class="constructor">Invalid_char</span><br>
+&nbsp;&nbsp;<span class="keyword">exception</span>&nbsp;<span class="constructor">Invalid_table</span><br>
+&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;encoding_table&nbsp;=&nbsp;char&nbsp;array<br>
+&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;decoding_table&nbsp;=&nbsp;int&nbsp;array<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;str_encode&nbsp;:&nbsp;?tbl:<span class="constructor">XmlRpcBase64</span>.encoding_table&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;str_decode&nbsp;:&nbsp;?tbl:<span class="constructor">XmlRpcBase64</span>.decoding_table&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;encode&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?tbl:<span class="constructor">XmlRpcBase64</span>.encoding_table&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;char&nbsp;<span class="constructor">Stream</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;char&nbsp;<span class="constructor">Stream</span>.t<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;decode&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?tbl:<span class="constructor">XmlRpcBase64</span>.decoding_table&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;char&nbsp;<span class="constructor">Stream</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;char&nbsp;<span class="constructor">Stream</span>.t<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;make_decoding_table&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">XmlRpcBase64</span>.encoding_table&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcBase64</span>.decoding_table<br>
+<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/type_XmlRpcDateTime.html b/doc/xmlrpc-light/html/type_XmlRpcDateTime.html
new file mode 100644
index 0000000..5ae797c
--- /dev/null
+++ b/doc/xmlrpc-light/html/type_XmlRpcDateTime.html
@@ -0,0 +1,39 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>XmlRpcDateTime</title>
+</head>
+<body>
+<code class="code"><span class="keyword">sig</span><br>
+&nbsp;&nbsp;<span class="keyword">exception</span>&nbsp;<span class="constructor">Parse_error</span>&nbsp;<span class="keyword">of</span>&nbsp;string<br>
+&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;t&nbsp;=&nbsp;int&nbsp;*&nbsp;int&nbsp;*&nbsp;int&nbsp;*&nbsp;int&nbsp;*&nbsp;int&nbsp;*&nbsp;int&nbsp;*&nbsp;int<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;compare&nbsp;:&nbsp;<span class="constructor">XmlRpcDateTime</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:&nbsp;<span class="constructor">XmlRpcDateTime</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;hash&nbsp;:&nbsp;<span class="constructor">XmlRpcDateTime</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;now&nbsp;:&nbsp;unit&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;now_utc&nbsp;:&nbsp;unit&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;set_tz_offset&nbsp;:&nbsp;int&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fix_tz_offset&nbsp;:&nbsp;int&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;from_unixfloat&nbsp;:&nbsp;float&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;from_unixfloat_utc&nbsp;:&nbsp;float&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;to_unixfloat&nbsp;:&nbsp;<span class="constructor">XmlRpcDateTime</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;to_unixfloat_utc&nbsp;:&nbsp;<span class="constructor">XmlRpcDateTime</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;from_unixtm&nbsp;:&nbsp;<span class="constructor">Unix</span>.tm&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;from_unixtm_utc&nbsp;:&nbsp;<span class="constructor">Unix</span>.tm&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;to_unixtm&nbsp;:&nbsp;<span class="constructor">XmlRpcDateTime</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Unix</span>.tm<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;to_unixtm_utc&nbsp;:&nbsp;<span class="constructor">XmlRpcDateTime</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Unix</span>.tm<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;of_string&nbsp;:&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;to_string&nbsp;:&nbsp;<span class="constructor">XmlRpcDateTime</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string<br>
+<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/type_XmlRpcServer.base.html b/doc/xmlrpc-light/html/type_XmlRpcServer.base.html
new file mode 100644
index 0000000..b1a92cb
--- /dev/null
+++ b/doc/xmlrpc-light/html/type_XmlRpcServer.base.html
@@ -0,0 +1,44 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>XmlRpcServer.base</title>
+</head>
+<body>
+<code class="code"><span class="keyword">object</span><br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;base64_decoder&nbsp;:&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;base64_encoder&nbsp;:&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;datetime_decoder&nbsp;:&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;datetime_encoder&nbsp;:&nbsp;<span class="constructor">XmlRpcDateTime</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;error_handler&nbsp;:&nbsp;exn&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.message<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;methods&nbsp;:&nbsp;(string,&nbsp;<span class="constructor">XmlRpc</span>.value&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value)&nbsp;<span class="constructor">Hashtbl</span>.t<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;register&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;?help:string&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;?signature:<span class="constructor">XmlRpcServer</span>.param_type&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;?signatures:<span class="constructor">XmlRpcServer</span>.param_type&nbsp;list&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="constructor">XmlRpc</span>.value&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;<span class="keyword">virtual</span>&nbsp;run&nbsp;:&nbsp;unit&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;serve&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;serve_message&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">XmlRpc</span>.message&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.message<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_base64_decoder&nbsp;:&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_base64_encoder&nbsp;:&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_datetime_decoder&nbsp;:&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_datetime_encoder&nbsp;:&nbsp;(<span class="constructor">XmlRpcDateTime</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_error_handler&nbsp;:&nbsp;(exn&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.message)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;unregister&nbsp;:&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/type_XmlRpcServer.cgi.html b/doc/xmlrpc-light/html/type_XmlRpcServer.cgi.html
new file mode 100644
index 0000000..4f09b3b
--- /dev/null
+++ b/doc/xmlrpc-light/html/type_XmlRpcServer.cgi.html
@@ -0,0 +1,19 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>XmlRpcServer.cgi</title>
+</head>
+<body>
+<code class="code">unit&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcServer</span>.server</code></body></html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/type_XmlRpcServer.html b/doc/xmlrpc-light/html/type_XmlRpcServer.html
new file mode 100644
index 0000000..63936c0
--- /dev/null
+++ b/doc/xmlrpc-light/html/type_XmlRpcServer.html
@@ -0,0 +1,90 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>XmlRpcServer</title>
+</head>
+<body>
+<code class="code"><span class="keyword">sig</span><br>
+&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;param_type&nbsp;=<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&nbsp;<span class="keywordsign">`</span><span class="constructor">Array</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Binary</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Boolean</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">DateTime</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Double</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Int</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">String</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Struct</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Undefined</span>&nbsp;]<br>
+&nbsp;&nbsp;<span class="keyword">class</span>&nbsp;<span class="keyword">virtual</span>&nbsp;base&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">object</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;base64_decoder&nbsp;:&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;base64_encoder&nbsp;:&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;datetime_decoder&nbsp;:&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;datetime_encoder&nbsp;:&nbsp;<span class="constructor">XmlRpcDateTime</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;error_handler&nbsp;:&nbsp;exn&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.message<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;methods&nbsp;:&nbsp;(string,&nbsp;<span class="constructor">XmlRpc</span>.value&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value)&nbsp;<span class="constructor">Hashtbl</span>.t<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;register&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?help:string&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?signature:<span class="constructor">XmlRpcServer</span>.param_type&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?signatures:<span class="constructor">XmlRpcServer</span>.param_type&nbsp;list&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="constructor">XmlRpc</span>.value&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;<span class="keyword">virtual</span>&nbsp;run&nbsp;:&nbsp;unit&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;serve&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;serve_message&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">XmlRpc</span>.message&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.message<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_base64_decoder&nbsp;:&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_base64_encoder&nbsp;:&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_datetime_decoder&nbsp;:&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_datetime_encoder&nbsp;:&nbsp;(<span class="constructor">XmlRpcDateTime</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_error_handler&nbsp;:&nbsp;(exn&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.message)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;unregister&nbsp;:&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;<span class="keyword">class</span>&nbsp;<span class="keyword">type</span>&nbsp;server&nbsp;=<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">object</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;base64_decoder&nbsp;:&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;base64_encoder&nbsp;:&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;datetime_decoder&nbsp;:&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;datetime_encoder&nbsp;:&nbsp;<span class="constructor">XmlRpcDateTime</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;error_handler&nbsp;:&nbsp;exn&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.message<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;methods&nbsp;:&nbsp;(string,&nbsp;<span class="constructor">XmlRpc</span>.value&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value)&nbsp;<span class="constructor">Hashtbl</span>.t<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;register&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?help:string&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?signature:param_type&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?signatures:param_type&nbsp;list&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="constructor">XmlRpc</span>.value&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;run&nbsp;:&nbsp;unit&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;serve&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;serve_message&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">XmlRpc</span>.message&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.message<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_base64_decoder&nbsp;:&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_base64_encoder&nbsp;:&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_datetime_decoder&nbsp;:&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_datetime_encoder&nbsp;:&nbsp;(<span class="constructor">XmlRpcDateTime</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_error_handler&nbsp;:&nbsp;(exn&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.message)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;unregister&nbsp;:&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;<span class="keyword">class</span>&nbsp;cgi&nbsp;:&nbsp;unit&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;server<br>
+&nbsp;&nbsp;<span class="keyword">class</span>&nbsp;netplex&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?parallelizer:<span class="constructor">Netplex_types</span>.parallelizer&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;?handler:string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;server<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;invalid_method&nbsp;:&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;invalid_params&nbsp;:&nbsp;unit&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a<br>
+<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/type_XmlRpcServer.netplex.html b/doc/xmlrpc-light/html/type_XmlRpcServer.netplex.html
new file mode 100644
index 0000000..aa4967a
--- /dev/null
+++ b/doc/xmlrpc-light/html/type_XmlRpcServer.netplex.html
@@ -0,0 +1,20 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>XmlRpcServer.netplex</title>
+</head>
+<body>
+<code class="code">?parallelizer:<span class="constructor">Netplex_types</span>.parallelizer&nbsp;<span class="keywordsign">-&gt;</span><br>
+?handler:string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcServer</span>.server</code></body></html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/html/type_XmlRpcServer.server.html b/doc/xmlrpc-light/html/type_XmlRpcServer.server.html
new file mode 100644
index 0000000..b98337f
--- /dev/null
+++ b/doc/xmlrpc-light/html/type_XmlRpcServer.server.html
@@ -0,0 +1,44 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of exceptions" rel=Appendix href="index_exceptions.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of class attributes" rel=Appendix href="index_attributes.html">
+<link title="Index of class methods" rel=Appendix href="index_methods.html">
+<link title="Index of classes" rel=Appendix href="index_classes.html">
+<link title="Index of class types" rel=Appendix href="index_class_types.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="XmlRpc" rel="Chapter" href="XmlRpc.html">
+<link title="XmlRpcServer" rel="Chapter" href="XmlRpcServer.html">
+<link title="XmlRpcDateTime" rel="Chapter" href="XmlRpcDateTime.html">
+<link title="XmlRpcBase64" rel="Chapter" href="XmlRpcBase64.html"><title>XmlRpcServer.server</title>
+</head>
+<body>
+<code class="code"><span class="keyword">object</span><br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;base64_decoder&nbsp;:&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;base64_encoder&nbsp;:&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;datetime_decoder&nbsp;:&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;datetime_encoder&nbsp;:&nbsp;<span class="constructor">XmlRpcDateTime</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;<span class="keyword">mutable</span>&nbsp;error_handler&nbsp;:&nbsp;exn&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.message<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;methods&nbsp;:&nbsp;(string,&nbsp;<span class="constructor">XmlRpc</span>.value&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value)&nbsp;<span class="constructor">Hashtbl</span>.t<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;register&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;?help:string&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;?signature:param_type&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;?signatures:param_type&nbsp;list&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="constructor">XmlRpc</span>.value&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;run&nbsp;:&nbsp;unit&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;serve&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;serve_message&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.value)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">XmlRpc</span>.message&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.message<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_base64_decoder&nbsp;:&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_base64_encoder&nbsp;:&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_datetime_decoder&nbsp;:&nbsp;(string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpcDateTime</span>.t)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_datetime_encoder&nbsp;:&nbsp;(<span class="constructor">XmlRpcDateTime</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;string)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;set_error_handler&nbsp;:&nbsp;(exn&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">XmlRpc</span>.message)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">method</span>&nbsp;unregister&nbsp;:&nbsp;string&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/doc/xmlrpc-light/latex/doc.aux b/doc/xmlrpc-light/latex/doc.aux
new file mode 100644
index 0000000..21e264f
--- /dev/null
+++ b/doc/xmlrpc-light/latex/doc.aux
@@ -0,0 +1,116 @@
+\relax
+\@writefile{toc}{\contentsline {section}{\numberline {1}Module {\tt {XmlRpc}} : XmlRpc Light.}{1}}
+\newlabel{module:XmlRpc}{{1}{1}}
+\newlabel{val:XmlRpc.version}{{1}{1}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {1.1}High-level interface}{1}}
+\newlabel{exception:XmlRpc.Error}{{1.1}{1}}
+\newlabel{type:XmlRpc.value}{{1.1}{2}}
+\newlabel{class:XmlRpc.client}{{1.1}{2}}
+\newlabel{val:XmlRpc.client.url}{{1.1}{2}}
+\newlabel{val:XmlRpc.client.debug}{{1.1}{2}}
+\newlabel{val:XmlRpc.client.headers}{{1.1}{2}}
+\newlabel{val:XmlRpc.client.insecure-underscoressl}{{1.1}{2}}
+\newlabel{val:XmlRpc.client.timeout}{{1.1}{2}}
+\newlabel{val:XmlRpc.client.useragent}{{1.1}{3}}
+\newlabel{method:XmlRpc.client.url}{{1.1}{3}}
+\newlabel{method:XmlRpc.client.debug}{{1.1}{3}}
+\newlabel{method:XmlRpc.client.set-underscoredebug}{{1.1}{3}}
+\newlabel{method:XmlRpc.client.headers}{{1.1}{3}}
+\newlabel{method:XmlRpc.client.set-underscoreheaders}{{1.1}{3}}
+\newlabel{method:XmlRpc.client.insecure-underscoressl}{{1.1}{3}}
+\newlabel{method:XmlRpc.client.set-underscoreinsecure-underscoressl}{{1.1}{3}}
+\newlabel{method:XmlRpc.client.timeout}{{1.1}{3}}
+\newlabel{method:XmlRpc.client.set-underscoretimeout}{{1.1}{3}}
+\newlabel{method:XmlRpc.client.useragent}{{1.1}{3}}
+\newlabel{method:XmlRpc.client.set-underscoreuseragent}{{1.1}{3}}
+\newlabel{method:XmlRpc.client.set-underscorebase64-underscoreencoder}{{1.1}{3}}
+\newlabel{method:XmlRpc.client.set-underscorebase64-underscoredecoder}{{1.1}{4}}
+\newlabel{method:XmlRpc.client.set-underscoredatetime-underscoreencoder}{{1.1}{4}}
+\newlabel{method:XmlRpc.client.set-underscoredatetime-underscoredecoder}{{1.1}{4}}
+\newlabel{method:XmlRpc.client.call}{{1.1}{4}}
+\newlabel{class:XmlRpc.multicall}{{1.1}{4}}
+\newlabel{method:XmlRpc.multicall.call}{{1.1}{4}}
+\newlabel{method:XmlRpc.multicall.execute}{{1.1}{4}}
+\newlabel{method:XmlRpc.multicall.result}{{1.1}{4}}
+\newlabel{method:XmlRpc.multicall.executed}{{1.1}{5}}
+\newlabel{method:XmlRpc.multicall.completed}{{1.1}{5}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {1.2}Utility functions}{6}}
+\newlabel{val:XmlRpc.dump}{{1.2}{6}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {1.3}Low-level interface}{6}}
+\newlabel{type:XmlRpc.message}{{1.3}{6}}
+\newlabel{val:XmlRpc.message-underscoreof-underscorexml-underscoreelement}{{1.3}{7}}
+\newlabel{val:XmlRpc.xml-underscoreelement-underscoreof-underscoremessage}{{1.3}{7}}
+\newlabel{val:XmlRpc.value-underscoreof-underscorexml-underscoreelement}{{1.3}{7}}
+\newlabel{val:XmlRpc.xml-underscoreelement-underscoreof-underscorevalue}{{1.3}{7}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {1.4}Server tools}{7}}
+\newlabel{val:XmlRpc.serve}{{1.4}{7}}
+\newlabel{val:XmlRpc.serve-underscoremessage}{{1.4}{8}}
+\newlabel{val:XmlRpc.default-underscoreerror-underscorehandler}{{1.4}{8}}
+\newlabel{val:XmlRpc.quiet-underscoreerror-underscorehandler}{{1.4}{8}}
+\@writefile{toc}{\contentsline {section}{\numberline {2}Module {\tt {XmlRpcServer}} : XmlRpc Light server.}{8}}
+\newlabel{module:XmlRpcServer}{{2}{8}}
+\newlabel{type:XmlRpcServer.param-underscoretype}{{2}{8}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Base classes}{9}}
+\newlabel{class:XmlRpcServer.base}{{2.1}{9}}
+\newlabel{val:XmlRpcServer.base.methods}{{2.1}{9}}
+\newlabel{val:XmlRpcServer.base.base64-underscoreencoder}{{2.1}{9}}
+\newlabel{val:XmlRpcServer.base.base64-underscoredecoder}{{2.1}{9}}
+\newlabel{val:XmlRpcServer.base.datetime-underscoreencoder}{{2.1}{9}}
+\newlabel{val:XmlRpcServer.base.datetime-underscoredecoder}{{2.1}{9}}
+\newlabel{val:XmlRpcServer.base.error-underscorehandler}{{2.1}{9}}
+\newlabel{method:XmlRpcServer.base.set-underscorebase64-underscoreencoder}{{2.1}{9}}
+\newlabel{method:XmlRpcServer.base.set-underscorebase64-underscoredecoder}{{2.1}{9}}
+\newlabel{method:XmlRpcServer.base.set-underscoredatetime-underscoreencoder}{{2.1}{9}}
+\newlabel{method:XmlRpcServer.base.set-underscoredatetime-underscoredecoder}{{2.1}{9}}
+\newlabel{method:XmlRpcServer.base.set-underscoreerror-underscorehandler}{{2.1}{9}}
+\newlabel{method:XmlRpcServer.base.serve}{{2.1}{9}}
+\newlabel{method:XmlRpcServer.base.serve-underscoremessage}{{2.1}{10}}
+\newlabel{method:XmlRpcServer.base.register}{{2.1}{10}}
+\newlabel{method:XmlRpcServer.base.unregister}{{2.1}{10}}
+\newlabel{method:XmlRpcServer.base.run}{{2.1}{10}}
+\newlabel{classtype:XmlRpcServer.server}{{2.1}{10}}
+\newlabel{method:XmlRpcServer.server.run}{{2.1}{10}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}Server implementations}{11}}
+\newlabel{class:XmlRpcServer.cgi}{{2.2}{11}}
+\newlabel{class:XmlRpcServer.netplex}{{2.2}{11}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {2.3}Utility functions}{11}}
+\newlabel{val:XmlRpcServer.invalid-underscoremethod}{{2.3}{11}}
+\newlabel{val:XmlRpcServer.invalid-underscoreparams}{{2.3}{11}}
+\@writefile{toc}{\contentsline {section}{\numberline {3}Module {\tt {XmlRpcDateTime}} : Date/time type.}{11}}
+\newlabel{module:XmlRpcDateTime}{{3}{11}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}Types}{11}}
+\newlabel{exception:XmlRpcDateTime.Parse-underscoreerror}{{3.1}{11}}
+\newlabel{type:XmlRpcDateTime.t}{{3.1}{11}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}Comparison}{11}}
+\newlabel{val:XmlRpcDateTime.compare}{{3.2}{11}}
+\newlabel{val:XmlRpcDateTime.equal}{{3.2}{11}}
+\newlabel{val:XmlRpcDateTime.hash}{{3.2}{11}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.3}Current date and time}{12}}
+\newlabel{val:XmlRpcDateTime.now}{{3.3}{12}}
+\newlabel{val:XmlRpcDateTime.now-underscoreutc}{{3.3}{12}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.4}Time zone adjustments}{12}}
+\newlabel{val:XmlRpcDateTime.set-underscoretz-underscoreoffset}{{3.4}{12}}
+\newlabel{val:XmlRpcDateTime.fix-underscoretz-underscoreoffset}{{3.4}{12}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.5}Conversion}{12}}
+\newlabel{val:XmlRpcDateTime.from-underscoreunixfloat}{{3.5}{12}}
+\newlabel{val:XmlRpcDateTime.from-underscoreunixfloat-underscoreutc}{{3.5}{12}}
+\newlabel{val:XmlRpcDateTime.to-underscoreunixfloat}{{3.5}{12}}
+\newlabel{val:XmlRpcDateTime.to-underscoreunixfloat-underscoreutc}{{3.5}{12}}
+\newlabel{val:XmlRpcDateTime.from-underscoreunixtm}{{3.5}{12}}
+\newlabel{val:XmlRpcDateTime.from-underscoreunixtm-underscoreutc}{{3.5}{12}}
+\newlabel{val:XmlRpcDateTime.to-underscoreunixtm}{{3.5}{12}}
+\newlabel{val:XmlRpcDateTime.to-underscoreunixtm-underscoreutc}{{3.5}{12}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {3.6}ISO-8601 parsing and generation}{13}}
+\newlabel{val:XmlRpcDateTime.of-underscorestring}{{3.6}{13}}
+\newlabel{val:XmlRpcDateTime.to-underscorestring}{{3.6}{13}}
+\@writefile{toc}{\contentsline {section}{\numberline {4}Module {\tt {XmlRpcBase64}} : Base64 codec.}{13}}
+\newlabel{module:XmlRpcBase64}{{4}{13}}
+\newlabel{exception:XmlRpcBase64.Invalid-underscorechar}{{4}{13}}
+\newlabel{exception:XmlRpcBase64.Invalid-underscoretable}{{4}{13}}
+\newlabel{type:XmlRpcBase64.encoding-underscoretable}{{4}{13}}
+\newlabel{type:XmlRpcBase64.decoding-underscoretable}{{4}{13}}
+\newlabel{val:XmlRpcBase64.str-underscoreencode}{{4}{13}}
+\newlabel{val:XmlRpcBase64.str-underscoredecode}{{4}{13}}
+\newlabel{val:XmlRpcBase64.encode}{{4}{13}}
+\newlabel{val:XmlRpcBase64.decode}{{4}{13}}
+\newlabel{val:XmlRpcBase64.make-underscoredecoding-underscoretable}{{4}{13}}
diff --git a/doc/xmlrpc-light/latex/doc.dvi b/doc/xmlrpc-light/latex/doc.dvi
new file mode 100644
index 0000000..a92defc
--- /dev/null
+++ b/doc/xmlrpc-light/latex/doc.dvi
Binary files differ
diff --git a/doc/xmlrpc-light/latex/doc.log b/doc/xmlrpc-light/latex/doc.log
new file mode 100644
index 0000000..ae8ed4f
--- /dev/null
+++ b/doc/xmlrpc-light/latex/doc.log
@@ -0,0 +1,128 @@
+This is pdfTeXk, Version 3.141592-1.40.3 (Web2C 7.5.6) (format=latex 2008.11.2) 19 JAN 2009 17:36
+entering extended mode
+ %&-line parsing enabled.
+**doc.tex
+(./doc.tex
+LaTeX2e <2005/12/01>
+Babel <v3.8h> and hyphenation patterns for english, usenglishmax, dumylang, noh
+yphenation, croatian, ukrainian, russian, bulgarian, czech, slovak, danish, dut
+ch, finnish, basque, french, german, ngerman, ibycus, greek, monogreek, ancient
+greek, hungarian, italian, latin, mongolian, norsk, icelandic, interlingua, tur
+kish, coptic, romanian, welsh, serbian, slovenian, estonian, esperanto, upperso
+rbian, indonesian, polish, portuguese, spanish, catalan, galician, swedish, loa
+ded.
+(/usr/share/texmf-texlive/tex/latex/base/article.cls
+Document Class: article 2005/09/16 v1.4f Standard LaTeX document class
+(/usr/share/texmf-texlive/tex/latex/base/size11.clo
+File: size11.clo 2005/09/16 v1.4f Standard LaTeX file (size option)
+)
+\c@part=\count79
+\c@section=\count80
+\c@subsection=\count81
+\c@subsubsection=\count82
+\c@paragraph=\count83
+\c@subparagraph=\count84
+\c@figure=\count85
+\c@table=\count86
+\abovecaptionskip=\skip41
+\belowcaptionskip=\skip42
+\bibindent=\dimen102
+)
+(/usr/share/texmf-texlive/tex/latex/base/inputenc.sty
+Package: inputenc 2006/05/05 v1.1b Input encoding file
+\inpenc@prehook=\toks14
+\inpenc@posthook=\toks15
+
+(/usr/share/texmf-texlive/tex/latex/base/latin1.def
+File: latin1.def 2006/05/05 v1.1b Input encoding file
+))
+(/usr/share/texmf-texlive/tex/latex/base/fontenc.sty
+Package: fontenc 2005/09/27 v1.99g Standard LaTeX package
+
+(/usr/share/texmf-texlive/tex/latex/base/t1enc.def
+File: t1enc.def 2005/09/27 v1.99g Standard LaTeX file
+LaTeX Font Info: Redeclaring font encoding T1 on input line 43.
+))
+(/usr/share/texmf-texlive/tex/latex/preprint/fullpage.sty
+Package: fullpage 1999/02/23 1.1 (PWD)
+\FP@margin=\skip43
+)
+(/usr/share/texmf-texlive/tex/latex/ltxmisc/url.sty
+\Urlmuskip=\muskip10
+Package: url 2005/06/27 ver 3.2 Verb mode for urls, etc.
+) (./ocamldoc.sty
+Package: ocamldoc 2001/12/04 v1.0 ocamldoc support
+)
+(./doc.aux)
+\openout1 = `doc.aux'.
+
+LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 7.
+LaTeX Font Info: ... okay on input line 7.
+LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 7.
+LaTeX Font Info: ... okay on input line 7.
+LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 7.
+LaTeX Font Info: ... okay on input line 7.
+LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 7.
+LaTeX Font Info: ... okay on input line 7.
+LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 7.
+LaTeX Font Info: ... okay on input line 7.
+LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 7.
+LaTeX Font Info: ... okay on input line 7.
+ (./doc.toc
+LaTeX Font Info: Try loading font information for T1+cmtt on input line 1.
+ (/usr/share/texmf-texlive/tex/latex/base/t1cmtt.fd
+File: t1cmtt.fd 1999/05/25 v2.5h Standard LaTeX font definitions
+)
+LaTeX Font Info: External font `cmex10' loaded for size
+(Font) <10.95> on input line 2.
+LaTeX Font Info: External font `cmex10' loaded for size
+(Font) <8> on input line 2.
+LaTeX Font Info: External font `cmex10' loaded for size
+(Font) <6> on input line 2.
+)
+\tf@toc=\write3
+\openout3 = `doc.toc'.
+
+
+[1
+
+]
+LaTeX Font Info: Try loading font information for OMS+cmr on input line 85.
+ (/usr/share/texmf-texlive/tex/latex/base/omscmr.fd
+File: omscmr.fd 1999/05/25 v2.5h Standard LaTeX font definitions
+)
+LaTeX Font Info: Font shape `OMS/cmr/m/n' in size <10.95> not available
+(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 85.
+
+Overfull \hbox (294.12506pt too wide) in paragraph at lines 107--107
+[]\T1/cmtt/m/n/10.95 class client : ?debug:bool -> ?headers:(string * string) l
+ist -> ?insecure_ssl:bool -> ?timeout:float -> ?useragent:string -> string ->
+ []
+
+[2] [3] [4] [5]
+Overfull \hbox (32.9232pt too wide) in paragraph at lines 514--514
+ [] \T1/cmtt/m/n/10.95 Exception: XmlRpc.Error (-32602, "server error. i
+nvalid method parameters").[]
+ []
+
+[6] [7] [8] [9] [10]
+Overfull \hbox (56.47348pt too wide) in paragraph at lines 1081--1081
+[]\T1/cmtt/m/n/10.95 class netplex : ?parallelizer:Netplex_types.parallelizer -
+> ?handler:string -> unit -> server
+ []
+
+[11] [12] [13] (./doc.aux)
+
+LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.
+
+ )
+Here is how much of TeX's memory you used:
+ 742 strings out of 94102
+ 11159 string characters out of 1165833
+ 53000 words of memory out of 1500000
+ 4060 multiletter control sequences out of 10000+50000
+ 12330 words of font info for 32 fonts, out of 1200000 for 2000
+ 637 hyphenation exceptions out of 8191
+ 22i,5n,20p,232b,304s stack positions out of 5000i,500n,6000p,200000b,5000s
+
+Output written on doc.dvi (13 pages, 30196 bytes).
diff --git a/doc/xmlrpc-light/latex/doc.pdf b/doc/xmlrpc-light/latex/doc.pdf
new file mode 100644
index 0000000..e936e7d
--- /dev/null
+++ b/doc/xmlrpc-light/latex/doc.pdf
Binary files differ
diff --git a/doc/xmlrpc-light/latex/doc.ps b/doc/xmlrpc-light/latex/doc.ps
new file mode 100644
index 0000000..3b2c002
--- /dev/null
+++ b/doc/xmlrpc-light/latex/doc.ps
@@ -0,0 +1,3723 @@
+%!PS-Adobe-2.0
+%%Creator: dvips(k) 5.96.1 Copyright 2007 Radical Eye Software
+%%Title: doc.dvi
+%%CreationDate: Mon Jan 19 17:36:42 2009
+%%Pages: 13
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 596 842
+%%DocumentFonts: CMSY10 CMMI10
+%%DocumentPaperSizes: a4
+%%EndComments
+%DVIPSWebPage: (www.radicaleye.com)
+%DVIPSCommandLine: dvips doc.dvi -o doc.ps
+%DVIPSParameters: dpi=600
+%DVIPSSource: TeX output 2009.01.19:1736
+%%BeginProcSet: tex.pro 0 0
+%!
+/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
+N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
+mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
+0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
+landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
+mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
+matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
+exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
+statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
+N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
+/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
+/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
+array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
+df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
+definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
+}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
+B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
+1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S
+/BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy
+setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask
+restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
+/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
+}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
+bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
+mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
+SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
+userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
+1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
+index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
+/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{
+/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)
+(LaserWriter 16/600)]{A length product length le{A length product exch 0
+exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse
+end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask
+grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot}
+imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round
+exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto
+fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p
+delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M}
+B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{
+p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S
+rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end
+
+%%EndProcSet
+%%BeginProcSet: texps.pro 0 0
+%!
+TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2
+index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll
+exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0
+ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{
+pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get
+div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type
+/nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end
+definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup
+sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll
+mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[
+exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if}
+forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def
+end
+
+%%EndProcSet
+%%BeginFont: CMMI10
+%!PS-AdobeFont-1.1: CMMI10 1.100
+%%CreationDate: 1996 Jul 23 07:53:57
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.100) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMMI10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.04 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMMI10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 58 /period put
+dup 60 /less put
+dup 62 /greater put
+readonly def
+/FontBBox{-32 -250 1048 750}readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA0529731C99A784CCBE85B4993B2EEBDE
+3B12D472B7CF54651EF21185116A69AB1096ED4BAD2F646635E019B6417CC77B
+532F85D811C70D1429A19A5307EF63EB5C5E02C89FC6C20F6D9D89E7D91FE470
+B72BEFDA23F5DF76BE05AF4CE93137A219ED8A04A9D7D6FDF37E6B7FCDE0D90B
+986423E5960A5D9FBB4C956556E8DF90CBFAEC476FA36FD9A5C8175C9AF513FE
+D919C2DDD26BDC0D99398B9F4D03D5993DFC0930297866E1CD0A319B6B1FD958
+9E394A533A081C36D456A09920001A3D2199583EB9B84B4DEE08E3D12939E321
+990CD249827D9648574955F61BAAA11263A91B6C3D47A5190165B0C25ABF6D3E
+6EC187E4B05182126BB0D0323D943170B795255260F9FD25F2248D04F45DFBFB
+DEF7FF8B19BFEF637B210018AE02572B389B3F76282BEB29CC301905D388C721
+59616893E774413F48DE0B408BC66DCE3FE17CB9F84D205839D58014D6A88823
+D9320AE93AF96D97A02C4D5A2BB2B8C7925C4578003959C46E3CE1A2F0EAC4BF
+8B9B325E46435BDE60BC54D72BC8ACB5C0A34413AC87045DC7B84646A324B808
+6FD8E34217213E131C3B1510415CE45420688ED9C1D27890EC68BD7C1235FAF9
+1DAB3A369DD2FC3BE5CF9655C7B7EDA7361D7E05E5831B6B8E2EEC542A7B38EE
+03BE4BAC6079D038ACB3C7C916279764547C2D51976BABA94BA9866D79F13909
+95AA39B0F03103A07CBDF441B8C5669F729020AF284B7FF52A29C6255FCAACF1
+74109050FBA2602E72593FBCBFC26E726EE4AEF97B7632BC4F5F353B5C67FED2
+3EA752A4A57B8F7FEFF1D7341D895F0A3A0BE1D8E3391970457A967EFF84F6D8
+47750B1145B8CC5BD96EE7AA99DDC9E06939E383BDA41175233D58AD263EBF19
+AFC0E2F840512D321166547B306C592B8A01E1FA2564B9A26DAC14256414E4C8
+42616728D918C74D13C349F4186EC7B9708B86467425A6FDB3A396562F7EE4D8
+40B43621744CF8A23A6E532649B66C2A0002DD04F8F39618E4F572819DD34837
+B5A08E643FDCA1505AF6A1FA3DDFD1FA758013CAED8ACDDBBB334D664DFF5B53
+956017667094CD8DC214A666D7D12CB23EC030318B42CBAAF40FFB3841355872
+715967202E674F5ECE31075C2B1C5F53E28AE3C1491012441F34A19EE7421594
+8C7C9937E184D28A736BA38E5E2596B6541FD3FDFB0E3F2FDCD1C10D2F048B47
+01E771216915C6D5AA086DAE91E8581D5017146B452AC12080853B8BA982ED62
+439481801A9791BEE207032642F4B66ADFEDFF9C7C779E896DA0BFF61C4B2847
+94C5CE44B7F6ECA777491672DA62C4904A9D4A9BC8D49672446AE640BD50117A
+6E2F3D44C38F21E572847884011309A71D567154A43D2BBEA13682287A5D63A3
+8C0FCCAD477B607D89F84E32868DC2D5CB6E2DBB39AE0FB7C049A517DF8AC902
+4B8A6982210B2D361A9E381E960E5D1F4C42599AED2677F84F23522A6D19653B
+E6E0EA0D94F5649FE39A3666098D55AACD60AABA48EC29060611C411D34D0DB8
+383F260E1EB69D9F81BB6CE70ADC191C5F3A9690F1AAEE51D174CF24D4D687D3
+80BFDB524A54B5CA242E9B724C74B83B0F9F04C028B3F26EC2065E23434B2A47
+C067859462BB1EC0FF0FE19FD2B0539D7D82691518E48CE2D618C3FDA5ECC5CB
+27A4096487A78DCACAF340BBFC7704B57514D8B041E527B0CD94DDD3BA2F
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont
+%%BeginFont: CMSY10
+%!PS-AdobeFont-1.1: CMSY10 1.0
+%%CreationDate: 1991 Aug 15 07:20:57
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.0) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMSY10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle -14.035 def
+/isFixedPitch false def
+end readonly def
+/FontName /CMSY10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 15 /bullet put
+dup 33 /arrowright put
+readonly def
+/FontBBox{-29 -960 1116 775}readonly def
+currentdict end
+currentfile eexec
+D9D66F633B846A97B686A97E45A3D0AA052F09F9C8ADE9D907C058B87E9B6964
+7D53359E51216774A4EAA1E2B58EC3176BD1184A633B951372B4198D4E8C5EF4
+A213ACB58AA0A658908035BF2ED8531779838A960DFE2B27EA49C37156989C85
+E21B3ABF72E39A89232CD9F4237FC80C9E64E8425AA3BEF7DED60B122A52922A
+221A37D9A807DD01161779DDE7D31FF2B87F97C73D63EECDDA4C49501773468A
+27D1663E0B62F461F6E40A5D6676D1D12B51E641C1D4E8E2771864FC104F8CBF
+5B78EC1D88228725F1C453A678F58A7E1B7BD7CA700717D288EB8DA1F57C4F09
+0ABF1D42C5DDD0C384C7E22F8F8047BE1D4C1CC8E33368FB1AC82B4E96146730
+DE3302B2E6B819CB6AE455B1AF3187FFE8071AA57EF8A6616B9CB7941D44EC7A
+71A7BB3DF755178D7D2E4BB69859EFA4BBC30BD6BB1531133FD4D9438FF99F09
+4ECC068A324D75B5F696B8688EEB2F17E5ED34CCD6D047A4E3806D000C199D7C
+515DB70A8D4F6146FE068DC1E5DE8BC57036431151EC603C8BCFE359BBD953AD
+5F3D998C6EE18EABCDD31D35C7E933DEA008418A4F0845FC9A361328AB270359
+C974485C9BCBCB1E9EBBF3ACC647C4108F7E05961E22390303FD667A2294F500
+7A085C407875EB0F306D82AF2CD4829E70C8DDF7E27A57EE6D66713B450FB5D1
+E37EA9012BE3E4642F467847C3401CCDBF7987531B406162E82910D56F7AE6E0
+4587FAB307D874BEF0981B709F3C6847D141FF45F2C46CA337D65E6E31005EC9
+E1C970667034EAE2CEAD678E6F94BC880E81E288D425B4C078126B01D9374BAA
+D20451839407F0174C7CDA9FBA9599BC29F1BC4D574290B8FF1DF4E1A737DBD5
+5D64259C877191547076B1C7684CD252C02D58B7810E95ADC8C1C4497EE27922
+D87EB5B4B2F7081AB03BEEFB555C6942C79F53C77FF154FD87EAC82AC3A3A8C2
+2D91DF7C509A1838C72ADA3CB65BAF59E392FD8936DF8DC002A0C41215A3
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndFont
+TeXDict begin 39158280 55380996 1000 600 600 (doc.dvi)
+@start /Fa 193[71 1[71 1[25 58[{}3 90.9091 /CMMI10 rf
+/Fb 222[91 17[45 15[{}2 90.9091 /CMSY10 rf
+%DVIPSBitmapFont: Fc ecbx1200 12 41
+/Fc 41 123 df<FFFFFFF8FFFFFFF8FFFFFFF8FFFFFFF8FFFFFFF8FFFFFFF8FFFFFFF8FF
+FFFFF8FFFFFFF81D097F9A25>45 D<07C01FF03FF87FFCFFFEFFFEFFFEFFFEFFFEFFFEFF
+FE7FFC3FF81FF007C00F0F788E1F>I<00003FF800000001FFFF0000000FFFFFE000003F
+FFFFF800007FF01FFC0000FFC007FE0001FF0001FF0003FE0000FF8007FE0000FFC007FC
+00007FC00FFC00007FE00FF800003FE01FF800003FF01FF800003FF03FF800003FF83FF8
+00003FF83FF000001FF87FF000001FFC7FF000001FFC7FF000001FFC7FF000001FFC7FF0
+00001FFC7FF000001FFCFFF000001FFEFFF000001FFEFFF000001FFEFFF000001FFEFFF0
+00001FFEFFF000001FFEFFF000001FFEFFF000001FFEFFF000001FFEFFF000001FFEFFF0
+00001FFEFFF000001FFEFFF000001FFEFFF000001FFEFFF000001FFEFFF000001FFEFFF0
+00001FFEFFF000001FFEFFF000001FFEFFF000001FFEFFF000001FFE7FF000001FFC7FF0
+00001FFC7FF000001FFC7FF000001FFC7FF000001FFC3FF800003FF83FF800003FF83FF8
+00003FF81FF800003FF01FF800003FF00FF800003FE00FFC00007FE007FC00007FC007FE
+0000FFC003FF0001FF8001FF8003FF0000FFC007FE00007FF01FFC00003FFFFFF800000F
+FFFFE0000003FFFF800000003FF800002F427CC038>48 D<000003C000000007C0000000
+1FC00000007FC0000003FFC000003FFFC000FFFFFFC000FFFFFFC000FFFFFFC000FFFFFF
+C000FFC3FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0
+000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC000
+0003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC00000
+03FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003
+FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FF
+C0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0
+000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC0000003FFC000
+FFFFFFFFFCFFFFFFFFFCFFFFFFFFFCFFFFFFFFFCFFFFFFFFFC264177C038>I<0000FFE0
+0000000FFFFE0000003FFFFF800000FFFFFFE00003FFFFFFF80007FC03FFFE000FE0007F
+FF001F80003FFF803F00000FFFC07F000007FFC07FC00007FFE07FF00003FFE0FFF00001
+FFF0FFF80001FFF0FFF80001FFF8FFF80000FFF8FFF80000FFF8FFF80000FFF8FFF80000
+FFF87FF00000FFF83FE00000FFF81FC00000FFF800000000FFF800000000FFF000000001
+FFF000000001FFF000000001FFE000000003FFE000000003FFC000000007FF800000000F
+FF000000000FFF000000001FFC000000003FF8000000003FF0000000007FE000000000FF
+C000000001FF0000000003FE0000000007FC000000000FF0000000001FE0000000003F80
+000000007F0000780000FE0000780001FC0000780003F80000F80007E00000F0000FC000
+00F0001F800000F0003F000000F0007C000001F000F8000003F001FFFFFFFFF003FFFFFF
+FFE007FFFFFFFFE00FFFFFFFFFE01FFFFFFFFFE03FFFFFFFFFE07FFFFFFFFFE0FFFFFFFF
+FFE0FFFFFFFFFFC0FFFFFFFFFFC0FFFFFFFFFFC0FFFFFFFFFFC02D417BC038>I<0000FF
+F000000007FFFF0000001FFFFFC000007FFFFFF00000FF007FF80003F8003FFE0007E000
+1FFF0007E0000FFF000FF80007FF800FFE0007FF801FFE0007FFC01FFF0007FFC01FFF00
+07FFC01FFF0007FFC01FFF0007FFC01FFF0007FFC01FFF0007FFC00FFE0007FFC007FC00
+07FF8003F8000FFF800000000FFF000000001FFF000000001FFE000000003FFC00000000
+7FF800000000FFF000000001FFE00000000FFF80000007FFFE00000007FFF800000007FF
+FF00000007FFFFC000000000FFF0000000003FFC000000000FFE000000000FFF80000000
+07FF8000000003FFC000000003FFE000000003FFE000000001FFF000000001FFF0000000
+01FFF800000001FFF800000001FFF80FC00001FFF83FF00001FFF87FF80001FFF87FF800
+01FFF8FFFC0001FFF8FFFC0001FFF8FFFC0001FFF0FFFC0001FFF0FFFC0003FFF0FFFC00
+03FFE07FF80003FFE07FF00007FFC07FE00007FFC03F80000FFF801FF0001FFF000FFE00
+FFFE0007FFFFFFF80001FFFFFFF000007FFFFFC000001FFFFE00000001FFE000002D427B
+C038>I<000000003F0000000000003F0000000000007F000000000000FF000000000001
+FF000000000003FF000000000003FF000000000007FF00000000000FFF00000000001FFF
+00000000003FFF00000000003FFF00000000007FFF0000000000FFFF0000000001F7FF00
+00000003E7FF0000000007E7FF0000000007C7FF000000000F87FF000000001F07FF0000
+00003E07FF000000007E07FF000000007C07FF00000000F807FF00000001F007FF000000
+03E007FF00000007E007FF00000007C007FF0000000F8007FF0000001F0007FF0000003E
+0007FF0000007C0007FF0000007C0007FF000000F80007FF000001F00007FF000003E000
+07FF000007C00007FF00000FC00007FF00000F800007FF00001F000007FF00003E000007
+FF00007C000007FF0000FC000007FF0000FFFFFFFFFFFF80FFFFFFFFFFFF80FFFFFFFFFF
+FF80FFFFFFFFFFFF80FFFFFFFFFFFF800000000FFF00000000000FFF00000000000FFF00
+000000000FFF00000000000FFF00000000000FFF00000000000FFF00000000000FFF0000
+0000000FFF00000000000FFF00000000000FFF00000000000FFF000000007FFFFFFF8000
+007FFFFFFF8000007FFFFFFF8000007FFFFFFF8000007FFFFFFF8031417DC038>I<0700
+0000030007E000003F0007FF0007FF0007FFFFFFFF0007FFFFFFFE0007FFFFFFFC0007FF
+FFFFF80007FFFFFFF00007FFFFFFE00007FFFFFF800007FFFFFE000007FFFFFC000007FF
+FFE0000007FFFF00000007C00000000007C00000000007C00000000007C00000000007C0
+0000000007C00000000007C00000000007C00000000007C00000000007C00000000007C0
+3FF0000007C1FFFF000007C7FFFFC00007DFFFFFF00007FFE03FFC0007FF000FFE0007FC
+0007FF0007F00003FF8007E00003FFC007C00001FFC003800001FFE000000001FFE00000
+0000FFF000000000FFF000000000FFF000000000FFF800000000FFF800000000FFF80000
+0000FFF80F800000FFF83FE00000FFF87FF00000FFF8FFF00000FFF8FFF80000FFF8FFF8
+0000FFF8FFF80000FFF8FFF80000FFF0FFF00000FFF0FFF00001FFF07FE00001FFE07FC0
+0001FFE07E000003FFC03E000003FFC03F000007FF801FC0000FFF000FF0001FFE0007FE
+00FFFC0003FFFFFFF00000FFFFFFE000003FFFFF8000000FFFFC00000001FFC000002D42
+7BC038>I<000001FF800000001FFFF00000007FFFFC000001FFFFFF000007FF807F8000
+0FFC001F80003FF0001FC0007FE0007FC000FFC000FFE001FF8001FFE003FF8001FFE003
+FF0001FFE007FE0001FFE00FFE0001FFE00FFE0001FFE01FFC0000FFC01FFC00007F801F
+FC00001E003FFC000000003FFC000000003FF8000000007FF8000000007FF8000000007F
+F807FC00007FF81FFF8000FFF87FFFE000FFF8FFFFF800FFF9F01FFC00FFFBC007FE00FF
+FF8003FF00FFFF8003FF80FFFF0001FFC0FFFE0001FFC0FFFE0000FFE0FFFE0000FFE0FF
+FC0000FFF0FFFC0000FFF0FFFC0000FFF0FFFC0000FFF8FFF80000FFF8FFF80000FFF8FF
+F80000FFF8FFF80000FFF87FF80000FFF87FF80000FFF87FF80000FFF87FF80000FFF87F
+F80000FFF83FF80000FFF83FF80000FFF83FF80000FFF03FFC0000FFF01FFC0000FFF01F
+FC0000FFF00FFC0001FFE00FFC0001FFE007FE0001FFC007FF0003FF8003FF8003FF0001
+FFC007FE0000FFE01FFC00007FFFFFF800001FFFFFF0000007FFFFC0000001FFFF000000
+003FF000002D427BC038>I<00007FF000000003FFFF0000000FFFFFC000003FFFFFF000
+007F801FFC0001FC0003FE0003F80001FF0003F00000FF0007E000007F8007E000003F80
+0FC000003FC00FC000003FC01FC000001FC01FC000001FC01FE000001FC01FE000001FC0
+1FF000001FC01FF800001FC01FFE00003FC01FFF00003F801FFFC0007F801FFFF0007F00
+0FFFFC00FF000FFFFE01FE0007FFFF83FC0007FFFFE7F80003FFFFFFE00001FFFFFFC000
+00FFFFFF0000007FFFFFC000003FFFFFE000000FFFFFF800000FFFFFFC00003FFFFFFE00
+00FFFFFFFF0001FF3FFFFF8007FC0FFFFFC00FF803FFFFE01FF000FFFFE01FE0007FFFF0
+3FE0001FFFF07FC00007FFF07F800003FFF87F800000FFF8FF8000007FF8FF0000003FF8
+FF0000001FF8FF0000000FF8FF0000000FF8FF00000007F8FF00000007F8FF00000007F8
+FF80000007F07F80000007F07F8000000FF07FC000000FE03FE000001FE03FF000003FC0
+1FF800007F800FFE0001FF0007FFC00FFE0003FFFFFFFC0000FFFFFFF000003FFFFFC000
+000FFFFF00000000FFF000002D427BC038>56 D<FFFFFFFFFFFF000000FFFFFFFFFFFFF0
+0000FFFFFFFFFFFFFE0000FFFFFFFFFFFFFF8000FFFFFFFFFFFFFFE000003FFC000007FF
+F000003FFC000001FFF800003FFC0000007FFC00003FFC0000003FFE00003FFC0000001F
+FF00003FFC0000001FFF00003FFC0000000FFF80003FFC0000000FFF80003FFC0000000F
+FF80003FFC00000007FFC0003FFC00000007FFC0003FFC00000007FFC0003FFC00000007
+FFC0003FFC00000007FFC0003FFC00000007FFC0003FFC00000007FFC0003FFC0000000F
+FF80003FFC0000000FFF80003FFC0000001FFF00003FFC0000001FFF00003FFC0000003F
+FE00003FFC0000007FFC00003FFC000000FFF800003FFC000001FFF000003FFC000007FF
+E000003FFC0000FFFF8000003FFFFFFFFFFC0000003FFFFFFFFFF00000003FFFFFFFFFFF
+0000003FFFFFFFFFFFE000003FFC000001FFF800003FFC0000007FFC00003FFC0000001F
+FE00003FFC0000000FFF00003FFC00000007FF80003FFC00000007FFC0003FFC00000003
+FFE0003FFC00000003FFE0003FFC00000001FFF0003FFC00000001FFF0003FFC00000001
+FFF0003FFC00000001FFF8003FFC00000001FFF8003FFC00000001FFF8003FFC00000001
+FFF8003FFC00000001FFF8003FFC00000001FFF8003FFC00000001FFF8003FFC00000001
+FFF0003FFC00000001FFF0003FFC00000003FFF0003FFC00000003FFE0003FFC00000007
+FFE0003FFC0000000FFFC0003FFC0000001FFFC0003FFC0000003FFF80003FFC000000FF
+FF00003FFC000007FFFE00FFFFFFFFFFFFFFF800FFFFFFFFFFFFFFF000FFFFFFFFFFFFFF
+C000FFFFFFFFFFFFFE0000FFFFFFFFFFFFE0000045447CC350>66
+D<00000000FFF00000700000001FFFFF0000F0000001FFFFFFE001F0000007FFFFFFF803
+F000003FFFFFFFFE07F00000FFFFE001FF0FF00001FFFE00003F9FF00007FFF000000FFF
+F0000FFFC0000007FFF0001FFF00000003FFF0003FFE00000001FFF0007FFC00000000FF
+F000FFF8000000007FF001FFF0000000003FF003FFE0000000001FF007FFE0000000001F
+F007FFC0000000000FF00FFF80000000000FF00FFF800000000007F01FFF000000000007
+F01FFF000000000003F03FFF000000000003F03FFE000000000003F03FFE000000000003
+F07FFE000000000001F07FFE000000000001F07FFE000000000001F07FFC000000000000
+00FFFC00000000000000FFFC00000000000000FFFC00000000000000FFFC000000000000
+00FFFC00000000000000FFFC00000000000000FFFC00000000000000FFFC000000000000
+00FFFC00000000000000FFFC00000000000000FFFC00000000000000FFFC000000000000
+00FFFC00000000000000FFFC000000000000007FFC000000000000007FFE000000000000
+007FFE000000000000F07FFE000000000000F03FFE000000000000F03FFE000000000000
+F03FFF000000000000F01FFF000000000001F01FFF000000000001E00FFF800000000001
+E00FFF800000000003E007FFC00000000003C007FFE00000000007C003FFE00000000007
+C001FFF0000000000F8000FFF8000000001F00007FFC000000003F00003FFE000000007E
+00001FFF80000000FC00000FFFC0000001F8000007FFF0000007F0000001FFFE00001FE0
+000000FFFFF001FF800000003FFFFFFFFF0000000007FFFFFFFC0000000001FFFFFFF000
+000000001FFFFF80000000000000FFF800000044467AC451>I<FFFFFFFF8003FFFFFFFE
+FFFFFFFF8003FFFFFFFEFFFFFFFF8003FFFFFFFEFFFFFFFF8003FFFFFFFEFFFFFFFF8003
+FFFFFFFE003FFE00000000FFF800003FFE00000000FFF800003FFE00000000FFF800003F
+FE00000000FFF800003FFE00000000FFF800003FFE00000000FFF800003FFE00000000FF
+F800003FFE00000000FFF800003FFE00000000FFF800003FFE00000000FFF800003FFE00
+000000FFF800003FFE00000000FFF800003FFE00000000FFF800003FFE00000000FFF800
+003FFE00000000FFF800003FFE00000000FFF800003FFE00000000FFF800003FFE000000
+00FFF800003FFE00000000FFF800003FFE00000000FFF800003FFE00000000FFF800003F
+FE00000000FFF800003FFE00000000FFF800003FFE00000000FFF800003FFE00000000FF
+F800003FFFFFFFFFFFFFF800003FFFFFFFFFFFFFF800003FFFFFFFFFFFFFF800003FFFFF
+FFFFFFFFF800003FFFFFFFFFFFFFF800003FFE00000000FFF800003FFE00000000FFF800
+003FFE00000000FFF800003FFE00000000FFF800003FFE00000000FFF800003FFE000000
+00FFF800003FFE00000000FFF800003FFE00000000FFF800003FFE00000000FFF800003F
+FE00000000FFF800003FFE00000000FFF800003FFE00000000FFF800003FFE00000000FF
+F800003FFE00000000FFF800003FFE00000000FFF800003FFE00000000FFF800003FFE00
+000000FFF800003FFE00000000FFF800003FFE00000000FFF800003FFE00000000FFF800
+003FFE00000000FFF800003FFE00000000FFF800003FFE00000000FFF800003FFE000000
+00FFF800003FFE00000000FFF800003FFE00000000FFF800003FFE00000000FFF800003F
+FE00000000FFF800FFFFFFFF8003FFFFFFFEFFFFFFFF8003FFFFFFFEFFFFFFFF8003FFFF
+FFFEFFFFFFFF8003FFFFFFFEFFFFFFFF8003FFFFFFFE4F447CC358>72
+D<FFFFFFFFE0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE0001FFF0000001FFF0000
+001FFF0000001FFF0000001FFF0000001FFF0000001FFF0000001FFF0000001FFF000000
+1FFF0000001FFF0000001FFF0000001FFF0000001FFF0000001FFF0000001FFF0000001F
+FF0000001FFF0000001FFF0000001FFF0000001FFF0000001FFF0000001FFF0000001FFF
+0000001FFF0000001FFF0000001FFF0000001FFF0000001FFF0000001FFF0000001FFF00
+00001FFF0000001FFF0000001FFF0000001FFF0000001FFF0000001FFF0000001FFF0000
+001FFF0000001FFF0000001FFF0000001FFF0000001FFF0000001FFF0000001FFF000000
+1FFF0000001FFF0000001FFF0000001FFF0000001FFF0000001FFF0000001FFF0000001F
+FF0000001FFF0000001FFF0000001FFF0000001FFF0000001FFF0000FFFFFFFFE0FFFFFF
+FFE0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE023447DC32A>I<FFFFFFFFF0000000FFFFFFFF
+F0000000FFFFFFFFF0000000FFFFFFFFF0000000FFFFFFFFF0000000003FFE0000000000
+003FFE0000000000003FFE0000000000003FFE0000000000003FFE0000000000003FFE00
+00000000003FFE0000000000003FFE0000000000003FFE0000000000003FFE0000000000
+003FFE0000000000003FFE0000000000003FFE0000000000003FFE0000000000003FFE00
+00000000003FFE0000000000003FFE0000000000003FFE0000000000003FFE0000000000
+003FFE0000000000003FFE0000000000003FFE0000000000003FFE0000000000003FFE00
+00000000003FFE0000000000003FFE0000000000003FFE0000000000003FFE0000000000
+003FFE0000000000003FFE0000000000003FFE0000000000003FFE0000000000003FFE00
+00000000003FFE0000000000003FFE0000000000003FFE0000000780003FFE0000000780
+003FFE0000000780003FFE0000000780003FFE0000000F80003FFE0000000F00003FFE00
+00000F00003FFE0000000F00003FFE0000000F00003FFE0000001F00003FFE0000001F00
+003FFE0000001F00003FFE0000003F00003FFE0000003F00003FFE0000007E00003FFE00
+00007E00003FFE000000FE00003FFE000001FE00003FFE000003FE00003FFE000007FE00
+003FFE00001FFE00003FFE00007FFE00003FFE0003FFFE00FFFFFFFFFFFFFC00FFFFFFFF
+FFFFFC00FFFFFFFFFFFFFC00FFFFFFFFFFFFFC00FFFFFFFFFFFFFC0039447CC343>76
+D<00000007FFC0000000000000FFFFFE000000000007FFFFFFC0000000001FFFFFFFF000
+0000007FFE00FFFC00000001FFF0001FFF00000007FF800003FFC000000FFF000001FFE0
+00001FFC0000007FF000003FF80000003FF800007FF00000001FFC0000FFF00000001FFE
+0001FFE00000000FFF0003FFC000000007FF8003FFC000000007FF8007FF8000000003FF
+C007FF8000000003FFC00FFF0000000001FFE00FFF0000000001FFE01FFF0000000001FF
+F01FFE0000000000FFF03FFE0000000000FFF83FFE0000000000FFF83FFE0000000000FF
+F87FFE0000000000FFFC7FFC00000000007FFC7FFC00000000007FFC7FFC00000000007F
+FC7FFC00000000007FFCFFFC00000000007FFEFFFC00000000007FFEFFFC00000000007F
+FEFFFC00000000007FFEFFFC00000000007FFEFFFC00000000007FFEFFFC00000000007F
+FEFFFC00000000007FFEFFFC00000000007FFEFFFC00000000007FFEFFFC00000000007F
+FEFFFC00000000007FFEFFFC00000000007FFE7FFC00000000007FFC7FFE0000000000FF
+FC7FFE0000000000FFFC7FFE0000000000FFFC3FFE0000000000FFF83FFE0000000000FF
+F83FFF0000000001FFF81FFF0000000001FFF01FFF0000000001FFF01FFF8000000003FF
+F00FFF8000000003FFE00FFF8000000003FFE007FFC000000007FFC003FFC000000007FF
+8003FFE00000000FFF8001FFF00000001FFF0000FFF80000003FFE00007FFC0000007FFC
+00003FFE000000FFF800001FFF000001FFF000000FFFC00007FFE0000007FFF0001FFFC0
+000001FFFE00FFFF00000000FFFFFFFFFE000000003FFFFFFFF80000000007FFFFFFC000
+00000000FFFFFE00000000000007FFC000000047467AC454>79 D<0000FFE0001C000007
+FFFE003C00003FFFFF807C0000FFFFFFE0FC0001FFFFFFF9FC0003FF801FFFFC0007FC00
+01FFFC000FF800007FFC001FF000003FFC003FE000000FFC003FC0000007FC007FC00000
+03FC007F80000003FC007F80000001FC007F80000000FC00FF80000000FC00FF80000000
+7C00FF800000007C00FFC00000007C00FFC00000007C00FFE00000003C00FFF00000003C
+00FFF80000003C00FFFC00000000007FFE00000000007FFFE0000000007FFFFE00000000
+3FFFFFF00000003FFFFFFF0000001FFFFFFFE000001FFFFFFFFC00000FFFFFFFFE000007
+FFFFFFFF800003FFFFFFFFC00001FFFFFFFFE000007FFFFFFFF000001FFFFFFFF8000007
+FFFFFFFC000000FFFFFFFC0000000FFFFFFE00000000FFFFFE0000000007FFFF00000000
+007FFF00000000003FFF00000000000FFF800000000007FF800000000003FF80F0000000
+03FF80F000000001FF80F000000001FF80F000000000FF80F000000000FF80F800000000
+FF80F800000000FF80F800000000FF00FC00000000FF00FC00000000FF00FE00000001FF
+00FF00000001FE00FF80000003FE00FFC0000003FC00FFE0000007FC00FFF800000FF800
+FFFF00003FF000FFFFF800FFE000FE7FFFFFFFC000FC1FFFFFFF0000F807FFFFFC0000F0
+00FFFFF00000E00007FF80000031467AC43E>83 D<3FFFFFFFFFFFFFFFE03FFFFFFFFFFF
+FFFFE03FFFFFFFFFFFFFFFE03FFFFFFFFFFFFFFFE03FFFFFFFFFFFFFFFE03FFE000FFF80
+03FFE07FE0000FFF80003FF07FC0000FFF80001FF07F00000FFF800007F07F00000FFF80
+0007F07E00000FFF800003F07C00000FFF800001F07C00000FFF800001F07C00000FFF80
+0001F07800000FFF800000F07800000FFF800000F07800000FFF800000F07800000FFF80
+0000F0F800000FFF800000F8F000000FFF80000078F000000FFF80000078F000000FFF80
+000078F000000FFF80000078F000000FFF800000780000000FFF800000000000000FFF80
+0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80
+0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80
+0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80
+0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80
+0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80
+0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80
+0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80
+0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80
+0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80
+0000000007FFFFFFFFFF00000007FFFFFFFFFF00000007FFFFFFFFFF00000007FFFFFFFF
+FF00000007FFFFFFFFFF000045437CC24E>I<FFFFFFFF80000FFFFFF8FFFFFFFF80000F
+FFFFF8FFFFFFFF80000FFFFFF8FFFFFFFF80000FFFFFF8FFFFFFFF80000FFFFFF8003FFE
+0000000003E000003FFE0000000003E000003FFE0000000003E000003FFE0000000003E0
+00003FFE0000000003E000003FFE0000000003E000003FFE0000000003E000003FFE0000
+000003E000003FFE0000000003E000003FFE0000000003E000003FFE0000000003E00000
+3FFE0000000003E000003FFE0000000003E000003FFE0000000003E000003FFE00000000
+03E000003FFE0000000003E000003FFE0000000003E000003FFE0000000003E000003FFE
+0000000003E000003FFE0000000003E000003FFE0000000003E000003FFE0000000003E0
+00003FFE0000000003E000003FFE0000000003E000003FFE0000000003E000003FFE0000
+000003E000003FFE0000000003E000003FFE0000000003E000003FFE0000000003E00000
+3FFE0000000003E000003FFE0000000003E000003FFE0000000003E000003FFE00000000
+03E000003FFE0000000003E000003FFE0000000003E000003FFE0000000003E000003FFE
+0000000003E000003FFE0000000003E000003FFE0000000003E000003FFE0000000003E0
+00003FFE0000000003E000003FFE0000000003E000003FFE0000000003E000003FFE0000
+000003E000003FFE0000000003E000001FFE0000000007E000001FFE0000000007C00000
+1FFF0000000007C000001FFF000000000FC000000FFF000000000F8000000FFF80000000
+1F80000007FF800000001F00000003FFC00000003F00000003FFC00000007E00000001FF
+E0000000FC00000000FFF0000003FC000000007FFC000007F8000000003FFF00003FF000
+0000000FFFF003FFE00000000007FFFFFFFF800000000001FFFFFFFF0000000000007FFF
+FFFC0000000000000FFFFFE0000000000000007FFE000000004D457CC356>I<0001FFE0
+000000001FFFFE000000007FFFFF80000001FFFFFFE0000003FE007FF8000007FC001FFC
+000007FE000FFE00000FFF0007FF00000FFF0007FF00000FFF0003FF80000FFF0003FF80
+000FFF0003FF80000FFF0001FFC00007FE0001FFC00003FC0001FFC00000F00001FFC000
+00000001FFC00000000001FFC00000000001FFC00000000001FFC000000003FFFFC00000
+00FFFFFFC0000007FFFFFFC000003FFFF1FFC00000FFFC01FFC00003FFE001FFC00007FF
+8001FFC0001FFE0001FFC0003FFC0001FFC0003FF80001FFC0007FF80001FFC0007FF000
+01FFC000FFF00001FFC000FFE00001FFC000FFE00001FFC000FFE00001FFC000FFE00003
+FFC000FFE00003FFC000FFF00007FFC0007FF8000FFFC0007FF8001FFFF0003FFE003EFF
+FFC01FFF80FC7FFFC007FFFFF87FFFC003FFFFE01FFFC0007FFF8007FFC0000FFC000000
+00322F7DAD36>97 D<00003FFC00000001FFFFC000000FFFFFF000003FFFFFFC00007FF0
+03FE0000FFC001FF0003FF8003FF0007FF0007FF8007FE0007FF800FFE0007FF801FFC00
+07FF801FFC0007FF803FF80007FF803FF80003FF007FF80001FE007FF8000078007FF000
+0000007FF000000000FFF000000000FFF000000000FFF000000000FFF000000000FFF000
+000000FFF000000000FFF000000000FFF000000000FFF000000000FFF000000000FFF000
+000000FFF0000000007FF8000000007FF8000000007FF8000000003FF8000000003FFC00
+0003C03FFC000003C01FFE000007C00FFE000007800FFF00000F8007FF80001F0003FFC0
+003E0001FFF0007C00007FFC03F800003FFFFFF000000FFFFFC0000003FFFF000000003F
+F800002A2F7CAD32>99 D<0000000003FE0000000007FFFE0000000007FFFE0000000007
+FFFE0000000007FFFE0000000007FFFE00000000001FFE00000000000FFE00000000000F
+FE00000000000FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE
+00000000000FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE00
+000000000FFE00000000000FFE00000000000FFE00000000000FFE00000000000FFE0000
+003FE00FFE000003FFFC0FFE00000FFFFF8FFE00003FFFFFCFFE0000FFF807FFFE0001FF
+C001FFFE0003FF80007FFE0007FF00003FFE000FFE00001FFE000FFC00000FFE001FFC00
+000FFE003FF800000FFE003FF800000FFE003FF800000FFE007FF800000FFE007FF00000
+0FFE007FF000000FFE00FFF000000FFE00FFF000000FFE00FFF000000FFE00FFF000000F
+FE00FFF000000FFE00FFF000000FFE00FFF000000FFE00FFF000000FFE00FFF000000FFE
+00FFF000000FFE00FFF000000FFE00FFF000000FFE007FF000000FFE007FF000000FFE00
+7FF000000FFE007FF800000FFE003FF800000FFE003FF800000FFE001FFC00001FFE001F
+FC00001FFE000FFE00003FFE0007FE00007FFE0003FF0000FFFF0001FFC003FFFFFC00FF
+F01FEFFFFC007FFFFF8FFFFC001FFFFE0FFFFC0007FFF80FFFFC00007FC00FF80036467C
+C43E>I<00003FF800000003FFFF8000000FFFFFE000003FFFFFF000007FF83FF80000FF
+C007FC0001FF8003FE0003FF0001FF0007FE0000FF800FFC0000FF801FFC00007FC01FF8
+00007FC03FF800003FE03FF800003FE07FF800003FE07FF000003FE07FF000003FF07FF0
+00001FF0FFF000001FF0FFF000001FF0FFFFFFFFFFF0FFFFFFFFFFF0FFFFFFFFFFF0FFFF
+FFFFFFF0FFF000000000FFF000000000FFF000000000FFF000000000FFF0000000007FF0
+000000007FF0000000007FF8000000007FF8000000003FF8000000003FF8000000F01FFC
+000000F01FFC000001F00FFE000001E007FF000003E003FF800007C001FFC0000F8000FF
+F0003F00007FFE01FE00001FFFFFFC000007FFFFF0000001FFFFC00000001FFE00002C2F
+7DAD33>I<000000FF8000000FFFE000007FFFF00001FFFFF80003FF8FFC000FFE0FFE00
+1FFC1FFE001FF81FFE003FF81FFE007FF01FFE007FF01FFE007FF00FFC00FFE00FFC00FF
+E003F000FFE000C000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0
+000000FFE0000000FFE0000000FFE0000000FFE0000000FFE00000FFFFFFF800FFFFFFF8
+00FFFFFFF800FFFFFFF800FFFFFFF80000FFE0000000FFE0000000FFE0000000FFE00000
+00FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000
+FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FF
+E0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0
+000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE000
+0000FFE000007FFFFFE0007FFFFFE0007FFFFFE0007FFFFFE0007FFFFFE00027467DC522
+>I<0000FFE0007E00000FFFFE03FF80003FFFFF8FFF8000FFFFFFFFFFC001FFC07FFF3F
+C003FF001FF83FC007FE000FFC3FC00FFC0007FE1F801FFC0007FF0F001FF80003FF0000
+1FF80003FF00003FF80003FF80003FF80003FF80003FF80003FF80003FF80003FF80003F
+F80003FF80003FF80003FF80003FF80003FF80003FF80003FF80001FF80003FF00001FF8
+0003FF00001FFC0007FF00000FFC0007FE000007FE000FFC000003FF001FF8000001FFC0
+7FF0000003FFFFFFE0000003FFFFFF800000078FFFFE0000000780FFE00000000F800000
+0000000F8000000000000F8000000000000F8000000000000FC000000000000FE0000000
+00000FF000000000000FFFFFFFC000000FFFFFFFFC000007FFFFFFFF800007FFFFFFFFE0
+0003FFFFFFFFF00001FFFFFFFFFC0000FFFFFFFFFC0003FFFFFFFFFE000FFFFFFFFFFF00
+1FF000007FFF003FC0000007FF007F80000001FF807F80000000FF80FF00000000FF80FF
+000000007F80FF000000007F80FF000000007F80FF000000007F80FF80000000FF807F80
+000000FF007FC0000001FF003FE0000003FE001FF0000007FC000FFE00003FF80007FFC0
+01FFF00001FFFFFFFFC000007FFFFFFF0000000FFFFFF8000000007FFF00000032427DAC
+38>I<007FC000000000FFFFC000000000FFFFC000000000FFFFC000000000FFFFC00000
+0000FFFFC00000000003FFC00000000001FFC00000000001FFC00000000001FFC0000000
+0001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC000000000
+01FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001
+FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC007FE000001FF
+C03FFF800001FFC0FFFFE00001FFC1FFFFF80001FFC7F03FFC0001FFCF801FFC0001FFDF
+000FFE0001FFDE000FFE0001FFFC000FFE0001FFF80007FF0001FFF00007FF0001FFF000
+07FF0001FFE00007FF0001FFE00007FF0001FFE00007FF0001FFC00007FF0001FFC00007
+FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF
+0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF00
+01FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001
+FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FF
+C00007FF0001FFC00007FF0001FFC00007FF00FFFFFF83FFFFFEFFFFFF83FFFFFEFFFFFF
+83FFFFFEFFFFFF83FFFFFEFFFFFF83FFFFFE37457CC43E>I<007C0001FF0003FF8007FF
+C007FFC00FFFE00FFFE00FFFE00FFFE00FFFE007FFC007FFC003FF8001FF00007C000000
+00000000000000000000000000000000000000000000000000000000007FC07FFFC07FFF
+C07FFFC07FFFC07FFFC003FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FF
+C001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FF
+C001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FF
+C001FFC0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18467CC520>I<000003E000000FF80000
+1FFC00003FFE00003FFE00007FFF00007FFF00007FFF00007FFF00007FFF00003FFE0000
+3FFE00001FFC00000FF8000003E000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000001FF0003FFFF0003FFFF0003FFFF0003
+FFFF0003FFFF00000FFF000007FF000007FF000007FF000007FF000007FF000007FF0000
+07FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF0000
+07FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF0000
+07FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF0000
+07FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF000007FF0000
+07FF1F8007FF3FC007FF7FE007FFFFF007FFFFF00FFEFFF00FFEFFF00FFCFFF01FFCFFE0
+1FF87FE03FF03FC0FFE01FFFFF800FFFFF0003FFFC0000FFC000205A86C522>I<007FC0
+00FFFFC000FFFFC000FFFFC000FFFFC000FFFFC00003FFC00001FFC00001FFC00001FFC0
+0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0
+0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0
+0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0
+0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0
+0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0
+0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0
+00FFFFFF80FFFFFF80FFFFFF80FFFFFF80FFFFFF8019457CC420>108
+D<007F8007FE00000FFC0000FFFF803FFFC0007FFF8000FFFF80FFFFF001FFFFE000FFFF
+81FFFFF803FFFFF000FFFF87F01FFC0FE03FF800FFFF8FC00FFE1F801FFC0003FF9F000F
+FF3E001FFE0001FF9E0007FF3C000FFE0001FFBC0007FF78000FFE0001FFF80003FFF000
+07FF0001FFF80003FFF00007FF0001FFF00003FFE00007FF0001FFE00003FFC00007FF00
+01FFE00003FFC00007FF0001FFE00003FFC00007FF0001FFC00003FF800007FF0001FFC0
+0003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF
+800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007
+FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001
+FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC000
+03FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF80
+0007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF
+0001FFC00003FF800007FF0001FFC00003FF800007FF0001FFC00003FF800007FF0001FF
+C00003FF800007FF00FFFFFF81FFFFFF03FFFFFEFFFFFF81FFFFFF03FFFFFEFFFFFF81FF
+FFFF03FFFFFEFFFFFF81FFFFFF03FFFFFEFFFFFF81FFFFFF03FFFFFE572D7CAC5E>I<00
+7F8007FE0000FFFF803FFF8000FFFF80FFFFE000FFFF81FFFFF800FFFF87F03FFC00FFFF
+8F801FFC0003FF9F000FFE0001FF9E000FFE0001FFBC000FFE0001FFF80007FF0001FFF0
+0007FF0001FFF00007FF0001FFE00007FF0001FFE00007FF0001FFE00007FF0001FFC000
+07FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007
+FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF
+0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF00
+01FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001
+FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF00FFFFFF83FFFFFEFFFF
+FF83FFFFFEFFFFFF83FFFFFEFFFFFF83FFFFFEFFFFFF83FFFFFE372D7CAC3E>I<00001F
+FC0000000001FFFFC000000007FFFFF00000001FFFFFFC0000007FF80FFF000000FFC001
+FF800001FF8000FFC00003FE00003FE00007FE00003FF0000FFC00001FF8000FF800000F
+F8001FF800000FFC001FF800000FFC003FF800000FFE003FF0000007FE007FF0000007FF
+007FF0000007FF007FF0000007FF007FF0000007FF00FFF0000007FF80FFF0000007FF80
+FFF0000007FF80FFF0000007FF80FFF0000007FF80FFF0000007FF80FFF0000007FF80FF
+F0000007FF80FFF0000007FF80FFF0000007FF807FF0000007FF007FF0000007FF007FF0
+000007FF007FF0000007FF003FF800000FFE003FF800000FFE001FF800000FFC001FFC00
+001FFC000FFC00001FF80007FE00003FF00007FE00003FF00003FF8000FFE00001FFC001
+FFC000007FF80FFF0000003FFFFFFE0000000FFFFFF800000001FFFFC0000000001FFC00
+0000312F7DAD38>I<007FC00FF80000FFFFC0FFFF8000FFFFC3FFFFE000FFFFCFFFFFF8
+00FFFFDFC03FFC00FFFFFF001FFE0003FFFC0007FF0001FFF80003FF8001FFF00003FFC0
+01FFE00001FFE001FFC00001FFE001FFC00000FFF001FFC00000FFF001FFC000007FF801
+FFC000007FF801FFC000007FF801FFC000007FF801FFC000003FFC01FFC000003FFC01FF
+C000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC0
+00003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000003FFC01FFC000
+007FF801FFC000007FF801FFC000007FF801FFC000007FF001FFC00000FFF001FFC00000
+FFF001FFC00001FFE001FFE00001FFC001FFF00003FFC001FFF80007FF8001FFFC000FFF
+0001FFFE001FFE0001FFDFC07FFC0001FFCFFFFFF00001FFC3FFFFC00001FFC0FFFF0000
+01FFC01FF0000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001
+FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FF
+C00000000001FFC00000000001FFC00000000001FFC000000000FFFFFF80000000FFFFFF
+80000000FFFFFF80000000FFFFFF80000000FFFFFF8000000036407DAC3E>I<007F807F
+00FFFF81FFE0FFFF83FFF0FFFF8FFFF8FFFF8F8FFCFFFF9F1FFE03FFBE1FFE01FFBC1FFE
+01FFF81FFE01FFF81FFE01FFF01FFE01FFF00FFC01FFE007F801FFE001E001FFE0000001
+FFE0000001FFE0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FF
+C0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0
+000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC0000001FFC000
+0001FFC0000001FFC0000001FFC00000FFFFFFE000FFFFFFE000FFFFFFE000FFFFFFE000
+FFFFFFE000272D7DAC2E>114 D<001FFC038000FFFF878003FFFFFF800FFFFFFF801FF0
+03FF803FC000FF803F80003F807F00001F807E00001F80FE00000F80FE00000F80FE0000
+0780FF00000780FF00000780FF80000780FFE0000000FFFE0000007FFFF000007FFFFF00
+003FFFFFC0003FFFFFF0001FFFFFFC000FFFFFFE0003FFFFFF0001FFFFFF80007FFFFF80
+000FFFFFC000003FFFC0000003FFE0000000FFE0F000003FE0F000003FE0F800001FE0F8
+00000FE0F800000FE0FC00000FE0FC00000FE0FE00000FC0FF00001FC0FF00001FC0FF80
+003F80FFE0007F00FFF803FE00FFFFFFFC00FCFFFFF800F03FFFE000E007FE0000232F7C
+AD2C>I<0001E000000001E000000001E000000001E000000001E000000003E000000003
+E000000003E000000003E000000007E000000007E00000000FE00000000FE00000001FE0
+0000001FE00000003FE00000007FE0000000FFE0000003FFE000000FFFFFFF80FFFFFFFF
+80FFFFFFFF80FFFFFFFF80FFFFFFFF8000FFE0000000FFE0000000FFE0000000FFE00000
+00FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000
+FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FF
+E0000000FFE0000000FFE0000000FFE001E000FFE001E000FFE001E000FFE001E000FFE0
+01E000FFE001E000FFE001E000FFE001E000FFE001E000FFE003E000FFF003C0007FF003
+C0007FF007C0003FF80F80001FFC1F00000FFFFF000007FFFC000001FFF80000003FE000
+23407EBE2C>I<007FC00001FF00FFFFC003FFFF00FFFFC003FFFF00FFFFC003FFFF00FF
+FFC003FFFF00FFFFC003FFFF0003FFC0000FFF0001FFC00007FF0001FFC00007FF0001FF
+C00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC0
+0007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC000
+07FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007
+FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC00007FF
+0001FFC00007FF0001FFC00007FF0001FFC00007FF0001FFC0000FFF0001FFC0000FFF00
+01FFC0001FFF0001FFC0001FFF0001FFC0003FFF0000FFC0003FFF0000FFE0007FFF8000
+7FE001F7FFFE007FF807E7FFFE003FFFFFC7FFFE000FFFFF07FFFE0003FFFE07FFFE0000
+7FF007FC00372E7CAC3E>I<FFFFFF0003FFFCFFFFFF0003FFFCFFFFFF0003FFFCFFFFFF
+0003FFFCFFFFFF0003FFFC01FFE000003E0000FFE000003C0000FFF000003C00007FF000
+007800007FF800007800007FF80000F800003FF80000F000003FFC0001F000001FFC0001
+E000001FFE0003E000000FFE0003C000000FFF0007C0000007FF000780000007FF800F80
+000003FF800F00000003FFC00F00000003FFC01F00000001FFE01E00000001FFE03E0000
+0000FFE03C00000000FFF07C000000007FF078000000007FF8F8000000003FF8F0000000
+003FFDF0000000001FFDE0000000001FFFE0000000000FFFC0000000000FFFC000000000
+0FFFC00000000007FF800000000007FF800000000003FF000000000003FF000000000001
+FE000000000001FE000000000000FC000000000000FC00000000000078000000362C7EAB
+3B>I<FFFFFE1FFFFF801FFFF0FFFFFE1FFFFF801FFFF0FFFFFE1FFFFF801FFFF0FFFFFE
+1FFFFF801FFFF0FFFFFE1FFFFF801FFFF001FFC0003FE000007C0001FFC0003FF0000078
+0001FFE0003FF00000F80000FFE0001FF80000F00000FFF0001FF80001F000007FF0000F
+FC0001E000007FF0000FFC0001E000007FF8001FFC0003E000003FF8001FFE0003C00000
+3FFC003FFE0007C000001FFC003FFF00078000001FFC003FFF00078000001FFE0079FF00
+0F8000000FFE0079FF800F0000000FFF00F9FF801F00000007FF00F0FFC01E00000007FF
+80F0FFC01E00000003FF81E07FC03C00000003FF81E07FE03C00000003FFC3E07FE07C00
+000001FFC3C03FF07800000001FFE7C03FF07800000000FFE7801FF0F000000000FFE780
+1FF8F000000000FFFF801FF9F0000000007FFF000FFDE0000000007FFF000FFFE0000000
+003FFE0007FFC0000000003FFE0007FFC0000000003FFE0007FFC0000000001FFC0003FF
+80000000001FFC0003FF80000000000FF80001FF00000000000FF80001FF00000000000F
+F00000FF000000000007F00000FE000000000007F00000FE000000000003E000007C0000
+00000003C000003C0000004C2C7EAB51>I<FFFFFF0003FFFCFFFFFF0003FFFCFFFFFF00
+03FFFCFFFFFF0003FFFCFFFFFF0003FFFC01FFE000003E0000FFE000003C0000FFF00000
+3C00007FF000007800007FF800007800007FF80000F800003FF80000F000003FFC0001F0
+00001FFC0001E000001FFE0003E000000FFE0003C000000FFF0007C0000007FF00078000
+0007FF800F80000003FF800F00000003FFC00F00000003FFC01F00000001FFE01E000000
+01FFE03E00000000FFE03C00000000FFF07C000000007FF078000000007FF8F800000000
+3FF8F0000000003FFDF0000000001FFDE0000000001FFFE0000000000FFFC0000000000F
+FFC0000000000FFFC00000000007FF800000000007FF800000000003FF000000000003FF
+000000000001FE000000000001FE000000000000FC000000000000FC0000000000007800
+000000000078000000000000F8000000000000F0000000000001F0000000000001E00000
+001F0003E00000003F8003C00000007FC007C0000000FFE00780000000FFE00F80000000
+FFE00F00000000FFE01F00000000FFE03E00000000FFC07C000000007FC1F8000000007F
+07F0000000003FFFE0000000001FFFC00000000007FF000000000001FC00000000003640
+7EAB3B>121 D<1FFFFFFFFF801FFFFFFFFF801FFFFFFFFF801FFFFFFFFF801FFC001FFF
+001FE0003FFE001FC0003FFE001F80007FFC001F0000FFF8003F0001FFF0003E0001FFF0
+003E0003FFE0003E0007FFC0003C000FFF80003C000FFF80003C001FFF00003C003FFE00
+003C007FFC000000007FFC00000000FFF800000001FFF000000003FFE000000003FFE000
+000007FFC00000000FFF800780001FFF000780001FFF000780003FFE000780007FFC000F
+8000FFF8000F0000FFF8000F0001FFF0000F0003FFE0001F0007FFC0001F0007FFC0001F
+000FFF80003F001FFF00007F003FFE0000FF003FFE0003FF007FFC001FFE00FFFFFFFFFE
+00FFFFFFFFFE00FFFFFFFFFE00FFFFFFFFFE00292C7DAB32>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fd ecti1095 10.95 17
+/Fd 17 119 df<000000018000000007800000000F000000001C00000000380000000070
+00000000E000000001E000000003C000000007800000000F000000001E000000003E0000
+00007C000000007800000000F000000001F000000003E000000003E000000007C0000000
+07800000000F800000001F000000001F000000003E000000003E000000007C000000007C
+00000000FC00000000F800000001F800000001F000000001F000000003F000000003E000
+000007E000000007E000000007C00000000FC00000000FC00000000F800000000F800000
+001F800000001F800000001F000000001F000000003F000000003F000000003E00000000
+3E000000007E000000007E000000007C000000007C000000007C000000007C000000007C
+000000007C00000000F800000000F800000000F800000000F800000000F800000000F800
+000000F800000000F800000000F800000000F800000000F8000000007800000000780000
+000078000000007800000000780000000078000000003C000000003C000000003C000000
+003C000000001E000000001E000000000E000000000F0000000007000000000700000000
+0380000000038000000001C000000000E00000000060000000215A73C325>40
+D<000003000000038000000380000001C0000000E0000000E00000007000000070000000
+78000000380000003C0000003C0000003C0000001E0000001E0000001E0000001E000000
+1F0000001F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000000
+1F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F000000
+3F0000003F0000003E0000003E0000003E0000007E0000007E0000007C0000007C000000
+FC000000FC000000F8000000F8000001F8000001F8000001F0000001F0000003F0000003
+E0000003E0000007E0000007C0000007C000000F8000000F8000001F8000001F0000003F
+0000003E0000003E0000007C0000007C000000F8000000F8000001F0000001E0000003E0
+000007C00000078000000F8000001F0000001E0000003C0000007C000000F8000000F000
+0001E0000003C00000078000000F0000001E0000003C00000070000000E0000000C00000
+00205A7FC325>I<7FFFFC7FFFFC7FFFFCFFFFFCFFFFFC1605799520>45
+D<000000FE00000007FF8000001F07C000007C01F00000F000F00001E000F80003C00078
+0007C0007C000F80007C001F00007C001F00007E003E00007E007E00007E007E00007E00
+FC00007E00FC00007E01F800007E01F800007E03F80000FE03F80000FE03F00000FE07F0
+0000FC07F00000FC07E00001FC0FE00001FC0FE00001FC0FE00001FC1FC00003F81FC000
+03F81FC00003F81FC00003F83F800007F03F800007F03F800007F03F800007F07F00000F
+E07F00000FE07F00000FE07F00000FC07E00001FC0FE00001FC0FE00001F80FE00003F80
+FE00003F80FC00003F00FC00003F00FC00007E00FC00007E00FC0000FC00FC0000FC00FC
+0000F800F80001F800F80001F000FC0003E0007C0003E0007C0007C0007C000F80003E00
+1F00003E003E00001F007C00000FC1F0000003FFC0000000FE000000273F76BC2E>48
+D<000000FE0000000003FFC00000000F01F00000003C00F800000078007C000000F0003E
+000001E0003F000003C0001F00000380001F80000700001F80000F00001F80000E0C001F
+80001E0C001FC0001C0E001FC0003C06001FC0003806001FC0007806001FC0007006001F
+C000700E003FC000F00C003F8000E00C003F8000E01C003F8000E018007F8001E018007F
+0001C038007F0001C07000FE0001C06001FE0001C0E001FC0000E3C003F80000FF0007F0
+00003C000FE0000000001FC0000000001F80000000007F0000000000FC0000000001F800
+00000003F0000000000FC0000000001F00000000007E0000000000F80000000003E00000
+000007C0000000001F00000000003E00000000007C0000180000F000003C0001E0000038
+0003C00000380003C0000078000780000078000F000000F0000E000000F0001E000001E0
+003FE00003E0003FFF0007C0007C3FF01FC000780FFFFF80007003FFFF0000F001FFFE00
+00E0007FFC0000E0003FF80000E00007C000002A3F79BC2E>50 D<00703F0001C00070FF
+8003C000F3FF80038000EFFFC0078000FFFFC00F0001FFFFC01E0001FF83C01E0003FE01
+C03C0003F801C07C0007F000C0F80007E000E3F0000FC0007FF0000F80003FE0001F0000
+01E0001E000003C0001E000007C0003C00000780003800000F80007800000F0000700000
+1F0000F000003E0000E000003E0000E000007C00000000007C0000000000F80000000000
+F80000000001F00000000001F00000000003F00000000003E00000000007E0000000000F
+C0000000000FC0000000001FC0000000001F80000000001F80000000003F00000000003F
+00000000007F00000000007E0000000000FE0000000000FE0000000001FC0000000001FC
+0000000001FC0000000003F80000000003F80000000003F80000000007F80000000007F0
+000000000FF0000000000FF0000000000FE0000000001FE0000000001FE0000000001FE0
+000000001FC0000000003FC0000000003FC0000000003FC0000000003F80000000003F00
+000000001E000000002A3F73BC2E>55 D<0000007F8000000003FFE00000000FFFF00000
+001FC0F80000007F007C000000FC003E000001F8003E000003F0003F000007E0001F0000
+0FE0001F00000FC0001F00001F80001F80003F80001F80003F00001F80007F00001F8000
+7F00001F8000FE00001F8000FE00003F8000FE00003F8001FE00003F8001FC00003F8001
+FC00003F0001FC00007F0003FC00007F0003F800007F0003F80000FF0003F80000FF0003
+F80000FE0003F80001FE0003F00001FE0001F00003FE0001F00003FC0001F80007FC0000
+F8000FFC0000F8001FFC000078003BF800007C0073F800003E00E3F800001F03C7F00000
+07FF07F0000001FC07F0000000000FE0000000000FE0000000000FC0000000001FC00000
+00001F80000000003F00000000003F00000000007E00000000007E0000000000FC00003E
+0001F800007F0003F000007F0003E000007F0007C00000FE000F800000FC001F00000070
+003E0000007800FC0000007E03F80000003FFFE00000000FFF8000000003FC0000000029
+3F78BC2E>57 D<0001FFFFFFFF80000001FFFFFFFFF0000001FFFFFFFFFC00000003FC00
+01FE00000003FC00007F00000003F800003F80000003F800003FC0000003F800001FC000
+0007F800001FC0000007F000001FE0000007F000001FE0000007F000000FE000000FF000
+000FE000000FE000001FE000000FE000001FE000000FE000001FE000001FE000001FC000
+001FC000003FC000001FC000003FC000001FC000003F8000003FC000007F0000003F8000
+00FF0000003F800001FE0000003F800001FC0000007F800003F80000007F00000FF00000
+007F00001FC00000007F00007F80000000FF0003FE00000000FFFFFFF000000000FFFFFF
+FE00000000FE00003F80000001FE00001FC0000001FC00000FE0000001FC000007F00000
+01FC000003F8000003FC000003F8000003F8000001FC000003F8000001FC000003F80000
+01FC000007F8000001FE000007F0000001FE000007F0000001FE000007F0000001FE0000
+0FF0000001FC00000FE0000003FC00000FE0000003FC00000FE0000003F800001FE00000
+07F800001FC0000007F800001FC000000FF000001FC000001FE000003FC000001FE00000
+3F8000003FC000003F8000007F8000007F800000FF0000007F800003FE0000007F00000F
+F8000000FF00003FF000007FFFFFFFFFC00000FFFFFFFFFF000000FFFFFFFFF00000003B
+3E7BBD3F>66 D<0001FFFFFFFF80000001FFFFFFFFF0000001FFFFFFFFFC00000003FC00
+03FE00000003FC00007F80000003F800003F80000003F800000FC0000003F800000FE000
+0007F8000007F0000007F0000003F0000007F0000003F8000007F0000001F800000FF000
+0001F800000FE0000001FC00000FE0000000FC00000FE0000000FC00001FE0000000FC00
+001FC0000000FE00001FC0000000FE00001FC0000000FE00003FC0000000FE00003F8000
+0000FE00003F80000000FE00003F80000001FE00007F80000001FE00007F00000001FE00
+007F00000001FE00007F00000001FC0000FF00000001FC0000FE00000003FC0000FE0000
+0003FC0000FE00000003FC0001FE00000003F80001FC00000007F80001FC00000007F800
+01FC00000007F00003FC0000000FF00003F80000000FF00003F80000000FE00003F80000
+001FE00007F80000001FC00007F00000001FC00007F00000003F800007F00000003F8000
+0FF00000007F00000FE00000007E00000FE0000000FE00000FE0000001FC00001FE00000
+01F800001FC0000003F000001FC0000007F000001FC000000FE000003FC000001FC00000
+3F8000003F8000003F8000007F0000007F800001FC0000007F800003F80000007F00000F
+E0000000FF00007FC000007FFFFFFFFF000000FFFFFFFFFC000000FFFFFFFFC00000003F
+3E7BBD44>68 D<00007E00000001FF80000007C1C380001F80EFC0003F00FFC0007E007F
+C000FC007F8001F8003F8003F0003F8003F0003F8007E0003F000FE0003F000FC0003F00
+1FC0007F001FC0007E003F80007E003F80007E003F8000FE007F8000FC007F0000FC007F
+0000FC007F0001FC00FF0001F800FE0001F800FE0001F800FE0003F800FE0003F038FC00
+03F038FC0003F038FC0007F038FC0007E078FC000FE0707C000FE0707C001FE0F07E003F
+E0E03E007FE0E03E00F3E1E01F01E3E1C00F8781E38003FF00FF0000FC003E00252977A7
+2E>97 D<00001FC00000FFF00003F07C000FC01E001F000E003E000F007C001F00FC007F
+01F8007F03F0007F07F0007E07E0007E0FE000381FC000001FC000003F8000003F800000
+3F8000007F8000007F0000007F0000007F000000FF000000FE000000FE000000FE000000
+FE000000FE000000FC000000FC000006FC00000E7E00001E7E00003C7E0000783E0000F0
+3F0001E01F0007C00F800F0007C07E0001FFF000007F8000202977A729>99
+D<00003F000001FFE00007C0F0001F0078007E007800FC003C01F8003C03F0003C07F000
+3C0FE0007C0FC000781FC000783F8000F83F8001F07F8007E07F001FC07F01FF007FFFF8
+00FFFF8000FE000000FE000000FE000000FE000000FC000000FC000000FC000000FC0000
+00FC000000FC000000FC00000CFC00001CFC00003C7C0000787C0000F07E0001E03E0003
+C01F000F800F001E000780FC0003FFE00000FF00001E2976A729>101
+D<0000700001FC0001FC0001FC0001F80001F80000E00000000000000000000000000000
+00000000000000000000000000000000000000000000000000007C0001FF00038F800707
+800E07C01E07C01C07C03C0FC0380FC0380FC0781FC0701F80701F80F03F80F03F00003F
+00007F00007E0000FE0000FC0000FC0001FC0001F80001F80003F80003F00003F03807F0
+3807E0380FE0780FC0700FC0700FC0F00F80E00F80E00F81C00F83C00F838007870003FE
+0000F800163D79BB1C>105 D<00000003800000000FC00000001FC00000001FC0000000
+1FC00000001F800000000F00000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000007C00000003FF000000078F8000000E07C000001C07C000003C07C0000
+03807E000007007E000007007E00000E00FE00000E00FC00001E00FC00001C00FC00003C
+01FC00003C01FC00000001F800000001F800000003F800000003F800000003F000000003
+F000000007F000000007F000000007E000000007E00000000FE00000000FE00000000FC0
+0000000FC00000001FC00000001FC00000001F800000001F800000003F800000003F8000
+00003F000000003F000000007F000000007F000000007E000000007E00000000FE000000
+00FE00000000FC00000000FC00000001FC00000001F800000001F800000001F800003C03
+F000007E03F00000FE07E00000FE07C00000FE0F800000FC1F000000F03E000000707C00
+00003FF00000000FC0000000224F83BB1C>I<01F0003F80007F000007FC01FFE003FFC0
+000F3E07C1F80F83F0000E1F0F00FC1E01F8001E1F1C007C3800F8001C1F38007E7000FC
+003C1FF0007EE000FC00381FF0007FE000FC00381FE0007FC000FC00783FC0007F8000FC
+00703FC0007F8000FC00703F80007F0000FC00703F00007E0000FC00F03F0000FE0001FC
+00F07F0000FC0001F800007E0000FC0001F800007E0000FC0001F800007E0001FC0003F8
+0000FE0001FC0003F00000FC0001F80003F00000FC0001F80003F00000FC0003F80007F0
+0001FC0003F80007E00001F80003F00007E00001F80003F0000FE00001F80007F0000FC0
+0003F80007F0001FC0E003F00007E0001F80E003F00007E0001F80E003F0000FE0003F81
+E007F0000FE0003F01C007E0000FC0003F01C007E0000FC0003F01C007E0001FC0003E03
+800FE0001FC0003E03800FC0001F80003E07000FC0001F80003E07000FC0003F80003E0E
+001FC0003F80001E1C001F80003F00000FF8000700000E000003E000432979A74A>109
+D<01F0003F800007FC01FFE0000F3E07C1F8000E1F0F00FC001E1F1C007C001C1F38007E
+003C1FF0007E00381FF0007E00381FE0007E00783FC0007E00703FC0007E00703F80007E
+00703F00007E00F03F0000FE00F07F0000FC00007E0000FC00007E0000FC00007E0001FC
+0000FE0001F80000FC0001F80000FC0001F80000FC0003F80001FC0003F00001F80003F0
+0001F80007F00001F80007E00003F8000FE07003F0000FC07003F0000FC07003F0001FC0
+F007F0001F80E007E0001F80E007E0001F81E007E0001F01C00FE0001F01C00FC0001F03
+800FC0001F03800FC0001F07001FC0000F0E001F800007FC0007000001F0002C2979A733
+>I<007C00038001FF0007E0038F800FE00707800FE00E07C00FF01E07C00FF01C07C007
+F03C0FC007F0380FC003F0380FC003E0781FC001E0701F8001E0701F8001E0F03F8001E0
+F03F0001C0003F0001C0007F0001C0007E0003C0007E00038000FE00038000FC00038000
+FC00078001FC00070001F800070001F800070001F8000E0003F8000E0003F0000E0003F0
+001C0003F0001C0003F000380003F000380003F000700003F000700001F000E00001F001
+C00001F803C00000F8078000007E0F0000001FFC00000007F00000242979A729>118
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fe ectt1440 14.4 19
+/Fe 19 119 df<00000007FE00000000000FFF00000000000FFF00000000001FFF000000
+00001FFF00000000003FFF00000000007FBF00000000007F3F0000000000FF3F00000000
+01FE3F0000000001FE3F0000000003FC3F0000000003F83F0000000007F83F000000000F
+F03F000000000FE03F000000001FE03F000000003FC03F000000003FC03F000000007F80
+3F000000007F003F00000000FF003F00000001FE003F00000001FC003F00000003FC003F
+00000007F8003F00000007F8003F0000000FF0003F0000000FE0003F0000001FE0003F00
+00003FC0003F0000003F80003F0000007F80003F000000FF00003F000000FF00003F0000
+01FE00003F000001FC00003F000003FC00003F000007F800003F000007F000003F00000F
+F000003F00001FE000003F00001FE000003F00003FC000003F00003F8000003F00007F80
+00003F0000FF0000003F0000FFFFFFFFFFFFF8FFFFFFFFFFFFFCFFFFFFFFFFFFFCFFFFFF
+FFFFFFFCFFFFFFFFFFFFFCFFFFFFFFFFFFFC7FFFFFFFFFFFF8000000003F000000000000
+3F0000000000003F0000000000003F0000000000003F0000000000003F0000000000003F
+0000000000003F0000000000003F0000000000003F0000000000003F0000000000003F00
+00000000003F0000000000003F0000000000FFFFFFC0000001FFFFFFE0000003FFFFFFF0
+000003FFFFFFF0000003FFFFFFF0000001FFFFFFE0000000FFFFFFC0364B7DCA3D>52
+D<0000007FF000000003FFFE0000000FFFFF8000003FFFFFC00000FFFFFFE00001FFFFFF
+F00007FFFFFFF8000FFFE01FF8001FFE0007FC003FF80003FC007FF00007FC007FC00007
+FC00FF800007FC01FF000007FC03FE000003F803FC000001F007FC0000000007F8000000
+000FF0000000000FF0000000001FE0000000001FC0000000003FC0000000003FC0000000
+003F80000000003F80000000007F8007FF00007F007FFFC0007F01FFFFF0007F07FFFFFC
+00FF1FFFFFFE00FE3FFFFFFF00FE7FFFFFFF80FEFFF807FFC0FFFF8000FFE0FFFE00007F
+F0FFFC00001FF0FFF800000FF8FFF0000007F8FFE0000007FCFFC0000003FCFF80000001
+FEFF80000001FEFF80000000FEFF00000000FFFF00000000FFFF000000007FFF00000000
+7F7F000000007F7F000000007F7F800000007F7F000000007F7F800000007F7F80000000
+7F3F800000007F3F80000000FF3FC0000000FE1FC0000000FE1FE0000001FE1FE0000001
+FE0FF0000003FC0FF0000007FC07F800000FF807FC00001FF003FE00003FF001FF00007F
+E001FFC001FFC000FFF80FFF80007FFFFFFF00003FFFFFFE00001FFFFFFC000007FFFFF8
+000003FFFFE0000000FFFF800000001FFC0000304B7AC93D>54 D<7FFFFFFFC00000FFFF
+FFFFF80000FFFFFFFFFE0000FFFFFFFFFF8000FFFFFFFFFFC000FFFFFFFFFFE0007FFFFF
+FFFFF00001FC00007FF80001FC00000FFC0001FC000007FC0001FC000003FE0001FC0000
+01FF0001FC000000FF0001FC0000007F0001FC0000007F8001FC0000003F8001FC000000
+3F8001FC0000003F8001FC0000003F8001FC0000003F8001FC0000003F8001FC0000003F
+8001FC0000007F8001FC0000007F0001FC000000FF0001FC000000FE0001FC000001FE00
+01FC000003FC0001FC000007FC0001FC00001FF80001FC00007FF00001FC000FFFE00001
+FFFFFFFFC00001FFFFFFFF000001FFFFFFFC000001FFFFFFFF000001FFFFFFFFC00001FF
+FFFFFFE00001FFFFFFFFF00001FC00000FFC0001FC000007FC0001FC000001FE0001FC00
+0000FF0001FC0000007F8001FC0000003F8001FC0000003FC001FC0000001FC001FC0000
+001FC001FC0000001FC001FC0000000FE001FC0000000FE001FC0000000FE001FC000000
+0FE001FC0000000FE001FC0000000FE001FC0000000FE001FC0000001FE001FC0000001F
+C001FC0000001FC001FC0000003FC001FC0000007FC001FC000000FF8001FC000001FF80
+01FC000003FF0001FC00000FFF0001FC00003FFE007FFFFFFFFFFC00FFFFFFFFFFF800FF
+FFFFFFFFF000FFFFFFFFFFE000FFFFFFFFFF8000FFFFFFFFFE00007FFFFFFFF000003349
+7CC83D>66 D<3FFFFFFF0000007FFFFFFFE00000FFFFFFFFF80000FFFFFFFFFE0000FFFF
+FFFFFF00007FFFFFFFFF80003FFFFFFFFFC00001FC0003FFE00001FC0000FFF00001FC00
+003FF80001FC00000FF80001FC000007FC0001FC000003FE0001FC000001FE0001FC0000
+01FF0001FC000000FF0001FC0000007F8001FC0000007F8001FC0000003FC001FC000000
+3FC001FC0000001FC001FC0000001FE001FC0000000FE001FC0000000FE001FC0000000F
+F001FC00000007F001FC00000007F001FC00000007F001FC00000007F001FC00000007F0
+01FC00000003F801FC00000003F801FC00000003F801FC00000003F801FC00000003F801
+FC00000003F801FC00000003F801FC00000003F801FC00000003F801FC00000003F801FC
+00000003F801FC00000003F801FC00000003F801FC00000003F801FC00000007F001FC00
+000007F001FC00000007F001FC00000007F001FC0000000FF001FC0000000FF001FC0000
+000FE001FC0000001FE001FC0000001FE001FC0000001FC001FC0000003FC001FC000000
+3FC001FC0000007F8001FC000000FF8001FC000000FF0001FC000001FF0001FC000003FE
+0001FC000007FC0001FC00000FFC0001FC00003FF80001FC00007FF00001FC0003FFE000
+3FFFFFFFFFC0007FFFFFFFFF8000FFFFFFFFFF0000FFFFFFFFFE0000FFFFFFFFF800007F
+FFFFFFE000003FFFFFFF00000035497DC83D>68 D<7FFFFFFC00000000FFFFFFFF800000
+00FFFFFFFFF0000000FFFFFFFFF8000000FFFFFFFFFE000000FFFFFFFFFF0000007FFFFF
+FFFF80000001FC000FFFC0000001FC0001FFE0000001FC00007FF0000001FC00001FF000
+0001FC00000FF8000001FC000007F8000001FC000003FC000001FC000003FC000001FC00
+0001FC000001FC000001FE000001FC000000FE000001FC000000FE000001FC000000FE00
+0001FC000000FE000001FC000000FE000001FC000000FE000001FC000001FE000001FC00
+0001FC000001FC000003FC000001FC000003FC000001FC000007F8000001FC00000FF800
+0001FC00001FF0000001FC00007FF0000001FC0001FFE0000001FC000FFFC0000001FFFF
+FFFF80000001FFFFFFFF00000001FFFFFFFE00000001FFFFFFF800000001FFFFFFFC0000
+0001FFFFFFFE00000001FFFFFFFF00000001FC000FFF80000001FC0001FF80000001FC00
+007FC0000001FC00003FE0000001FC00001FE0000001FC00000FE0000001FC00000FF000
+0001FC000007F0000001FC000007F0000001FC000007F0000001FC000007F0000001FC00
+0007F0000001FC000007F0000001FC000007F0000001FC000007F0000001FC000007F000
+0001FC000007F0000001FC000007F0000001FC000007F0000001FC000007F01F0001FC00
+0007F03F8001FC000007F03F8001FC000007F03F8001FC000007F03F8001FC000007F83F
+8001FC000003F87F807FFFF00003FC7F00FFFFF80003FFFF00FFFFF80001FFFE00FFFFF8
+0001FFFE00FFFFF80000FFFC00FFFFF800007FF8007FFFF000003FF00000000000000FC0
+00394A7DC83D>82 D<0000FFE000F00007FFFC00F8001FFFFF81F8007FFFFFE1F801FFFF
+FFF1F803FFFFFFFBF807FFFFFFFFF80FFF803FFFF80FFC0007FFF81FF00001FFF83FE000
+00FFF83FC000003FF87F8000003FF87F8000001FF87F0000000FF8FF0000000FF8FE0000
+0007F8FE00000007F8FE00000007F8FE00000003F8FE00000003F8FE00000003F8FF0000
+0003F87F00000001F07F00000000007F80000000003FC0000000003FE0000000001FF000
+0000001FFC000000000FFF0000000007FFF000000003FFFF00000001FFFFF80000007FFF
+FF8000003FFFFFE000000FFFFFF8000001FFFFFE0000001FFFFF00000001FFFF80000000
+1FFFC000000001FFE0000000003FF0000000001FF80000000007F80000000003FC000000
+0003FC0000000001FE0000000000FE0000000000FE0000000000FF7C000000007FFE0000
+00007FFE000000007FFE000000007FFE000000007FFE000000007FFF000000007FFF0000
+0000FFFF00000000FEFF80000000FEFF80000001FEFFC0000003FCFFE0000007FCFFF800
+000FF8FFFC00001FF8FFFF80007FF0FFFFF801FFE0FFFFFFFFFFC0FEFFFFFFFF80FC7FFF
+FFFF00FC1FFFFFFE00FC07FFFFF800F800FFFFE00078000FFF0000304B7AC93D>I<3FFF
+FFFFFFFFF87FFFFFFFFFFFFCFFFFFFFFFFFFFCFFFFFFFFFFFFFCFFFFFFFFFFFFFCFFFFFF
+FFFFFFFCFFFFFFFFFFFFFCFE0000FE0001FCFE0000FE0001FCFE0000FE0001FCFE0000FE
+0001FCFE0000FE0001FCFE0000FE0001FCFE0000FE0001FCFE0000FE0001FCFE0000FE00
+01FC7C0000FE0000F8000000FE000000000000FE000000000000FE000000000000FE0000
+00000000FE000000000000FE000000000000FE000000000000FE000000000000FE000000
+000000FE000000000000FE000000000000FE000000000000FE000000000000FE00000000
+0000FE000000000000FE000000000000FE000000000000FE000000000000FE0000000000
+00FE000000000000FE000000000000FE000000000000FE000000000000FE000000000000
+FE000000000000FE000000000000FE000000000000FE000000000000FE000000000000FE
+000000000000FE000000000000FE000000000000FE000000000000FE000000000000FE00
+0000000000FE000000000000FE000000000000FE000000000000FE000000000000FE0000
+00000000FE000000000000FE000000000000FE000000000000FE000000000000FE000000
+000000FE000000000000FE000000000000FE000000000000FE0000000001FFFFFF000000
+03FFFFFF80000003FFFFFF80000003FFFFFF80000003FFFFFF80000003FFFFFF80000001
+FFFFFF000036497DC83D>I<1FFFE000FFFF803FFFF001FFFFC07FFFF801FFFFE07FFFF8
+01FFFFE07FFFF801FFFFE03FFFF001FFFFC01FFFE000FFFF80007F80000FE000007F8000
+1FE000003FC0001FC000003FC0003FC000001FE0003F8000001FE0007F8000000FF0007F
+0000000FF000FF00000007F800FE00000007F801FE00000003FC01FC00000001FC03FC00
+000001FE03F800000000FE07F800000000FF07F0000000007F0FF0000000007F8FE00000
+00003F9FE0000000003FDFC0000000001FFFC0000000001FFF80000000000FFF80000000
+000FFF000000000007FF000000000007FE000000000003FE000000000001FC0000000000
+01FC000000000003FE000000000003FE000000000007FF000000000007FF00000000000F
+FF80000000000FFF80000000001FFFC0000000001FDFC0000000003F9FE0000000003F8F
+E0000000007F07F0000000007F07F000000000FE03F800000000FE03F800000001FE01FC
+00000001FC01FE00000003FC00FE00000003F800FF00000007F8007F00000007F0007F80
+00000FF0003F8000000FE0003FC000001FE0001FC000001FC0001FE000003FC0000FE000
+003F80000FF000007F800007F000007F000007F80000FF000003F80000FE000003FC0001
+FE000001FE007FFFC0000FFFF0FFFFE0001FFFF8FFFFF0003FFFFCFFFFF0003FFFFCFFFF
+F0003FFFFCFFFFE0001FFFF87FFFC0000FFFF036497DC83D>88 D<000FFFC000000000FF
+FFF800000003FFFFFE00000007FFFFFF8000000FFFFFFFC000000FFFFFFFE000001FFFFF
+FFF000001FF800FFF800001FF0001FFC00001FF00007FC00001FF00003FE00000FE00001
+FE000007C00000FF0000000000007F0000000000007F8000000000003F8000000000003F
+8000000000003F8000000000003F8000000000003F8000000000003F80000000007FFF80
+0000001FFFFF80000001FFFFFF8000000FFFFFFF8000003FFFFFFF800000FFFFFFFF8000
+03FFFFFC3F800007FFFC003F80000FFFC0003F80001FFE00003F80003FF000003F80003F
+E000003F80007F8000003F80007F0000003F8000FF0000003F8000FE0000003F8000FE00
+00003F8000FE0000003F8000FE0000003F8000FE0000003F8000FF0000007F80007F0000
+007F80007F800000FF80007FC00003FF80003FF0000FFFE0003FFE00FFFFFFF01FFFFFFF
+FFFFF80FFFFFFFFFFFF807FFFFFFCFFFF803FFFFFF07FFF801FFFFFC03FFF8007FFFE000
+7FF0000FFE00000000353679B43D>97 D<00000FFFC0000000FFFFFC000003FFFFFF0000
+07FFFFFF80001FFFFFFFC0003FFFFFFFC0007FFFFFFFE000FFF8007FE001FFC0003FE003
+FF00003FE007FE00003FE007FC00001FC00FF800000F801FF0000000001FE0000000003F
+C0000000003FC0000000003F80000000007F80000000007F00000000007F00000000007F
+0000000000FF0000000000FE0000000000FE0000000000FE0000000000FE0000000000FE
+0000000000FE0000000000FE0000000000FE0000000000FE0000000000FF00000000007F
+00000000007F00000000007F80000000007F80000000003FC0000000003FE0000001F01F
+E0000003F81FF0000003F80FF8000007F80FFC000007F007FF00000FF003FF80001FE003
+FFF0007FE001FFFE01FFC000FFFFFFFF80003FFFFFFF00001FFFFFFE00000FFFFFFC0000
+03FFFFF0000000FFFFC00000001FFC00002D3677B43D>99 D<00001FF800000000FFFF80
+000003FFFFE000000FFFFFF800001FFFFFFC00003FFFFFFE00007FFFFFFF0000FFF80FFF
+8001FFC001FFC003FF00007FE007FC00001FE00FF800000FF00FF000000FF01FE0000007
+F81FE0000003F83FC0000003F83F80000003FC3F80000001FC7F80000001FC7F00000001
+FC7F00000001FEFF00000000FEFE00000000FEFFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFF
+FEFFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFFFEFFFFFFFFFFFCFE0000000000FF00000000
+007F00000000007F00000000007F00000000007F80000000003F80000000003FC0000000
+001FE00000007C1FE0000000FE0FF0000000FE0FF8000000FE07FC000001FE03FF000003
+FC03FF800007FC01FFF0001FF800FFFE00FFF0007FFFFFFFE0003FFFFFFFC0000FFFFFFF
+800007FFFFFF000001FFFFFC0000007FFFE000000007FF00002F3679B43D>101
+D<00003C00000000007E0000000000FF0000000001FF8000000001FF8000000001FF8000
+000001FF8000000000FF00000000007E00000000003C0000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000000000001FFFFF0000
+003FFFFF8000007FFFFF8000007FFFFF8000007FFFFF8000003FFFFF8000001FFFFF8000
+0000003F80000000003F80000000003F80000000003F80000000003F80000000003F8000
+0000003F80000000003F80000000003F80000000003F80000000003F80000000003F8000
+0000003F80000000003F80000000003F80000000003F80000000003F80000000003F8000
+0000003F80000000003F80000000003F80000000003F80000000003F80000000003F8000
+0000003F80000000003F80000000003F80000000003F80000000003F80000000003F8000
+0000003F80000000003F80000000003F80000000003F80000000003F80000000003F8000
+0000003F8000003FFFFFFFFE007FFFFFFFFF00FFFFFFFFFF80FFFFFFFFFF80FFFFFFFFFF
+807FFFFFFFFF003FFFFFFFFE00294A76C93D>105 D<3FFFFF8000007FFFFFC00000FFFF
+FFC00000FFFFFFC00000FFFFFFC000007FFFFFC000003FFFFFC0000000001FC000000000
+1FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000000
+1FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000000
+1FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000000
+1FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000000
+1FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000000
+1FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000000
+1FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000000
+1FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000000
+1FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC000000000
+1FC0000000001FC0000000001FC0000000001FC000003FFFFFFFFFE07FFFFFFFFFF0FFFF
+FFFFFFF8FFFFFFFFFFF8FFFFFFFFFFF87FFFFFFFFFF03FFFFFFFFFE02D4978C83D>108
+D<00001FC000FE00007FE0FFF007FF8000FFF1FFF80FFFC000FFF7FFFC3FFFE000FFFFFF
+FC7FFFE000FFFFFFFEFFFFF000FFFFFFFEFFFFF0007FFFE0FFFF07F80003FF807FFC03F8
+0003FF003FF801F80003FE003FF001FC0003FC003FE001FC0003FC001FE000FC0003FC00
+1FE000FC0003F8001FC000FC0003F8001FC000FC0003F8001FC000FC0003F0001F8000FC
+0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F000
+1F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC
+0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F000
+1F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC
+0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F000
+1F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC0003F0001F8000FC
+007FFF81FFFC0FFFE0FFFFC3FFFE1FFFF0FFFFC7FFFE3FFFF0FFFFC7FFFE3FFFF0FFFFC7
+FFFE3FFFF0FFFFC3FFFE1FFFF07FFF81FFFC0FFFE03C3480B33D>I<0000001FF000007F
+FE00FFFC0000FFFF03FFFF0000FFFF0FFFFFC000FFFF3FFFFFE000FFFF7FFFFFF000FFFF
+FFFFFFF8007FFFFFC07FFC00007FFF000FFE00007FFC0007FE00007FF80001FF00007FF0
+0000FF00007FE00000FF80007FC000007F80007F8000003FC0007F8000003FC0007F8000
+001FE0007F0000001FE0007F0000000FE0007F0000000FE0007F0000000FF0007F000000
+0FF0007F00000007F0007F00000007F0007F00000007F0007F00000007F0007F00000007
+F0007F00000007F0007F00000007F0007F00000007F0007F00000007F0007F0000000FF0
+007F0000000FF0007F0000000FE0007F8000000FE0007F8000001FE0007F8000001FC000
+7FC000003FC0007FC000003FC0007FE000007F80007FE00000FF80007FF00001FF00007F
+F80003FF00007FFC0007FE00007FFE001FFC00007FFFC0FFF800007FFFFFFFF800007F7F
+FFFFE000007F3FFFFFC000007F0FFFFF8000007F07FFFE0000007F01FFF80000007F003F
+E00000007F0000000000007F0000000000007F0000000000007F0000000000007F000000
+0000007F0000000000007F0000000000007F0000000000007F0000000000007F00000000
+00007F0000000000007F0000000000007F0000000000007F0000000000007F0000000000
+007F0000000000007F0000000000007F0000000000007F00000000007FFFFF00000000FF
+FFFF80000000FFFFFF80000000FFFFFF80000000FFFFFF80000000FFFFFF800000007FFF
+FF00000000344F7DB33D>112 D<000000001FF8007FFFE000FFFF00FFFFF007FFFF80FF
+FFF01FFFFFC0FFFFF03FFFFFC0FFFFF07FFFFFE0FFFFF1FFFFFFE07FFFF3FFF03FE00007
+F7FF803FE00007F7FE001FC00007FFF8000F800007FFF00000000007FFE00000000007FF
+C00000000007FF800000000007FF000000000007FE000000000007FE000000000007FC00
+0000000007FC000000000007F8000000000007F8000000000007F8000000000007F80000
+00000007F0000000000007F0000000000007F0000000000007F0000000000007F0000000
+000007F0000000000007F0000000000007F0000000000007F0000000000007F000000000
+0007F0000000000007F0000000000007F0000000000007F0000000000007F00000000000
+07F0000000000007F0000000000007F0000000000007F0000000000007F0000000000007
+F0000000007FFFFFFFE00000FFFFFFFFF00000FFFFFFFFF80000FFFFFFFFF80000FFFFFF
+FFF80000FFFFFFFFF000007FFFFFFFE0000033347BB33D>114 D<0001FFF00F00001FFF
+FE0F8000FFFFFF9F8003FFFFFFFF8007FFFFFFFF800FFFFFFFFF801FFFFFFFFF803FFF00
+1FFF807FF00007FF807FC00001FF807F800000FF80FF0000007F80FE0000007F80FE0000
+003F80FE0000003F80FE0000003F80FF0000003F807F0000003F807F8000001F007FE000
+0000003FFC000000001FFFE00000000FFFFF00000007FFFFFC000001FFFFFF8000007FFF
+FFE000000FFFFFF8000000FFFFFE00000007FFFF000000001FFF8000000001FFC0000000
+007FE07C0000001FE0FE0000000FF0FE00000007F0FE00000007F8FF00000003F8FF0000
+0003F8FF00000003F8FF80000003F8FFC0000003F8FFC0000007F8FFE000000FF0FFF000
+000FF0FFF800003FF0FFFE0000FFE0FFFFC007FFC0FFFFFFFFFFC0FFFFFFFFFF80FCFFFF
+FFFF00FC3FFFFFFC00FC0FFFFFF000F803FFFFC00078007FFC00002D3678B43D>I<0000
+780000000000FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001
+FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001
+FC0000000001FC0000000001FC0000003FFFFFFFFFF87FFFFFFFFFFCFFFFFFFFFFFCFFFF
+FFFFFFFCFFFFFFFFFFFCFFFFFFFFFFFC7FFFFFFFFFF80001FC0000000001FC0000000001
+FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001
+FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001
+FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001FC0000000001
+FC0000000001FC0000000001FC0000000001FC0000000001FC00003E0001FC00007F0001
+FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001FC00007F0001
+FC00007F0001FE0000FF0001FE0001FE0000FF0003FE0000FF8007FC00007FF01FFC0000
+7FFFFFF800003FFFFFF000003FFFFFE000001FFFFF80000007FFFF00000003FFFC000000
+007FC00030437DC13D>I<7FFFE0001FFFF8FFFFF0003FFFFCFFFFF8007FFFFCFFFFF800
+7FFFFCFFFFF8007FFFFCFFFFF0003FFFFC7FFFE0001FFFF800FC000000FC0000FC000000
+FC0000FE000001FC00007E000001F800007E000001F800007F000003F800003F000003F0
+00003F000003F000003F800007F000001F800007E000001F800007E000001FC0000FE000
+000FC0000FC000000FC0000FC000000FE0001FC0000007E0001F80000007E0001F800000
+07F0003F80000003F0003F00000003F0003F00000003F8007F00000001F8007E00000001
+F8007E00000001FC00FE00000000FC00FC00000000FC00FC00000000FE01FC000000007E
+01F8000000007E01F8000000007F03F8000000003F03F0000000003F03F0000000003F87
+F0000000001F87E0000000001F87E0000000001FCFE0000000000FCFC0000000000FCFC0
+000000000FFFC00000000007FF800000000007FF800000000007FF800000000003FF0000
+00000003FF000000000000FC00000036347DB23D>118 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Ff ecrm1095 10.95 75
+/Ff 75 123 df<000003FF000FE000001FFFC07FF80000FE00F1F81C0001F8003BE07E00
+07E0007FC0FF000FC001FFC0FF001F8001FF80FF003F0001FF00FF007F0001FF00FF007E
+0001FF007E00FE0000FE000000FC00007E000000FC00007E000000FC00007E000000FC00
+007E000000FC00007E000000FC00007E000000FC00007E000000FC00007E000000FC0000
+7E000000FC00007E000000FC00007E000000FC00007E000000FC00007E000000FC00007E
+0000FFFFFFFFFFFF80FFFFFFFFFFFF80FFFFFFFFFFFF8000FC00007E000000FC00007E00
+0000FC00007E000000FC00007E000000FC00007E000000FC00007E000000FC00007E0000
+00FC00007E000000FC00007E000000FC00007E000000FC00007E000000FC00007E000000
+FC00007E000000FC00007E000000FC00007E000000FC00007E000000FC00007E000000FC
+00007E000000FC00007E000000FC00007E000000FC00007E000000FC00007E000000FC00
+007E000000FC00007E000000FC00007E000000FC00007E000000FC00007E000000FC0000
+7E000000FC00007E000000FC00007E000000FC00007E000000FC00007E000001FE0000FF
+00007FFFF83FFFFF007FFFF83FFFFF007FFFF83FFFFF0038407FBF35>27
+D<000003FE000000001FFFC0000000FE01E0000001F80078000007E0001C00000FC0007C
+00001F8000FE00003F0001FE00007F0001FE00007E0001FE0000FE0001FE0000FC0000FC
+0000FC0000780000FC0000000000FC0000000000FC0000000000FC0000000000FC000000
+0000FC0000000000FC0000000000FC0000000000FC0000000000FC0000000000FC000000
+0000FC00007E00FFFFFFFFFE00FFFFFFFFFE00FFFFFFFFFE0000FC0001FE0000FC0000FE
+0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E
+0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E
+0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E
+0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E
+0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E
+0001FE0000FF007FFFF83FFFFC7FFFF83FFFFC7FFFF83FFFFC2E407FBF32>I<000003FF
+000000001FFFEE000000FE00FE000001F800FE000007E001FE00000FC001FE00001F8001
+FE00003F0001FE00007F0001FE00007E0000FE0000FE00007E0000FC00007E0000FC0000
+7E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC0000
+7E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC0000
+7E00FFFFFFFFFE00FFFFFFFFFE00FFFFFFFFFE0000FC00007E0000FC00007E0000FC0000
+7E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC0000
+7E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC0000
+7E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC0000
+7E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC0000
+7E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0000FC00007E0001FE0000
+FF007FFFF83FFFFC7FFFF83FFFFC7FFFF83FFFFC2E407FBF32>I<3E001F007F003F807F
+003F80FF807FC07F003F807F003F807F003F807F003F807F003F807F003F807F003F807F
+003F807F003F807E001F803E001F003E001F003E001F003E001F003E001F003E001F003E
+001F003E001F003E001F001C000E001C000E001C000E001C000E001C000E001C000E001C
+000E001C000E001C000E00180006001A2177BF2D>34 D<1C007F00FF80FF80FFC0FFC0FF
+C07FC01CC000C000C000C000C000C001C00180018003800300070006000E000C001C0038
+00700060000A1B78BE19>39 D<0000300000700000E00001C0000380000700000F00001E
+00003C00003C0000780000F00000F00001E00001E00003C00003C00007C0000780000F80
+000F80000F00001F00001F00001E00003E00003E00003E00003C00007C00007C00007C00
+007C00007C00007C0000780000F80000F80000F80000F80000F80000F80000F80000F800
+00F80000F80000F80000F80000F80000F80000F80000F80000F80000F800007800007C00
+007C00007C00007C00007C00007C00003C00003E00003E00003E00001E00001F00001F00
+000F00000F80000F800007800007C00003C00003C00001E00001E00000F00000F0000078
+00003C00003C00001E00000F000007000003800001C00000E0000070000030145A77C323
+>I<C00000E000007000003800001C00000E00000F000007800003C00003C00001E00000
+F00000F000007800007800003C00003C00003E00001E00001F00001F00000F00000F8000
+0F800007800007C00007C00007C00003C00003E00003E00003E00003E00003E00003E000
+01E00001F00001F00001F00001F00001F00001F00001F00001F00001F00001F00001F000
+01F00001F00001F00001F00001F00001F00001F00001E00003E00003E00003E00003E000
+03E00003E00003C00007C00007C00007C0000780000F80000F80000F00001F00001F0000
+1E00003E00003C00003C0000780000780000F00000F00001E00003C00003C0000780000F
+00000E00001C0000380000700000E00000C00000145A7BC323>I<000000060000000000
+000006000000000000000600000000000000060000000000000006000000000000000600
+000000000000060000000000000006000000000000000600000000000000060000000000
+000006000000000000000600000000000000060000000000000006000000000000000600
+000000000000060000000000000006000000000000000600000000000000060000000000
+000006000000000000000600000000000000060000000000000006000000000000000600
+000000000000060000000000000006000000000000000600000000000000060000000000
+00000600000000FFFFFFFFFFFFFFE0FFFFFFFFFFFFFFE000000006000000000000000600
+000000000000060000000000000006000000000000000600000000000000060000000000
+000006000000000000000600000000000000060000000000000006000000000000000600
+000000000000060000000000000006000000000000000600000000000000060000000000
+000006000000000000000600000000000000060000000000000006000000000000000600
+000000000000060000000000000006000000000000000600000000000000060000000000
+000006000000000000000600000000000000060000000000000006000000000000000600
+0000003B3C7BB446>43 D<1C007F00FF80FF80FFC0FFC0FFC07FC01CC000C000C000C000
+C000C001C00180018003800300070006000E000C001C003800700060000A1B788819>I<
+FFFFFEFFFFFEFFFFFEFFFFFEFFFFFE17057F951E>I<1C007F00FF80FF80FF80FF80FF80
+7F001C000909788819>I<00000000C000000000C000000001C000000001800000000180
+000000038000000003000000000700000000060000000006000000000E000000000C0000
+00000C000000001C00000000180000000018000000003800000000300000000030000000
+0070000000006000000000E000000000C000000000C000000001C0000000018000000001
+80000000038000000003000000000300000000070000000006000000000E000000000C00
+0000000C000000001C000000001800000000180000000038000000003000000000300000
+0000700000000060000000006000000000E000000000C000000001C00000000180000000
+01800000000380000000030000000003000000000700000000060000000006000000000E
+000000000C000000000C000000001C000000001800000000380000000030000000003000
+000000700000000060000000006000000000E000000000C000000000C000000001C00000
+000180000000038000000003000000000300000000070000000006000000000600000000
+0E000000000C000000000C000000001C0000000018000000001800000000380000000030
+00000000700000000060000000006000000000E000000000C000000000C000000000225B
+7BC32D>I<0003FC0000001FFF8000003E07C00000F801F00001F000F80003E0007C0003
+C0003C0007C0003E000F80001F000F80001F001F00000F801F00000F803F00000FC03F00
+000FC03F00000FC03F00000FC07E000007E07E000007E07E000007E07E000007E07E0000
+07E0FE000007F0FE000007F0FE000007F0FE000007F0FE000007F0FE000007F0FE000007
+F0FE000007F0FE000007F0FE000007F0FE000007F0FE000007F0FE000007F0FE000007F0
+FE000007F0FE000007F0FE000007F0FE000007F0FE000007F0FE000007F0FE000007F07E
+000007E07E000007E07E000007E07E000007E07F00000FE03F00000FC03F00000FC03F00
+000FC03F00000FC01F00000F801F80001F800F80001F000F80001F0007C0003E0007C000
+3E0003E0007C0001F000F80000F801F000003E07C000001FFF80000003FC0000243F7CBC
+2D>I<0000C0000003C0000007C000001FC000007FC00007FFC000FFFFC000FF9FC000F8
+1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000
+1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000
+1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000
+1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000
+1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000
+1FC000001FC000001FC000001FC000007FF000FFFFFFF8FFFFFFF8FFFFFFF81D3D78BC2D
+>I<0007FC0000003FFF800000FFFFE00001F00FF800078003FC000F0001FE000E0000FF
+001C00007F803800003FC03000003FC07000001FE06000001FE06000001FE0FE00000FF0
+FF00000FF0FF80000FF0FF80000FF0FF80000FF0FF80000FF0FF80000FF07F00000FF01C
+00000FF00000000FE00000001FE00000001FE00000001FC00000003FC00000003F800000
+007F800000007F00000000FE00000001FC00000001FC00000003F800000007F00000000F
+E00000000FC00000001F800000003E000000007C00000000F800000001F000000003E000
+000003C000000007800000000F000030001E000030003C000030007800003000F0000060
+01E000006003C0000060078000006007000000E00FFFFFFFE01FFFFFFFE03FFFFFFFE07F
+FFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0243D7CBC2D>I<0007FC0000003FFF8000
+00FFFFE00001F807F80007C003FC000F0001FE000E0000FF001C00007F801F80007F803F
+C0003FC03FE0003FC03FE0003FC03FE0003FC03FE0003FC03FE0003FC01FC0003FC00700
+003FC00000003F800000007F800000007F800000007F00000000FF00000000FE00000001
+FC00000003F800000003F00000000FC00000003F0000001FFC0000001FFF800000000FE0
+00000003F800000001FC00000000FE000000007F000000007F800000003FC00000003FC0
+0000003FE00000003FE00000001FE00000001FF00000001FF00C00001FF03F00001FF07F
+80001FF0FFC0001FF0FFC0001FF0FFC0001FF0FFC0001FF0FFC0003FE0FF80003FE07F00
+003FC07000003FC07000007F803800007F801C0000FF000F0001FE0007C003FC0003F80F
+F00000FFFFE000003FFF80000007FC0000243F7CBC2D>I<0000000E000000000E000000
+001E000000003E000000003E000000007E00000000FE00000000FE00000001FE00000003
+FE00000003FE00000006FE0000000EFE0000000CFE00000018FE00000038FE00000030FE
+00000060FE000000E0FE000000C0FE00000180FE00000380FE00000300FE00000600FE00
+000E00FE00000C00FE00001800FE00003800FE00003000FE00006000FE0000E000FE0000
+C000FE00018000FE00038000FE00030000FE00060000FE000E0000FE000C0000FE001800
+00FE00380000FE00300000FE00600000FE00E00000FE00FFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE
+00000000FE00000000FE00000000FE00000000FE00000000FE00000001FF000001FFFFFF
+0001FFFFFF0001FFFFFF283E7EBD2D>I<060000030007C0000F0007F800FE0007FFFFFC
+0007FFFFFC0007FFFFF00007FFFFE00007FFFFC00007FFFF0000063FF800000600000000
+060000000006000000000600000000060000000006000000000600000000060000000006
+0000000006000000000600000000060000000006000000000601FE0000060FFF8000063E
+03E000067001F80006E000FC0007C0007E000780003F000700003F800600001F80000000
+1FC00000001FC00000001FE00000000FE00000000FE00000000FE00000000FF00000000F
+F00000000FF00000000FF03E00000FF07F00000FF0FF80000FF0FF80000FF0FF80000FF0
+FF80000FF0FF00000FE0FE00001FE0E000001FE06000001FC07000001FC03000003F8038
+00003F801C00007F001E0000FE000F0001FC0007C003F80003F00FE00000FFFFC000003F
+FF00000007F80000243F7CBC2D>I<00001FE0000000FFF8000003FFFE00000FF01F0000
+1F800780003F000380007E000FC000FC001FC001F8003FC003F0003FC003F0003FC007E0
+003FC00FE0001F800FC0000F001FC00000001FC00000001F800000003F800000003F8000
+00003F800000007F800000007F000000007F01FE00007F07FF8000FF0E03E000FF1C01F0
+00FF3800FC00FF70007E00FF60003E00FFE0003F00FFC0001F80FFC0001FC0FF80001FC0
+FF80001FE0FF80000FE0FF80000FE0FF00000FF0FF00000FF0FF00000FF0FF00000FF0FF
+00000FF0FF00000FF07F00000FF07F00000FF07F00000FF07F00000FF07F00000FF03F80
+000FF03F80000FE03F80000FE01F80000FE01F80001FC01FC0001FC00FC0001F800FC000
+3F8007E0003F0003F0007E0001F800FC0000FC01F800007E07F000003FFFE000000FFF80
+000003FC0000243F7CBC2D>I<300000000038000000003E000000003FFFFFFFFC3FFFFF
+FFFC3FFFFFFFFC3FFFFFFFF87FFFFFFFF87FFFFFFFF07FFFFFFFE070000000E060000001
+C0600000038060000003006000000700C000000E00C000000C00C000001C00C000003800
+00000030000000007000000000E000000001C00000000180000000038000000007000000
+0007000000000E000000000E000000001C000000001C000000003C000000003800000000
+78000000007800000000F800000000F000000001F000000001F000000001F000000003F0
+00000003F000000003F000000007F000000007E000000007E000000007E00000000FE000
+00000FE00000000FE00000000FE00000000FE00000001FE00000001FE00000001FE00000
+001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE0000000
+0FC00000000780000026407BBD2D>I<0003FC0000001FFF8000007FFFE00000FC03F800
+01E000FC0003C0003E000780001F000F00000F000E00000F801E000007801C000007C03C
+000003C03C000003C03C000003C03E000003C03E000003C03F000003C03F000007C03F80
+0007801FE0000F801FF0000F001FFC001E000FFE003C000FFF80780007FFC0F00003FFF1
+E00001FFFF800000FFFF0000003FFF0000001FFFC000000FFFE000001FFFF8000078FFFC
+0001F07FFE0003C01FFF0007800FFF800F0003FFC01F0001FFC01E00007FE03C00003FE0
+7C00000FE078000007F078000003F0F8000003F0F0000001F0F0000001F0F0000000F0F0
+000000F0F0000000F0F0000000F0F8000000E078000001E078000001E07C000001C03E00
+0003C01E000007801F00000F000FC0001E0007E0007C0001FC03F80000FFFFE000001FFF
+80000003FC0000243F7CBC2D>I<0003FC0000001FFF0000003FFFC00000FE07F00001F8
+01F80003F000FC0007E0007C000FE0007E001FC0003F001F80003F003F80001F803F8000
+1F807F80001F807F00001FC07F00001FC0FF00001FC0FF00000FE0FF00000FE0FF00000F
+E0FF00000FE0FF00000FE0FF00000FF0FF00000FF0FF00000FF0FF00000FF0FF00000FF0
+FF00000FF07F00001FF07F00001FF07F80001FF03F80001FF03F80003FF01F80003FF00F
+C0007FF007C0006FF007E000EFF003F001CFF000F8038FF0007C070FF0001FFE0FE00007
+F80FE00000000FE00000001FE00000001FE00000001FC00000001FC00000001FC0000000
+3F800000003F800F00003F001F80007F003FC0007E003FC0007E003FC000FC003FC001F8
+003F8001F8003F0003F0001C0007E0001E001FC0000FC07F000003FFFE000001FFF80000
+003FC00000243F7CBC2D>I<1C007F00FF80FF80FF80FF80FF807F001C00000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+1C007F00FF80FF80FF80FF80FF807F001C00092778A619>I<1C007F00FF80FF80FF80FF
+80FF807F001C000000000000000000000000000000000000000000000000000000000000
+000000000000000000000000001C007F00FF80FF80FFC0FFC0FFC07FC01CC000C000C000
+C000C000C001C00180018003800300070006000E000C001C003800700060000A3978A619
+>I<000000FFE0000000000007FFFC00000000003F001F8000000000F80003E000000001
+C0000070000000078000003C0000000E0000000E0000001C000000070000003800000003
+8000007000000001C00000E000000000E00001C000000000700003800000000038000700
+003F80001C00060001FFE0000C000E0007E078000E000C000F801C0006001C003F000F00
+070018007E00070003003800FC00038003803000F80001FC01803001F80000FE01807003
+F00000FE01C06003F000007E00C06007E000007E00C06007E000007E00C0E007E000007E
+00E0C00FE000007E0060C00FC000007E0060C00FC000007E0060C00FC000007E0060C00F
+C000007E0060C00FC000007E0060C00FC000007E0060C00FC000007E0060C00FC000007E
+0060C00FC000007E0060C00FE000007E0060E007E000007E00606007E000007E00606007
+E000007E00606003F000007E00E07003F00000FE00C03001F80000FE00C03000F80001FE
+00C03800FC0003FE01C018007E00077E01801C003F000F7F03800C000F801C3F03000E00
+07E0781F8700060001FFE007FE000700003F8001F800038000000000000001C000000000
+000000E000000000000000700000000000000038000000000000001C0000000003E0000E
+000000000FE00007800000007F800001C0000003FC000000F800001FE00000003F0007FF
+0000000007FFFFF00000000000FFFC0000003B417BBF46>64 D<00000007000000000000
+00070000000000000007000000000000000F800000000000000F800000000000001FC000
+00000000001FC00000000000001FC00000000000003FE00000000000003FE00000000000
+003FE00000000000007FF00000000000006FF00000000000006FF0000000000000CFF800
+0000000000C7F8000000000000C7F800000000000187FC00000000000183FC0000000000
+0183FC00000000000301FE00000000000301FE00000000000301FE00000000000600FF00
+000000000600FF00000000000E00FF80000000000C007F80000000000C007F8000000000
+1C007FC00000000018003FC00000000018003FC00000000030003FE00000000030001FE0
+0000000030001FE00000000060001FF00000000060000FF00000000060000FF000000000
+C00007F800000000C00007F800000000C00007F800000001800003FC00000001FFFFFFFC
+00000003FFFFFFFE00000003FFFFFFFE00000003000001FE00000007000001FF00000006
+000000FF00000006000000FF0000000C000000FF8000000C0000007F8000000C0000007F
+800000180000007FC00000180000003FC00000180000003FC00000300000001FE0000030
+0000001FE00000700000001FE00000700000000FF00000F00000000FF00001F00000000F
+F80003F80000000FF8000FFE0000003FFE00FFFFC00007FFFFF8FFFFC00007FFFFF8FFFF
+C00007FFFFF83D417DC044>I<FFFFFFFFFC0000FFFFFFFFFFC000FFFFFFFFFFF00000FF
+C0000FFC00007F800003FE00007F800000FF00007F8000007F80007F8000003FC0007F80
+00003FE0007F8000001FE0007F8000001FF0007F8000000FF0007F8000000FF8007F8000
+000FF8007F8000000FF8007F8000000FF8007F8000000FF8007F8000000FF8007F800000
+0FF8007F8000000FF0007F8000001FF0007F8000001FE0007F8000003FE0007F8000003F
+C0007F8000007F80007F800000FF00007F800003FE00007F80000FF800007F80007FE000
+007FFFFFFF0000007FFFFFFFE000007F800003FC00007F800000FE00007F8000007F8000
+7F8000003FC0007F8000001FE0007F8000000FF0007F8000000FF8007F80000007F8007F
+80000007FC007F80000003FC007F80000003FC007F80000003FE007F80000003FE007F80
+000003FE007F80000003FE007F80000003FE007F80000003FE007F80000003FE007F8000
+0003FC007F80000007FC007F80000007FC007F8000000FF8007F8000000FF0007F800000
+1FF0007F8000003FE0007F8000007FC0007F800001FF8000FFC0000FFE00FFFFFFFFFFFC
+00FFFFFFFFFFE000FFFFFFFFFF0000373E7DBD40>I<0000003FF0000C000003FFFE001C
+00001FFFFF801C00007FE00FC03C0000FF0001F07C0003FC0000787C0007F000003CFC00
+1FE000000FFC003FC0000007FC007F80000003FC00FF00000003FC01FE00000001FC01FC
+00000000FC03FC00000000FC07F8000000007C07F8000000007C0FF0000000003C0FF000
+0000003C1FE0000000001C1FE0000000001C3FE0000000001C3FC0000000001C3FC00000
+00000C7FC0000000000C7FC0000000000C7FC0000000000C7F800000000000FF80000000
+0000FF800000000000FF800000000000FF800000000000FF800000000000FF8000000000
+00FF800000000000FF800000000000FF800000000000FF800000000000FF800000000000
+FF8000000000007F8000000000007FC000000000007FC0000000000C7FC0000000000C3F
+C0000000000C3FC0000000000C3FE0000000000C1FE0000000001C1FE000000000180FF0
+00000000180FF0000000001807F8000000003807F8000000003003FC000000007001FC00
+0000006001FE00000000E000FF00000001C0007F8000000380003FC000000780001FE000
+000F000007F000001E000003FC00003C000000FF0000F00000007FE007E00000001FFFFF
+8000000003FFFE00000000003FF0000036427BBF41>I<FFFFFFFFFC000000FFFFFFFFFF
+800000FFFFFFFFFFE0000000FFC0001FF80000007F800003FE0000007F800000FF000000
+7F8000003F8000007F8000001FC000007F8000000FE000007F80000007F000007F800000
+03F800007F80000001FC00007F80000001FC00007F80000000FE00007F80000000FF0000
+7F800000007F00007F800000007F80007F800000003F80007F800000003FC0007F800000
+003FC0007F800000003FC0007F800000003FE0007F800000001FE0007F800000001FE000
+7F800000001FE0007F800000001FE0007F800000001FF0007F800000001FF0007F800000
+001FF0007F800000001FF0007F800000001FF0007F800000001FF0007F800000001FF000
+7F800000001FF0007F800000001FF0007F800000001FF0007F800000001FF0007F800000
+001FE0007F800000001FE0007F800000001FE0007F800000001FE0007F800000003FE000
+7F800000003FC0007F800000003FC0007F800000003F80007F800000007F80007F800000
+007F80007F800000007F00007F80000000FE00007F80000000FE00007F80000001FC0000
+7F80000003F800007F80000007F800007F8000000FF000007F8000001FE000007F800000
+3FC000007F800000FF0000007F800003FE000000FFC0001FF80000FFFFFFFFFFF00000FF
+FFFFFFFF800000FFFFFFFFFC0000003C3E7DBD45>I<FFFFFFFFFFFFC0FFFFFFFFFFFFC0
+FFFFFFFFFFFFC000FFC00001FFC0007F8000001FC0007F8000000FE0007F80000003E000
+7F80000003E0007F80000001E0007F80000000E0007F80000000E0007F80000000E0007F
+8000000060007F8000000060007F8000000060007F8000000060007F8000000030007F80
+00300030007F8000300030007F8000300030007F8000300030007F8000300000007F8000
+300000007F8000700000007F8000700000007F8000F00000007F8001F00000007F8007F0
+0000007FFFFFF00000007FFFFFF00000007FFFFFF00000007F8007F00000007F8001F000
+00007F8000F00000007F8000700000007F8000700000007F8000300000007F8000300000
+007F8000300006007F8000300006007F8000300006007F800030000C007F800000000C00
+7F800000000C007F800000000C007F800000000C007F800000001C007F8000000018007F
+8000000018007F8000000038007F8000000038007F8000000078007F8000000078007F80
+000000F0007F80000001F0007F80000003F0007F80000007F0007F8000001FF000FFC000
+01FFF0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0373E7DBD3D>I<FFFFFFFFFF
+FF80FFFFFFFFFFFF80FFFFFFFFFFFF8000FFC00003FF80007F8000003F80007F8000001F
+C0007F80000007C0007F80000003C0007F80000003C0007F80000001C0007F80000001C0
+007F80000001C0007F80000000C0007F80000000C0007F80000000C0007F80000000C000
+7F8000000060007F8000000060007F8000300060007F8000300060007F8000300060007F
+8000300000007F8000300000007F8000300000007F8000700000007F8000700000007F80
+00F00000007F8001F00000007F8007F00000007FFFFFF00000007FFFFFF00000007FFFFF
+F00000007F8007F00000007F8001F00000007F8000F00000007F8000700000007F800070
+0000007F8000300000007F8000300000007F8000300000007F8000300000007F80003000
+00007F8000300000007F8000000000007F8000000000007F8000000000007F8000000000
+007F8000000000007F8000000000007F8000000000007F8000000000007F800000000000
+7F8000000000007F8000000000007F8000000000007F8000000000007F8000000000007F
+800000000000FFE000000000FFFFFFF0000000FFFFFFF0000000FFFFFFF0000000333E7D
+BD3B>I<0000003FF0000C00000003FFFE001C0000001FFFFF801C0000007FE00FC03C00
+0000FF0001F07C000003FC0000787C000007F000003CFC00001FE000000FFC00003FC000
+0007FC00007F80000003FC0000FF00000003FC0001FE00000001FC0001FC00000000FC00
+03FC00000000FC0007F8000000007C0007F8000000007C000FF0000000003C000FF00000
+00003C001FE0000000001C001FE0000000001C003FE0000000001C003FC0000000001C00
+3FC0000000000C007FC0000000000C007FC0000000000C007FC0000000000C007F800000
+00000000FF80000000000000FF80000000000000FF80000000000000FF80000000000000
+FF80000000000000FF80000000000000FF80000000000000FF80000000000000FF800000
+00000000FF80000000000000FF80000000000000FF8000001FFFFFF07F8000001FFFFFF0
+7FC000001FFFFFF07FC00000000FFE007FC000000003FC003FC000000003FC003FC00000
+0003FC003FE000000003FC001FE000000003FC001FE000000003FC000FF000000003FC00
+0FF000000003FC0007F800000003FC0007F800000003FC0003FC00000003FC0001FE0000
+0003FC0001FE00000003FC0000FF00000003FC00007F80000007FC00003FC0000007FC00
+001FE000000FFC000007F800001CFC000003FC0000387C000000FF0000F03C0000007FF0
+07E01C0000001FFFFF800C00000003FFFE0000000000003FF00000003C427BBF47>I<FF
+FFFFC01FFFFFF8FFFFFFC01FFFFFF8FFFFFFC01FFFFFF800FFC000001FF800007F800000
+0FF000007F8000000FF000007F8000000FF000007F8000000FF000007F8000000FF00000
+7F8000000FF000007F8000000FF000007F8000000FF000007F8000000FF000007F800000
+0FF000007F8000000FF000007F8000000FF000007F8000000FF000007F8000000FF00000
+7F8000000FF000007F8000000FF000007F8000000FF000007F8000000FF000007F800000
+0FF000007F8000000FF000007F8000000FF000007F8000000FF000007F8000000FF00000
+7F8000000FF000007FFFFFFFFFF000007FFFFFFFFFF000007FFFFFFFFFF000007F800000
+0FF000007F8000000FF000007F8000000FF000007F8000000FF000007F8000000FF00000
+7F8000000FF000007F8000000FF000007F8000000FF000007F8000000FF000007F800000
+0FF000007F8000000FF000007F8000000FF000007F8000000FF000007F8000000FF00000
+7F8000000FF000007F8000000FF000007F8000000FF000007F8000000FF000007F800000
+0FF000007F8000000FF000007F8000000FF000007F8000000FF000007F8000000FF00000
+7F8000000FF000007F8000000FF000007F8000000FF000007F8000000FF00000FFC00000
+1FF800FFFFFFC01FFFFFF8FFFFFFC01FFFFFF8FFFFFFC01FFFFFF83D3E7DBD44>I<FFFF
+FFC0FFFFFFC0FFFFFFC001FFE000007F8000007F8000007F8000007F8000007F8000007F
+8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F
+8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F
+8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F
+8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F
+8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F
+8000007F8000007F8000007F800001FFE000FFFFFFC0FFFFFFC0FFFFFFC01A3E7DBD21>
+I<FFFFFFF00000FFFFFFF00000FFFFFFF0000000FFE0000000007F80000000007F800000
+00007F80000000007F80000000007F80000000007F80000000007F80000000007F800000
+00007F80000000007F80000000007F80000000007F80000000007F80000000007F800000
+00007F80000000007F80000000007F80000000007F80000000007F80000000007F800000
+00007F80000000007F80000000007F80000000007F80000000007F80000000007F800000
+00007F80000000007F80000000007F80000000007F80000000007F80000000007F800000
+00007F80000000007F80000000007F80000003007F80000003007F80000003007F800000
+03007F80000003007F80000007007F80000006007F80000006007F80000006007F800000
+06007F8000000E007F8000000E007F8000000E007F8000001E007F8000001E007F800000
+3E007F8000007E007F800000FE007F800001FC007F800007FC00FFC0003FFCFFFFFFFFFF
+FCFFFFFFFFFFFCFFFFFFFFFFFC303E7DBD38>76 D<FFFF80000000001FFFF0FFFFC00000
+00003FFFF0FFFFC0000000003FFFF000FFC0000000003FF000006FE0000000006FE00000
+6FE0000000006FE0000067F000000000CFE0000067F000000000CFE0000067F000000000
+CFE0000063F8000000018FE0000063F8000000018FE0000061FC000000030FE0000061FC
+000000030FE0000061FC000000030FE0000060FE000000060FE0000060FE000000060FE0
+0000607F0000000C0FE00000607F0000000C0FE00000607F0000000C0FE00000603F8000
+00180FE00000603F800000180FE00000603F800000180FE00000601FC00000300FE00000
+601FC00000300FE00000600FE00000600FE00000600FE00000600FE00000600FE0000060
+0FE000006007F00000C00FE000006007F00000C00FE000006003F80001800FE000006003
+F80001800FE000006003F80001800FE000006001FC0003000FE000006001FC0003000FE0
+00006000FE0006000FE000006000FE0006000FE000006000FE0006000FE0000060007F00
+0C000FE0000060007F000C000FE0000060003F8018000FE0000060003F8018000FE00000
+60003F8018000FE0000060001FC030000FE0000060001FC030000FE0000060000FE06000
+0FE0000060000FE060000FE0000060000FE060000FE00000600007F0C0000FE000006000
+07F0C0000FE00000600003F980000FE00000600003F980000FE00000600003F980000FE0
+0000600001FF00000FE00000600001FF00000FE00000600000FE00000FE00000600000FE
+00000FE00000F00000FE00000FE00001F800007C00000FE00007FE00007C00001FF000FF
+FFF00038001FFFFFF0FFFFF00038001FFFFFF0FFFFF00038001FFFFFF04C3E7DBD53>I<
+FFFF8000007FFFF8FFFFC000007FFFF8FFFFE000007FFFF8007FE0000003FF00007FF000
+0000FC00006FF80000007800006FFC00000030000067FC00000030000063FE0000003000
+0063FF00000030000061FF00000030000060FF800000300000607FC00000300000607FC0
+0000300000603FE00000300000601FF00000300000601FF00000300000600FF800003000
+006007FC00003000006007FC00003000006003FE00003000006001FF00003000006001FF
+00003000006000FF800030000060007FC00030000060007FE00030000060003FE0003000
+0060001FF00030000060001FF80030000060000FF800300000600007FC00300000600007
+FE00300000600003FE00300000600001FF00300000600000FF80300000600000FF803000
+006000007FC03000006000003FE03000006000003FE03000006000001FF0300000600000
+0FF83000006000000FF830000060000007FC30000060000003FE30000060000003FE3000
+0060000001FF30000060000000FFB0000060000000FFF00000600000007FF00000600000
+003FF00000600000003FF00000600000001FF00000600000000FF000006000000007F000
+006000000007F000006000000003F00000F000000001F00001F800000001F00007FE0000
+0000F000FFFFF00000007000FFFFF00000007000FFFFF000000030003D3E7DBD44>I<00
+0000FFE0000000000007FFFC00000000003FC07F8000000000FE000FE000000001F80003
+F000000007E00000FC0000000FC000007E0000001F8000003F0000003F0000001F800000
+7E0000000FC00000FE0000000FE00001FC00000007F00003F800000003F80003F8000000
+03F80007F000000001FC0007F000000001FC000FE000000000FE001FE000000000FF001F
+E000000000FF001FC0000000007F003FC0000000007F803FC0000000007F803FC0000000
+007F807FC0000000007FC07F80000000003FC07F80000000003FC07F80000000003FC0FF
+80000000003FE0FF80000000003FE0FF80000000003FE0FF80000000003FE0FF80000000
+003FE0FF80000000003FE0FF80000000003FE0FF80000000003FE0FF80000000003FE0FF
+80000000003FE0FF80000000003FE0FF80000000003FE07F80000000003FC07FC0000000
+007FC07FC0000000007FC07FC0000000007FC07FC0000000007FC03FC0000000007F803F
+E000000000FF801FE000000000FF001FE000000000FF001FE000000000FF000FF0000000
+01FE000FF000000001FE0007F800000003FC0003F800000003F80003FC00000007F80001
+FC00000007F00000FE0000000FE000007F0000001FC000003F8000003F8000001F800000
+3F0000000FE00000FE00000007F00001FC00000001F80003F000000000FE000FE0000000
+003FC07F800000000007FFFC000000000000FFE00000003B427BBF46>I<FFFFFFFFF000
+00FFFFFFFFFF0000FFFFFFFFFFC00000FFC0003FF000007F800007F800007F800001FE00
+007F800000FF00007F8000007F00007F8000007F80007F8000003FC0007F8000003FC000
+7F8000001FE0007F8000001FE0007F8000001FF0007F8000001FF0007F8000001FF0007F
+8000001FF0007F8000001FF0007F8000001FF0007F8000001FF0007F8000001FF0007F80
+00001FE0007F8000001FE0007F8000003FC0007F8000003FC0007F8000007F80007F8000
+007F00007F800000FE00007F800003FC00007F800007F800007F80003FE000007FFFFFFF
+8000007FFFFFFC0000007F8000000000007F8000000000007F8000000000007F80000000
+00007F8000000000007F8000000000007F8000000000007F8000000000007F8000000000
+007F8000000000007F8000000000007F8000000000007F8000000000007F800000000000
+7F8000000000007F8000000000007F8000000000007F8000000000007F8000000000007F
+8000000000007F8000000000007F8000000000007F8000000000007F8000000000007F80
+0000000000FFC000000000FFFFFFC0000000FFFFFFC0000000FFFFFFC0000000343E7DBD
+3D>I<FFFFFFFFC0000000FFFFFFFFFC000000FFFFFFFFFF80000000FFC0007FE0000000
+7F80000FF00000007F800003FC0000007F800001FE0000007F800000FF0000007F800000
+7F8000007F8000003FC000007F8000003FC000007F8000003FE000007F8000001FE00000
+7F8000001FF000007F8000001FF000007F8000001FF000007F8000001FF000007F800000
+1FF000007F8000001FF000007F8000001FF000007F8000001FE000007F8000003FE00000
+7F8000003FC000007F8000003F8000007F8000007F8000007F800000FF0000007F800001
+FC0000007F800003F80000007F80000FE00000007F8000FF800000007FFFFFFC00000000
+7FFFFFF8000000007F8000FF000000007F80003FC00000007F80000FE00000007F800007
+F00000007F800003F80000007F800003FC0000007F800001FE0000007F800001FE000000
+7F800000FF0000007F800000FF0000007F800000FF0000007F800000FF0000007F800000
+FF0000007F800000FF0000007F800000FF8000007F800000FF8000007F800000FF800000
+7F800000FF8000007F800000FF8000007F800000FF8000007F800000FF8000007F800000
+FF8006007F800000FFC006007F8000007FC006007F8000007FC006007F8000007FC00E00
+FFC000003FE00CFFFFFFC0001FE01CFFFFFFC0000FF038FFFFFFC00007F8700000000000
+01FFE00000000000003F803F407DBD43>82 D<0007FC0018003FFF803800FFFFE03801FC
+03F87803F0007C7807C0001EF80F80000FF81F000007F83F000003F83E000001F87E0000
+00F87E000000F87C00000078FC00000078FC00000078FC00000038FC00000038FC000000
+38FE00000018FE00000018FF00000018FF000000187F800000007FC00000007FE0000000
+3FF80000003FFF0000001FFFF000000FFFFF00000FFFFFF00007FFFFFC0001FFFFFE0000
+FFFFFF80003FFFFFC00007FFFFE000007FFFE0000007FFF00000007FF80000001FF80000
+000FFC00000007FC00000003FC00000001FE00000001FEC0000000FEC0000000FEC00000
+00FEC00000007EC00000007EE00000007EE00000007EE00000007EE00000007CF0000000
+7CF0000000FCF8000000F8FC000001F8FE000001F0FF000003F0FF800007E0FBE0000FC0
+F1F8001F80F07F007F00E01FFFFC00E007FFF000C0007FC00027427BBF32>I<3FFFFFFF
+FFFFFF003FFFFFFFFFFFFF003FFFFFFFFFFFFF003FE000FFC001FF003F00007F80003F00
+7E00007F80001F807C00007F80000F807800007F800007807000007F800003807000007F
+800003807000007F800003806000007F800001806000007F800001806000007F80000180
+6000007F800001806000007F80000180C000007F800000C0C000007F800000C0C000007F
+800000C0C000007F800000C0C000007F800000C00000007F800000000000007F80000000
+0000007F800000000000007F800000000000007F800000000000007F800000000000007F
+800000000000007F800000000000007F800000000000007F800000000000007F80000000
+0000007F800000000000007F800000000000007F800000000000007F800000000000007F
+800000000000007F800000000000007F800000000000007F800000000000007F80000000
+0000007F800000000000007F800000000000007F800000000000007F800000000000007F
+800000000000007F800000000000007F800000000000007F800000000000007F80000000
+0000007F800000000000007F800000000000007F800000000000007F800000000000007F
+800000000000007F800000000000007F80000000000000FFC0000000000001FFE0000000
+0007FFFFFFF800000007FFFFFFF800000007FFFFFFF800003A3E7DBD41>I<FFFFFFC000
+7FFFF8FFFFFFC0007FFFF8FFFFFFC0007FFFF800FFC0000003FF00007F80000000FC0000
+7F800000007800007F800000003000007F800000003000007F800000003000007F800000
+003000007F800000003000007F800000003000007F800000003000007F80000000300000
+7F800000003000007F800000003000007F800000003000007F800000003000007F800000
+003000007F800000003000007F800000003000007F800000003000007F80000000300000
+7F800000003000007F800000003000007F800000003000007F800000003000007F800000
+003000007F800000003000007F800000003000007F800000003000007F80000000300000
+7F800000003000007F800000003000007F800000003000007F800000003000007F800000
+003000007F800000003000007F800000003000007F800000003000007F80000000300000
+7F800000003000007F800000003000007F800000003000007F800000003000007F800000
+003000003F800000007000003FC00000006000003FC00000006000003FC0000000E00000
+1FC0000000C000001FE0000001C000000FE0000001C000000FF000000380000007F00000
+0700000003F800000F00000001FC00000E00000000FE00003C000000007F000078000000
+003FC001F0000000000FF00FE00000000003FFFF800000000000FFFE0000000000001FF0
+0000003D407DBD44>I<FFFFFE000003FFFEFFFFFE000003FFFEFFFFFE000003FFFE03FF
+C00000007FE001FF800000001F8000FF000000001F0000FF800000000E00007F80000000
+0C00007F800000000C00007FC00000001C00003FC00000001800003FE00000001800001F
+E00000003000001FE00000003000001FF00000007000000FF00000006000000FF0000000
+60000007F8000000C0000007F8000000C0000007FC000000C0000003FC00000180000003
+FC00000180000003FE00000380000001FE00000300000001FF00000300000000FF000006
+00000000FF00000600000000FF80000E000000007F80000C000000007F80000C00000000
+3FC00018000000003FC00018000000003FE00018000000001FE00030000000001FE00030
+000000001FF00070000000000FF00060000000000FF800600000000007F800C000000000
+07F800C00000000007FC01C00000000003FC01800000000003FC01800000000001FE0300
+0000000001FE03000000000001FF03000000000000FF06000000000000FF060000000000
+00FF8E0000000000007F8C0000000000007FCC0000000000003FD80000000000003FD800
+00000000003FF80000000000001FF00000000000001FF00000000000000FE00000000000
+000FE00000000000000FE000000000000007C000000000000007C000000000000007C000
+0000000000038000000000000003800000003F407EBD44>I<7FFFFF8001FFFFE07FFFFF
+8001FFFFE07FFFFF8001FFFFE000FFFC00003FFC00003FF800001FE000001FF000000F80
+00001FF000000F0000000FF800000E00000007FC00000C00000007FC00001C00000003FE
+00003800000001FF00003000000001FF00006000000000FF8000E0000000007FC000C000
+0000007FC00180000000003FE00380000000001FF00300000000001FF00600000000000F
+F80E000000000007FC0C000000000007FC18000000000003FE38000000000001FF300000
+00000001FF60000000000000FFE00000000000007FC00000000000007FC0000000000000
+3FE00000000000001FF00000000000001FF00000000000000FF80000000000001FFC0000
+000000001FFC00000000000033FE00000000000071FF00000000000061FF000000000000
+C0FF800000000001C07FC00000000001807FC00000000003003FE00000000007001FF000
+00000006001FF0000000000C000FF8000000001C0007FC00000000380007FC0000000030
+0003FE00000000700001FF00000000E00001FF00000000C00000FF800000018000007FC0
+0000038000007FC00000030000003FE00000070000001FF000000E0000001FF000001E00
+00000FF800003E0000000FFC0000FF0000000FFE0007FFC000003FFF00FFFFF00001FFFF
+FEFFFFF00001FFFFFEFFFFF00001FFFFFE3F3E7EBD44>88 D<FFFFFF000000FFFF80FFFF
+FF000000FFFF80FFFFFF000000FFFF8001FFF00000003FF80000FFE00000000FC000007F
+E00000000F8000003FE00000000F0000003FF00000000E0000001FF00000000C0000000F
+F8000000180000000FFC0000003800000007FC0000003000000003FE0000007000000003
+FE0000006000000001FF000000C000000001FF800001C000000000FF8000018000000000
+7FC0000380000000007FE0000300000000003FE0000600000000001FF0000E0000000000
+1FF0000C00000000000FF8001C00000000000FFC0018000000000007FC00300000000000
+03FE0070000000000003FE0060000000000001FF00E0000000000000FF80C00000000000
+00FF81800000000000007FC3800000000000007FE3000000000000003FE7000000000000
+001FF6000000000000001FFC000000000000000FFC0000000000000007F8000000000000
+0007F80000000000000007F80000000000000007F80000000000000007F8000000000000
+0007F80000000000000007F80000000000000007F80000000000000007F8000000000000
+0007F80000000000000007F80000000000000007F80000000000000007F8000000000000
+0007F80000000000000007F80000000000000007F80000000000000007F8000000000000
+0007F80000000000000007F80000000000000007F80000000000000007F8000000000000
+0007F8000000000000000FFC0000000000000FFFFFFC00000000000FFFFFFC0000000000
+0FFFFFFC000000413E7FBD44>I<3FFFFFFFFFF03FFFFFFFFFF03FFFFFFFFFF03FFE0000
+3FE03FF000003FE03FC000007FC03F0000007FC03E000000FF803C000001FF003C000001
+FF0038000003FE0078000003FC0070000007FC007000000FF8007000000FF8007000001F
+F0006000003FE0006000003FE0006000007FC0006000007FC000600000FF8000000001FF
+0000000001FF0000000003FE0000000003FC0000000007FC000000000FF8000000000FF8
+000000001FF0000000003FE0000000003FE0000000007FC0000000007FC000000000FF80
+00000001FF0000000001FF0000000003FE0000000003FC0000000007FC000018000FF800
+0018000FF8000018001FF0000018003FE0000018003FE0000018007FC0000018007FC000
+003800FF8000003801FF0000003801FF0000003803FE0000003803FC0000007007FC0000
+00700FF8000000F00FF8000000F01FF0000001F03FE0000003F03FE000000FF07FC00000
+3FF07FC00001FFF0FFFFFFFFFFF0FFFFFFFFFFF0FFFFFFFFFFF02D3E7BBD37>I<FFFEFF
+FEFC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC
+00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC
+00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC
+00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC
+00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FFFEFFFE0F
+5B78C319>I<FFFEFFFE007E007E007E007E007E007E007E007E007E007E007E007E007E
+007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E
+007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E
+007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E
+007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E007E
+007E007EFFFEFFFE0F5B7FC319>93 D<001FF0000000FFFC000003E03F00000F000FC000
+1C0007E0001F0003F0003F8001F8003FC000FC003FC000FC003FC000FC003FC0007E001F
+80007E000F00007E000000007E000000007E000000007E000000007E0000001FFE000003
+FFFE00001FF87E00007F807E0001FC007E0007F0007E000FE0007E001FC0007E003F8000
+7E007F80007E007F00007E007F00007E03FE00007E03FE00007E03FE00007E03FE0000FE
+03FE0000FE03FE0001FE037F0001BE037F0003BE033F80071F061FC00E1F8E0FF03C0FFC
+03FFF007F8003FC003E0282A7CA82D>97 D<01F800000000FFF800000000FFF800000000
+FFF80000000007F80000000003F80000000001F80000000001F80000000001F800000000
+01F80000000001F80000000001F80000000001F80000000001F80000000001F800000000
+01F80000000001F80000000001F80000000001F80000000001F80000000001F800000000
+01F80000000001F80000000001F807F8000001F81FFF000001F8780FC00001F9E003F000
+01FB8001F80001FF0000FC0001FE00007E0001FC00003F0001FC00001F8001F800001F80
+01F800001FC001F800000FC001F800000FE001F800000FE001F8000007E001F8000007F0
+01F8000007F001F8000007F001F8000007F001F8000007F001F8000007F001F8000007F0
+01F8000007F001F8000007F001F8000007F001F8000007E001F800000FE001F800000FE0
+01F800000FE001F800000FC001F800001FC001F800001F8001FC00003F0001FE00003F00
+01F600007E0001F70000FC0001E38001F80001C1C003E00001C0F81F800001803FFE0000
+000007F000002C407EBE32>I<0001FF0000000FFFE000003F00F800007C001E0001F800
+070003F0001F0007E0003F800FC0007F800FC0007F801F80007F801F80007F803F00003F
+003F00001E007F000000007F000000007E00000000FE00000000FE00000000FE00000000
+FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE
+000000007F000000007F000000007F000000003F000000C03F800000C01F800001C01FC0
+0001800FC000038007E000070003F000060001F8001E0000FC003800003F01F000000FFF
+C0000001FE0000222A7DA828>I<00000001F800000000FFF800000000FFF800000000FF
+F80000000007F80000000003F80000000001F80000000001F80000000001F80000000001
+F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001
+F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001
+F80000000001F8000000FF01F8000007FFC1F800001F80F1F800007C0039F80001F8001D
+F80003F0000FF80007E00007F8000FC00003F8000FC00003F8001F800001F8003F800001
+F8003F000001F8007F000001F8007F000001F8007F000001F8007E000001F800FE000001
+F800FE000001F800FE000001F800FE000001F800FE000001F800FE000001F800FE000001
+F800FE000001F800FE000001F800FE000001F8007E000001F8007F000001F8007F000001
+F8003F000001F8003F800001F8001F800003F8001F800003F8000FC00007F80007E0000F
+F80003F0000DFC0001F8003DFE0000FC0071FFF0003F01E1FFF0000FFF81FFF00001FE01
+F8002C407DBE32>I<0003FC0000001FFF8000007E07E00000F801F00001F000F80003E0
+007C0007C0003E000FC0003F001F80001F001F80001F803F00001F803F00000F807F0000
+0F807F00000FC07E00000FC07E00000FC0FE00000FC0FE00000FC0FFFFFFFFC0FFFFFFFF
+C0FE00000000FE00000000FE00000000FE00000000FE00000000FE000000007E00000000
+7F000000007F000000007F000000003F000000C03F800000C01F800001C00FC00001800F
+C000038007E000070003F0000E0001F8001C0000FC003800003F01F000000FFFC0000001
+FE0000222A7DA828>I<00001FC00000FFF00003F0380007C0FC000F81FE001F81FE003F
+01FE003E01FE007E01FE007E00FC00FC000000FC000000FC000000FC000000FC000000FC
+000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC
+0000FFFFFF00FFFFFF00FFFFFF0000FC000000FC000000FC000000FC000000FC000000FC
+000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC
+000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC
+000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000001FE
+00007FFFFE007FFFFE007FFFFE001F407FBF1C>I<000000007E000003FC01FF00000FFF
+078780003E07CE0F8000FC03FC0F8001F801F80F8003F000FC070003E0007C000007E000
+7E000007E0007E00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC000
+3F00000FC0003F00000FC0003F00000FC0003F000007E0007E000007E0007E000003E000
+7C000003F000FC000001F801F8000001FC03F0000001BE07C00000038FFF0000000303FC
+000000070000000000070000000000070000000000070000000000078000000000078000
+00000007C00000000003E00000000003FFFFF0000001FFFFFE000001FFFFFF8000007FFF
+FFE00001FFFFFFF80007C0001FF8001F800003FC003F000000FE003E0000007E007C0000
+003E007C0000003F00F80000001F00F80000001F00F80000001F00F80000001F00F80000
+001F00FC0000003F007C0000003E007E0000007E003F000000FC001F800001F8000FC000
+03F00003F0000FC00000FE007F0000003FFFFC00000003FFC00000293D7EA82D>I<01F8
+00000000FFF800000000FFF800000000FFF80000000007F80000000003F80000000001F8
+0000000001F80000000001F80000000001F80000000001F80000000001F80000000001F8
+0000000001F80000000001F80000000001F80000000001F80000000001F80000000001F8
+0000000001F80000000001F80000000001F80000000001F80000000001F803FC000001F8
+0FFF800001F83C0FC00001F8F003E00001F9C003F00001FB8001F80001FB0001F80001FF
+0000FC0001FE0000FC0001FE0000FC0001FC0000FC0001FC0000FC0001F80000FC0001F8
+0000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F8
+0000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F8
+0000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F8
+0000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0003FC0001FE00FFFF
+F07FFFF8FFFFF07FFFF8FFFFF07FFFF82D3F7EBE32>I<01C00007F0000FF8000FF8000F
+F8000FF8000FF80007F00001C00000000000000000000000000000000000000000000000
+000000000000000000000000000001F8007FF8007FF8007FF80007F80003F80001F80001
+F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001
+F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001
+F80001F80001F80001F80001F80003FC00FFFFE0FFFFE0FFFFE0133D7EBC19>I<000070
+0001FC0003FE0003FE0003FE0003FE0003FE0001FC000070000000000000000000000000
+0000000000000000000000000000000000000000000000000000FE003FFE003FFE003FFE
+0001FE0000FE00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E
+00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E
+00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E00007E
+00007E00007E00007E00007E00007E00007E00007E00007E3C007E7E007CFF00FCFF00FC
+FF00F8FF01F8FE01F07803E03E07C00FFF0001FC00175084BC1C>I<01F800000000FFF8
+00000000FFF800000000FFF80000000007F80000000003F80000000001F80000000001F8
+0000000001F80000000001F80000000001F80000000001F80000000001F80000000001F8
+0000000001F80000000001F80000000001F80000000001F80000000001F80000000001F8
+0000000001F80000000001F80000000001F80000000001F80000000001F8007FFF8001F8
+007FFF8001F8007FFF8001F8001FFC0001F8000FE00001F8000F800001F8001F000001F8
+001C000001F80038000001F80070000001F800E0000001F803C0000001F80700000001F8
+0E00000001F81E00000001F83E00000001F87F00000001F9FF80000001FB9FC0000001FF
+0FC0000001FE07E0000001FC07F0000001F803F0000001F801F8000001F801FC000001F8
+00FE000001F8007E000001F8003F000001F8003F800001F8001F800001F8000FC00001F8
+000FE00001F80007F00001F80007F00001F80007F80003FC0007FE00FFFFF03FFFE0FFFF
+F03FFFE0FFFFF03FFFE02B3F7EBE30>I<01F800FFF800FFF800FFF80007F80003F80001
+F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001
+F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001
+F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001
+F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001
+F80001F80001F80001F80001F80003FC00FFFFF0FFFFF0FFFFF0143F7EBE19>I<01F803
+FC0001FE0000FFF80FFF8007FFC000FFF83C0FC01E07E000FFF8F003E07801F00007F9C0
+03F0E001F80003FB8001F9C000FC0001FB0001F98000FC0001FF0000FF80007E0001FE00
+00FF00007E0001FE0000FF00007E0001FC0000FE00007E0001FC0000FE00007E0001F800
+00FC00007E0001F80000FC00007E0001F80000FC00007E0001F80000FC00007E0001F800
+00FC00007E0001F80000FC00007E0001F80000FC00007E0001F80000FC00007E0001F800
+00FC00007E0001F80000FC00007E0001F80000FC00007E0001F80000FC00007E0001F800
+00FC00007E0001F80000FC00007E0001F80000FC00007E0001F80000FC00007E0001F800
+00FC00007E0001F80000FC00007E0001F80000FC00007E0001F80000FC00007E0001F800
+00FC00007E0001F80000FC00007E0001F80000FC00007E0001F80000FC00007E0003FC00
+01FE0000FF00FFFFF07FFFF83FFFFCFFFFF07FFFF83FFFFCFFFFF07FFFF83FFFFC46287E
+A74B>I<01F803FC0000FFF80FFF8000FFF83C0FC000FFF8F003E00007F9C003F00003FB
+8001F80001FB0001F80001FF0000FC0001FE0000FC0001FE0000FC0001FC0000FC0001FC
+0000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F8
+0000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F8
+0000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F8
+0000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F8
+0000FC0003FC0001FE00FFFFF07FFFF8FFFFF07FFFF8FFFFF07FFFF82D287EA732>I<00
+01FE0000000FFFC000003F03F000007C00F80001F0003E0003E0001F0007C0000F8007C0
+000F800F800007C01F800007E01F000003E03F000003F03F000003F07E000001F87E0000
+01F87E000001F87E000001F8FE000001FCFE000001FCFE000001FCFE000001FCFE000001
+FCFE000001FCFE000001FCFE000001FCFE000001FC7E000001F87E000001F87E000001F8
+7F000003F83F000003F03F000003F01F800007E00F800007C00FC0000FC007C0000F8003
+E0001F0001F0003E0000FC00FC00003F03F000000FFFC0000001FE0000262A7DA82D>I<
+01F807F80000FFF81FFF0000FFF8780FC000FFF9E003F00003FB8001F80001FF0000FC00
+01FE00007E0001FC00007F0001FC00003F8001F800001F8001F800001FC001F800001FC0
+01F800000FE001F800000FE001F800000FE001F800000FF001F8000007F001F8000007F0
+01F8000007F001F8000007F001F8000007F001F8000007F001F8000007F001F8000007F0
+01F8000007F001F800000FE001F800000FE001F800000FE001F800000FE001F800001FC0
+01F800001FC001F800003F8001FC00003F0001FE00007F0001FE0000FE0001FF0001FC00
+01FB8003F80001F9C007E00001F8F81F800001F83FFE000001F807F0000001F800000000
+01F80000000001F80000000001F80000000001F80000000001F80000000001F800000000
+01F80000000001F80000000001F80000000001F80000000001F80000000001F800000000
+03FC00000000FFFFF0000000FFFFF0000000FFFFF00000002C3A7EA732>I<0000FF000C
+000007FFC01C00001F80F01C00007E00381C0000FC001C3C0003F8000E3C0007F000077C
+0007E000037C000FC00003FC001FC00001FC003F800001FC003F800000FC007F000000FC
+007F000000FC007F000000FC007F000000FC00FE000000FC00FE000000FC00FE000000FC
+00FE000000FC00FE000000FC00FE000000FC00FE000000FC00FE000000FC00FE000000FC
+00FF000000FC007F000000FC007F000000FC007F000000FC003F800000FC003F800001FC
+001FC00001FC000FC00003FC000FE00003FC0007E00007FC0003F0000EFC0001F8001CFC
+00007E0078FC00003F01E0FC00000FFFC0FC000001FE00FC0000000000FC0000000000FC
+0000000000FC0000000000FC0000000000FC0000000000FC0000000000FC0000000000FC
+0000000000FC0000000000FC0000000000FC0000000000FC0000000000FC0000000001FE
+000000007FFFF80000007FFFF80000007FFFF82D3A7DA730>I<03F00FC0FFF03FF0FFF0
+F0F8FFF1C3FC07F183FC03F383FC01F703FC01F603FC01F601F801FE006001FC000001FC
+000001FC000001FC000001F8000001F8000001F8000001F8000001F8000001F8000001F8
+000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8
+000001F8000001F8000001F8000001F8000001F8000001F8000003FC0000FFFFF800FFFF
+F800FFFFF8001E287EA723>I<007FC06003FFF8E007C03DE01E000FE03C0003E0780001
+E0780001E0700000E0F00000E0F0000060F0000060F8000060F8000060FC000060FF0000
+007FC000007FFE00003FFFE0001FFFFC0007FFFE0003FFFF80007FFFC00007FFE000003F
+E000000FF0C00003F0C00001F8C00000F8E00000F8E0000078E0000078F0000078F00000
+78F8000078F80000F0FC0000F0FC0001E0FE0001C0F7800780F1E01F00E0FFFC00C01FE0
+001D2A7DA824>I<00180000001800000018000000180000001800000018000000380000
+003800000038000000380000007800000078000000F8000000F8000001F8000003F80000
+07F800001FFFFFC0FFFFFFC0FFFFFFC001F8000001F8000001F8000001F8000001F80000
+01F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F80000
+01F8000001F8000001F8000001F8000001F8000001F8000001F8006001F8006001F80060
+01F8006001F8006001F8006001F8006001F8006001F8006000FC00E000FC00C000FC00C0
+007E01C0003F0380001F87000007FE000001F8001B397EB723>I<01F80000FC00FFF800
+7FFC00FFF8007FFC00FFF8007FFC0007F80003FC0003F80001FC0001F80000FC0001F800
+00FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F800
+00FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F800
+00FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F80000FC0001F800
+00FC0001F80000FC0001F80000FC0001F80000FC0001F80001FC0001F80001FC0001F800
+01FC0001F80003FC0000F80003FC0000FC0007FC0000FC000EFE00007C001CFF00003E00
+38FFF8001F80F0FFF80007FFE0FFF80000FF00FC002D297EA732>I<FFFFC007FFE0FFFF
+C007FFE0FFFFC007FFE007FC0001FF0003F800007C0003F80000780001F80000700001FC
+0000700000FC0000600000FC00006000007E0000C000007E0000C000007F0001C000003F
+00018000003F00018000001F80030000001F80030000001FC0070000000FC0060000000F
+C00600000007E00C00000007E00C00000007F01C00000003F01800000003F01800000001
+F83000000001F83000000001FC7000000000FC6000000000FC60000000007EC000000000
+7EC0000000007FC0000000003F80000000003F80000000001F00000000001F0000000000
+1F00000000000E00000000000E0000002B287EA630>I<FFFF87FFFC03FFF0FFFF87FFFC
+03FFF0FFFF87FFFC03FFF00FFC003FE0007FC007F0001FC0003F0003F0000F80001E0003
+F0000FC0001C0001F8000FC0001C0001F80007C000180001F80007E000180000FC000FE0
+00300000FC000FE000300000FE000FF0007000007E0019F0006000007E0019F000600000
+7F0019F800E000003F0030F800C000003F0030F800C000003F8030FC01C000001F80607C
+018000001F80607C018000000FC0E07E030000000FC0C03E030000000FC0C03E03000000
+07E1C03F0600000007E1801F0600000007E1801F8600000003F3801F8C00000003F3000F
+8C00000003F3000FCC00000001FE0007D800000001FE0007D800000001FE0007F8000000
+00FC0003F000000000FC0003F000000000FC0003F000000000780001E000000000780001
+E000000000780001E000000000300000C000003C287EA641>I<7FFFC00FFFE07FFFC00F
+FFE07FFFC00FFFE003FF0007FE0000FF0003F800007F0003E000003F0003C000003F8003
+8000001FC0070000000FC00E00000007E00C00000007F01800000003F83800000001F870
+00000000FCE000000000FEC0000000007F80000000003F80000000001F80000000000FC0
+000000000FE0000000001FE0000000003BF00000000071F800000000E1FC00000000C0FE
+00000001807E00000003803F00000007003F8000000E001FC000000C000FC000001C0007
+E00000380007F00000F80003F80001F80003FC000FFC0007FE00FFFF001FFFF8FFFF001F
+FFF8FFFF001FFFF82D277FA630>I<FFFFC007FFE0FFFFC007FFE0FFFFC007FFE007FC00
+01FF0003F800007C0001F80000780001F80000700001FC0000700000FC0000600000FE00
+006000007E0000C000007E0000C000003F00018000003F00018000003F80038000001F80
+030000001F80030000000FC0060000000FC0060000000FE00E00000007E00C00000007E0
+0C00000003F01800000003F01800000003F83800000001F83000000001FC3000000000FC
+6000000000FC60000000007EC0000000007EC0000000007FC0000000003F80000000003F
+80000000001F00000000001F00000000001F00000000000E00000000000E00000000000C
+00000000000C00000000001C000000000018000000000018000000000030000000000030
+0000000000600000003800600000007C00E0000000FE00C0000000FE01C0000000FE0180
+000000FE03000000007C0700000000700E00000000383C000000001FF80000000007E000
+0000002B3A7EA630>I<1FFFFFFF801FFFFFFF801FE0007F801F00007F001E0000FE001C
+0001FC001C0003FC00180003F800380007F00038000FE00030001FE00030001FC0003000
+3F800030007F000030007F00000000FE00000001FC00000003FC00000003F800000007F0
+0000000FE00000001FE00000001FC00180003F800180007F000180007F00018000FE0001
+8001FC00018003FC00038003F800038007F00003000FE00003001FE00007001FC0000F00
+3F80000F007F00003F00FF0001FF00FFFFFFFF00FFFFFFFF0021277EA628>I
+E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fg ectt1095 10.95 73
+/Fg 73 125 df<1F003F807FC0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FFE0FF
+E0FFE0FFE0FFE0FFE0FFE0FFE07FC07FC07FC07FC07FC07FC07FC07FC07FC07FC07FC07F
+C07FC07FC07FC07FC03F80000000000000000000000000000000001F003F807FC0FFE0FF
+E0FFE0FFE0FFE07FC03F801F000B396EB82F>33 D<3C000F007E001F80FF003FC0FF003F
+C0FF003FC0FF003FC0FF003FC0FF003FC0FF003FC0FF003FC0FF003FC07F003F807F003F
+807F003F807F003F807F003F807F003F807F003F807E001F807E001F807E001F807E001F
+807E001F807E001F807E001F807E001F803C000F001A1B76B82F>I<0007800780000FC0
+0FC0000FC00FC0000FC00FC0000FC00FC0000FC00FC0000FC00FC0000FC00FC0000FC00F
+C0000FC00FC0001FC01FC0001F801F80001F801F80001F801F80001F801F803FFFFFFFFC
+7FFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFE003F003F00003F003F0000
+7F007F00007E007E00007E007E00007E007E00007E007E00007E007E00007E007E00007E
+007E00007E007E00007E007E0000FE00FE0000FC00FC0000FC00FC007FFFFFFFFEFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFE3FFFFFFFFC01F801F80001F801F80001F801F8
+0003F803F80003F003F00003F003F00003F003F00003F003F00003F003F00003F003F000
+03F003F00003F003F00003F003F00001E001E00028387DB72F>I<07C00FF01FF83FFC3F
+FC3FFE3FFE3FFF1FFF0FFF07FF003F003F003F003F007F007E007E00FE00FC01FC03F803
+F80FF01FF03FE0FFC0FF80FF007C003800101F70B72F>39 D<00003C00007E0001FE0003
+FE0007FC000FF8001FE0003FC0007F8000FF0000FE0001FC0003F80003F80007F00007E0
+000FE0000FC0001FC0001F80001F80003F80003F00003F00007F00007E00007E00007E00
+00FE0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC00
+00FC0000FC0000FE00007E00007E00007E00007F00003F00003F00003F80001F80001F80
+001FC0000FC0000FE00007E00007F00003F80003F80001FC0000FE0000FF00007F80003F
+C0001FE0000FF80007FC0003FE0001FE00007E00003C174771BE2F>I<780000FC0000FF
+0000FF80007FC0003FE0000FF00007F80003FC0001FE0000FE00007F00003F80003F8000
+1FC0000FC0000FE00007E00007F00003F00003F00003F80001F80001F80001FC0000FC00
+00FC0000FC0000FE00007E00007E00007E00007E00007E00007E00007E00007E00007E00
+007E00007E00007E00007E0000FE0000FC0000FC0000FC0001FC0001F80001F80003F800
+03F00003F00007F00007E0000FE0000FC0001FC0003F80003F80007F0000FE0001FE0003
+FC0007F8000FF0003FE0007FC000FF8000FF0000FC0000780000174778BE2F>I<0001E0
+00000003F000000003F000000003F000000003F000000003F000000003F000000003F000
+003003F003007C03F00F80FE03F01FC0FF83F07FC0FFE3F1FFC07FF3F3FF801FFFFFFE00
+0FFFFFFC0003FFFFF00000FFFFC000003FFF0000000FFC0000003FFF000000FFFFC00003
+FFFFF0000FFFFFFC001FFFFFFE007FF3F3FF80FFE3F1FFC0FF83F07FC0FE03F01FC07C03
+F00F803003F003000003F000000003F000000003F000000003F000000003F000000003F0
+00000003F000000001E0000022277AAE2F>I<07C00FF01FF83FF83FFC3FFC3FFE3FFE1F
+FE0FFE07FE007E00FE00FC01FC01FC03F80FF03FF0FFE0FFC0FF807E0038000F18708A2F
+>44 D<7FFFFFF8FFFFFFFCFFFFFFFCFFFFFFFCFFFFFFFC7FFFFFF81E0678962F>I<1F00
+3F807FC0FFE0FFE0FFE0FFE0FFE07FC03F801F000B0B6E8A2F>I<00000000E000000001
+F000000003F000000003F000000007F000000007E00000000FE00000000FC00000001FC0
+0000001F800000003F800000003F000000007F000000007E00000000FE00000000FC0000
+0000FC00000001FC00000001F800000003F800000003F000000007F000000007E0000000
+0FE00000000FC00000001FC00000001F800000003F800000003F000000003F000000007F
+000000007E00000000FE00000000FC00000001FC00000001F800000003F800000003F000
+000007F000000007E00000000FE00000000FC00000000FC00000001FC00000001F800000
+003F800000003F000000007F000000007E00000000FE00000000FC00000001FC00000001
+F800000003F800000003F000000003F000000007F000000007E00000000FE00000000FC0
+0000001FC00000001F800000003F800000003F000000007F000000007E00000000FE0000
+0000FC00000000FC00000000F800000000780000000024477BBE2F>I<0001FE00000007
+FF8000001FFFE000003FFFF000007FFFF80000FFFFFC0001FF03FE0003FC00FF0003F800
+7F0007F0003F800FE0001FC00FC0000FC01FC0000FE01F800007E01F800007E03F000003
+F03F000003F03F000003F07E000001F87E000001F87E000001F87E000001F8FC000000FC
+FC000000FCFC000000FCFC000000FCFC000000FCFC000000FCFC000000FCFC000000FCFC
+000000FCFC000000FCFC000000FCFC000000FCFC000000FCFE000001FC7E000001F87E00
+0001F87E000001F87F000003F83F000003F03F000003F03F800007F01F800007E01FC000
+0FE01FC0000FE00FE0001FC00FE0001FC007F0003F8003F8007F0003FC00FF0001FF03FE
+0000FFFFFC00007FFFF800003FFFF000001FFFE0000007FF80000001FE0000263A7CB82F
+>I<000380000007C0000007C000000FC000000FC000001FC000003FC000003FC000007F
+C00001FFC00003FFC0007FFFC000FFFFC000FFFFC000FFCFC000FF8FC0007E0FC000000F
+C000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000F
+C000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000F
+C000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000F
+C000000FC000000FC000000FC000000FC000000FC000000FC0003FFFFFF87FFFFFF87FFF
+FFFC7FFFFFFC7FFFFFF87FFFFFF81E3977B82F>I<000FFC0000003FFF800000FFFFE000
+03FFFFF80007FFFFFC000FFFFFFE001FF80FFF003FE001FF803F80007F807F00003FC07E
+00001FC07E00000FE0FE000007E0FE000007F0FF000007F0FF000003F0FF000003F0FF00
+0003F07E000003F018000003F000000003F000000003F000000007F000000007E0000000
+0FE00000000FC00000001FC00000001FC00000003F800000007F00000000FF00000001FE
+00000003FC00000007F80000000FF00000001FE00000003FC00000007F80000000FF0000
+0001FE00000007FC0000000FF80000001FF00000003FE00000007F80000000FF00000001
+FE00000003FC0001E00FF80003F01FF00003F03FE00003F07FFFFFFFF0FFFFFFFFF0FFFF
+FFFFF0FFFFFFFFF0FFFFFFFFF07FFFFFFFE024397BB82F>I<0007FF0000003FFFE00001
+FFFFF80003FFFFFE0007FFFFFF000FFFFFFF801FFC01FFC01FE0003FC03F80001FE03FC0
+0007E03FC00007F03FC00003F03FC00003F01F800003F00F000003F000000003F0000000
+07F000000007E00000000FE00000000FE00000001FC00000007FC0000000FF8000000FFF
+00000FFFFE00001FFFFC00001FFFF800001FFFF800001FFFFE00000FFFFF00000001FF80
+0000003FC00000001FE000000007F000000003F000000003F800000001F800000001FC00
+000000FC00000000FC18000000FC7E000000FCFF000000FCFF000000FCFF000001FCFF00
+0001F8FE000003F8FE000003F87F000007F07F80001FE03FE0003FE01FFE01FFC00FFFFF
+FF8007FFFFFF0003FFFFFE0000FFFFF800003FFFE0000003FF0000263A7CB82F>I<0000
+07F80000000FFC0000000FFC0000001FFC0000003FFC0000003F7C0000007F7C0000007E
+7C000000FE7C000001FC7C000001F87C000003F87C000003F07C000007F07C00000FE07C
+00000FC07C00001FC07C00001F807C00003F807C00007F007C00007E007C0000FE007C00
+00FC007C0001F8007C0003F8007C0003F0007C0007F0007C0007E0007C000FC0007C001F
+C0007C001F80007C003F80007C003F00007C007E00007C00FE00007C00FFFFFFFFFEFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFE0000007C000000007C00000000
+7C000000007C000000007C000000007C000000007C000000007C000000007C000000007C
+0000007FFFFC0000FFFFFE0000FFFFFE0000FFFFFE0000FFFFFE00007FFFFC28397DB82F
+>I<00001FE0000000FFFC000003FFFF00000FFFFF80001FFFFF80003FFFFFC0007FF03F
+C000FF800FE001FE001FE003FC001FE007F8001FE007F0001FE00FE0000FC00FC0000780
+1FC00000001F800000003F800000003F000000007F000000007F000000007E001000007E
+07FF80007E1FFFE000FE7FFFF800FCFFFFFC00FDFFFFFE00FFFFFFFF00FFFC01FF00FFF0
+007F80FFC0003FC0FF80001FC0FF00000FE0FF00000FE0FE000007E0FE000007F0FE0000
+03F0FE000003F0FE000003F07E000003F07E000003F07E000003F07E000003F07F000003
+F03F000007F03F000007E03F800007E01F80000FE01FC0001FC00FE0003FC00FF0007F80
+07F800FF0003FE03FF0003FFFFFE0001FFFFFC0000FFFFF800003FFFE000000FFF800000
+03FE0000243A7BB82F>54 D<7800000000FFFFFFFFF8FFFFFFFFFCFFFFFFFFFCFFFFFFFF
+FCFFFFFFFFFCFFFFFFFFF8FC000007F0FC00000FE0FC00001FC07800003F800000003F80
+0000007F00000000FE00000001FC00000001F800000003F800000007F000000007E00000
+000FE00000000FC00000001FC00000001F800000003F800000003F000000007F00000000
+7E00000000FE00000000FC00000000FC00000001FC00000001F800000001F800000003F0
+00000003F000000003F000000007F000000007E000000007E000000007E00000000FE000
+00000FC00000000FC00000000FC00000000FC00000000FC00000001FC00000001F800000
+001F800000001F800000001F800000001F800000001F800000001F800000001F80000000
+1F800000001F800000000F000000263A7CB82F>I<0003FF0000001FFFE000007FFFF800
+01FFFFFE0003FFFFFF0007FFFFFF800FFE01FFC01FF0003FE01FE0001FE03F800007F03F
+800007F07F000003F87E000001F87E000001F87E000001F87E000001F87E000001F87F00
+0003F83F000003F03F800007F01FC0000FE00FE0001FC00FF8007FC003FF03FF0001FFFF
+FE00007FFFF800001FFFE000003FFFF00000FFFFFC0003FFFFFF0007FC00FF800FF0003F
+C01FC0000FE03F800007F03F000003F07F000003F87E000001F8FE000001FCFC000000FC
+FC000000FCFC000000FCFC000000FCFC000000FCFC000000FCFE000001FC7E000001F87F
+000003F87F800007F83FC0000FF01FE0001FE01FF0003FE00FFE01FFC007FFFFFF8003FF
+FFFF0001FFFFFE00007FFFF800001FFFE0000003FF0000263A7CB82F>I<1F003F807FC0
+FFE0FFE0FFE0FFE0FFE07FC03F801F000000000000000000000000000000000000000000
+00000000000000000000000000001F003F807FC0FFE0FFE0FFE0FFE0FFE07FC03F801F00
+0B276EA62F>58 D<07C00FE01FF03FF83FF83FF83FF83FF81FF00FE007C0000000000000
+0000000000000000000000000000000000000000000000000000000007C00FF01FF83FF8
+3FFC3FFC3FFE3FFE1FFE0FFE07FE007E00FE00FC01FC01FC03F80FF03FF0FFE0FFC0FF80
+7E0038000F3470A62F>I<000000004000000001E000000007F00000000FF00000003FF0
+0000007FE0000001FFC0000003FF0000000FFE0000001FF80000007FF0000000FFC00000
+03FF80000007FE0000001FFC0000003FF0000000FFE0000001FF80000007FF0000000FFC
+0000003FF80000007FE0000000FFC0000000FF00000000FFC00000007FE00000003FF800
+00000FFC00000007FF00000001FF80000000FFE00000003FF00000001FFC00000007FE00
+000003FF80000000FFC00000007FF00000001FF80000000FFE00000003FF00000001FFC0
+0000007FE00000003FF00000000FF000000007F000000001E00000000040242F7BB22F>
+I<3FFFFFFFFC7FFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFE0000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+000000007FFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFE3FFFFFFFFC2815
+7DA52F>I<30000000007800000000FE00000000FF00000000FFC00000007FE00000003F
+F80000000FFC00000007FF00000001FF80000000FFE00000003FF00000001FFC00000007
+FE00000003FF80000000FFC00000007FF00000001FF80000000FFE00000003FF00000001
+FFC00000007FE00000003FF00000000FF00000003FF00000007FE0000001FFC0000003FF
+0000000FFE0000001FF80000007FF0000000FFC0000003FF80000007FE0000001FFC0000
+003FF0000000FFE0000001FF80000007FF0000000FFC0000003FF80000007FE0000000FF
+C0000000FF00000000FE0000000078000000003000000000242F7BB22F>I<001FFF0000
+00FFFFF00003FFFFFC000FFFFFFF001FFFFFFF803FFFFFFFC07FF001FFC07F80003FE0FE
+00000FE0FE000007F0FF000003F0FF000003F0FF000003F07E000007F07E00000FE00000
+001FE00000007FC0000001FFC0000003FF8000000FFF0000001FFC0000003FF00000007F
+E00000007F80000000FF00000001FE00000001FE00000003FC00000003F800000003F800
+000007F800000007F000000007F000000007F000000007F000000007F000000007F00000
+0007F000000003F000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000001C000000007F000000007F00000000F
+F80000000FF80000000FF800000007F000000007F000000001C0000024397BB82F>I<00
+003F00000000007F80000000007F8000000000FFC000000000FFC000000000FFC0000000
+00FFC000000001F3E000000001F3E000000001F3E000000001F3E000000001F3E0000000
+03F3F000000003F3F000000003F3F000000003E1F000000007E1F800000007E1F8000000
+07E1F800000007E1F800000007C0F80000000FC0FC0000000FC0FC0000000FC0FC000000
+0FC0FC0000001F807E0000001F807E0000001F807E0000001F807E0000003F807F000000
+3F003F0000003F003F0000003F003F0000003F003F0000007E001F8000007E001F800000
+7FFFFF8000007FFFFF800000FFFFFFC00000FFFFFFC00000FFFFFFC00000FFFFFFC00000
+FC000FC00001F80007E00001F80007E00001F80007E00001F80007E00003F80007F00003
+F00003F00003F00003F00003F00003F0007FFF003FFF807FFF003FFF80FFFF807FFFC0FF
+FF807FFFC07FFF003FFF807FFF003FFF802A397EB82F>65 D<7FFFFFE000FFFFFFFC00FF
+FFFFFF00FFFFFFFF80FFFFFFFFC07FFFFFFFE003F0001FF003F0000FF003F00003F803F0
+0003F803F00001F803F00001FC03F00000FC03F00000FC03F00000FC03F00000FC03F000
+00FC03F00001FC03F00001F803F00003F803F00003F003F00007F003F0001FE003F0007F
+C003FFFFFF8003FFFFFF0003FFFFFC0003FFFFFF0003FFFFFFC003FFFFFFE003F0000FF0
+03F00003F803F00001FC03F00000FC03F00000FE03F000007E03F000007E03F000003F03
+F000003F03F000003F03F000003F03F000003F03F000003F03F000007F03F000007E03F0
+0000FE03F00000FE03F00001FC03F00007FC03F0001FF87FFFFFFFF8FFFFFFFFF0FFFFFF
+FFE0FFFFFFFF80FFFFFFFF007FFFFFF80028387EB72F>I<00007F80380003FFE07C000F
+FFF8FC001FFFFCFC003FFFFFFC007FFFFFFC00FFC0FFFC01FF003FFC03FE000FFC07F800
+0FFC07F00007FC0FE00003FC0FE00003FC1FC00001FC1F800001FC3F800001FC3F000000
+FC3F000000FC7F000000FC7E000000FC7E000000787E00000000FE00000000FC00000000
+FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC
+00000000FC00000000FC00000000FC00000000FE000000007E000000007E000000007E00
+0000787F000000FC3F000000FC3F000000FC3F800000FC1F800000FC1FC00001FC0FE000
+01F80FF00003F807F00003F807F80007F003FE000FF001FF001FE000FFC07FC0007FFFFF
+80003FFFFF00001FFFFE00000FFFFC000003FFF00000007F8000263A7CB82F>I<7FFFFF
+800000FFFFFFF00000FFFFFFFC0000FFFFFFFE0000FFFFFFFF00007FFFFFFF800007E001
+FFC00007E0003FE00007E0001FE00007E0000FF00007E00007F80007E00003F80007E000
+01FC0007E00001FC0007E00000FE0007E00000FE0007E000007E0007E000007F0007E000
+003F0007E000003F0007E000003F0007E000003F0007E000003F8007E000001F8007E000
+001F8007E000001F8007E000001F8007E000001F8007E000001F8007E000001F8007E000
+001F8007E000001F8007E000001F8007E000001F8007E000003F8007E000003F0007E000
+003F0007E000003F0007E000007F0007E000007E0007E000007E0007E00000FE0007E000
+01FC0007E00001FC0007E00003F80007E00007F80007E0000FF00007E0001FF00007E000
+3FE00007E001FFC0007FFFFFFF8000FFFFFFFF0000FFFFFFFE0000FFFFFFFC0000FFFFFF
+F000007FFFFF80000029387EB72F>I<7FFFFFFFFC00FFFFFFFFFE00FFFFFFFFFE00FFFF
+FFFFFE00FFFFFFFFFE007FFFFFFFFE0003F000007E0003F000007E0003F000007E0003F0
+00007E0003F000007E0003F000007E0003F000007E0003F000003C0003F00000000003F0
+0000000003F00000000003F00000000003F00000000003F000F0000003F001F8000003F0
+01F8000003F001F8000003F001F8000003FFFFF8000003FFFFF8000003FFFFF8000003FF
+FFF8000003FFFFF8000003FFFFF8000003F001F8000003F001F8000003F001F8000003F0
+01F8000003F000F0000003F00000000003F00000000003F00000000003F00000000003F0
+0000000003F000000F0003F000001F8003F000001F8003F000001F8003F000001F8003F0
+00001F8003F000001F8003F000001F8003F000001F8003F000001F807FFFFFFFFF80FFFF
+FFFFFF80FFFFFFFFFF80FFFFFFFFFF80FFFFFFFFFF807FFFFFFFFF0029387DB72F>I<7F
+FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFF03F000003F03F0
+00003F03F000003F03F000003F03F000003F03F000003F03F000003F03F000001E03F000
+000003F000000003F000000003F000000003F000000003F000000003F000780003F000FC
+0003F000FC0003F000FC0003F000FC0003FFFFFC0003FFFFFC0003FFFFFC0003FFFFFC00
+03FFFFFC0003FFFFFC0003F000FC0003F000FC0003F000FC0003F000FC0003F000780003
+F000000003F000000003F000000003F000000003F000000003F000000003F000000003F0
+00000003F000000003F000000003F000000003F000000003F000000003F00000007FFFE0
+0000FFFFF00000FFFFF00000FFFFF00000FFFFF000007FFFE0000028387DB72F>I<7FFF
+807FFF807FFF807FFF80FFFFC0FFFFC0FFFFC0FFFFC07FFF807FFF807FFF807FFF8003F0
+0003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0
+0003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0
+0003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003FF
+FFFFF00003FFFFFFF00003FFFFFFF00003FFFFFFF00003FFFFFFF00003FFFFFFF00003F0
+0003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0
+0003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0
+0003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F0
+0003F00003F00003F0007FFF807FFF807FFF807FFF80FFFFC0FFFFC0FFFFC0FFFFC07FFF
+807FFF807FFF807FFF802A387EB72F>72 D<7FFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF7FFFFFFE0007E0000007E0000007E0000007E0000007E0000007E0000007E0000007
+E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007
+E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007
+E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007
+E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007E0000007
+E0007FFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFE203879B72F>I<7FFFF0
+00007FFFF80000FFFFF80000FFFFF800007FFFF800007FFFF0000001F800000001F80000
+0001F800000001F800000001F800000001F800000001F800000001F800000001F8000000
+01F800000001F800000001F800000001F800000001F800000001F800000001F800000001
+F800000001F800000001F800000001F800000001F800000001F800000001F800000001F8
+00000001F800000001F800000001F800000001F800000001F800000001F800000001F800
+000001F800000001F800000001F800000001F800001E01F800003F01F800003F01F80000
+3F01F800003F01F800003F01F800003F01F800003F01F800003F01F800003F7FFFFFFFFF
+7FFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFF7FFFFFFFFE28387DB72F>76
+D<7FF00000FFE07FF80001FFE0FFF80001FFF0FFFC0003FFF07FFC0003FFE07FFC0003FF
+E007DE0007BE0007DE0007BE0007DE0007BE0007DF000FBE0007CF000F3E0007CF000F3E
+0007CF801F3E0007CF801F3E0007C7801E3E0007C7801E3E0007C7C03E3E0007C7C03E3E
+0007C3C03C3E0007C3E07C3E0007C3E07C3E0007C1E0783E0007C1F0F83E0007C1F0F83E
+0007C1F0F83E0007C0F0F03E0007C0F9F03E0007C0F9F03E0007C079E03E0007C079E03E
+0007C079E03E0007C03FC03E0007C03FC03E0007C03FC03E0007C01F803E0007C01F803E
+0007C00F003E0007C000003E0007C000003E0007C000003E0007C000003E0007C000003E
+0007C000003E0007C000003E0007C000003E0007C000003E0007C000003E0007C000003E
+0007C000003E0007C000003E007FFC0003FFE07FFC0003FFE0FFFE0007FFF0FFFE0007FF
+F07FFC0003FFE07FFC0003FFE02C387FB72F>I<7FF8003FFF807FFC003FFF80FFFC007F
+FFC0FFFE007FFFC07FFE003FFF807FFE003FFF8003EF0001F00003EF0001F00003EF8001
+F00003E78001F00003E78001F00003E7C001F00003E3C001F00003E3C001F00003E3E001
+F00003E3E001F00003E1E001F00003E1F001F00003E1F001F00003E0F001F00003E0F801
+F00003E0F801F00003E07801F00003E07C01F00003E07C01F00003E03E01F00003E03E01
+F00003E03E01F00003E01F01F00003E01F01F00003E01F01F00003E00F81F00003E00F81
+F00003E00781F00003E007C1F00003E007C1F00003E003C1F00003E003E1F00003E003E1
+F00003E001E1F00003E001F1F00003E001F1F00003E000F1F00003E000F1F00003E000F9
+F00003E00079F00003E00079F00003E0007DF00003E0003DF00003E0003DF0007FFF001F
+F0007FFF001FF000FFFF801FF000FFFF800FF0007FFF000FF0007FFF0007E0002A387EB7
+2F>I<7FFFFFE000FFFFFFF800FFFFFFFE00FFFFFFFF80FFFFFFFFC07FFFFFFFE003F000
+7FF003F0001FF003F00007F803F00003F803F00001FC03F00001FC03F00000FC03F00000
+FE03F000007E03F000007E03F000007E03F000007E03F000007E03F000007E03F00000FE
+03F00000FC03F00001FC03F00001FC03F00003F803F00007F803F0001FF003F0007FF003
+FFFFFFE003FFFFFFC003FFFFFF8003FFFFFE0003FFFFF80003FFFFE00003F000000003F0
+00000003F000000003F000000003F000000003F000000003F000000003F000000003F000
+000003F000000003F000000003F000000003F000000003F000000003F000000003F00000
+007FFF800000FFFFC00000FFFFC00000FFFFC00000FFFFC000007FFF80000027387DB72F
+>80 D<7FFFFE0000007FFFFFC00000FFFFFFF00000FFFFFFFC00007FFFFFFE00007FFFFF
+FF000003F003FF800003F0007FC00003F0003FC00003F0001FE00003F0000FE00003F000
+07E00003F00007F00003F00003F00003F00003F00003F00003F00003F00003F00003F000
+03F00003F00007F00003F00007E00003F0000FE00003F0001FE00003F0003FC00003F000
+7FC00003F003FF800003FFFFFF000003FFFFFE000003FFFFFC000003FFFFF8000003FFFF
+FC000003FFFFFE000003F003FF000003F0007F800003F0003F800003F0001F800003F000
+1FC00003F0000FC00003F0000FC00003F0000FC00003F0000FC00003F0000FC00003F000
+0FC00003F0000FC00003F0000FC00003F0000FC00003F0000FC1E003F0000FC3F003F000
+0FC3F003F0000FC3F003F0000FE3F07FFF8007E7F07FFF8007FFE0FFFFC007FFE0FFFFC0
+03FFC07FFF8001FFC07FFF8000FF80000000003E002C397EB72F>82
+D<001FF80380007FFF07C001FFFFC7C003FFFFEFC007FFFFFFC00FFFFFFFC01FF80FFFC0
+3FC003FFC03F8000FFC07F00007FC07E00003FC0FE00003FC0FC00001FC0FC00001FC0FC
+00000FC0FC00000FC0FC00000FC0FC00000FC0FE000007807E000000007F000000003F80
+0000003FC00000001FF80000000FFF80000007FFF8000003FFFF800001FFFFE000007FFF
+F800000FFFFC000000FFFE0000000FFF00000000FF800000003FC00000001FC00000000F
+E000000007E000000007E000000007F078000003F0FC000003F0FC000003F0FC000003F0
+FC000003F0FC000003F0FE000007F0FE000007E0FF00000FE0FF80000FE0FFC0001FC0FF
+F0007FC0FFFE01FF80FFFFFFFF00FFFFFFFE00FDFFFFFC00F87FFFF800F81FFFE0007003
+FF0000243A7BB82F>I<7FFFFFFFFF80FFFFFFFFFFC0FFFFFFFFFFC0FFFFFFFFFFC0FFFF
+FFFFFFC0FFFFFFFFFFC0FC003F000FC0FC003F000FC0FC003F000FC0FC003F000FC0FC00
+3F000FC0FC003F000FC0FC003F000FC078003F00078000003F00000000003F0000000000
+3F00000000003F00000000003F00000000003F00000000003F00000000003F0000000000
+3F00000000003F00000000003F00000000003F00000000003F00000000003F0000000000
+3F00000000003F00000000003F00000000003F00000000003F00000000003F0000000000
+3F00000000003F00000000003F00000000003F00000000003F00000000003F0000000000
+3F00000000003F00000000003F00000000003F00000000003F00000000003F0000000000
+3F00000000003F00000000003F00000000003F000000001FFFFE0000003FFFFF0000003F
+FFFF0000003FFFFF0000003FFFFF0000001FFFFE00002A387EB72F>I<7FFF801FFFE0FF
+FFC03FFFF0FFFFC03FFFF0FFFFC03FFFF0FFFFC03FFFF07FFF801FFFE003F00000FC0003
+F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003
+F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003
+F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003
+F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003
+F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003F00000FC0003
+F00000FC0003F00000FC0003F00000FC0003F00000FC0003F80001FC0003F80001FC0001
+F80001F80001F80001F80001FC0003F80000FE0007F00000FE0007F000007F000FE00000
+7F801FE000003FE07FC000001FFFFF8000000FFFFF00000007FFFE00000003FFFC000000
+00FFF0000000003FC000002C397FB72F>I<3FFF00FFFC003FFF81FFFE007FFF81FFFE00
+7FFF81FFFE003FFF81FFFE003FFF00FFFC0001FC001F800000FE003F800000FE003F0000
+007F007F0000007F007E0000003F80FE0000003F80FC0000001FC1FC0000000FC1F80000
+000FE3F800000007E3F000000007F7F000000003F7E000000003FFE000000001FFC00000
+0001FFC000000000FF8000000000FF80000000007F00000000007F00000000007F000000
+00007F0000000000FF8000000000FF8000000001FFC000000001FFC000000003FFE00000
+0003F7E000000003F3F000000007E3F000000007E1F80000000FC1F80000000FC1FC0000
+001F80FC0000001F80FE0000003F007E0000003F007F0000007E003F0000007E003F8000
+00FE001F800000FC001FC00001FC000FC00001F8000FE00003F80007F0007FFE001FFF80
+7FFF003FFF80FFFF003FFFC0FFFF003FFFC07FFF003FFF807FFE001FFF802A387EB72F>
+88 D<7FFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFC0000FC0000FC0000FC0000FC0000
+FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000
+FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000
+FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000
+FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000
+FC0000FC0000FC0000FC0000FC0000FC0000FFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7FFFFE
+18476DBE2F>91 D<7FFFFEFFFFFFFFFFFFFFFFFFFFFFFF7FFFFF00003F00003F00003F00
+003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00
+003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00
+003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00
+003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00003F00
+003F00003F00003F00003F00003F00003F00003F00003F7FFFFFFFFFFFFFFFFFFFFFFFFF
+FFFF7FFFFE18477DBE2F>93 D<7FFFFFFFE07FFFFFFFE0FFFFFFFFF0FFFFFFFFF0FFFFFF
+FFF07FFFFFFFE07FFFFFFFE024077B7D2F>95 D<001C003E00FF01FF03FF07FC0FF80FF0
+1FC01FC03F803F007F007E007E00FE00FC00FC00FC00FC00FFE0FFF0FFF8FFFC7FFC7FFC
+3FFC3FFC1FF80FF003E0101F71BE2F>I<007FF000000003FFFE00000007FFFF8000000F
+FFFFC000001FFFFFE000003FFFFFF000003FC01FF800003FC003FC00003FC001FC00003F
+C000FE00001F80007E00000F00007F00000000003F00000000003F00000000003F000000
+00003F000000007FFF00000007FFFF0000003FFFFF000001FFFFFF000007FFFFFF00000F
+FFF83F00001FFE003F00003FF0003F00007FC0003F00007F00003F0000FE00003F0000FC
+00003F0000FC00003F0000FC00003F0000FC00003F0000FC00007F0000FE00007F00007F
+0000FF00007F8003FF80003FE01FFFFF003FFFFFFFFF801FFFFFFFFF800FFFFFDFFF8007
+FFFF0FFF8001FFFC01FF00007FE0000000292A7BA82F>I<7FF000000000FFF800000000
+FFF800000000FFF800000000FFF8000000007FF80000000001F80000000001F800000000
+01F80000000001F80000000001F80000000001F80000000001F80000000001F800000000
+01F80000000001F80000000001F80FF0000001F83FFC000001F8FFFF000001FBFFFFC000
+01FFFFFFE00001FFFFFFF00001FFF03FF00001FFC00FF80001FF8003FC0001FF0001FC00
+01FE0000FE0001FC0000FE0001FC00007F0001F800003F0001F800003F0001F800003F80
+01F800001F8001F800001F8001F800001F8001F800001F8001F800001F8001F800001F80
+01F800001F8001F800001F8001F800003F8001F800003F8001FC00003F0001FC00007F00
+01FC00007F0001FE0000FE0001FE0000FE0001FF0001FC0001FF8007FC0001FFC00FF800
+01FFF03FF00001FFFFFFE00001FFFFFFC00001FBFFFF800001F9FFFF000000F07FFC0000
+00001FE0000029397EB72F>I<0003FFC000000FFFF800003FFFFC0000FFFFFE0001FFFF
+FF0003FFFFFF8007FF007F800FF8007F800FF0007F801FE0007F801FC0003F003F80001E
+003F000000007F000000007E000000007E00000000FE00000000FC00000000FC00000000
+FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000FE000000007E
+000000007E000000007F000000007F000007803F80000FC03FC0000FC01FE0001FC01FF0
+001F800FFC007F8007FF81FF0003FFFFFF0001FFFFFE0000FFFFFC00003FFFF000000FFF
+C0000003FE0000222A79A82F>I<000003FF8000000007FFC000000007FFC000000007FF
+C000000007FFC000000003FFC0000000000FC0000000000FC0000000000FC0000000000F
+C0000000000FC0000000000FC0000000000FC0000000000FC0000000000FC0000000000F
+C0000003FC0FC000001FFF0FC000007FFFCFC00000FFFFEFC00001FFFFFFC00003FFFFFF
+C00007FE07FFC0000FF801FFC0001FF0007FC0001FC0003FC0003F80003FC0003F80001F
+C0007F00001FC0007F00000FC0007E00000FC000FE00000FC000FE00000FC000FC00000F
+C000FC00000FC000FC00000FC000FC00000FC000FC00000FC000FC00000FC000FC00000F
+C000FC00000FC000FE00000FC0007E00001FC0007E00001FC0007F00001FC0003F80003F
+C0003F80007FC0001FC0007FC0001FE000FFC0000FF801FFC00007FE07FFFF0007FFFFFF
+FF8003FFFFEFFF8001FFFFCFFF80007FFF8FFF80001FFE07FF000007F800000029397DB7
+2F>I<0003FE0000000FFF8000003FFFE00000FFFFF00001FFFFF80003FFFFFC0007FE07
+FE000FF800FF000FF0007F001FC0003F803FC0001F803F80001FC03F00000FC07F00000F
+C07E00000FC07E00000FE0FE000007E0FC000007E0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE0
+FFFFFFFFE0FFFFFFFFE0FFFFFFFFC0FC00000000FE000000007E000000007E000000007F
+000000003F800003C03F800007E01FC00007E01FE0000FE00FF8001FC007FE003FC007FF
+80FF8003FFFFFF8001FFFFFF00007FFFFC00003FFFF800000FFFE0000001FF0000232A7B
+A82F>I<000001FF00000007FFC000001FFFE000007FFFE00000FFFFF00000FFFFF00001
+FF0FF00003FC0FF00003F807E00007F001800007E000000007E000000007E000000007E0
+00000007E000000007E000000007E000000007E000007FFFFFFF80FFFFFFFFC0FFFFFFFF
+C0FFFFFFFFC0FFFFFFFFC07FFFFFFF800007E000000007E000000007E000000007E00000
+0007E000000007E000000007E000000007E000000007E000000007E000000007E0000000
+07E000000007E000000007E000000007E000000007E000000007E000000007E000000007
+E000000007E000000007E000000007E000000007E000000007E000000007E000000007E0
+00000007E000003FFFFFFC007FFFFFFE007FFFFFFE007FFFFFFE007FFFFFFE003FFFFFFC
+0024397DB82F>I<0003F801FE00001FFF07FF80007FFFDFFF8000FFFFFFFFC001FFFFFF
+FFC003FFFFFFFFC003FE0FFF0F8007F803FC07000FF001FE00000FE000FE00000FC0007E
+00001FC0007F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F
+00001F80003F00001FC0007F00000FC0007E00000FE000FE00000FF001FE000007F803FC
+000003FE0FF8000003FFFFF8000007FFFFF0000007FFFFE000000FFFFFC000000F9FFF00
+00000F83F80000000F80000000000F80000000000F80000000000FC00000000007E40000
+000007FFFFF0000003FFFFFF000007FFFFFFC0000FFFFFFFE0001FFFFFFFF0003FC0001F
+F8003F000001FC007E000000FE007C0000007E00FC0000003E00F80000003F00F8000000
+1F00F80000001F00F80000001F00F80000001F00FC0000003F007C0000003E007F000000
+FE003F800001FC003FE00007FC001FFE007FF8000FFFFFFFF00007FFFFFFE00001FFFFFF
+800000FFFFFF0000001FFFF800000003FFC000002A3E7DA72F>I<7FF000000000FFF800
+000000FFF800000000FFF800000000FFF8000000007FF80000000001F80000000001F800
+00000001F80000000001F80000000001F80000000001F80000000001F80000000001F800
+00000001F80000000001F80000000001F80FF0000001F83FFC000001F8FFFE000001FBFF
+FF000001FFFFFF800001FFFFFF800001FFF03FC00001FFC01FC00001FF800FE00001FF00
+0FE00001FE0007E00001FC0007E00001FC0007E00001FC0007E00001F80007E00001F800
+07E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F800
+07E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F800
+07E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F800
+07E0007FFFE07FFF80FFFFF0FFFFC0FFFFF0FFFFC0FFFFF0FFFFC0FFFFF0FFFFC07FFFE0
+7FFF802A387EB72F>I<0003800000000FE00000000FE00000001FF00000001FF0000000
+1FF00000000FE00000000FE0000000038000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000000000003FFFE000007FFFF0
+00007FFFF000007FFFF000007FFFF000003FFFF000000003F000000003F000000003F000
+000003F000000003F000000003F000000003F000000003F000000003F000000003F00000
+0003F000000003F000000003F000000003F000000003F000000003F000000003F0000000
+03F000000003F000000003F000000003F000000003F000000003F000000003F000000003
+F000000003F000000003F000007FFFFFFF00FFFFFFFF00FFFFFFFF80FFFFFFFF80FFFFFF
+FF007FFFFFFF00213979B82F>I<0000038000000FE000000FE000001FF000001FF00000
+1FF000000FE000000FE00000038000000000000000000000000000000000000000000000
+000000000000000000000000000000FFFFE000FFFFF001FFFFF001FFFFF000FFFFF000FF
+FFF0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F00000
+03F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F00000
+03F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F00000
+03F0000003F0000003F0000003F0000003F0000003F0000003F0000003F0000003F00000
+03F0000003F0000003F0000003F0000003F0000003F0000007F0000007E07E000FE07E00
+0FC0FF001FC0FF003F80FF00FF80FFFFFF007FFFFE007FFFFC003FFFF8000FFFE00001FF
+80001C4E7CB82F>I<7FF000000000FFF800000000FFF800000000FFF800000000FFF800
+0000007FF80000000000F80000000000F80000000000F80000000000F80000000000F800
+00000000F80000000000F80000000000F80000000000F80000000000F80000000000F800
+00000000F807FFFF0000F80FFFFF0000F80FFFFF8000F80FFFFF8000F80FFFFF0000F807
+FFFF0000F8003F800000F8007F000000F800FE000000F801FC000000F803F8000000F807
+F0000000F80FE0000000F81FC0000000F83F80000000F87F00000000F8FF00000000F9FF
+80000000FBFF80000000FFFFC0000000FFE7E0000000FFC7F0000000FF83F0000000FF01
+F8000000FE00FC000000FC00FE000000F8007E000000F8003F000000F8001F800000F800
+1F800000F8000FC00000F80007E00000F80007F0007FFFF03FFFC0FFFFF87FFFC0FFFFF8
+7FFFE0FFFFF87FFFE0FFFFF87FFFC07FFFF03FFFC02B387EB72F>I<7FFFF000007FFFF8
+0000FFFFF80000FFFFF800007FFFF800007FFFF800000001F800000001F800000001F800
+000001F800000001F800000001F800000001F800000001F800000001F800000001F80000
+0001F800000001F800000001F800000001F800000001F800000001F800000001F8000000
+01F800000001F800000001F800000001F800000001F800000001F800000001F800000001
+F800000001F800000001F800000001F800000001F800000001F800000001F800000001F8
+00000001F800000001F800000001F800000001F800000001F800000001F800000001F800
+000001F800000001F800000001F800000001F800000001F800007FFFFFFFE07FFFFFFFE0
+FFFFFFFFF0FFFFFFFFF07FFFFFFFE07FFFFFFFE024387BB72F>I<0001F801F8007F8FFC
+0FFC00FFDFFE1FFE00FFFFFF3FFF00FFFFFFFFFF80FFFFFFFFFF807FFE1FFE1F8007FC0F
+FC0FC007F80FF80FC007F007F007C007E007E007C007E007E007C007E007E007C007C007
+C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007
+C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007
+C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007C007
+C007C007C007C007C007C007C007C07FFC3FFC3FFCFFFE3FFE3FFEFFFE7FFE7FFEFFFE7F
+FE7FFEFFFE3FFE3FFE7FFC3FFC3FFC2F2880A72F>I<00000FF000007FF03FFC0000FFF8
+FFFE0000FFFBFFFF0000FFFFFFFF8000FFFFFFFF80007FFFF03FC00001FFC01FC00001FF
+800FE00001FF000FE00001FE0007E00001FC0007E00001FC0007E00001FC0007E00001F8
+0007E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F8
+0007E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F8
+0007E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F8
+0007E00001F80007E0007FFFE07FFF80FFFFF0FFFFC0FFFFF0FFFFC0FFFFF0FFFFC0FFFF
+F0FFFFC07FFFE07FFF802A287EA72F>I<0003FC0000001FFF8000003FFFC00000FFFFF0
+0001FFFFF80003FFFFFC0007FE07FE000FF801FF000FE0007F001FC0003F801F80001F80
+3F80001FC03F00000FC07F00000FE07E000007E07E000007E0FC000003F0FC000003F0FC
+000003F0FC000003F0FC000003F0FC000003F0FC000003F0FC000003F0FC000003F0FE00
+0007F07E000007E07E000007E07F00000FE07F00000FE03F80001FC03F80001FC01FC000
+3F801FE0007F800FF801FF0007FE07FE0003FFFFFC0001FFFFF80000FFFFF000007FFFE0
+00001FFF80000003FC0000242A7BA82F>I<00000FF000007FF03FFC0000FFF8FFFF0000
+FFFBFFFFC000FFFFFFFFE000FFFFFFFFF0007FFFF03FF00001FFC00FF80001FF8003FC00
+01FF0001FC0001FE0000FE0001FC0000FE0001FC00007F0001F800003F0001F800003F00
+01F800003F8001F800001F8001F800001F8001F800001F8001F800001F8001F800001F80
+01F800001F8001F800001F8001F800001F8001F800003F8001F800003F8001FC00003F00
+01FC00007F0001FC00007F0001FE0000FE0001FE0000FE0001FF0001FC0001FF8007FC00
+01FFC00FF80001FFF03FF00001FFFFFFE00001FFFFFFC00001FBFFFF800001F9FFFF0000
+01F87FFC000001F81FE0000001F80000000001F80000000001F80000000001F800000000
+01F80000000001F80000000001F80000000001F80000000001F80000000001F800000000
+01F80000000001F80000000001F8000000007FFFE0000000FFFFF0000000FFFFF0000000
+FFFFF0000000FFFFF00000007FFFE0000000293C7EA72F>I<0003FE01E000000FFF83F0
+00003FFFE3F00000FFFFF3F00001FFFFFBF00003FFFFFFF00007FF03FFF0000FFC00FFF0
+000FF0003FF0001FE0001FF0003FC0001FF0003F80000FF0007F000007F0007F000007F0
+007E000007F0007E000003F000FE000003F000FC000003F000FC000003F000FC000003F0
+00FC000003F000FC000003F000FC000003F000FC000003F000FE000003F000FE000007F0
+007E000007F0007F000007F0007F00000FF0003F80000FF0003F80001FF0001FC0003FF0
+001FF0007FF0000FF800FFF00007FE03FFF00003FFFFFFF00001FFFFFBF00000FFFFF3F0
+00007FFFC3F000001FFF03F0000003FC03F00000000003F00000000003F00000000003F0
+0000000003F00000000003F00000000003F00000000003F00000000003F00000000003F0
+0000000003F00000000003F00000000003F00000000003F000000001FFFFE0000001FFFF
+E0000003FFFFF0000003FFFFF0000001FFFFE0000001FFFFE02C3C7DA72F>I<0000000F
+F0007FFF007FFE007FFF81FFFF00FFFF87FFFF00FFFF8FFFFF807FFF9FFFFF807FFFBFF8
+7F80001FFFC07F80001FFF003F00001FFE001E00001FFC000000001FF8000000001FF000
+0000001FF0000000001FE0000000001FC0000000001FC0000000001FC0000000001FC000
+0000001F80000000001F80000000001F80000000001F80000000001F80000000001F8000
+0000001F80000000001F80000000001F80000000001F80000000001F80000000001F8000
+0000001F80000000001F80000000001F800000007FFFFFF800007FFFFFFC0000FFFFFFFC
+0000FFFFFFFC00007FFFFFFC00007FFFFFF8000029287EA72F>I<001FFC0E0001FFFF9F
+0007FFFFFF000FFFFFFF001FFFFFFF003FFFFFFF007FF007FF007F8000FF00FE00007F00
+FE00007F00FC00003F00FC00003F00FC00003F00FE00003F007F00001E007FC00000003F
+FC0000001FFFF000000FFFFF800003FFFFE00000FFFFF800001FFFFE0000007FFF000000
+01FF800000007F807800001FC0FC00000FC0FC000007E0FC000007E0FE000007E0FE0000
+07E0FF000007E0FF80000FE0FFC0001FC0FFE0003FC0FFFC01FF80FFFFFFFF80FFFFFFFF
+00FFFFFFFE00F8FFFFF800F83FFFE0007007FF0000232A7AA82F>I<000F000000001F80
+0000001F800000001F800000001F800000001F800000001F800000001F800000001F8000
+00001F800000001F8000007FFFFFFFC0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE0FFFFFFFFE0
+7FFFFFFFC0001F800000001F800000001F800000001F800000001F800000001F80000000
+1F800000001F800000001F800000001F800000001F800000001F800000001F800000001F
+800000001F800000001F800000001F800000001F800000001F8000F0001F8001F8001F80
+01F8001F8001F8001F8001F8001F8001F8001FC003F8001FC007F0000FE00FF0000FF81F
+E00007FFFFC00007FFFFC00003FFFF800001FFFE0000007FF80000001FE00025337EB12F
+>I<7FF001FFC000FFF803FFE000FFF803FFE000FFF803FFE000FFF803FFE0007FF801FF
+E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007
+E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007
+E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007E00001F80007
+E00001F80007E00001F80007E00001F80007E00001F80007E00001F8000FE00001F8000F
+E00001F8001FE00001F8003FE00001FC007FE00000FF01FFFF8000FFFFFFFFC0007FFFFF
+FFC0007FFFFFFFC0003FFFE7FFC0000FFF83FF800003FE0000002A287EA62F>I<7FFF00
+3FFF80FFFF807FFFC0FFFF807FFFC0FFFF807FFFC0FFFF807FFFC07FFF003FFF8001F000
+03E00001F00003E00001F80007E00000F80007C00000F80007C00000FC000FC000007C00
+0F8000007C000F8000007C000F8000003E001F0000003E001F0000003E001F0000001F00
+3E0000001F003E0000001F003E0000000F807C0000000F807C0000000F807C00000007C0
+F800000007C0F800000007C0F800000003E1F000000003E1F000000003E1F000000001F3
+E000000001F3E000000001F3E000000000FFC000000000FFC000000000FFC0000000007F
+80000000007F80000000003F0000002A277EA62F>I<7FFF801FFFE07FFFC03FFFE0FFFF
+C03FFFF0FFFFC03FFFF07FFFC03FFFE07FFF801FFFE007C000003E0007C000003E0007C0
+00003E0007E000007E0003E000007C0003E000007C0003E000007C0003E000007C0003E0
+00007C0001F00000F80001F00F80F80001F01FC0F80001F03FE0F80001F03FE0F80001F0
+3FE0F80000F87FF0F00000F87DF1F00000F87DF1F00000F8FDF1F00000F8FDF9F00000F8
+F9F9F0000078F8F9E0000079F8F9E000007DF8F9E000007DF8F9E000007DF079E000007D
+F07BE000003FF07FC000003FE07FC000003FE03FC000003FE03FC000003FC01FC000001F
+800F80002C277FA62F>I<3FFF80FFFE007FFFC1FFFF007FFFC1FFFF007FFFC1FFFF007F
+FFC1FFFF003FFF80FFFE00007E001F0000003F003F0000003F007E0000001F80FC000000
+0FC0FC00000007C1F800000007E3F000000003F3E000000001FFE000000000FFC0000000
+00FF80000000007F00000000003F00000000003F00000000007F0000000000FF80000000
+00FFC000000001F3E000000003E3F000000007E1F000000007C0F80000000F80FC000000
+1F807E0000003F003E0000003E001F0000007E001F800000FC000FC0007FFF807FFF807F
+FFC0FFFF80FFFFC0FFFFC0FFFFC0FFFFC07FFFC0FFFF807FFF807FFF802A277EA62F>I<
+7FFF803FFF80FFFF807FFFC0FFFFC07FFFC0FFFFC07FFFC0FFFF807FFFC07FFF803FFF80
+01F00003E00001F80003E00000F80003E00000F80007C00000FC0007C000007C0007C000
+007E000F8000003E000F8000003E000F8000003F001F0000001F001F0000001F001F0000
+000F803E0000000F803E0000000FC03E00000007C07C00000007C07C00000007E07C0000
+0003E0F800000003E0F800000001F0F800000001F0F000000001F1F000000000F9F00000
+0000F9E000000000F9E0000000007BE0000000007FC0000000003FC0000000003FC00000
+00003F80000000001F80000000001F80000000001F00000000001F00000000001F000000
+00003E00000000003E00000000003E00000000007C00000000007C0000000000FC000000
+0F00F80000001F81F80000003FC1F80000003FC3F00000003F07E00000003F1FE0000000
+3FFFC00000001FFF800000001FFF800000000FFE0000000007FC0000000003F000000000
+2A3C7EA62F>I<3FFFFFFFF87FFFFFFFFC7FFFFFFFFC7FFFFFFFFC7FFFFFFFFC7FFFFFFF
+F87E00000FF07E00001FE07E00003FC07E00007F807E0000FF003C0001FE00000003FC00
+000007F80000000FF00000001FE00000003FC00000007F80000000FF00000001FE000000
+03FC00000007F80000000FF00000001FE00000003FC00000007F80000000FF00003C01FE
+00007E03FC00007E07F800007E0FF000007E1FE000007E3FC000007E7FFFFFFFFEFFFFFF
+FFFEFFFFFFFFFEFFFFFFFFFEFFFFFFFFFE7FFFFFFFFC27277DA62F>I<7C7CFEFEFEFEFE
+FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
+FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE7C7C07476CBE2F>124
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fh ecbx1095 10.95 32
+/Fh 32 122 df<07801FE03FF07FF8FFFCFFFCFFFCFFFCFFFCFFFC7FF83FF01FE007800E
+0E798D1D>46 D<0000000006000000000E000000001E000000001C000000001C00000000
+3C000000003800000000780000000070000000007000000000F000000000E000000001E0
+00000001C000000003C000000003800000000380000000078000000007000000000F0000
+00000E000000000E000000001E000000001C000000003C00000000380000000038000000
+0078000000007000000000F000000000E000000000E000000001E000000001C000000003
+C000000003800000000780000000070000000007000000000F000000000E000000001E00
+0000001C000000001C000000003C00000000380000000078000000007000000000700000
+0000F000000000E000000001E000000001C000000001C000000003C00000000380000000
+078000000007000000000F000000000E000000000E000000001E000000001C000000003C
+000000003800000000380000000078000000007000000000F000000000E000000000E000
+000001E000000001C000000003C000000003800000000380000000078000000007000000
+000F000000000E000000001E000000001C000000001C000000003C000000003800000000
+780000000070000000007000000000F000000000E000000000E000000000275B7AC334>
+I<00000F000000001F000000007F00000001FF0000000FFF000001FFFF0000FFFFFF0000
+FFFFFF0000FFF7FF0000FE07FF00000007FF00000007FF00000007FF00000007FF000000
+07FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007
+FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF
+00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF00
+000007FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF0000
+0007FF00000007FF00000007FF00000007FF00000007FF00000007FF00000007FF000000
+07FF00000007FF00000007FF00000007FF00000007FF00000007FF00003FFFFFFFF83FFF
+FFFFF83FFFFFFFF83FFFFFFFF8253C79BB34>49 D<0003FF800000003FFFF8000000FFFF
+FE000003FFFFFF800007F80FFFC0000FC001FFF0001F8000FFF8003F00007FFC007FC000
+3FFE007FE0003FFE00FFF0001FFF00FFF8001FFF00FFF8001FFF00FFF8000FFF80FFF800
+0FFF80FFF8000FFF80FFF8000FFF807FF0000FFF807FF0000FFF801FC0000FFF80070000
+0FFF800000000FFF000000001FFF000000001FFF000000001FFE000000003FFE00000000
+3FFC000000007FF8000000007FF000000000FFE000000001FFC000000001FF8000000003
+FF0000000007FE000000000FF8000000001FF0000000001FE0000000003F80000000007F
+0000000000FE0000000001F80007800003F00007800007E0000780000FC0000F00001F80
+000F00003E00000F00007C00000F0000F800001F0001F000001F0001FFFFFFFF0003FFFF
+FFFE0007FFFFFFFE000FFFFFFFFE001FFFFFFFFE003FFFFFFFFE007FFFFFFFFE00FFFFFF
+FFFE00FFFFFFFFFC00FFFFFFFFFC00FFFFFFFFFC00293C7BBB34>I<0000FFE00000000F
+FFFC0000003FFFFF800000FF01FFE00001F8007FF00003E0003FF80007C0003FFC000FF0
+001FFE000FFC001FFE001FFE001FFF001FFE001FFF001FFE001FFF001FFE001FFF001FFF
+001FFF001FFE001FFF001FFE001FFF000FFE001FFF0007FC001FFE0003F0003FFE000000
+003FFC000000003FFC000000007FF8000000007FF000000000FFE000000001FFC0000000
+03FF000000000FFC00000007FFF000000007FFE000000007FFFE0000000001FF80000000
+007FE0000000003FF8000000001FFC000000001FFE000000000FFF000000000FFF800000
+0007FFC000000007FFC000000007FFC007800007FFE01FE00007FFE07FF80007FFE07FF8
+0007FFE0FFFC0007FFE0FFFC0007FFE0FFFC0007FFE0FFFC0007FFE0FFFC0007FFC0FFFC
+0007FFC0FFF8000FFFC07FF8000FFF807FF0000FFF003FC0001FFF001FC0003FFE000FF0
+007FFC0007FE01FFF00003FFFFFFE00000FFFFFF8000001FFFFC00000001FFC000002B3D
+7CBB34>I<00000001F00000000001F00000000003F00000000007F0000000000FF00000
+00001FF0000000001FF0000000003FF0000000007FF000000000FFF000000000FFF00000
+0001FFF000000003FFF000000007FFF00000000FBFF00000000F3FF00000001E3FF00000
+003C3FF00000007C3FF0000000783FF0000000F03FF0000001E03FF0000003E03FF00000
+03C03FF0000007803FF000000F003FF000001F003FF000003E003FF000003C003FF00000
+78003FF00000F0003FF00001F0003FF00001E0003FF00003C0003FF0000780003FF0000F
+80003FF0001F00003FF0001E00003FF0003C00003FF0007800003FF000F800003FF000FF
+FFFFFFFFF8FFFFFFFFFFF8FFFFFFFFFFF8FFFFFFFFFFF80000007FF0000000007FF00000
+00007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF00000
+00007FF0000000007FF0000000007FF0000001FFFFFFF80001FFFFFFF80001FFFFFFF800
+01FFFFFFF82D3C7DBB34>I<000003FE000000003FFFC0000000FFFFF0000003FE01F800
+000FF8007C00003FE0003E00007FC001FE0000FF8003FF0001FF8007FF0003FF0007FF00
+03FE0007FF0007FE0007FF000FFE0007FF000FFC0007FF001FFC0003FE001FFC0001FC00
+3FFC000000003FFC000000003FF8000000007FF8000000007FF8000000007FF800000000
+7FF83FFC0000FFF87FFF8000FFF9FFFFC000FFFBC03FF000FFFB800FF800FFFF000FFC00
+FFFF0007FE00FFFE0007FF00FFFE0003FF80FFFC0003FF80FFFC0003FFC0FFFC0003FFC0
+FFFC0003FFC0FFF80003FFE0FFF80003FFE0FFF80003FFE0FFF80003FFE0FFF80003FFE0
+7FF80003FFE07FF80003FFE07FF80003FFE07FF80003FFE07FF80003FFE03FF80003FFE0
+3FF80003FFE03FF80003FFC01FF80003FFC01FFC0003FFC00FFC0003FF800FFC0007FF80
+07FE0007FF0003FE0007FE0003FF000FFC0001FF801FF80000FFE07FF000003FFFFFE000
+000FFFFF80000003FFFE000000007FE000002B3D7CBB34>54 D<0000FFE000000007FFFE
+0000001FFFFF8000007F803FE00000FC000FF00001F00007F80003E00003FC0007E00001
+FE0007C00000FE000FC00000FF000FC000007F000FC000007F001FE000007F001FE00000
+7F001FF000007F001FF800007F001FFC00007F001FFF0000FE001FFFC000FE001FFFE001
+FE000FFFF803FC000FFFFE03F8000FFFFF87F00007FFFFDFE00007FFFFFF800003FFFFFE
+000001FFFFFF000000FFFFFF8000007FFFFFE000001FFFFFF000001FFFFFFC00007FFFFF
+FE0001FEFFFFFE0003F83FFFFF0007F00FFFFF800FE007FFFF801FC001FFFFC03FC0007F
+FFC07F80001FFFE07F00000FFFE07F000003FFE0FF000000FFE0FE0000007FE0FE000000
+3FE0FE0000001FE0FE0000001FE0FE0000000FE0FE0000000FE0FE0000000FC0FF000000
+0FC07F0000000FC07F8000001F803FC000001F003FC000003F001FF000007E000FF80001
+FC0007FF801FF80001FFFFFFE000007FFFFF8000001FFFFE00000001FFE000002B3D7CBB
+34>56 D<07801FE03FF07FF8FFFCFFFCFFFCFFFCFFFCFFFC7FF83FF01FE0078000000000
+000000000000000000000000000000000000000007801FE03FF07FF8FFFCFFFCFFFCFFFC
+FFFCFFFC7FF83FF01FE007800E2879A71D>58 D<FFFFFFFFFFF80000FFFFFFFFFFFF8000
+FFFFFFFFFFFFF000FFFFFFFFFFFFFC00003FFC00003FFE00003FFC00000FFF00003FFC00
+0007FF80003FFC000003FFC0003FFC000003FFE0003FFC000001FFE0003FFC000001FFF0
+003FFC000001FFF0003FFC000000FFF8003FFC000000FFF8003FFC000000FFF8003FFC00
+0000FFF8003FFC000000FFF8003FFC000000FFF8003FFC000000FFF8003FFC000001FFF0
+003FFC000001FFF0003FFC000001FFF0003FFC000003FFE0003FFC000003FFC0003FFC00
+0007FF80003FFC00000FFF00003FFC00001FFE00003FFC0000FFF800003FFFFFFFFFE000
+003FFFFFFFFF0000003FFFFFFFFFF000003FFC00003FFE00003FFC000007FF80003FFC00
+0003FFC0003FFC000001FFE0003FFC000000FFF0003FFC0000007FF8003FFC0000007FFC
+003FFC0000007FFC003FFC0000003FFE003FFC0000003FFE003FFC0000003FFF003FFC00
+00003FFF003FFC0000003FFF003FFC0000003FFF003FFC0000003FFF003FFC0000003FFF
+003FFC0000003FFF003FFC0000003FFF003FFC0000003FFE003FFC0000003FFE003FFC00
+00007FFE003FFC0000007FFC003FFC000000FFF8003FFC000001FFF8003FFC000003FFF0
+003FFC000007FFE0003FFC00003FFFC0FFFFFFFFFFFFFF00FFFFFFFFFFFFFC00FFFFFFFF
+FFFFF000FFFFFFFFFFFF0000403E7DBD4A>66 D<FFFFFFFFFFF8000000FFFFFFFFFFFF80
+0000FFFFFFFFFFFFF00000FFFFFFFFFFFFFC0000003FFE00007FFF0000003FFE00000FFF
+C000003FFE000003FFE000003FFE000000FFF000003FFE0000003FF800003FFE0000001F
+FC00003FFE0000000FFE00003FFE0000000FFF00003FFE00000007FF80003FFE00000003
+FF80003FFE00000003FFC0003FFE00000003FFC0003FFE00000001FFE0003FFE00000001
+FFE0003FFE00000001FFF0003FFE00000000FFF0003FFE00000000FFF0003FFE00000000
+FFF8003FFE00000000FFF8003FFE00000000FFF8003FFE00000000FFF8003FFE00000000
+FFFC003FFE00000000FFFC003FFE00000000FFFC003FFE00000000FFFC003FFE00000000
+FFFC003FFE00000000FFFC003FFE00000000FFFC003FFE00000000FFFC003FFE00000000
+FFFC003FFE00000000FFFC003FFE00000000FFFC003FFE00000000FFFC003FFE00000000
+FFFC003FFE00000000FFF8003FFE00000000FFF8003FFE00000000FFF8003FFE00000000
+FFF8003FFE00000000FFF0003FFE00000000FFF0003FFE00000001FFF0003FFE00000001
+FFE0003FFE00000001FFE0003FFE00000003FFC0003FFE00000003FFC0003FFE00000007
+FF80003FFE00000007FF00003FFE0000000FFF00003FFE0000001FFE00003FFE0000003F
+FC00003FFE000000FFF800003FFE000001FFE000003FFE00000FFFC000003FFE00007FFF
+8000FFFFFFFFFFFFFE0000FFFFFFFFFFFFF80000FFFFFFFFFFFFC00000FFFFFFFFFFF800
+0000463E7DBD50>68 D<FFFFFFFFC00000FFFFFFFFC00000FFFFFFFFC00000FFFFFFFFC0
+0000007FFC00000000007FFC00000000007FFC00000000007FFC00000000007FFC000000
+00007FFC00000000007FFC00000000007FFC00000000007FFC00000000007FFC00000000
+007FFC00000000007FFC00000000007FFC00000000007FFC00000000007FFC0000000000
+7FFC00000000007FFC00000000007FFC00000000007FFC00000000007FFC00000000007F
+FC00000000007FFC00000000007FFC00000000007FFC00000000007FFC00000000007FFC
+00000000007FFC00000000007FFC00000000007FFC00000000007FFC00000000007FFC00
+000000007FFC00000000007FFC00000000007FFC00000078007FFC00000078007FFC0000
+0078007FFC00000078007FFC000000F0007FFC000000F0007FFC000000F0007FFC000000
+F0007FFC000001F0007FFC000001F0007FFC000001F0007FFC000003F0007FFC000003F0
+007FFC000007E0007FFC000007E0007FFC00000FE0007FFC00001FE0007FFC00003FE000
+7FFC0000FFE0007FFC0003FFE0007FFC001FFFE0FFFFFFFFFFFFC0FFFFFFFFFFFFC0FFFF
+FFFFFFFFC0FFFFFFFFFFFFC0353E7CBD3E>76 D<FFFFFE00000000001FFFFFE0FFFFFF00
+000000003FFFFFE0FFFFFF00000000003FFFFFE0FFFFFF80000000007FFFFFE0003FFF80
+000000007FFF8000003FFF80000000007FFF8000003DFFC000000000F7FF8000003DFFC0
+00000000F7FF8000003CFFE000000001E7FF8000003CFFE000000001E7FF8000003C7FF0
+00000003C7FF8000003C7FF000000003C7FF8000003C3FF80000000787FF8000003C3FF8
+0000000787FF8000003C3FF80000000787FF8000003C1FFC0000000F07FF8000003C1FFC
+0000000F07FF8000003C0FFE0000001E07FF8000003C0FFE0000001E07FF8000003C07FF
+0000003C07FF8000003C07FF0000003C07FF8000003C03FF8000007807FF8000003C03FF
+8000007807FF8000003C03FF8000007807FF8000003C01FFC00000F007FF8000003C01FF
+C00000F007FF8000003C00FFE00001E007FF8000003C00FFE00001E007FF8000003C007F
+F00003C007FF8000003C007FF00003C007FF8000003C003FF800078007FF8000003C003F
+F800078007FF8000003C003FF800078007FF8000003C001FFC000F0007FF8000003C001F
+FC000F0007FF8000003C000FFE001E0007FF8000003C000FFE001E0007FF8000003C0007
+FF003C0007FF8000003C0007FF003C0007FF8000003C0003FF80780007FF8000003C0003
+FF80780007FF8000003C0003FF80780007FF8000003C0001FFC0F00007FF8000003C0001
+FFC0F00007FF8000003C0000FFE1E00007FF8000003C0000FFE1E00007FF8000003C0000
+7FF3C00007FF8000003C00007FF3C00007FF8000003C00003FFF800007FF8000003C0000
+3FFF800007FF8000003C00003FFF800007FF8000003C00001FFF000007FF8000003C0000
+1FFF000007FF8000003C00000FFE000007FF8000003C00000FFE000007FF8000003C0000
+07FC000007FF8000003C000007FC000007FF8000007E000003F8000007FF8000FFFFFF00
+03F8001FFFFFFFE0FFFFFF0003F8001FFFFFFFE0FFFFFF0001F0001FFFFFFFE0FFFFFF00
+00E0001FFFFFFFE05B3E7DBD62>I<FFFFFFFFFFC000000000FFFFFFFFFFFC00000000FF
+FFFFFFFFFF80000000FFFFFFFFFFFFF0000000003FFE0001FFFC000000003FFE00003FFE
+000000003FFE00001FFF000000003FFE000007FF800000003FFE000007FFC00000003FFE
+000003FFE00000003FFE000003FFE00000003FFE000001FFF00000003FFE000001FFF000
+00003FFE000001FFF80000003FFE000001FFF80000003FFE000001FFF80000003FFE0000
+01FFF80000003FFE000001FFF80000003FFE000001FFF80000003FFE000001FFF8000000
+3FFE000001FFF00000003FFE000001FFF00000003FFE000003FFE00000003FFE000003FF
+E00000003FFE000007FFC00000003FFE000007FF800000003FFE00001FFE000000003FFE
+00003FFC000000003FFE0003FFF0000000003FFFFFFFFFC0000000003FFFFFFFFE000000
+00003FFFFFFFFE00000000003FFE000FFF80000000003FFE0003FFE0000000003FFE0000
+FFF0000000003FFE00007FF8000000003FFE00007FFC000000003FFE00003FFC00000000
+3FFE00003FFE000000003FFE00001FFE000000003FFE00001FFF000000003FFE00001FFF
+000000003FFE00001FFF000000003FFE00001FFF000000003FFE00001FFF000000003FFE
+00001FFF000000003FFE00001FFF800000003FFE00001FFF800000003FFE00001FFF8000
+00003FFE00001FFF800000003FFE00001FFF800000003FFE00001FFF800180003FFE0000
+1FFF8003C0003FFE00001FFFC003C0003FFE00000FFFC003C0003FFE00000FFFC003C000
+3FFE000007FFE00780003FFE000007FFE00780FFFFFFFF8003FFF00F00FFFFFFFF8001FF
+FC3F00FFFFFFFF80007FFFFE00FFFFFFFF80001FFFF80000000000000000FFE0004A3F7D
+BD4E>82 D<7FFFFFFF007FFFFFE07FFFFFFF007FFFFFE07FFFFFFF007FFFFFE07FFFFFFF
+007FFFFFE0003FFF800001FFC000001FFFC000007E0000001FFFC00000FE0000000FFFE0
+0000FC00000007FFF00001F800000003FFF00003F000000003FFF80007F000000001FFFC
+0007E000000000FFFE000FC000000000FFFE001F80000000007FFF001F80000000003FFF
+803F00000000001FFF807E00000000001FFFC0FE00000000000FFFE0FC000000000007FF
+E1F8000000000007FFF3F0000000000003FFFFF0000000000001FFFFE0000000000001FF
+FFC0000000000000FFFF800000000000007FFF800000000000003FFF000000000000003F
+FF800000000000001FFFC00000000000000FFFE00000000000000FFFE000000000000007
+FFF000000000000007FFF80000000000000FFFF80000000000000FFFFC0000000000001F
+FFFE0000000000003F7FFE0000000000007F7FFF0000000000007E3FFF800000000000FC
+1FFFC00000000001F80FFFC00000000003F80FFFE00000000003F007FFF00000000007E0
+03FFF0000000000FC003FFF8000000000FC001FFFC000000001F8000FFFE000000003F00
+00FFFE000000007F00007FFF000000007E00003FFF80000000FC00001FFF80000001F800
+001FFFC0000003F800000FFFE0000003F0000007FFF0000007E0000007FFF000000FC000
+0003FFF800001FC0000001FFFC00007FE0000000FFFC00FFFFFF80007FFFFFFEFFFFFF80
+007FFFFFFEFFFFFF80007FFFFFFEFFFFFF80007FFFFFFE473E7DBD4E>88
+D<0007FF800000003FFFF0000001FFFFFC000003FC03FF000007E000FFC0000FF8007FE0
+001FF8003FF0001FFC003FF0001FFC001FF8001FFC001FF8001FFC000FFC001FFC000FFC
+000FF8000FFC0007F0000FFC0001C0000FFC000000000FFC000000000FFC000000000FFC
+00000003FFFC000001FFFFFC00000FFFFFFC00007FFF8FFC0001FFF00FFC0007FF800FFC
+000FFF000FFC001FFC000FFC003FF8000FFC007FF8000FFC007FF0000FFC00FFF0000FFC
+00FFE0000FFC00FFE0000FFC00FFE0000FFC00FFE0001FFC00FFE0001FFC00FFF0003FFC
+007FF0003FFC007FF8007FFF003FFC01F7FFFC1FFE07E3FFFC07FFFF81FFFC01FFFE007F
+FC001FF80000002E2B7DA932>97 D<00007FF0000003FFFF00001FFFFFC0007FE01FE000
+FF8003F001FF000FF803FE000FFC07FE001FFC0FFC001FFC1FFC001FFC1FF8001FFC3FF8
+001FFC3FF8000FF87FF80007F07FF00001C07FF0000000FFF0000000FFF0000000FFF000
+0000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF00000
+00FFF00000007FF00000007FF00000007FF80000007FF80000003FF800001E3FFC00001E
+1FFC00003E0FFC00003C0FFE00007C07FF0000F803FF8001F000FFC003E0007FF00FC000
+1FFFFF000007FFFC0000007FE000272B7DA92E>99 D<0000000007F80000000007FFF800
+00000007FFF80000000007FFF80000000007FFF800000000003FF800000000001FF80000
+0000001FF800000000001FF800000000001FF800000000001FF800000000001FF8000000
+00001FF800000000001FF800000000001FF800000000001FF800000000001FF800000000
+001FF800000000001FF800000000001FF800000000001FF800000000001FF80000007FE0
+1FF8000003FFFC1FF800001FFFFF1FF800007FF00FDFF80000FFC003FFF80003FF0000FF
+F80007FE00007FF8000FFE00003FF8000FFC00001FF8001FFC00001FF8003FF800001FF8
+003FF800001FF8007FF800001FF8007FF000001FF8007FF000001FF8007FF000001FF800
+FFF000001FF800FFF000001FF800FFF000001FF800FFF000001FF800FFF000001FF800FF
+F000001FF800FFF000001FF800FFF000001FF800FFF000001FF800FFF000001FF8007FF0
+00001FF8007FF000001FF8007FF000001FF8007FF800001FF8003FF800001FF8003FF800
+001FF8001FF800001FF8001FFC00003FF8000FFC00007FF80007FE0000FFF80003FF0001
+FFFC0001FF8007FFFFE0007FE01F9FFFE0001FFFFE1FFFE00007FFF81FFFE000007FC01F
+E00033407DBE3A>I<0000FFE0000007FFFC00003FFFFF00007FE0FF8001FF803FC003FF
+001FE007FE000FF00FFC000FF80FFC0007FC1FF80007FC3FF80003FE3FF80003FE3FF800
+03FE7FF00003FE7FF00003FF7FF00003FFFFF00001FFFFF00001FFFFF00001FFFFFFFFFF
+FFFFFFFFFFFFFFFFFFFFFFFFF0000000FFF0000000FFF0000000FFF0000000FFF0000000
+7FF00000007FF00000007FF00000003FF80000003FF800000F1FF800000F1FFC00001F0F
+FC00001E07FE00003E03FE00007C01FF0000F800FFC003F0007FF01FE0001FFFFFC00007
+FFFE0000007FF000282B7DA92F>I<0003FF8003F0003FFFF81FFC00FFFFFE7FFE03FF01
+FFFCFE07FC007FE1FE0FFC007FE0FE1FF8003FF0FE3FF8003FF87C3FF0001FF8003FF000
+1FF8007FF0001FFC007FF0001FFC007FF0001FFC007FF0001FFC007FF0001FFC007FF000
+1FFC007FF0001FFC003FF0001FF8003FF0001FF8003FF8003FF8001FF8003FF0000FFC00
+7FE00007FC007FC00007FF01FF800007FFFFFE00000F3FFFF800000F03FF8000001E0000
+0000001E00000000001F00000000001F00000000001F00000000001F80000000001FC000
+0000001FFFFFFF00000FFFFFFFF0000FFFFFFFFC0007FFFFFFFF0007FFFFFFFF8003FFFF
+FFFFC003FFFFFFFFE00FFFFFFFFFE01FC00001FFF03F8000001FF07F0000000FF87F0000
+0007F8FE00000007F8FE00000003F8FE00000003F8FE00000003F8FE00000003F8FF0000
+0007F87F00000007F07F8000000FF03FC000001FE01FE000003FC00FF80000FF8003FF80
+0FFE0000FFFFFFF800001FFFFFC0000001FFFC00002F3D7DA834>103
+D<00FF0000000000FFFF0000000000FFFF0000000000FFFF0000000000FFFF0000000000
+07FF000000000003FF000000000003FF000000000003FF000000000003FF000000000003
+FF000000000003FF000000000003FF000000000003FF000000000003FF000000000003FF
+000000000003FF000000000003FF000000000003FF000000000003FF000000000003FF00
+0000000003FF000000000003FF003FF0000003FF00FFFE000003FF03FFFF800003FF0FC0
+FFC00003FF1E007FE00003FF3C003FF00003FF78003FF00003FFF0003FF00003FFE0001F
+F80003FFC0001FF80003FFC0001FF80003FF80001FF80003FF80001FF80003FF80001FF8
+0003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF800
+03FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003
+FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF
+00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00
+001FF80003FF00001FF80003FF00001FF800FFFFFC07FFFFE0FFFFFC07FFFFE0FFFFFC07
+FFFFE0FFFFFC07FFFFE0333F7CBE3A>I<01F80003FC0007FE000FFF001FFF801FFF801F
+FF801FFF801FFF801FFF800FFF0007FE0003FC0001F80000000000000000000000000000
+000000000000000000000000000000FF00FFFF00FFFF00FFFF00FFFF0007FF0003FF0003
+FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003
+FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003
+FF0003FF0003FF0003FF0003FF0003FF00FFFFF8FFFFF8FFFFF8FFFFF815407CBF1D>I<
+00FF00FFFF00FFFF00FFFF00FFFF0007FF0003FF0003FF0003FF0003FF0003FF0003FF00
+03FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF00
+03FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF00
+03FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF00
+03FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF00FFFFFC
+FFFFFCFFFFFCFFFFFC163F7CBE1D>108 D<01FE003FF00001FF8000FFFE00FFFE0007FF
+F000FFFE03FFFF801FFFFC00FFFE0FC0FFC07E07FE00FFFE1E007FE0F003FF0007FE3C00
+3FF1E001FF8003FE78003FF3C001FF8003FEF0003FF78001FF8003FFE0001FFF0000FFC0
+03FFC0001FFE0000FFC003FFC0001FFE0000FFC003FF80001FFC0000FFC003FF80001FFC
+0000FFC003FF80001FFC0000FFC003FF00001FF80000FFC003FF00001FF80000FFC003FF
+00001FF80000FFC003FF00001FF80000FFC003FF00001FF80000FFC003FF00001FF80000
+FFC003FF00001FF80000FFC003FF00001FF80000FFC003FF00001FF80000FFC003FF0000
+1FF80000FFC003FF00001FF80000FFC003FF00001FF80000FFC003FF00001FF80000FFC0
+03FF00001FF80000FFC003FF00001FF80000FFC003FF00001FF80000FFC003FF00001FF8
+0000FFC003FF00001FF80000FFC003FF00001FF80000FFC003FF00001FF80000FFC003FF
+00001FF80000FFC003FF00001FF80000FFC003FF00001FF80000FFC0FFFFFC07FFFFE03F
+FFFFFFFFFC07FFFFE03FFFFFFFFFFC07FFFFE03FFFFFFFFFFC07FFFFE03FFFFF50297CA8
+57>I<00007FF000000003FFFE0000001FFFFFC000007FE03FF00000FF800FF80001FF00
+07FC0003FE0003FE0007FC0001FF000FF80000FF801FF80000FFC01FF80000FFC03FF800
+00FFE03FF000007FE07FF000007FF07FF000007FF07FF000007FF07FF000007FF0FFF000
+007FF8FFF000007FF8FFF000007FF8FFF000007FF8FFF000007FF8FFF000007FF8FFF000
+007FF8FFF000007FF8FFF000007FF8FFF000007FF87FF000007FF07FF000007FF07FF000
+007FF07FF000007FF03FF80000FFE03FF80000FFE01FF80000FFC00FF80000FF800FFC00
+01FF8007FE0003FF0003FF0007FE0001FF800FFC00007FE03FF000001FFFFFC0000007FF
+FF000000007FF000002D2B7DA934>111 D<00FF007FE00000FFFF07FFFC0000FFFF1FFF
+FF0000FFFF7F01FFC000FFFFF8007FF00007FFF0003FF80003FFE0001FFC0003FF80000F
+FE0003FF80000FFF0003FF000007FF0003FF000007FF8003FF000003FF8003FF000003FF
+C003FF000003FFC003FF000003FFC003FF000001FFC003FF000001FFE003FF000001FFE0
+03FF000001FFE003FF000001FFE003FF000001FFE003FF000001FFE003FF000001FFE003
+FF000001FFE003FF000001FFE003FF000001FFE003FF000001FFC003FF000003FFC003FF
+000003FFC003FF000003FFC003FF000007FF8003FF000007FF8003FF000007FF0003FF80
+000FFE0003FFC0001FFE0003FFE0001FFC0003FFF0003FF80003FFF800FFE00003FF7F03
+FFC00003FF1FFFFF000003FF07FFF8000003FF00FFC0000003FF000000000003FF000000
+000003FF000000000003FF000000000003FF000000000003FF000000000003FF00000000
+0003FF000000000003FF000000000003FF000000000003FF000000000003FF0000000000
+03FF0000000000FFFFFC00000000FFFFFC00000000FFFFFC00000000FFFFFC0000000033
+3B7DA83A>I<01FE01FC00FFFE07FF80FFFE0FFFE0FFFE3F1FF0FFFE3C1FF007FE783FF8
+03FEF03FF803FEE03FF803FFE03FF803FFC03FF803FFC01FF003FF800FE003FF80038003
+FF80000003FF80000003FF00000003FF00000003FF00000003FF00000003FF00000003FF
+00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00
+000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF0000
+0003FF00000003FF000000FFFFFF0000FFFFFF0000FFFFFF0000FFFFFF000025297DA82B
+>114 D<001FF80E0001FFFF3E0007FFFFFE000FE007FE001F8001FE003F0000FE007E00
+007E007C00003E00FC00003E00FC00001E00FC00001E00FE00001E00FF00001E00FF8000
+0000FFE0000000FFFF0000007FFFFC00007FFFFF80003FFFFFE0001FFFFFF8000FFFFFFC
+0003FFFFFE0000FFFFFF00003FFFFF000003FFFF8000000FFF80000001FFC0F000007FC0
+F000003FC0F800001FC0F800001FC0F800000FC0FC00000FC0FC00000FC0FE00000F80FE
+00001F80FF00001F00FF80003F00FFE0007E00FFF803FC00FCFFFFF000F03FFFC000E007
+FE0000222B7DA929>I<0007800000078000000780000007800000078000000F8000000F
+8000000F8000000F8000001F8000001F8000001F8000003F8000007F8000007F800000FF
+800001FF800007FF80001FFFFFFCFFFFFFFCFFFFFFFCFFFFFFFC01FF800001FF800001FF
+800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF
+800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF
+801E01FF801E01FF801E01FF801E01FF801E01FF801E01FF801E01FF801E01FF801E00FF
+803C00FFC03C00FFC03C007FE078003FF0F0001FFFE00007FFC00000FF001F3B7EB928>
+I<00FF000007F800FFFF0007FFF800FFFF0007FFF800FFFF0007FFF800FFFF0007FFF800
+07FF00003FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003
+FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF
+00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00
+001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF0000
+1FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00001FF80003FF00003F
+F80003FF00003FF80003FF00003FF80003FF00007FF80001FF0000FFF80001FF0000FFF8
+0001FF8001FFFC0000FF8007DFFFE0007FE01F9FFFE0001FFFFE1FFFE00007FFF81FFFE0
+0000FFE01FE000332A7CA83A>I<FFFFF8001FFFC0FFFFF8001FFFC0FFFFF8001FFFC0FF
+FFF8001FFFC003FF800003F80001FF800001E00001FFC00003E00000FFC00003C00000FF
+E00003C000007FE000078000007FF000078000007FF0000F8000003FF0000F0000003FF8
+001F0000001FF8001E0000001FFC003E0000000FFC003C0000000FFE007C00000007FE00
+7800000007FF00F800000003FF00F000000003FF81F000000001FF81E000000001FFC1E0
+00000000FFC3C000000000FFE3C000000000FFE7C0000000007FE780000000007FFF8000
+0000003FFF00000000003FFF00000000001FFE00000000001FFE00000000000FFC000000
+00000FFC000000000007F8000000000007F8000000000003F0000000000003F000000000
+0001E000000032287EA737>I<FFFFF8001FFFC0FFFFF8001FFFC0FFFFF8001FFFC0FFFF
+F8001FFFC003FF800003F80001FF800001E00001FFC00003E00000FFC00003C00000FFE0
+0003C000007FE000078000007FF000078000007FF0000F8000003FF0000F0000003FF800
+1F0000001FF8001E0000001FFC003E0000000FFC003C0000000FFE007C00000007FE0078
+00000007FF00F800000003FF00F000000003FF81F000000001FF81E000000001FFC1E000
+000000FFC3C000000000FFE3C000000000FFE7C0000000007FE780000000007FFF800000
+00003FFF00000000003FFF00000000001FFE00000000001FFE00000000000FFC00000000
+000FFC000000000007F8000000000007F8000000000003F0000000000003F00000000000
+01E0000000000001E0000000000003E0000000000003C0000000000007C0000000000007
+800000000C000F800000003F000F000000007F801F00000000FFC01E00000000FFC03E00
+000000FFC03C00000000FFC07800000000FFC0F8000000007F81F0000000007F03E00000
+00003E0FC0000000001FFF80000000000FFE000000000003F80000000000323B7EA737>
+121 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fi ecbx1440 14.4 33
+/Fi 33 122 df<07E01FF83FFC7FFE7FFEFFFFFFFFFFFFFFFFFFFFFFFF7FFE7FFE3FFC1F
+F807E01010768F25>46 D<000000000000C0000000000001E0000000000003E000000000
+0003E0000000000003C0000000000007C0000000000007C000000000000F800000000000
+0F8000000000000F0000000000001F0000000000001F0000000000003E0000000000003E
+0000000000003C0000000000007C0000000000007C000000000000F8000000000000F800
+0000000000F0000000000001F0000000000001F0000000000003E0000000000003E00000
+00000007C0000000000007C00000000000078000000000000F8000000000000F80000000
+00001F0000000000001F0000000000001E0000000000003E0000000000003E0000000000
+007C0000000000007C00000000000078000000000000F8000000000000F8000000000001
+F0000000000001F0000000000001E0000000000003E0000000000003E0000000000007C0
+000000000007C00000000000078000000000000F8000000000000F8000000000001F0000
+000000001F0000000000001E0000000000003E0000000000003E0000000000007C000000
+0000007C00000000000078000000000000F8000000000000F8000000000001F000000000
+0001F0000000000003E0000000000003E0000000000003C0000000000007C00000000000
+07C000000000000F8000000000000F8000000000000F0000000000001F0000000000001F
+0000000000003E0000000000003E0000000000003C0000000000007C0000000000007C00
+0000000000F8000000000000F8000000000000F0000000000001F0000000000001F00000
+00000003E0000000000003E0000000000003C0000000000007C0000000000007C0000000
+00000F8000000000000F8000000000000F0000000000001F0000000000001F0000000000
+003E0000000000003E0000000000003C0000000000007C0000000000007C000000000000
+F8000000000000F8000000000001F0000000000001F0000000000001E0000000000003E0
+000000000003E0000000000007C0000000000007C00000000000078000000000000F8000
+000000000F8000000000001F0000000000001F0000000000001E0000000000003E000000
+0000003E0000000000007C0000000000007C00000000000078000000000000F800000000
+0000F8000000000000F000000000000060000000000000337879D942>I<0000001E0000
+0000003E0000000000FE0000000003FE000000000FFE000000007FFE00000007FFFE0000
+03FFFFFE0000FFFFFFFE0000FFFFFFFE0000FFFFFFFE0000FFF87FFE0000FC007FFE0000
+00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000
+00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000
+00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000
+00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000
+00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000
+00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000
+00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000
+00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000
+00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000
+00007FFE000000007FFE000000007FFE000000007FFE000000007FFE000000007FFE0000
+7FFFFFFFFFFC7FFFFFFFFFFC7FFFFFFFFFFC7FFFFFFFFFFC7FFFFFFFFFFC2E4E76CD42>
+49 D<00001FFE0000000001FFFFF00000000FFFFFFC0000003FFFFFFF8000007FFFFFFF
+E00001FF803FFFF00003FC0007FFFC0007F00001FFFE000FE00000FFFF001F8000007FFF
+803F0000003FFF803F0000001FFFC07FE000001FFFE07FF800000FFFE07FFC00000FFFF0
+FFFC000007FFF0FFFE000007FFF0FFFE000003FFF8FFFE000003FFF8FFFE000003FFF8FF
+FE000003FFF8FFFE000003FFF87FFC000003FFF87FFC000003FFF83FF8000003FFF81FF0
+000003FFF80380000003FFF80000000003FFF00000000007FFF00000000007FFF0000000
+0007FFE0000000000FFFE0000000000FFFC0000000001FFFC0000000001FFF8000000000
+3FFF00000000003FFE00000000007FFC0000000000FFF80000000000FFF00000000001FF
+E00000000003FFC00000000007FF800000000007FF00000000000FFC00000000001FF800
+000000003FF000000000007FC00000000000FF800000000001FF000000000003FC000000
+000007F800000000000FF00000F800001FE00000F800003FC00000F800007F000000F800
+00FE000001F00001FC000001F00003F8000001F00007F0000001F00007E0000001F0000F
+80000003F0001F00000003F0003E00000007F0007FFFFFFFFFF000FFFFFFFFFFE001FFFF
+FFFFFFE003FFFFFFFFFFE007FFFFFFFFFFE00FFFFFFFFFFFE01FFFFFFFFFFFE03FFFFFFF
+FFFFE07FFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFC0FFFFFFFFFFFFC0FFFFFFFFFF
+FFC0FFFFFFFFFFFFC0354E7ACD42>I<000007FFC0000000007FFFFC00000003FFFFFF80
+00000FFFFFFFE000001FF803FFF800007FC000FFFC0000FE00003FFE0001FC00003FFF00
+03F800001FFF8003FE00001FFF8007FF80000FFFC007FFC0000FFFC00FFFC0000FFFE00F
+FFE0000FFFE00FFFE0000FFFE00FFFE0000FFFE00FFFE0000FFFE00FFFE0000FFFE00FFF
+E0000FFFE007FFC0000FFFE007FFC0000FFFC003FF80000FFFC001FF00001FFFC0003800
+001FFF80000000001FFF80000000003FFF00000000003FFF00000000007FFE0000000000
+7FFC0000000000FFF80000000001FFF00000000003FFC0000000000FFF80000000007FFE
+000000007FFFF8000000007FFFC0000000007FFFFC000000007FFFFF800000000003FFE0
+00000000007FF800000000003FFE00000000001FFF00000000000FFF80000000000FFFC0
+0000000007FFE00000000007FFF00000000003FFF80000000003FFF80000000003FFFC00
+00000001FFFC0000000001FFFC0000000001FFFE0000000001FFFE0000000001FFFE03C0
+000001FFFE0FF0000001FFFE3FFC000001FFFE7FFE000001FFFE7FFE000001FFFEFFFF00
+0001FFFEFFFF000001FFFEFFFF000001FFFCFFFF000001FFFCFFFF000003FFFCFFFF0000
+03FFF8FFFF000003FFF87FFE000003FFF07FFC000007FFF07FF8000007FFE03FE000000F
+FFC01FC000001FFFC00FF000003FFF8007FE00007FFE0003FFE003FFFC0001FFFFFFFFF8
+00007FFFFFFFE000000FFFFFFF00000001FFFFFC000000001FFF800000374F7BCD42>I<
+0000000000FC00000000000001FC00000000000001FC00000000000003FC000000000000
+07FC0000000000000FFC0000000000000FFC0000000000001FFC0000000000003FFC0000
+000000007FFC0000000000007FFC000000000000FFFC000000000001FFFC000000000003
+FFFC000000000003FFFC000000000007FFFC00000000000FFFFC00000000001FFFFC0000
+0000001F7FFC00000000003E7FFC00000000007E7FFC0000000000FC7FFC0000000000F8
+7FFC0000000001F07FFC0000000003F07FFC0000000007E07FFC0000000007C07FFC0000
+00000F807FFC000000001F807FFC000000003F007FFC000000003E007FFC000000007C00
+7FFC00000000FC007FFC00000001F8007FFC00000001F0007FFC00000003E0007FFC0000
+0007E0007FFC0000000FC0007FFC0000000F80007FFC0000001F00007FFC0000003F0000
+7FFC0000007E00007FFC0000007C00007FFC000000F800007FFC000001F800007FFC0000
+03F000007FFC000003E000007FFC000007C000007FFC00000FC000007FFC00001F800000
+7FFC00001F0000007FFC00003E0000007FFC00007E0000007FFC0000FC0000007FFC0000
+FFFFFFFFFFFFFF80FFFFFFFFFFFFFF80FFFFFFFFFFFFFF80FFFFFFFFFFFFFF80FFFFFFFF
+FFFFFF8000000000FFFC000000000000FFFC000000000000FFFC000000000000FFFC0000
+00000000FFFC000000000000FFFC000000000000FFFC000000000000FFFC000000000000
+FFFC000000000000FFFC000000000000FFFC000000000000FFFC000000000000FFFC0000
+00000000FFFC000000000000FFFC000000001FFFFFFFFF8000001FFFFFFFFF8000001FFF
+FFFFFF8000001FFFFFFFFF8000001FFFFFFFFF80394F7CCE42>I<00000007FE00000000
+00FFFFC000000003FFFFF00000001FFFFFFC0000007FFC01FE000000FFE0007F000003FF
+80003F800007FF00001F80000FFE00007FC0001FFC0000FFC0003FF80003FFE0007FF000
+03FFE000FFE00007FFE001FFE00007FFE003FFC00007FFE003FFC00007FFE007FF800007
+FFE007FF800007FFE00FFF800003FFC00FFF000003FFC01FFF000000FF001FFF0000007E
+001FFF00000000003FFF00000000003FFF00000000003FFE00000000007FFE0000000000
+7FFE00000000007FFE003FF000007FFE01FFFF00007FFE07FFFFC000FFFE0FFFFFF000FF
+FE1F807FF800FFFE3E001FFE00FFFE78000FFF00FFFEF00007FF80FFFEF00003FFC0FFFF
+E00003FFC0FFFFC00001FFE0FFFFC00001FFF0FFFF800001FFF0FFFF800000FFF8FFFF80
+0000FFF8FFFF000000FFFCFFFF000000FFFCFFFF000000FFFCFFFF000000FFFCFFFE0000
+00FFFEFFFE000000FFFEFFFE000000FFFE7FFE000000FFFE7FFE000000FFFE7FFE000000
+FFFE7FFE000000FFFE7FFE000000FFFE7FFE000000FFFE3FFE000000FFFE3FFE000000FF
+FE3FFE000000FFFE3FFF000000FFFE1FFF000000FFFC1FFF000000FFFC1FFF000000FFFC
+0FFF000000FFF80FFF000001FFF807FF000001FFF807FF800001FFF003FF800001FFE001
+FFC00003FFE001FFE00003FFC000FFE00007FF80007FF0000FFF00003FFC001FFE00001F
+FF00FFFC000007FFFFFFF0000003FFFFFFE0000000FFFFFF800000001FFFFC0000000003
+FFC00000374F7BCD42>54 D<07E01FF83FFC7FFE7FFEFFFFFFFFFFFFFFFFFFFFFFFF7FFE
+7FFE3FFC1FF807E000000000000000000000000000000000000000000000000000000000
+000000000000000000000000000007E01FF83FFC7FFE7FFEFFFFFFFFFFFFFFFFFFFFFFFF
+7FFE7FFE3FFC1FF807E0103576B425>58 D<FFFFFFFFFFFFFE000000FFFFFFFFFFFFFFF0
+0000FFFFFFFFFFFFFFFE0000FFFFFFFFFFFFFFFF8000FFFFFFFFFFFFFFFFE000000FFFC0
+00001FFFF000000FFFC0000003FFF800000FFFC0000001FFFC00000FFFC00000007FFE00
+000FFFC00000007FFF00000FFFC00000003FFF80000FFFC00000001FFFC0000FFFC00000
+001FFFC0000FFFC00000000FFFE0000FFFC00000000FFFE0000FFFC00000000FFFE0000F
+FFC000000007FFF0000FFFC000000007FFF0000FFFC000000007FFF0000FFFC000000007
+FFF0000FFFC000000007FFF0000FFFC000000007FFF0000FFFC000000007FFF0000FFFC0
+00000007FFF0000FFFC000000007FFF0000FFFC00000000FFFE0000FFFC00000000FFFE0
+000FFFC00000000FFFE0000FFFC00000001FFFC0000FFFC00000001FFF80000FFFC00000
+003FFF80000FFFC00000007FFF00000FFFC00000007FFE00000FFFC0000000FFFC00000F
+FFC0000003FFF800000FFFC0000007FFE000000FFFC000003FFFC000000FFFFFFFFFFFFF
+0000000FFFFFFFFFFFF80000000FFFFFFFFFFFF80000000FFFFFFFFFFFFF8000000FFFC0
+00001FFFE000000FFFC0000001FFF800000FFFC00000007FFE00000FFFC00000003FFF00
+000FFFC00000000FFFC0000FFFC00000000FFFE0000FFFC000000007FFF0000FFFC00000
+0003FFF0000FFFC000000003FFF8000FFFC000000001FFFC000FFFC000000001FFFC000F
+FFC000000000FFFE000FFFC000000000FFFE000FFFC000000000FFFE000FFFC000000000
+FFFF000FFFC000000000FFFF000FFFC000000000FFFF000FFFC000000000FFFF000FFFC0
+00000000FFFF000FFFC000000000FFFF000FFFC000000000FFFF000FFFC000000000FFFF
+000FFFC000000000FFFF000FFFC000000000FFFE000FFFC000000000FFFE000FFFC00000
+0001FFFE000FFFC000000001FFFC000FFFC000000001FFFC000FFFC000000003FFFC000F
+FFC000000007FFF8000FFFC000000007FFF0000FFFC00000000FFFF0000FFFC00000001F
+FFE0000FFFC00000007FFFC0000FFFC0000001FFFF80000FFFC000000FFFFE00FFFFFFFF
+FFFFFFFFFC00FFFFFFFFFFFFFFFFF000FFFFFFFFFFFFFFFFC000FFFFFFFFFFFFFFFE0000
+FFFFFFFFFFFFFFC0000050527BD15D>66 D<0000000003FFF0000007000000007FFFFF00
+000F00000007FFFFFFE0001F0000003FFFFFFFF8003F000000FFFFFFFFFE007F000003FF
+FFC003FF00FF00000FFFF800003FC1FF00003FFFC000000FE3FF0000FFFF00000003FFFF
+0001FFFC00000001FFFF0003FFF800000000FFFF0007FFE0000000007FFF001FFFC00000
+00003FFF003FFF80000000001FFF003FFF00000000000FFF007FFE000000000007FF00FF
+FC000000000003FF01FFFC000000000003FF01FFF8000000000001FF03FFF00000000000
+01FF07FFF0000000000000FF07FFF0000000000000FF0FFFE00000000000007F0FFFE000
+00000000007F1FFFC00000000000007F1FFFC00000000000003F1FFFC00000000000003F
+3FFF800000000000003F3FFF800000000000001F3FFF800000000000001F7FFF80000000
+0000001F7FFF800000000000001F7FFF80000000000000007FFF00000000000000007FFF
+0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF000000000000
+0000FFFF0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF0000
+000000000000FFFF0000000000000000FFFF0000000000000000FFFF0000000000000000
+FFFF0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF00000000
+000000007FFF00000000000000007FFF00000000000000007FFF80000000000000007FFF
+80000000000000007FFF80000000000000003FFF800000000000001F3FFF800000000000
+001F3FFF800000000000001F1FFFC00000000000001F1FFFC00000000000001F1FFFC000
+00000000003F0FFFE00000000000003F0FFFE00000000000003E07FFF00000000000003E
+07FFF00000000000007E03FFF80000000000007C01FFF8000000000000FC01FFFC000000
+000000F800FFFC000000000001F8007FFE000000000003F0003FFF000000000003F0003F
+FF800000000007E0001FFFC0000000000FC00007FFE0000000001F800003FFF800000000
+3F000001FFFC00000000FE000000FFFF00000001FC0000003FFFC0000007F80000000FFF
+FC00003FF000000003FFFFC001FFC000000000FFFFFFFFFF00000000003FFFFFFFFC0000
+00000007FFFFFFF00000000000007FFFFF8000000000000003FFF0000000505479D25F>
+I<FFFFFFFFFFFFFF0000000000FFFFFFFFFFFFFFF800000000FFFFFFFFFFFFFFFF000000
+00FFFFFFFFFFFFFFFFE0000000FFFFFFFFFFFFFFFFF80000000007FFF000001FFFFE0000
+000007FFF0000001FFFF0000000007FFF00000003FFFC000000007FFF00000000FFFE000
+000007FFF000000003FFF000000007FFF000000001FFF800000007FFF000000000FFFC00
+000007FFF0000000007FFE00000007FFF0000000003FFF00000007FFF0000000001FFF80
+000007FFF0000000000FFF80000007FFF00000000007FFC0000007FFF00000000007FFE0
+000007FFF00000000003FFE0000007FFF00000000003FFF0000007FFF00000000001FFF0
+000007FFF00000000001FFF8000007FFF00000000001FFF8000007FFF00000000000FFFC
+000007FFF00000000000FFFC000007FFF00000000000FFFC000007FFF00000000000FFFE
+000007FFF000000000007FFE000007FFF000000000007FFE000007FFF000000000007FFF
+000007FFF000000000007FFF000007FFF000000000007FFF000007FFF000000000007FFF
+000007FFF000000000007FFF000007FFF000000000007FFF800007FFF000000000007FFF
+800007FFF000000000007FFF800007FFF000000000007FFF800007FFF000000000007FFF
+800007FFF000000000007FFF800007FFF000000000007FFF800007FFF000000000007FFF
+800007FFF000000000007FFF800007FFF000000000007FFF800007FFF000000000007FFF
+800007FFF000000000007FFF800007FFF000000000007FFF800007FFF000000000007FFF
+800007FFF000000000007FFF800007FFF000000000007FFF000007FFF000000000007FFF
+000007FFF000000000007FFF000007FFF000000000007FFF000007FFF000000000007FFF
+000007FFF000000000007FFE000007FFF000000000007FFE000007FFF00000000000FFFE
+000007FFF00000000000FFFC000007FFF00000000000FFFC000007FFF00000000000FFFC
+000007FFF00000000001FFF8000007FFF00000000001FFF8000007FFF00000000003FFF0
+000007FFF00000000003FFF0000007FFF00000000007FFE0000007FFF00000000007FFE0
+000007FFF0000000000FFFC0000007FFF0000000001FFF80000007FFF0000000001FFF00
+000007FFF0000000003FFE00000007FFF0000000007FFE00000007FFF000000001FFFC00
+000007FFF000000003FFF000000007FFF00000000FFFE000000007FFF00000003FFFC000
+000007FFF0000001FFFF8000000007FFF000001FFFFE000000FFFFFFFFFFFFFFFFF80000
+00FFFFFFFFFFFFFFFFE0000000FFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFF8000000
+00FFFFFFFFFFFFFF000000000059527CD165>I<FFFFFFFFFFE0000000FFFFFFFFFFE000
+0000FFFFFFFFFFE0000000FFFFFFFFFFE0000000FFFFFFFFFFE0000000000FFFE0000000
+0000000FFFE00000000000000FFFE00000000000000FFFE00000000000000FFFE0000000
+0000000FFFE00000000000000FFFE00000000000000FFFE00000000000000FFFE0000000
+0000000FFFE00000000000000FFFE00000000000000FFFE00000000000000FFFE0000000
+0000000FFFE00000000000000FFFE00000000000000FFFE00000000000000FFFE0000000
+0000000FFFE00000000000000FFFE00000000000000FFFE00000000000000FFFE0000000
+0000000FFFE00000000000000FFFE00000000000000FFFE00000000000000FFFE0000000
+0000000FFFE00000000000000FFFE00000000000000FFFE00000000000000FFFE0000000
+0000000FFFE00000000000000FFFE00000000000000FFFE00000000000000FFFE0000000
+0000000FFFE00000000000000FFFE00000000000000FFFE00000000000000FFFE0000000
+0000000FFFE00000000000000FFFE00000000000000FFFE00000000000000FFFE0000000
+0000000FFFE00000000000000FFFE00000000000000FFFE00000000000000FFFE0000000
+0000000FFFE000000000F8000FFFE000000000F8000FFFE000000000F8000FFFE0000000
+00F8000FFFE000000001F8000FFFE000000001F0000FFFE000000001F0000FFFE0000000
+01F0000FFFE000000001F0000FFFE000000001F0000FFFE000000003F0000FFFE0000000
+03F0000FFFE000000003F0000FFFE000000007F0000FFFE000000007F0000FFFE0000000
+0FF0000FFFE00000000FE0000FFFE00000001FE0000FFFE00000001FE0000FFFE0000000
+3FE0000FFFE00000007FE0000FFFE0000000FFE0000FFFE0000001FFE0000FFFE0000007
+FFE0000FFFE000000FFFE0000FFFE000007FFFE0000FFFE00003FFFFE0FFFFFFFFFFFFFF
+FFC0FFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFF
+FFC045527CD14F>76 D<FFFFFFF000000000000001FFFFFFF0FFFFFFF800000000000003
+FFFFFFF0FFFFFFFC00000000000007FFFFFFF0FFFFFFFC00000000000007FFFFFFF0FFFF
+FFFC00000000000007FFFFFFF00007FFFE0000000000000FFFFE00000007FFFE00000000
+00000FFFFE00000007DFFF0000000000001F7FFE00000007DFFF0000000000001F7FFE00
+000007CFFF8000000000003E7FFE00000007CFFF8000000000003E7FFE00000007CFFF80
+00000000003E7FFE00000007C7FFC000000000007C7FFE00000007C7FFC000000000007C
+7FFE00000007C3FFE00000000000F87FFE00000007C3FFE00000000000F87FFE00000007
+C1FFF00000000001F07FFE00000007C1FFF00000000001F07FFE00000007C0FFF8000000
+0003E07FFE00000007C0FFF80000000003E07FFE00000007C0FFF80000000003E07FFE00
+000007C07FFC0000000007C07FFE00000007C07FFC0000000007C07FFE00000007C03FFE
+000000000F807FFE00000007C03FFE000000000F807FFE00000007C01FFF000000001F00
+7FFE00000007C01FFF000000001F007FFE00000007C01FFF000000001F007FFE00000007
+C00FFF800000003E007FFE00000007C00FFF800000003E007FFE00000007C007FFC00000
+007C007FFE00000007C007FFC00000007C007FFE00000007C003FFE0000000F8007FFE00
+000007C003FFE0000000F8007FFE00000007C003FFE0000000F8007FFE00000007C001FF
+F0000001F0007FFE00000007C001FFF0000001F0007FFE00000007C000FFF8000003E000
+7FFE00000007C000FFF8000003E0007FFE00000007C0007FFC000007C0007FFE00000007
+C0007FFC000007C0007FFE00000007C0007FFC000007C0007FFE00000007C0003FFE0000
+0F80007FFE00000007C0003FFE00000F80007FFE00000007C0001FFF00001F00007FFE00
+000007C0001FFF00001F00007FFE00000007C0000FFF80003E00007FFE00000007C0000F
+FF80003E00007FFE00000007C0000FFF80003E00007FFE00000007C00007FFC0007C0000
+7FFE00000007C00007FFC0007C00007FFE00000007C00003FFE000F800007FFE00000007
+C00003FFE000F800007FFE00000007C00001FFF001F000007FFE00000007C00001FFF001
+F000007FFE00000007C00000FFF803E000007FFE00000007C00000FFF803E000007FFE00
+000007C00000FFF803E000007FFE00000007C000007FFC07C000007FFE00000007C00000
+7FFC07C000007FFE00000007C000003FFE0F8000007FFE00000007C000003FFE0F800000
+7FFE00000007C000001FFF1F0000007FFE00000007C000001FFF1F0000007FFE00000007
+C000001FFF1F0000007FFE00000007C000000FFFBE0000007FFE00000007C000000FFFBE
+0000007FFE00000007C0000007FFFC0000007FFE00000007C0000007FFFC0000007FFE00
+000007C0000003FFF80000007FFE00000007C0000003FFF80000007FFE00000007C00000
+03FFF80000007FFE00000007C0000001FFF00000007FFE00000007C0000001FFF0000000
+7FFE00000007C0000000FFE00000007FFE00000007C0000000FFE00000007FFE0000001F
+F00000007FC00000007FFE0000FFFFFFFE00007FC0000FFFFFFFFFF0FFFFFFFE00007FC0
+000FFFFFFFFFF0FFFFFFFE00003F80000FFFFFFFFFF0FFFFFFFE00003F80000FFFFFFFFF
+F0FFFFFFFE00001F00000FFFFFFFFFF074527CD17D>I<FFFFFFFFFFFFE00000000000FF
+FFFFFFFFFFFF0000000000FFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFE00000000FF
+FFFFFFFFFFFFFF800000000007FFF00000FFFFE00000000007FFF000000FFFF000000000
+07FFF0000003FFFC0000000007FFF0000000FFFE0000000007FFF00000007FFF00000000
+07FFF00000003FFF8000000007FFF00000001FFF8000000007FFF00000001FFFC0000000
+07FFF00000000FFFE000000007FFF00000000FFFE000000007FFF00000000FFFF0000000
+07FFF000000007FFF000000007FFF000000007FFF000000007FFF000000007FFF8000000
+07FFF000000007FFF800000007FFF000000007FFF800000007FFF000000007FFF8000000
+07FFF000000007FFF800000007FFF000000007FFF800000007FFF000000007FFF8000000
+07FFF000000007FFF800000007FFF000000007FFF000000007FFF000000007FFF0000000
+07FFF00000000FFFF000000007FFF00000000FFFE000000007FFF00000000FFFC0000000
+07FFF00000001FFFC000000007FFF00000001FFF8000000007FFF00000003FFF00000000
+07FFF00000007FFE0000000007FFF0000000FFFC0000000007FFF0000003FFF800000000
+07FFF000000FFFE00000000007FFF00000FFFF800000000007FFFFFFFFFFFE0000000000
+07FFFFFFFFFFF0000000000007FFFFFFFFFFC0000000000007FFFFFFFFFFF00000000000
+07FFF00007FFFC000000000007FFF00000FFFF000000000007FFF000003FFF8000000000
+07FFF000001FFFC00000000007FFF000000FFFE00000000007FFF0000007FFF000000000
+07FFF0000003FFF80000000007FFF0000003FFF80000000007FFF0000001FFFC00000000
+07FFF0000001FFFC0000000007FFF0000000FFFC0000000007FFF0000000FFFE00000000
+07FFF0000000FFFE0000000007FFF0000000FFFE0000000007FFF0000000FFFE00000000
+07FFF0000000FFFE0000000007FFF0000000FFFE0000000007FFF0000000FFFE00000000
+07FFF0000000FFFE0000000007FFF0000000FFFF0000000007FFF0000000FFFF00000000
+07FFF0000000FFFF0000000007FFF0000000FFFF0000000007FFF0000000FFFF00000000
+07FFF0000000FFFF0000000007FFF0000000FFFF0000000007FFF0000000FFFF00007000
+07FFF0000000FFFF8000F80007FFF0000000FFFF8000F80007FFF00000007FFF8000F800
+07FFF00000007FFF8001F80007FFF00000003FFFC001F00007FFF00000003FFFC001F000
+07FFF00000001FFFE003F0FFFFFFFFFF80000FFFF007E0FFFFFFFFFF800007FFFC1FC0FF
+FFFFFFFF800001FFFFFF80FFFFFFFFFF8000007FFFFF00FFFFFFFFFF8000000FFFFE0000
+0000000000000000FFF8005D537CD162>82 D<3FFFFFFFFF0001FFFFFFFC003FFFFFFFFF
+0001FFFFFFFC003FFFFFFFFF0001FFFFFFFC003FFFFFFFFF0001FFFFFFFC003FFFFFFFFF
+0001FFFFFFFC000003FFFE00000003FFE000000003FFFF000000007E0000000001FFFF00
+0000007E0000000000FFFF80000000FC00000000007FFFC0000001F800000000007FFFC0
+000003F800000000003FFFE0000003F000000000001FFFF0000007E000000000001FFFF0
+00000FC000000000000FFFF800001FC0000000000007FFFC00001F80000000000007FFFC
+00003F00000000000003FFFE00007E00000000000001FFFF00007E00000000000001FFFF
+8000FC00000000000000FFFF8001F8000000000000007FFFC003F8000000000000003FFF
+E003F0000000000000003FFFE007E0000000000000001FFFF00FC0000000000000000FFF
+F81FC0000000000000000FFFF81F800000000000000007FFFC3F000000000000000003FF
+FE7E000000000000000003FFFE7E000000000000000001FFFFFC000000000000000000FF
+FFF8000000000000000000FFFFF80000000000000000007FFFF00000000000000000003F
+FFE00000000000000000001FFFF00000000000000000001FFFF00000000000000000000F
+FFF800000000000000000007FFFC00000000000000000007FFFC00000000000000000003
+FFFE00000000000000000001FFFF00000000000000000001FFFF00000000000000000003
+FFFF80000000000000000003FFFFC0000000000000000007FFFFE000000000000000000F
+FFFFE000000000000000001FDFFFF000000000000000001F8FFFF800000000000000003F
+0FFFF800000000000000007E07FFFC00000000000000007E03FFFE0000000000000000FC
+03FFFE0000000000000001F801FFFF0000000000000003F800FFFF8000000000000003F0
+00FFFF8000000000000007E0007FFFC00000000000000FC0003FFFE00000000000001FC0
+003FFFF00000000000001F80001FFFF00000000000003F00000FFFF80000000000007E00
+0007FFFC0000000000007E000007FFFC000000000000FC000003FFFE000000000001F800
+0001FFFF000000000003F8000001FFFF000000000003F0000000FFFF800000000007E000
+00007FFFC0000000000FC00000007FFFC0000000001FC00000003FFFE0000000001F8000
+00001FFFF0000000003F000000001FFFF8000000007E000000000FFFF8000000007E0000
+000007FFFC00000000FC0000000003FFFE00000001F80000000003FFFE0000000FFF0000
+000001FFFF0000FFFFFFFF000003FFFFFFFFF0FFFFFFFF000003FFFFFFFFF0FFFFFFFF00
+0003FFFFFFFFF0FFFFFFFF000003FFFFFFFFF0FFFFFFFF000003FFFFFFFFF05C527DD163
+>88 D<00003FFE000000000007FFFFE0000000001FFFFFFC000000007FFFFFFF00000001
+FFC00FFFC0000003FE0003FFE0000007FF0000FFF0000007FF80007FF800000FFFC0007F
+FC00000FFFC0003FFE00000FFFC0003FFE00000FFFC0001FFF00000FFFC0001FFF00000F
+FFC0001FFF00000FFFC0000FFF800007FF80000FFF800003FF00000FFF800001FE00000F
+FF8000000000000FFF8000000000000FFF8000000000000FFF8000000000000FFF800000
+0000000FFF8000000000000FFF800000000007FFFF8000000003FFFFFF800000007FFFFF
+FF80000003FFFFFFFF8000001FFFF00FFF8000007FFF000FFF800000FFFC000FFF800003
+FFF0000FFF800007FFC0000FFF80000FFF80000FFF80001FFF00000FFF80003FFF00000F
+FF80003FFE00000FFF80007FFC00000FFF80007FFC00000FFF81F0FFFC00000FFF81F0FF
+F800000FFF81F0FFF800000FFF81F0FFF800000FFF81F0FFF800001FFF81F0FFF800001F
+FF81F0FFFC00003FFF81F07FFC00003FFF81F07FFE00007FFF81F03FFE0000F7FFC3F03F
+FF0001E3FFC3E01FFFC007E3FFFFE007FFF01F81FFFFC003FFFFFF00FFFF8000FFFFFC00
+7FFF00001FFFF0003FFC000001FF800007F0003C387CB642>97 D<000003FFE000000000
+3FFFFE00000000FFFFFF80000003FFFFFFE000000FFF003FF800003FFC0007FC00007FF8
+000FFE0000FFF0001FFE0001FFE0003FFF0003FFC0003FFF0007FF80003FFF0007FF8000
+3FFF000FFF00003FFF001FFF00003FFF001FFE00003FFF003FFE00001FFE003FFE00000F
+FC003FFE000007F8007FFE00000000007FFC00000000007FFC00000000007FFC00000000
+00FFFC0000000000FFFC0000000000FFFC0000000000FFFC0000000000FFFC0000000000
+FFFC0000000000FFFC0000000000FFFC0000000000FFFC0000000000FFFC0000000000FF
+FC0000000000FFFC0000000000FFFC00000000007FFC00000000007FFE00000000007FFE
+00000000007FFE00000000003FFE00000000003FFF00000000001FFF0000000F801FFF00
+00000F800FFF8000001F800FFF8000001F0007FFC000003F0003FFE000003E0001FFF000
+007E0000FFF80000FC00007FFC0001F800003FFF0007F000000FFFC01FE0000007FFFFFF
+80000001FFFFFE000000003FFFF80000000003FF80000031387CB63A>99
+D<000000000003FF8000000000000FFFFF8000000000000FFFFF8000000000000FFFFF80
+00000000000FFFFF8000000000000FFFFF800000000000003FFF800000000000000FFF80
+0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80
+0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80
+0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80
+0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80
+0000000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80
+0000000000000FFF8000000003FF800FFF800000003FFFF80FFF80000001FFFFFE0FFF80
+000007FFFFFF8FFF8000001FFFC03FEFFF8000003FFE0007FFFF8000007FF80001FFFF80
+0000FFF00000FFFF800001FFE000007FFF800003FFC000003FFF800007FF8000001FFF80
+000FFF8000000FFF80000FFF0000000FFF80001FFF0000000FFF80001FFE0000000FFF80
+003FFE0000000FFF80003FFE0000000FFF80007FFE0000000FFF80007FFC0000000FFF80
+007FFC0000000FFF80007FFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF80
+00FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF80
+00FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF80
+00FFFC0000000FFF8000FFFC0000000FFF8000FFFC0000000FFF80007FFC0000000FFF80
+007FFC0000000FFF80007FFC0000000FFF80007FFE0000000FFF80003FFE0000000FFF80
+003FFE0000000FFF80003FFE0000000FFF80001FFE0000000FFF80001FFF0000000FFF80
+000FFF0000001FFF800007FF8000003FFF800007FF8000007FFF800003FFC00000FFFF80
+0001FFE00001FFFF800000FFF00003FFFFE000007FFC000FEFFFFF80001FFF007F8FFFFF
+800007FFFFFF0FFFFF800001FFFFFC0FFFFF8000007FFFE00FFFFF80000007FF000FFE00
+0041547CD249>I<000007FF80000000007FFFF800000001FFFFFE00000007FFFFFF8000
+001FFF03FFE000003FFC007FF000007FF0003FF80000FFE0001FFC0001FFC0000FFC0003
+FF800007FE0007FF800007FF000FFF000003FF000FFF000003FF801FFE000003FF801FFE
+000001FF803FFE000001FFC03FFE000001FFC03FFE000001FFC07FFC000001FFC07FFC00
+0001FFE07FFC000000FFE07FFC000000FFE0FFFC000000FFE0FFFC000000FFE0FFFFFFFF
+FFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFC0000000000FFFC000000
+0000FFFC0000000000FFFC0000000000FFFC0000000000FFFC00000000007FFC00000000
+007FFC00000000007FFC00000000007FFE00000000003FFE00000000003FFE0000000000
+3FFE00000003E01FFF00000003E01FFF00000007E00FFF00000007C007FF8000000FC007
+FF8000000F8003FFC000001F8001FFE000003F0000FFF000007E00007FFC0001FC00001F
+FF0007F800000FFFE03FF0000003FFFFFFC0000000FFFFFF800000003FFFFC0000000001
+FFE0000033387CB63C>I<00001FFE0000FE000001FFFFE007FF80000FFFFFFC1FFFC000
+3FFFFFFF7FFFE0007FF807FFFF07E001FFE001FFF07FE003FFC000FFF07FE007FF80007F
+F83FE007FF00003FF83FC00FFF00003FFC1FC01FFF00003FFE07001FFE00001FFE00001F
+FE00001FFE00003FFE00001FFF00003FFE00001FFF00003FFE00001FFF00003FFE00001F
+FF00003FFE00001FFF00003FFE00001FFF00003FFE00001FFF00003FFE00001FFF00003F
+FE00001FFF00001FFE00001FFE00001FFE00001FFE00001FFF00003FFE00000FFF00003F
+FC000007FF00003FF8000007FF80007FF8000003FFC000FFF0000001FFE001FFE0000000
+FFF807FF80000001FFFFFFFF00000003EFFFFFFC00000003C1FFFFE000000007C01FFE00
+000000078000000000000007800000000000000FC00000000000000FC00000000000000F
+C00000000000000FE00000000000000FE00000000000000FF00000000000000FFC000000
+0000000FFFFFFFFE00000007FFFFFFFFF0000007FFFFFFFFFC000007FFFFFFFFFF800003
+FFFFFFFFFFC00003FFFFFFFFFFF00001FFFFFFFFFFF80000FFFFFFFFFFFC00007FFFFFFF
+FFFC0001FFFFFFFFFFFE0007FFFFFFFFFFFE000FFC000003FFFF001FF80000003FFF003F
+F00000000FFF007FE000000007FF807FE000000003FF80FFC000000003FF80FFC0000000
+01FF80FFC000000001FF80FFC000000001FF80FFC000000001FF80FFC000000001FF80FF
+E000000003FF807FE000000003FF007FF000000007FF003FF000000007FE001FF8000000
+0FFC001FFE0000003FFC0007FF0000007FF00003FFC00001FFE00000FFFC001FFF800000
+3FFFFFFFFE0000000FFFFFFFF800000001FFFFFFC0000000000FFFF80000003B4F7CB542
+>103 D<003FF8000000000000FFFFF8000000000000FFFFF8000000000000FFFFF80000
+00000000FFFFF8000000000000FFFFF800000000000003FFF800000000000000FFF80000
+0000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80000
+0000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80000
+0000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80000
+0000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80000
+0000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80000
+0000000000FFF800000000000000FFF8001FFC00000000FFF800FFFF80000000FFF803FF
+FFE0000000FFF80FFFFFF8000000FFF81FC07FFC000000FFF87E003FFE000000FFF8F800
+1FFF000000FFF9F0001FFF000000FFF9E0000FFF800000FFFBC0000FFF800000FFFF8000
+0FFF800000FFFF000007FFC00000FFFF000007FFC00000FFFE000007FFC00000FFFE0000
+07FFC00000FFFC000007FFC00000FFFC000007FFC00000FFFC000007FFC00000FFFC0000
+07FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF80000
+07FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF80000
+07FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF80000
+07FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF80000
+07FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF80000
+07FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF80000
+07FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF80000
+07FFC00000FFF8000007FFC00000FFF8000007FFC000FFFFFFF807FFFFFFC0FFFFFFF807
+FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC042537CD249
+>I<003F000000FFC00001FFE00003FFF00003FFF00007FFF80007FFF80007FFF80007FF
+F80007FFF80007FFF80003FFF00003FFF00001FFE00000FFC000003F0000000000000000
+000000000000000000000000000000000000000000000000000000000000000000000000
+0000000000000000000000000000001FF800FFFFF800FFFFF800FFFFF800FFFFF800FFFF
+F80001FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FF
+F80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FF
+F80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FF
+F80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FF
+F80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF800FFFFFFF0FFFF
+FFF0FFFFFFF0FFFFFFF0FFFFFFF01C547CD324>I<003FF800FFFFF800FFFFF800FFFFF8
+00FFFFF800FFFFF80003FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF8
+0000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF8
+0000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF8
+0000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF8
+0000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF8
+0000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF8
+0000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF8
+0000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF80000FFF8
+0000FFF80000FFF800FFFFFFF8FFFFFFF8FFFFFFF8FFFFFFF8FFFFFFF81D537CD224>
+108 D<003FF0001FF8000001FF800000FFFFF000FFFF80000FFFF80000FFFFF003FFFFE0
+003FFFFE0000FFFFF00FFFFFF000FFFFFF0000FFFFF03F80FFF803F80FFF8000FFFFF07E
+007FFC07E007FFC00003FFF0F8003FFE0F8003FFE00000FFF1F0001FFE1F0001FFE00000
+FFF3E0001FFF3E0001FFF00000FFF3C0001FFF3C0001FFF00000FFF780001FFF780001FF
+F00000FFF700000FFFF00000FFF80000FFFF00000FFFF00000FFF80000FFFE00000FFFE0
+0000FFF80000FFFE00000FFFE00000FFF80000FFFC00000FFFC00000FFF80000FFFC0000
+0FFFC00000FFF80000FFFC00000FFFC00000FFF80000FFF800000FFF800000FFF80000FF
+F800000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000FFF8
+0000FFF800000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF8000
+00FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800000F
+FF800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000FFF80000FFF8
+00000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000FFF800
+00FFF800000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000
+FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF
+800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800
+000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000FFF80000
+FFF800000FFF800000FFF80000FFF800000FFF800000FFF80000FFF800000FFF800000FF
+F80000FFF800000FFF800000FFF80000FFF800000FFF800000FFF800FFFFFFF80FFFFFFF
+80FFFFFFF8FFFFFFF80FFFFFFF80FFFFFFF8FFFFFFF80FFFFFFF80FFFFFFF8FFFFFFF80F
+FFFFFF80FFFFFFF8FFFFFFF80FFFFFFF80FFFFFFF865367BB56E>I<003FF0001FFC0000
+00FFFFF000FFFF800000FFFFF003FFFFE00000FFFFF00FFFFFF80000FFFFF01FC07FFC00
+00FFFFF07E003FFE000003FFF0F8001FFF000000FFF1F0001FFF000000FFF1E0000FFF80
+0000FFF3C0000FFF800000FFF780000FFF800000FFF7000007FFC00000FFFF000007FFC0
+0000FFFE000007FFC00000FFFE000007FFC00000FFFC000007FFC00000FFFC000007FFC0
+0000FFFC000007FFC00000FFFC000007FFC00000FFF8000007FFC00000FFF8000007FFC0
+0000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC0
+0000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC0
+0000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC0
+0000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC0
+0000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC0
+0000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC0
+0000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC0
+00FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFFC0FFFFFFF807FFFFFF
+C0FFFFFFF807FFFFFFC042367CB549>I<000001FFC000000000003FFFFE0000000000FF
+FFFF8000000003FFFFFFE00000000FFF80FFF80000003FFC001FFE0000007FF00007FF00
+0000FFE00003FF800001FFC00001FFC00003FF800000FFE00003FF0000007FE00007FF00
+00007FF0000FFF0000007FF8000FFE0000003FF8001FFE0000003FFC001FFE0000003FFC
+003FFE0000003FFE003FFC0000001FFE003FFC0000001FFE007FFC0000001FFF007FFC00
+00001FFF007FFC0000001FFF007FFC0000001FFF00FFFC0000001FFF80FFFC0000001FFF
+80FFFC0000001FFF80FFFC0000001FFF80FFFC0000001FFF80FFFC0000001FFF80FFFC00
+00001FFF80FFFC0000001FFF80FFFC0000001FFF80FFFC0000001FFF80FFFC0000001FFF
+80FFFC0000001FFF807FFC0000001FFF007FFC0000001FFF007FFC0000001FFF003FFC00
+00001FFE003FFE0000003FFE003FFE0000003FFE001FFE0000003FFC001FFE0000003FFC
+000FFF0000007FF8000FFF0000007FF80007FF800000FFF00003FF800000FFE00001FFC0
+0001FFC00000FFE00003FF8000007FF00007FF0000003FFC001FFE0000001FFF80FFFC00
+000007FFFFFFF000000001FFFFFFC0000000003FFFFE000000000003FFE000000039387C
+B642>I<003FF8007FF0000000FFFFF807FFFF000000FFFFF81FFFFFC00000FFFFF87FFF
+FFF00000FFFFF9FF00FFFC0000FFFFFFF8003FFF000003FFFFE0000FFF800000FFFF8000
+07FFC00000FFFF000003FFE00000FFFE000003FFF00000FFFC000001FFF00000FFF80000
+00FFF80000FFF8000000FFFC0000FFF80000007FFC0000FFF80000007FFE0000FFF80000
+007FFE0000FFF80000003FFE0000FFF80000003FFF0000FFF80000003FFF0000FFF80000
+003FFF0000FFF80000003FFF0000FFF80000001FFF8000FFF80000001FFF8000FFF80000
+001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF80000
+001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF80000
+001FFF8000FFF80000001FFF8000FFF80000001FFF8000FFF80000003FFF0000FFF80000
+003FFF0000FFF80000003FFF0000FFF80000003FFF0000FFF80000007FFE0000FFF80000
+007FFE0000FFF80000007FFC0000FFF8000000FFFC0000FFF8000000FFF80000FFFC0000
+01FFF80000FFFC000001FFF00000FFFE000003FFE00000FFFF000007FFC00000FFFF8000
+0FFF800000FFFFE0001FFF000000FFFFF0007FFE000000FFF9FE01FFF8000000FFF8FFFF
+FFF0000000FFF83FFFFFC0000000FFF807FFFE00000000FFF800FFE000000000FFF80000
+0000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80000
+0000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80000
+0000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80000
+0000000000FFF800000000000000FFF800000000000000FFF800000000000000FFF80000
+00000000FFFFFFF80000000000FFFFFFF80000000000FFFFFFF80000000000FFFFFFF800
+00000000FFFFFFF80000000000414D7DB549>I<003FF001FC00FFFFF00FFF80FFFFF01F
+FFE0FFFFF07FFFF0FFFFF0FE1FF8FFFFF1F83FF801FFF1F07FFC00FFF3E07FFC00FFF3C0
+7FFC00FFF7807FFC00FFF7807FFC00FFFF007FFC00FFFF003FF800FFFE001FF000FFFE00
+0FE000FFFE00000000FFFC00000000FFFC00000000FFFC00000000FFFC00000000FFF800
+000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800
+000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800
+000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800
+000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800
+000000FFF800000000FFF800000000FFF800000000FFF8000000FFFFFFFE0000FFFFFFFE
+0000FFFFFFFE0000FFFFFFFE0000FFFFFFFE00002E367DB535>114
+D<0003FFC00E00001FFFFC1E0000FFFFFF7E0003FFFFFFFE0007FE003FFE000FF0000FFE
+001FE00003FE003FC00001FE003F800000FE007F800000FE007F0000007E007F0000007E
+00FF0000003E00FF0000003E00FF8000003E00FF8000003E00FFC000003E00FFF0000000
+00FFFC00000000FFFF800000007FFFFE0000007FFFFFF000003FFFFFFE00003FFFFFFF80
+001FFFFFFFE0000FFFFFFFF00007FFFFFFFC0003FFFFFFFE0000FFFFFFFF00003FFFFFFF
+00000FFFFFFF800001FFFFFF8000000FFFFFC00000003FFFC000000007FFE000000001FF
+E0F8000000FFE0F80000007FE0FC0000003FE0FC0000003FE0FC0000001FE0FE0000001F
+E0FE0000001FE0FE0000001FC0FF0000001FC0FF8000003FC0FF8000003F80FFC000003F
+80FFE000007F00FFF80000FF00FFFC0003FE00FFFF801FFC00FE7FFFFFF000F81FFFFFC0
+00F007FFFF0000E0007FF000002B387CB634>I<00007C00000000007C00000000007C00
+000000007C00000000007C00000000007C0000000000FC0000000000FC0000000000FC00
+00000000FC0000000001FC0000000001FC0000000001FC0000000003FC0000000003FC00
+00000007FC0000000007FC000000000FFC000000001FFC000000003FFC000000007FFC00
+000000FFFC00000003FFFC0000000FFFFFFFFE00FFFFFFFFFE00FFFFFFFFFE00FFFFFFFF
+FE00FFFFFFFFFE00007FFC000000007FFC000000007FFC000000007FFC000000007FFC00
+0000007FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC00
+0000007FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC00
+0000007FFC000000007FFC000000007FFC000000007FFC000000007FFC000000007FFC00
+0000007FFC000000007FFC000000007FFC000000007FFC000000007FFC000F80007FFC00
+0F80007FFC000F80007FFC000F80007FFC000F80007FFC000F80007FFC000F80007FFC00
+0F80007FFC000F80007FFC000F80007FFC000F80007FFC001F00003FFE001F00003FFE00
+1F00001FFE003E00001FFF003E00000FFF807C000007FFC1F8000003FFFFF0000000FFFF
+E00000003FFF8000000003FE0000294D7ECB33>I<003FF8000001FFC000FFFFF80007FF
+FFC000FFFFF80007FFFFC000FFFFF80007FFFFC000FFFFF80007FFFFC000FFFFF80007FF
+FFC00003FFF800001FFFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007
+FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007
+FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007
+FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007
+FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007
+FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007
+FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007
+FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007FFC00000FFF8000007
+FFC00000FFF8000007FFC00000FFF800000FFFC00000FFF800000FFFC00000FFF800000F
+FFC00000FFF800001FFFC00000FFF800001FFFC00000FFF800003FFFC000007FF800003F
+FFC000007FF800007FFFC000003FFC0000F7FFC000003FFC0001E7FFF000001FFE0007C7
+FFFFC0000FFF801F87FFFFC00007FFFFFF07FFFFC00001FFFFFC07FFFFC000007FFFF007
+FFFFC0000007FFC007FF000042377CB549>I<FFFFFFE0001FFFFCFFFFFFE0001FFFFCFF
+FFFFE0001FFFFCFFFFFFE0001FFFFCFFFFFFE0001FFFFC01FFF8000001FF0000FFF80000
+007C0000FFFC000000FC00007FFC000000F800007FFE000000F800007FFE000001F80000
+3FFF000001F000003FFF000003F000001FFF000003E000001FFF800007E000000FFF8000
+07C000000FFFC0000FC000000FFFC0000FC0000007FFE0000F80000007FFE0001F800000
+03FFE0001F00000003FFF0003F00000001FFF0003E00000001FFF8007E00000000FFF800
+7C00000000FFFC007C00000000FFFC00FC000000007FFC00F8000000007FFE01F8000000
+003FFE01F0000000003FFF03F0000000001FFF03E0000000001FFF83E0000000001FFF87
+E0000000000FFF87C0000000000FFFCFC00000000007FFCF800000000007FFFF80000000
+0003FFFF000000000003FFFF000000000003FFFF000000000001FFFE000000000001FFFE
+000000000000FFFC000000000000FFFC0000000000007FF80000000000007FF800000000
+00007FF80000000000003FF00000000000003FF00000000000001FE00000000000001FE0
+0000000000000FC00000000000000FC00000003E367DB445>I<FFFFFFE0001FFFFCFFFF
+FFE0001FFFFCFFFFFFE0001FFFFCFFFFFFE0001FFFFCFFFFFFE0001FFFFC01FFF8000001
+FF0000FFF80000007C0000FFFC000000FC00007FFC000000F800007FFE000001F800003F
+FE000001F000003FFF000001F000003FFF000003F000001FFF800003E000001FFF800007
+E000000FFF800007C000000FFFC0000FC0000007FFC0000F80000007FFE0001F80000003
+FFE0001F00000003FFF0001F00000003FFF0003F00000001FFF8003E00000001FFF8007E
+00000000FFF8007C00000000FFFC00FC000000007FFC00F8000000007FFE00F800000000
+7FFE01F8000000003FFF01F0000000003FFF03F0000000001FFF03E0000000001FFF87E0
+000000000FFF87C0000000000FFFCFC00000000007FFCF800000000007FFEF8000000000
+07FFFF800000000003FFFF000000000003FFFF000000000001FFFE000000000001FFFE00
+0000000000FFFC000000000000FFFC0000000000007FF80000000000007FF80000000000
+007FF80000000000003FF00000000000003FF00000000000001FE00000000000001FE000
+00000000000FC00000000000000FC00000000000000FC00000000000000F800000000000
+001F800000000000001F000000000000003F000000000000003E000000000000007E0000
+00001FC0007C000000003FE0007C000000007FF000FC00000000FFF800F800000000FFF8
+01F800000000FFF801F000000000FFF803E000000000FFF807E000000000FFF80FC00000
+00007FF01F80000000007FE03F00000000007FC07F00000000003F81FC00000000001FFF
+F800000000000FFFF0000000000003FFC0000000000000FE0000000000003E4D7DB445>
+121 D E
+%EndDVIPSBitmapFont
+end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+%%BeginPaperSize: a4
+/setpagedevice where
+{ pop << /PageSize [595 842] >> setpagedevice }
+{ /a4 where { pop a4 } if }
+ifelse
+%%EndPaperSize
+ end
+%%EndSetup
+%%Page: 1 1
+TeXDict begin 1 0 bop 0 91 a Fi(Con)l(ten)l(ts)0 295
+y Fh(1)84 b(Mo)s(dule)34 b Fg(XmlRpc)h Fh(:)46 b(XmlRp)s(c)33
+b(Ligh)m(t.)2262 b(1)136 408 y Ff(1.1)92 b(High-lev)m(el)32
+b(in)m(terface)49 b(.)d(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f
+(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)
+h(.)f(.)h(.)g(.)f(.)h(.)137 b(1)136 520 y(1.2)92 b(Utilit)m(y)31
+b(functions)90 b(.)46 b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h
+(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)
+f(.)h(.)f(.)h(.)g(.)f(.)h(.)137 b(6)136 633 y(1.3)92
+b(Lo)m(w-lev)m(el)33 b(in)m(terface)73 b(.)46 b(.)f(.)h(.)f(.)h(.)f(.)h
+(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)
+f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)137 b(6)136
+746 y(1.4)92 b(Serv)m(er)32 b(to)s(ols)61 b(.)45 b(.)h(.)f(.)h(.)g(.)f
+(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)
+f(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)137
+b(7)0 950 y Fh(2)84 b(Mo)s(dule)34 b Fg(XmlRpcServer)h
+Fh(:)46 b(XmlRp)s(c)33 b(Ligh)m(t)i(serv)m(er.)1672 b(8)136
+1062 y Ff(2.1)92 b(Base)31 b(classes)53 b(.)45 b(.)h(.)f(.)h(.)g(.)f(.)
+h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f
+(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)137
+b(8)136 1175 y(2.2)92 b(Serv)m(er)32 b(implemen)m(tations)96
+b(.)45 b(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)
+f(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)92
+b(10)136 1288 y(2.3)g(Utilit)m(y)31 b(functions)90 b(.)46
+b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h
+(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)
+f(.)h(.)92 b(10)0 1492 y Fh(3)84 b(Mo)s(dule)34 b Fg(XmlRpcDateTime)h
+Fh(:)46 b(Date/time)35 b(t)m(yp)s(e.)1777 b(11)136 1605
+y Ff(3.1)92 b(T)m(yp)s(es)76 b(.)45 b(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f
+(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)
+f(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)92
+b(11)136 1717 y(3.2)g(Comparison)56 b(.)45 b(.)h(.)f(.)h(.)g(.)f(.)h(.)
+f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h
+(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)92
+b(11)136 1830 y(3.3)g(Curren)m(t)32 b(date)f(and)g(time)59
+b(.)46 b(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)
+h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h
+(.)92 b(11)136 1943 y(3.4)g(Time)32 b(zone)e(adjustmen)m(ts)h(.)46
+b(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f
+(.)h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)92
+b(11)136 2056 y(3.5)g(Con)m(v)m(ersion)i(.)45 b(.)h(.)f(.)h(.)g(.)f(.)h
+(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)
+h(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)92
+b(12)136 2169 y(3.6)g(ISO-8601)32 b(parsing)f(and)f(generation)77
+b(.)45 b(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)
+f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)92 b(12)0
+2372 y Fh(4)84 b(Mo)s(dule)34 b Fg(XmlRpcBase64)h Fh(:)46
+b(Base64)35 b(co)s(dec.)1975 b(12)0 2659 y Fi(1)131 b(Mo)t(dule)44
+b Fe(XmlRpc)d Fi(:)58 b(XmlRp)t(c)44 b(Ligh)l(t.)0 2862
+y Ff(XmlRp)s(c)30 b(Ligh)m(t)i(is)d(a)i(minimal)g(XmlRp)s(c)f(library)h
+(based)g(on)f(Xml)g(Ligh)m(t)i(and)f(Ocamlnet.)141 2975
+y(It)k(pro)m(vides)i(a)e(t)m(yp)s(e)h(for)f(v)-5 b(alues,)37
+b(a)f(clien)m(t)h(class)e(with)h(a)g(simple)g(calling)g(in)m(terface,)j
+(and)d(lo)m(w-lev)m(el)h(to)s(ols)0 3088 y(that)31 b(can)g(b)s(e)f
+(used)g(to)h(implemen)m(t)h(a)e(serv)m(er.)141 3200 y
+Fd(\(c\))j(2007-2009)g(Dave)g(Benjamin)0 3456 y Fg(val)47
+b(version)g(:)g(string)227 3594 y Ff(V)-8 b(ersion)31
+b(of)f(XmlRp)s(c-Ligh)m(t)i(as)e(a)g(string.)0 3912 y
+Fc(1.1)112 b(High-lev)m(el)35 b(in)m(terface)0 4084 y
+Ff(Example:)188 4335 y Fg(let)47 b(rpc)g(=)g(new)g(XmlRpc.client)f
+("http://localhost:8000")h(in)188 4448 y(let)g(result)g(=)g(rpc#call)f
+("echo")h([`String)g("hello!"])g(in)188 4560 y(print_endline)g
+(\(XmlRpc.dump)f(result\))0 4698 y(exception)h(Error)g(of)g(\(int)f(*)h
+(string\))227 4836 y Ff(Raised)30 b(for)g(all)h(errors)g(including)g
+(XmlRp)s(c)f(faults)g(\(co)s(de,)h(string\).)1927 5400
+y(1)p eop end
+%%Page: 2 2
+TeXDict begin 2 1 bop 0 91 a Fg(type)47 b(value)g(=)g([)g(`Array)f(of)h
+(value)g(list)94 204 y(|)g(`Binary)g(of)g(string)94 317
+y(|)g(`Boolean)g(of)g(bool)94 430 y(|)g(`DateTime)g(of)g
+(XmlRpcDateTime.t)94 543 y(|)g(`Double)g(of)g(float)94
+656 y(|)g(`Int)g(of)g(int)94 769 y(|)g(`Int32)g(of)g(int32)94
+882 y(|)g(`Nil)94 995 y(|)g(`String)g(of)g(string)94
+1108 y(|)g(`Struct)g(of)g(\(string)f(*)h(value\))g(list)g(])227
+1245 y Ff(P)m(olymorphic)33 b(v)-5 b(arian)m(t)31 b(t)m(yp)s(e)g(for)f
+(XmlRp)s(c)f(v)-5 b(alues:)336 1433 y Fb(\017)46 b Fg(`Array)p
+Ff(:)40 b(An)31 b(ordered)g(list)f(of)g(v)-5 b(alues)336
+1579 y Fb(\017)46 b Fg(`Binary)p Ff(:)40 b(A)30 b(string)h(con)m
+(taining)h(binary)f(data)336 1725 y Fb(\017)46 b Fg(`Boolean)p
+Ff(:)40 b(A)30 b(b)s(o)s(olean)336 1871 y Fb(\017)46
+b Fg(`DateTime)p Ff(:)40 b(A)30 b(date/time)i(v)-5 b(alue)336
+2017 y Fb(\017)46 b Fg(`Double)p Ff(:)40 b(A)30 b(\035oating-p)s(oin)m
+(t)j(v)-5 b(alue)336 2164 y Fb(\017)46 b Fg(`Int)p Ff(:)40
+b(An)31 b(in)m(teger)336 2310 y Fb(\017)46 b Fg(`Int32)p
+Ff(:)40 b(A)30 b(32-bit)i(in)m(teger)336 2456 y Fb(\017)46
+b Fg(`Nil)p Ff(:)40 b(A)30 b(n)m(ull)i(v)-5 b(alue)336
+2602 y Fb(\017)46 b Fg(`String)p Ff(:)40 b(A)30 b(string)336
+2748 y Fb(\017)46 b Fg(`Struct)p Ff(:)40 b(An)31 b(asso)s(ciation)f
+(list)g(of)g(\(name,)i(v)-5 b(alue\))30 b(pairs)227 2936
+y(Note)h(that)g(base64-enco)s(ding)h(of)e Fg(`Binary)f
+Ff(v)-5 b(alues)31 b(is)f(done)h(automatically)-8 b(.)42
+b(Y)-8 b(ou)31 b(do)g(not)f(need)h(to)g(do)227 3049 y(the)g(enco)s
+(ding)g(y)m(ourself.)0 3261 y Fg(class)47 b(client)g(:)g(?debug:bool)f
+(->)h(?headers:\(string)g(*)g(string\))g(list)g(->)g
+(?insecure_ssl:bool)f(->)h(?timeout:float)g(->)g(?useragent:string)f
+(->)h(string)g(->)90 3374 y(object)227 3549 y(val)g(url)g(:)g(string)
+427 3724 y Ff(Url)30 b(of)g(the)h(remote)g(XmlRp)s(c)f(serv)m(er.)227
+3937 y Fg(val)47 b(mutable)g(debug)g(:)g(bool)427 4112
+y Ff(If)30 b(true,)h(Xml)f(messages)g(will)h(b)s(e)f(prin)m(ted)i(to)e
+(standard)i(error.)227 4325 y Fg(val)47 b(mutable)g(headers)g(:)g
+(\(string)g(*)g(string\))f(list)427 4500 y Ff(List)31
+b(of)f(custom)h(HTTP)g(headers)g(to)f(send)g(with)h(eac)m(h)h(request.)
+227 4712 y Fg(val)47 b(mutable)g(insecure_ssl)g(:)g(bool)427
+4888 y Ff(If)30 b(true,)h(SSL)g(will)f(b)s(e)h(allo)m(w)m(ed)h(ev)m(en)
+f(if)f(the)g(certi\034cate)i(is)e(self-signed.)227 5100
+y Fg(val)47 b(mutable)g(timeout)g(:)g(float)1927 5400
+y Ff(2)p eop end
+%%Page: 3 3
+TeXDict begin 3 2 bop 427 91 a Ff(Maxim)m(um)32 b(time)e(to)h(w)m(ait)g
+(for)f(a)h(request)f(to)h(complete,)h(in)e(seconds.)227
+304 y Fg(val)47 b(mutable)g(useragent)g(:)g(string)427
+479 y Ff(User-agen)m(t)32 b(to)e(send)h(in)f(request)h(headers.)227
+692 y Fg(method)47 b(url)g(:)g(string)427 867 y Ff(Gets)30
+b Fg(url)p Ff(.)227 1079 y Fg(method)47 b(debug)g(:)g(bool)427
+1254 y Ff(Gets)30 b Fg(debug)p Ff(.)227 1467 y Fg(method)47
+b(set_debug)g(:)g(bool)g(->)g(unit)427 1642 y Ff(Sets)31
+b Fg(debug)p Ff(.)227 1855 y Fg(method)47 b(headers)g(:)g(\(string)g(*)
+g(string\))f(list)427 2030 y Ff(Gets)30 b Fg(headers)p
+Ff(.)227 2242 y Fg(method)47 b(set_headers)g(:)g(\(string)g(*)g
+(string\))f(list)h(->)g(unit)427 2418 y Ff(Sets)31 b
+Fg(headers)p Ff(.)227 2630 y Fg(method)47 b(insecure_ssl)g(:)g(bool)427
+2805 y Ff(Gets)30 b Fg(insecure_ssl)p Ff(.)227 3018 y
+Fg(method)47 b(set_insecure_ssl)g(:)g(bool)g(->)f(unit)427
+3193 y Ff(Sets)31 b Fg(insecure_ssl)p Ff(.)227 3406 y
+Fg(method)47 b(timeout)g(:)g(float)427 3581 y Ff(Gets)30
+b Fg(timeout)p Ff(.)227 3793 y Fg(method)47 b(set_timeout)g(:)g(float)g
+(->)g(unit)427 3968 y Ff(Sets)31 b Fg(timeout)p Ff(.)227
+4181 y Fg(method)47 b(useragent)g(:)g(string)427 4356
+y Ff(Gets)30 b Fg(useragent)p Ff(.)227 4569 y Fg(method)47
+b(set_useragent)g(:)g(string)g(->)g(unit)427 4744 y Ff(Sets)31
+b Fg(useragent)p Ff(.)227 4956 y Fg(method)47 b(set_base64_encoder)g(:)
+g(\(string)f(->)h(string\))g(->)g(unit)427 5132 y Ff(Sets)31
+b(an)f(alternate)i(Base-64)f(binary)f(enco)s(ding)i(function.)1927
+5400 y(3)p eop end
+%%Page: 4 4
+TeXDict begin 4 3 bop 227 91 a Fg(method)47 b(set_base64_decoder)g(:)g
+(\(string)f(->)h(string\))g(->)g(unit)427 262 y Ff(Sets)31
+b(an)f(alternate)i(Base-64)f(binary)f(deco)s(ding)i(function.)227
+467 y Fg(method)47 b(set_datetime_encoder)g(:)g(\(XmlRpcDateTime.t)f
+(->)h(string\))g(->)g(unit)427 638 y Ff(Sets)31 b(an)f(alternate)i
+(ISO-8601)f(date/time)h(enco)s(ding)f(function.)227 842
+y Fg(method)47 b(set_datetime_decoder)g(:)g(\(string)f(->)h
+(XmlRpcDateTime.t\))g(->)g(unit)427 1013 y Ff(Sets)31
+b(an)f(alternate)i(ISO-8601)f(date/time)h(deco)s(ding)f(function.)227
+1217 y Fg(method)47 b(call)g(:)g(string)g(->)g(XmlRpc.value)f(list)h
+(->)g(XmlRpc.value)427 1389 y(call)g(name)g(params)30
+b Ff(in)m(v)m(ok)m(es)h(an)g(XmlRp)s(c)f(metho)s(d)h(and)f(returns)h
+(the)g(result,)g(or)f(raises)427 1501 y Fg(XmlRpc.Error)p
+Ff([1.1])h(on)f(error.)90 1718 y Fg(end)227 1900 y Ff(Class)g(for)g
+(XmlRp)s(c)g(clien)m(ts.)42 b(T)-8 b(ak)m(es)31 b(a)f(single)h
+(mandatory)g(argumen)m(t,)i Fg(url)p Ff(.)227 2048 y(If)d
+Fg(url)g Ff(is)g(of)g(the)g(form)h("h)m(ttp://username:passw)m(ord@)p
+Fa(:)15 b(:)g(:)5 b Ff(",)31 b(basic)f(authen)m(tication)k(will)c(b)s
+(e)g(used.)227 2196 y(If)g Fg(url)g Ff(starts)g(with)h("h)m(ttps",)g
+(Curl)g(will)g(b)s(e)f(used)h(instead)f(of)g(Ocamlnet.)42
+b(The)31 b("curl")g(command-line)227 2309 y(program)h(m)m(ust)f(b)s(e)f
+(in)g(y)m(our)h(path)g(for)f(this)h(to)f(w)m(ork.)41
+b(Y)-8 b(ou)31 b(can)g(use)f(the)h Fg(insecure_ssl)f
+Ff(setting)g(to)227 2422 y(allo)m(w)i(connections)f(to)g(serv)m(ers)f
+(with)h(self-signed)g(certi\034cates;)g(b)m(y)g(default)g(this)f(is)g
+(false)g(and)227 2535 y(certi\034cates)i(m)m(ust)f(b)s(e)f(v)-5
+b(alid.)227 2683 y Fg(timeout)30 b Ff(can)h(b)s(e)f(used)g(to)h(sp)s
+(ecify)e(the)i(maxim)m(um)h(amoun)m(t)g(of)e(time)h(elapsed)f(b)s
+(efore)h(a)f(connection)i(is)227 2796 y(cancelled.)42
+b(It)30 b(defaults)h(to)f(300.0)h(seconds.)227 2944 y
+Fg(headers)f Ff(ma)m(y)g(con)m(tain)h(an)f(arra)m(y)g(of)g(\(name,)g(v)
+-5 b(alue\))30 b(pairs)g(of)f(additional)j(headers)e(to)g(send)g(with)g
+(eac)m(h)227 3057 y(request.)227 3205 y(The)h Fg(useragent)f
+Ff(setting)h(pro)m(vides)g(a)f(con)m(v)m(enien)m(t)j(w)m(a)m(y)f(to)e
+(c)m(hange)i(the)f(User-Agen)m(t)g(header,)g(whic)m(h)227
+3318 y(defaults)g(to)f("XmlRp)s(c-Ligh)m(t/)p Fa(<)p
+Ff(v)m(ersion)p Fa(>)p Ff(".)227 3466 y(The)h Fg(debug)f
+Ff(setting,)h(if)f(true,)h(will)g(enable)g(v)m(erb)s(ose)f(debugging)i
+(output)g(to)e(the)h(standard)g(error)227 3579 y(stream.)0
+3784 y Fg(class)47 b(multicall)g(:)g(client)f(->)90 3897
+y(object)227 4061 y(method)h(call)g(:)g(string)g(->)g(XmlRpc.value)f
+(list)h(->)g(XmlRpc.value)g(Lazy.t)427 4233 y Ff(A)m(dds)31
+b(a)f(call)h(to)f(this)h Fg(multicall)f Ff(instance.)41
+b(If)29 b(the)i(call)g(has)f(already)h(executed,)g(the)g(follo)m(wing)
+427 4345 y(exception)h(will)e(b)s(e)g(raised:)41 b(F)-8
+b(ailure)32 b("m)m(ulticall)p Fg(#)p Ff(call:)43 b(already)31
+b(executed".)227 4550 y Fg(method)47 b(execute)g(:)g(unit)g(->)g(unit)
+427 4721 y Ff(F)-8 b(orces)31 b(the)g(call)g(to)f(execute)h
+(immediately)-8 b(.)43 b(If)29 b(the)i(call)f(has)h(already)g(executed)
+g(and)f(completed)427 4834 y(successfully)-8 b(,)31 b(the)f(follo)m
+(wing)i(exception)f(will)g(b)s(e)f(raised:)41 b(F)-8
+b(ailure)31 b("m)m(ulticall)p Fg(#)p Ff(execute:)44 b(already)427
+4947 y(completed".)227 5151 y Fg(method)j(result)g(:)g(int)g(->)g
+(XmlRpc.value)1927 5400 y Ff(4)p eop end
+%%Page: 5 5
+TeXDict begin 5 4 bop 427 91 a Ff(Returns)31 b(a)f Fg(multicall)g
+Ff(result,)h(executing)g(the)g(call)f(if)g(necessary)-8
+b(.)41 b(The)31 b(results)f(are)h(n)m(um)m(b)s(ered)427
+204 y(starting)g(with)g(zero.)227 409 y Fg(method)47
+b(executed)g(:)g(bool)427 581 y Ff(T)-8 b(rue)32 b(if)e(the)g(call)h
+(has)f(executed,)i(whether)f(or)g(not)f(it)h(succeeded.)227
+786 y Fg(method)47 b(completed)g(:)g(bool)427 958 y Ff(T)-8
+b(rue)32 b(of)e(the)g(call)h(has)f(executed)i(and)e(completed)i
+(successfully)-8 b(.)90 1175 y Fg(end)227 1358 y Ff(Con)m(v)m(enience)
+33 b(class)d(for)g Fg(system.multicall)g Ff(calls.)455
+1506 y(Instances)g(tak)m(e)h(an)f Fg(XmlRpc.client)p
+Ff([1.1])h(as)f(an)g(argumen)m(t:)603 1755 y Fg(#)47
+b(let)g(mc)g(=)g(new)g(XmlRpc.multicall)f(client;;)603
+1868 y(val)h(mc)g(:)g(XmlRpc.multicall)f(=)h(<obj>)455
+2129 y Ff(The)30 b("call")i(metho)s(d)e(w)m(orks)h(lik)m(e)g
+Fg(client#call)p Ff(,)f(but)h(it)f(returns)h(a)f(lazy)h(v)-5
+b(alue:)603 2378 y Fg(#)47 b(let)g(a)g(=)g(mc#call)g
+("demo.addTwoNumbers")f([`Int)h(3;)g(`Int)g(4];;)603
+2491 y(val)g(a)g(:)g(XmlRpc.value)g(Lazy.t)f(=)h(<lazy>)603
+2604 y(#)g(let)g(b)g(=)g(mc#call)g("demo.addTwoNumbers")f([`Int)h(42;)g
+(`String)g("oh)g(noes!"];;)603 2717 y(val)g(b)g(:)g(XmlRpc.value)g
+(Lazy.t)f(=)h(<lazy>)603 2830 y(#)g(let)g(c)g(=)g(mc#call)g
+("demo.addTwoNumbers")f([`Double)h(3.0;)g(`Double)g(4.0];;)603
+2943 y(val)g(c)g(:)g(XmlRpc.value)g(Lazy.t)f(=)h(<lazy>)455
+3204 y Ff(A)m(t)30 b(this)g(p)s(oin)m(t,)i(the)e(call)h(has)f(not)h(b)s
+(een)f(executed)i(y)m(et:)603 3453 y Fg(#)47 b(mc#executed;;)603
+3566 y(--)g(:)g(bool)g(=)g(false)455 3827 y Ff(As)29
+b(so)s(on)h(as)g(one)h(of)f(the)g(return)i(v)-5 b(alues)30
+b(is)g(forced,)h(the)f(call)h(is)f(executed:)603 4076
+y Fg(#)47 b(Lazy.force)g(a;;)603 4189 y(--)g(:)g(XmlRpc.value)g(=)g
+(`Int)g(7)603 4302 y(#)g(mc#executed;;)603 4415 y(--)g(:)g(bool)g(=)g
+(true)455 4676 y Ff(Once)32 b(a)h(call)f(has)g(b)s(een)g(executed,)i
+(this)e(instance)h(cannot)g(b)s(e)f(used)g(to)h(mak)m(e)f(an)m(y)h
+(further)g(calls;)455 4789 y(instead,)e(a)f(new)h Fg(multicall)f
+Ff(instance)h(m)m(ust)g(b)s(e)f(created:)603 5038 y Fg(#)47
+b(mc#call)g("demo.addTwoNumbers")f([`Int)h(2;)g(`Int)g(2];;)603
+5151 y(Exception:)g(Failure)g("multicall#call:)f(already)h(executed".)
+1927 5400 y Ff(5)p eop end
+%%Page: 6 6
+TeXDict begin 6 5 bop 455 242 a Ff(If)24 b(an)i(XmlRp)s(c)g(fault)g(o)s
+(ccurred,)h(the)f(exception)h(will)g(b)s(e)e(thro)m(wn)i(when)g(the)f
+(lazy)g(v)-5 b(alue)26 b(is)f(forced:)603 492 y Fg(#)47
+b(Lazy.force)g(b;;)603 605 y(Exception:)g(XmlRpc.Error)g(\(-32602,)f
+("server)h(error.)g(invalid)g(method)g(parameters"\).)455
+868 y Ff(This)30 b(will)h(not)f(prev)m(en)m(t)i(further)f(metho)s(ds)g
+(from)f(executing)i(successfully:)603 1119 y Fg(#)47
+b(Lazy.force)g(c;;)603 1232 y(--)g(:)g(XmlRpc.value)g(=)g(`Double)f(7.)
+455 1495 y Ff(It)28 b(is)g(p)s(ossible)h(for)g(a)g Fg(multicall)f
+Ff(to)h(b)s(e)g(executed)g(but)h(not)f(completed,)i(for)e(example)g(if)
+g(a)f(trans-)455 1608 y(p)s(ort)g(error)h(o)s(ccurs.)40
+b(Aside)28 b(from)g(catc)m(hing)i(the)f(exception,)h(the)f
+Fg(completed)f Ff(prop)s(ert)m(y)h(indicates)455 1721
+y(if)g(the)i(call)g(actually)g(w)m(en)m(t)h(through)f(or)g(not:)603
+1972 y Fg(#)47 b(mc#completed;;)603 2085 y(--)g(:)g(bool)g(=)g(true)455
+2348 y Ff(It)32 b(is)h(not)h(necessary)f(to)h(use)f(lazy)g(v)-5
+b(alues.)50 b(Instead,)34 b(the)g(call)f(can)h(b)s(e)f(executed)h
+(explicitly)-8 b(,)35 b(and)455 2461 y(the)30 b(results)h(can)f(b)s(e)g
+(retriev)m(ed)i(b)m(y)f(n)m(um)m(b)s(er:)603 2711 y Fg(#)47
+b(let)g(mc)g(=)g(new)g(XmlRpc.multicall)f(client;;)603
+2824 y(val)h(mc)g(:)g(XmlRpc.multicall)f(=)h(<obj>)603
+2937 y(#)g(ignore)g(\(mc#call)g("demo.addTwoNumbers")f([`Int)h(2;)g
+(`Int)g(2]\);;)603 3050 y(--)g(:)g(unit)g(=)g(\(\))603
+3163 y(#)g(ignore)g(\(mc#call)g("demo.addTwoNumbers")f([`Int)h(3;)g
+(`Int)g(3]\);;)603 3276 y(--)g(:)g(unit)g(=)g(\(\))603
+3389 y(#)g(mc#result)g(1;;)603 3502 y(--)g(:)g(XmlRpc.value)g(=)g(`Int)
+g(6)0 3933 y Fc(1.2)112 b(Utilit)m(y)34 b(functions)0
+4129 y Fg(val)47 b(dump)g(:)g(value)g(->)g(string)227
+4267 y Ff(Con)m(v)m(erts)32 b(an)e(XmlRp)s(c)g(v)-5 b(alue)31
+b(to)f(a)h(h)m(uman-readable)i(string.)0 4585 y Fc(1.3)112
+b(Lo)m(w-lev)m(el)37 b(in)m(terface)0 4782 y Fg(type)47
+b(message)g(=)94 4895 y(|)g(MethodCall)g(of)g(\(string)f(*)h(value)g
+(list\))94 5008 y(|)g(MethodResponse)g(of)f(value)94
+5121 y(|)h(Fault)g(of)g(\(int)g(*)g(string\))1927 5400
+y Ff(6)p eop end
+%%Page: 7 7
+TeXDict begin 7 6 bop 227 91 a Ff(T)m(yp)s(e)31 b(for)f(XmlRp)s(c)g
+(messages.)0 298 y Fg(val)47 b(message_of_xml_element)f(:)94
+411 y(?base64_decoder:\(string)g(->)h(string\))g(->)94
+524 y(?datetime_decoder:\(string)f(->)h(XmlRpcDateTime.t\))g(->)g
+(Xml.xml)g(->)g(message)227 660 y Ff(Con)m(v)m(erts)32
+b(an)e(Xml)h(Ligh)m(t)h(elemen)m(t)g(to)e(an)h(XmlRp)s(c)e(message.)0
+867 y Fg(val)47 b(xml_element_of_message)f(:)94 980 y
+(?base64_encoder:\(string)g(->)h(string\))g(->)94 1093
+y(?datetime_encoder:\(XmlRpcDateTime.t)f(->)h(string\))g(->)g(message)g
+(->)g(Xml.xml)227 1229 y Ff(Con)m(v)m(erts)32 b(an)e(XmlRp)s(c)g
+(message)h(to)f(an)h(Xml)f(Ligh)m(t)i(elemen)m(t.)0 1436
+y Fg(val)47 b(value_of_xml_element)f(:)94 1549 y
+(?base64_decoder:\(string)g(->)h(string\))g(->)94 1662
+y(?datetime_decoder:\(string)f(->)h(XmlRpcDateTime.t\))g(->)g(Xml.xml)g
+(->)g(value)227 1798 y Ff(Con)m(v)m(erts)32 b(an)e(Xml)h(Ligh)m(t)h
+(elemen)m(t)g(to)e(an)h(XmlRp)s(c)e(v)-5 b(alue.)0 2005
+y Fg(val)47 b(xml_element_of_value)f(:)94 2118 y
+(?base64_encoder:\(string)g(->)h(string\))g(->)94 2231
+y(?datetime_encoder:\(XmlRpcDateTime.t)f(->)h(string\))g(->)g(value)g
+(->)g(Xml.xml)227 2367 y Ff(Con)m(v)m(erts)32 b(an)e(XmlRp)s(c)g(v)-5
+b(alue)31 b(to)f(an)h(Xml)f(Ligh)m(t)i(elemen)m(t.)0
+2679 y Fc(1.4)112 b(Serv)m(er)38 b(to)s(ols)0 2874 y
+Fg(val)47 b(serve)g(:)94 2987 y(?base64_encoder:\(string)f(->)h
+(string\))g(->)94 3100 y(?base64_decoder:\(string)f(->)h(string\))g(->)
+94 3213 y(?datetime_encoder:\(XmlRpcDateTime.t)f(->)h(string\))g(->)94
+3326 y(?datetime_decoder:\(string)f(->)h(XmlRpcDateTime.t\))g(->)94
+3439 y(?error_handler:\(exn)f(->)h(message\))g(->)94
+3552 y(\(string)g(->)g(value)g(list)f(->)h(value\))g(->)g(string)g(->)g
+(string)227 3688 y Ff(Creates)31 b(a)g(function)g(from)f(string)h
+(\(Xml)f(represen)m(ting)i(a)f Fg(MethodCall)p Ff(\))f(to)g(string)h
+(\(Xml)g(represen)m(ting)227 3801 y(a)g Fg(MethodResult)e
+Ff(or)i Fg(Fault)p Ff(\))f(giv)m(en)h(a)g(function)g(of)f(the)g(form:)
+41 b(\()p Fg(name)30 b Fb(!)g Fg(params)g Fb(!)g Fg(result)p
+Ff(\),)g(where)227 3914 y Fg(name)g Ff(is)g(the)h(name)g(of)f(the)h
+(metho)s(d,)g Fg(params)f Ff(is)g(a)g(list)g(of)g(parameter)i(v)-5
+b(alues,)30 b(and)h Fg(result)f Ff(is)g(the)227 4027
+y(result)h(v)-5 b(alue.)227 4176 y(This)30 b(function)h(can)g(b)s(e)f
+(used)g(to)g(build)h(man)m(y)g(di\033eren)m(t)g(kinds)f(of)g(XmlRp)s(c)
+f(serv)m(ers)i(since)f(it)g(mak)m(es)h(no)227 4289 y(assumptions)g(ab)s
+(out)g(the)f(net)m(w)m(ork)i(library)f(or)g(other)g(comm)m(unications)i
+(metho)s(d)e(used.)227 4438 y(If)f(an)g(exception)i(other)f(than)f
+Fg(XmlRpc.Error)p Ff([1.1])h(o)s(ccurs,)f(the)h(exception)g(is)f
+(passed)h(to)227 4550 y Fg(error_handler)p Ff(.)40 b(If)28
+b Fg(error_handler)h Ff(returns)h(a)g(message,)g(the)f(message)h(will)g
+(b)s(e)f(used)h(as)f(the)g(result.)227 4663 y(If)h(an)g
+Fg(XmlRpc.Error)p Ff([1.1])h(is)f(raised)g(b)m(y)h(either)g(the)g(main)
+g(function)g(or)f Fg(error_handler)p Ff(,)g(it)h(will)g(b)s(e)227
+4776 y(con)m(v)m(erted)i(to)d(an)h(XmlRp)s(c)e Fg(Fault)p
+Ff(.)41 b(An)m(y)30 b(other)h(exception)g(raised)g(b)m(y)f
+Fg(error_handler)g Ff(is)g(allo)m(w)m(ed)j(to)227 4889
+y(escap)s(e.)227 5038 y(F)-8 b(or)31 b(a)g(full-featured,)g
+(easy-to-use,)g(net)m(w)m(ork-capable)i(serv)m(er)e(implemen)m(tation,)
+i(see)d(the)227 5151 y Fg(XmlRpcServer)p Ff([2])h(mo)s(dule.)1927
+5400 y(7)p eop end
+%%Page: 8 8
+TeXDict begin 8 7 bop 0 91 a Fg(val)47 b(serve_message)g(:)94
+204 y(?error_handler:\(exn)f(->)h(message\))g(->)94 317
+y(\(string)g(->)g(value)g(list)f(->)h(value\))g(->)94
+430 y(message)g(->)g(message)227 568 y Ff(P)m(erforms)32
+b(the)e(same)h(function)g(as)f Fg(serve)p Ff(,)g(but)h(op)s(erates)f
+(on)h(t)m(yp)s(ed)g(messages)f(instead)h(of)f(strings.)0
+780 y Fg(val)47 b(default_error_handler)f(:)h(exn)g(->)g(message)227
+918 y Ff(The)31 b(default)g(error)g(handler)g(for)g Fg(serve)p
+Ff(.)227 1068 y(This)g(error)g(handler)g(catc)m(hes)h(all)e(exceptions)
+h(and)g(con)m(v)m(erts)g(them)g(in)m(to)h(faults)e(b)m(y)g(wrapping)i
+(them)f(in)227 1181 y Fg(XmlRpc.Error)p Ff(.)0 1394 y
+Fg(val)47 b(quiet_error_handler)f(:)h(exn)g(->)g(message)227
+1532 y Ff(A)30 b("quiet")h(error)g(handler)h(for)e Fg(serve)p
+Ff(.)227 1682 y(This)h(error)g(handler)g(simply)f(re-raises)h(the)g
+(exception.)41 b(Use)30 b(this)g(if)g(y)m(ou)h(w)m(an)m(t)h(exceptions)
+f(to)f(remain)227 1795 y(unhandled)i(so)e(that)h(they)f(will)h(escap)s
+(e)g(to)f(the)h(error)g(log.)41 b(The)30 b(clien)m(t)i(will)f(receiv)m
+(e)g(a)f(generic)227 1908 y("transp)s(ort)h(error",)h(whic)m(h)f(is)f
+(more)h(secure)g(since)f(it)h(do)s(es)f(not)g(rev)m(eal)i(an)m(y)e
+(information)i(ab)s(out)f(the)227 2021 y(sp)s(eci\034c)g(exception)g
+(that)g(o)s(ccurred.)0 2382 y Fi(2)131 b(Mo)t(dule)44
+b Fe(XmlRpcServer)39 b Fi(:)58 b(XmlRp)t(c)44 b(Ligh)l(t)h(serv)l(er.)0
+2703 y Ff(Example:)188 2954 y Fg(let)i(server)g(=)g(new)g
+(XmlRpcServer.cgi)f(\(\))h(in)188 3067 y(server#register)g
+("demo.sayHello")282 3179 y(\(fun)g(_)g(->)g(`String)f("Hello!"\);)188
+3292 y(server#run)h(\(\))141 3405 y Ff(By)25 b(inheriting)h(from)g
+Fg(XmlRpcServer.base)p Ff([2.1],)g(all)g(serv)m(ers)f(pro)m(vide)h(the)
+f(follo)m(wing)i(in)m(trosp)s(ection)g(func-)0 3518 y(tions)49
+b(b)m(y)g(default:)79 b Fg(system.listMethods)p Ff(,)53
+b Fg(system.getCapabilities)p Ff(.)96 b(T)-8 b(o)50 b(prev)m(en)m(t)h
+(their)e(use,)54 b(use)0 3631 y Fg(server#unregister)p
+Ff(.)141 3744 y(A)m(dditionally)-8 b(,)52 b(the)46 b(metho)s(ds)g
+Fg(system.methodHelp)g Ff(and)g Fg(system.methodSignature)f
+Ff(will)i(b)s(e)e(made)0 3857 y(a)m(v)-5 b(ailable)32
+b(if)e(at)g(least)h(one)f(metho)s(d)h(help)g(or)g(metho)s(d)f
+(signature)i(is)e(pro)m(vided.)0 3995 y Fg(type)47 b(param_type)g(=)g
+([)g(`Array)94 4108 y(|)g(`Binary)94 4221 y(|)g(`Boolean)94
+4333 y(|)g(`DateTime)94 4446 y(|)g(`Double)94 4559 y(|)g(`Int)94
+4672 y(|)g(`String)94 4785 y(|)g(`Struct)94 4898 y(|)g(`Undefined)g(])
+227 5036 y Ff(T)m(yp)s(e)31 b(of)f(parameters)h(used)g(in)f(metho)s(d)h
+(signatures.)1927 5400 y(8)p eop end
+%%Page: 9 9
+TeXDict begin 9 8 bop 0 91 a Fc(2.1)112 b(Base)38 b(classes)0
+287 y Fg(class)47 b(virtual)g(base)g(:)90 400 y(object)227
+574 y(val)g(methods)g(:)g(\(string,)g(XmlRpc.value)f(list)h(->)g
+(XmlRpc.value\))g(Hashtbl.t)427 748 y Ff(Hash)m(table)32
+b(mapping)f(metho)s(d)g(names)g(to)f(implemen)m(tation)k(functions.)227
+959 y Fg(val)47 b(mutable)g(base64_encoder)g(:)g(string)f(->)h(string)
+427 1133 y Ff(Base-64)31 b(binary)g(enco)s(ding)g(function.)227
+1344 y Fg(val)47 b(mutable)g(base64_decoder)g(:)g(string)f(->)h(string)
+427 1519 y Ff(Base-64)31 b(binary)g(deco)s(ding)g(function.)227
+1730 y Fg(val)47 b(mutable)g(datetime_encoder)g(:)g(XmlRpcDateTime.t)f
+(->)h(string)427 1904 y Ff(ISO-8601)31 b(date/time)h(enco)s(ding)f
+(function.)227 2115 y Fg(val)47 b(mutable)g(datetime_decoder)g(:)g
+(string)f(->)h(XmlRpcDateTime.t)427 2289 y Ff(ISO-8601)31
+b(date/time)h(deco)s(ding)f(function.)227 2500 y Fg(val)47
+b(mutable)g(error_handler)g(:)g(exn)g(->)f(XmlRpc.message)427
+2675 y Ff(Handler)31 b(for)f(unhandled)i(exceptions.)227
+2886 y Fg(method)47 b(set_base64_encoder)g(:)g(\(string)f(->)h
+(string\))g(->)g(unit)427 3060 y Ff(Sets)31 b(an)f(alternate)i(Base-64)
+f(binary)f(enco)s(ding)i(function.)227 3271 y Fg(method)47
+b(set_base64_decoder)g(:)g(\(string)f(->)h(string\))g(->)g(unit)427
+3445 y Ff(Sets)31 b(an)f(alternate)i(Base-64)f(binary)f(deco)s(ding)i
+(function.)227 3656 y Fg(method)47 b(set_datetime_encoder)g(:)g
+(\(XmlRpcDateTime.t)f(->)h(string\))g(->)g(unit)427 3831
+y Ff(Sets)31 b(an)f(alternate)i(ISO-8601)f(date/time)h(enco)s(ding)f
+(function.)227 4042 y Fg(method)47 b(set_datetime_decoder)g(:)g
+(\(string)f(->)h(XmlRpcDateTime.t\))g(->)g(unit)427 4216
+y Ff(Sets)31 b(an)f(alternate)i(ISO-8601)f(date/time)h(deco)s(ding)f
+(function.)227 4427 y Fg(method)47 b(set_error_handler)g(:)g(\(exn)g
+(->)f(XmlRpc.message\))h(->)g(unit)427 4601 y Ff(Sets)31
+b(an)f(alternate)i(handler)f(for)f(unhandled)i(exceptions.)42
+b(See)427 4714 y Fg(XmlRpc.default_error_handler)p Ff([1.4])31
+b(and)f Fg(XmlRpc.quiet_error_handler)p Ff([1.4])h(for)427
+4827 y(examples.)227 5038 y Fg(method)47 b(serve)g(:)321
+5151 y(\(string)g(->)g(XmlRpc.value)g(list)g(->)f(XmlRpc.value\))h(->)g
+(string)g(->)g(string)1927 5400 y Ff(9)p eop end
+%%Page: 10 10
+TeXDict begin 10 9 bop 427 91 a Ff(F)-8 b(or)31 b(use)f(in)h(sub)s
+(classes;)e(calls)i Fg(XmlRpc.serve)p Ff([1.4])f(with)h(the)g(curren)m
+(t)h(enco)s(ders,)f(deco)s(ders,)g(and)427 204 y(error)g(handler.)227
+401 y Fg(method)47 b(serve_message)g(:)321 514 y(\(string)g(->)g
+(XmlRpc.value)g(list)g(->)f(XmlRpc.value\))h(->)321 627
+y(XmlRpc.message)g(->)g(XmlRpc.message)427 795 y Ff(Lik)m(e)31
+b Fg(serve)p Ff(,)g(but)f(op)s(erates)h(on)f(messages)h(instead)f(of)g
+(strings.)227 992 y Fg(method)47 b(register)g(:)321 1104
+y(string)g(->)321 1217 y(?help:string)g(->)321 1330 y
+(?signature:XmlRpcServer.param_type)f(list)h(->)321 1443
+y(?signatures:XmlRpcServer.param_type)f(list)h(list)g(->)321
+1556 y(\(XmlRpc.value)g(list)g(->)g(XmlRpc.value\))f(->)h(unit)427
+1724 y Ff(Registers)30 b(a)h(metho)s(d)g(with)f(the)h(serv)m(er.)427
+1849 y(If)f(a)g Fg(help)g Ff(string)h(is)f(sp)s(eci\034ed,)g(its)h(con)
+m(ten)m(ts)h(will)e(b)s(e)g(returned)i(for)e(calls)h(to)427
+1962 y Fg(system.methodHelp)f Ff(for)g(this)g(metho)s(d.)427
+2088 y(If)g Fg(signature)g Ff(is)g(sp)s(eci\034ed,)g(this)h(metho)s
+(d's)f(signature)i(will)e(b)s(e)g(published)i(b)m(y)427
+2201 y Fg(system.methodSignature)e Ff(and)h(\(shallo)m(w\))g(t)m(yp)s
+(e-c)m(hec)m(king)i(will)e(b)s(e)f(enabled)h(for)f(parameters)427
+2314 y(passed)h(in)m(to)g(this)f(metho)s(d.)427 2439
+y(Multiple)h(signatures)g(can)g(b)s(e)f(supplied)h(via)f
+Fg(signatures)g Ff(if)g(desired)h(to)f(pro)m(vide)i(for)e(o)m(v)m
+(erloaded)427 2552 y(metho)s(ds.)427 2678 y(Signatures)i(are)e(of)g
+(the)h(form)g Fg(return-type;)46 b(param1-type;)h(param2-type;)g(...)40
+b Ff(where)427 2791 y(eac)m(h)32 b(t)m(yp)s(e)e(is)g(an)h(instance)g
+(of)f(the)g Fg(XmlRpcServer.param_type)p Ff([2])g(v)-5
+b(arian)m(t.)227 2988 y Fg(method)47 b(unregister)g(:)g(string)g(->)g
+(unit)427 3155 y Ff(Remo)m(v)m(es)31 b(a)f(metho)s(d)h(from)g(the)g
+(serv)m(er.)227 3352 y Fg(method)47 b(virtual)g(run)g(:)g(unit)g(->)g
+(unit)427 3520 y Ff(Starts)31 b(the)g(main)g(serv)m(er)f(pro)s(cess.)90
+3729 y Fg(end)227 3905 y Ff(Abstract)h(base)f(class)g(for)g(XmlRp)s(c)g
+(serv)m(ers.)0 4102 y Fg(class)47 b(type)g(server)g(=)90
+4215 y(object)227 4383 y(inherit)g(XmlRpcServer.base)30
+b Ff([2.1])227 4517 y Fg(method)47 b(run)g(:)g(unit)g(->)g(unit)427
+4685 y Ff(Starts)31 b(the)g(main)g(serv)m(er)f(pro)s(cess.)90
+4894 y Fg(end)227 5070 y Ff(T)m(yp)s(e)h(of)f(concrete)h(XmlRp)s(c)f
+(serv)m(er)h(classes.)1905 5400 y(10)p eop end
+%%Page: 11 11
+TeXDict begin 11 10 bop 0 91 a Fc(2.2)112 b(Serv)m(er)38
+b(implemen)m(tations)0 288 y Fg(class)47 b(cgi)g(:)g(unit)g(->)g
+(server)227 426 y Ff(CGI)30 b(XmlRp)s(c)g(serv)m(er)h(based)f(on)h
+(Netcgi2.)0 638 y Fg(class)47 b(netplex)g(:)g
+(?parallelizer:Netplex_types.parallelizer)f(->)h(?handler:string)f(->)h
+(unit)g(->)g(server)227 776 y Ff(Stand-alone)32 b(XmlRp)s(c)e(serv)m
+(er)h(based)f(on)h(Netplex.)0 1094 y Fc(2.3)112 b(Utilit)m(y)34
+b(functions)0 1291 y Fg(val)47 b(invalid_method)g(:)g(string)f(->)h('a)
+227 1428 y Ff(Raise)30 b(an)h Fg(XmlRpc.Error)p Ff([1.1])f(indicating)i
+(a)e(metho)s(d)h(name)g(not)g(found.)0 1641 y Fg(val)47
+b(invalid_params)g(:)g(unit)f(->)h('a)227 1779 y Ff(Raise)30
+b(an)h Fg(XmlRpc.Error)p Ff([1.1])f(indicating)i(in)m(v)-5
+b(alid)31 b(metho)s(d)g(parameters.)0 2140 y Fi(3)131
+b(Mo)t(dule)44 b Fe(XmlRpcDateTime)39 b Fi(:)58 b(Date/time)43
+b(t)l(yp)t(e.)0 2464 y Fc(3.1)112 b(T)m(yp)s(es)0 2661
+y Fg(exception)47 b(Parse_error)f(of)h(string)227 2799
+y Ff(Raised)30 b(b)m(y)h Fg(XmlRpcDateTime.of_string)p
+Ff([3.6])f(if)g(a)g(string)h(could)g(not)g(b)s(e)f(parsed.)41
+b(The)31 b(exception)227 2912 y(con)m(tains)h(the)f(input)g(string.)0
+3124 y Fg(type)47 b(t)g(=)g(int)g(*)g(int)g(*)g(int)f(*)h(int)g(*)g
+(int)g(*)g(int)g(*)g(int)227 3262 y Ff(T)m(yp)s(e)31
+b(of)f(XmlRp)s(c-compatible)i(date/time)f(v)-5 b(alues.)41
+b(\(y)m(ear,)31 b(mon)m(th,)h(da)m(y)-8 b(,)31 b(hour,)g(min)m(ute,)h
+(second,)227 3375 y(time)f(zone)g(o\033set)f(in)h(min)m(utes\))0
+3693 y Fc(3.2)112 b(Comparison)0 3889 y Fg(val)47 b(compare)g(:)g(t)g
+(->)g(t)g(->)f(int)227 4027 y Ff(Standard)32 b(comparator)g(for)e
+(date/time)i(v)-5 b(alues.)40 b(Con)m(v)m(erts)32 b(all)f(v)-5
+b(alues)30 b(to)g(UTC)h(b)s(efore)f(comparing)i(to)227
+4140 y(ensure)f(correct)g(b)s(eha)m(vior)h(with)e(v)-5
+b(alues)31 b(of)f(di\033ering)h(time)g(zones.)0 4353
+y Fg(val)47 b(equal)g(:)g(t)g(->)g(t)g(->)f(bool)227
+4491 y Ff(Standard)32 b(equalit)m(y)f(function)g(for)f(date/time)i(v)-5
+b(alues.)40 b(Con)m(v)m(erts)32 b(all)f(v)-5 b(alues)30
+b(to)g(UTC)h(b)s(efore)227 4603 y(comparing.)0 4816 y
+Fg(val)47 b(hash)g(:)g(t)g(->)g(int)227 4954 y Ff(Standard)32
+b(hash)e(function)h(for)g(date/time)g(v)-5 b(alues.)41
+b(Con)m(v)m(erts)32 b(v)-5 b(alues)30 b(to)g(UTC)h(b)s(efore)f
+(hashing.)1905 5400 y(11)p eop end
+%%Page: 12 12
+TeXDict begin 12 11 bop 0 91 a Fc(3.3)112 b(Curren)m(t)37
+b(date)h(and)g(time)0 287 y Fg(val)47 b(now)g(:)g(unit)g(->)g(t)227
+424 y Ff(Returns)31 b(the)f(curren)m(t)i(date)f(and)g(time)g(in)f(the)h
+(lo)s(cal)f(time)h(zone.)0 633 y Fg(val)47 b(now_utc)g(:)g(unit)g(->)f
+(t)227 770 y Ff(Returns)31 b(the)f(curren)m(t)i(date)f(and)g(time)g(in)
+f(UTC.)0 1084 y Fc(3.4)112 b(Time)36 b(zone)i(adjustmen)m(ts)0
+1280 y Fg(val)47 b(set_tz_offset)g(:)g(int)f(->)h(t)g(->)g(t)227
+1417 y Ff(A)m(djusts)30 b(the)h(time)g(zone)g(o\033set,)f(preserving)h
+(equalit)m(y)-8 b(.)0 1626 y Fg(val)47 b(fix_tz_offset)g(:)g(int)f(->)h
+(t)g(->)g(t)227 1763 y Ff(F)-8 b(orces)31 b(the)g(time)g(zone)g
+(o\033set)f(to)g(a)h(di\033eren)m(t)g(v)-5 b(alue,)31
+b(ignoring)h(all)e(other)h(\034elds.)41 b(Use)30 b(this)g(to)g(correct)
+227 1875 y(the)h(time)g(zone)g(of)f(a)g(date/time)i(v)-5
+b(alue)30 b(that)h(w)m(as)g(receiv)m(ed)h(without)f(a)f(time)h(zone)g
+(o\033set)f(and)h(is)227 1988 y(kno)m(wn)h(not)e(to)h(b)s(e)f(UTC.)0
+2303 y Fc(3.5)112 b(Con)m(v)m(ersion)0 2499 y Fg(val)47
+b(from_unixfloat)g(:)g(float)f(->)h(t)227 2635 y Ff(Builds)31
+b(a)f(date/time)i(v)-5 b(alue)30 b(from)h(ep)s(o)s(c)m(h)g(seconds)f
+(in)g(the)h(lo)s(cal)g(time)g(zone.)0 2844 y Fg(val)47
+b(from_unixfloat_utc)f(:)h(float)g(->)g(t)227 2981 y
+Ff(Builds)31 b(a)f(date/time)i(v)-5 b(alue)30 b(from)h(ep)s(o)s(c)m(h)g
+(seconds)f(in)g(UTC.)0 3190 y Fg(val)47 b(to_unixfloat)g(:)g(t)g(->)f
+(float)227 3327 y Ff(Con)m(v)m(erts)32 b(a)e(date/time)i(v)-5
+b(alue)31 b(to)f(ep)s(o)s(c)m(h)h(seconds)f(in)h(the)f(lo)s(cal)h(time)
+g(zone.)0 3536 y Fg(val)47 b(to_unixfloat_utc)g(:)f(t)h(->)g(float)227
+3673 y Ff(Con)m(v)m(erts)32 b(a)e(date/time)i(v)-5 b(alue)31
+b(to)f(ep)s(o)s(c)m(h)h(seconds)f(in)h(UTC.)0 3882 y
+Fg(val)47 b(from_unixtm)g(:)g(Unix.tm)f(->)h(t)227 4019
+y Ff(Builds)31 b(a)f(date/time)i(v)-5 b(alue)30 b(from)h(a)f(Unix.tm)h
+(v)-5 b(alue)30 b(in)h(the)g(lo)s(cal)f(time)h(zone.)0
+4228 y Fg(val)47 b(from_unixtm_utc)g(:)f(Unix.tm)h(->)g(t)227
+4365 y Ff(Builds)31 b(a)f(date/time)i(v)-5 b(alue)30
+b(from)h(a)f(Unix.tm)h(v)-5 b(alue)30 b(in)h(UTC.)0 4573
+y Fg(val)47 b(to_unixtm)g(:)g(t)g(->)g(Unix.tm)227 4710
+y Ff(Con)m(v)m(erts)32 b(a)e(date/time)i(v)-5 b(alue)31
+b(to)f(a)h(Unix.tm)f(v)-5 b(alue)31 b(in)f(the)h(lo)s(cal)f(time)h
+(zone.)0 4919 y Fg(val)47 b(to_unixtm_utc)g(:)g(t)f(->)h(Unix.tm)227
+5056 y Ff(Con)m(v)m(erts)32 b(a)e(date/time)i(v)-5 b(alue)31
+b(to)f(a)h(Unix.tm)f(v)-5 b(alue)31 b(in)f(UTC.)1905
+5400 y(12)p eop end
+%%Page: 13 13
+TeXDict begin 13 12 bop 0 91 a Fc(3.6)112 b(ISO-8601)38
+b(parsing)g(and)g(generation)0 288 y Fg(val)47 b(of_string)g(:)g
+(string)f(->)h(t)227 426 y Ff(P)m(arses)31 b(an)g(\(XmlRp)s(c-\035a)m
+(v)m(or\))g(ISO-8601)h(date/time)g(v)-5 b(alue)30 b(from)h(a)f(string.)
+0 638 y Fg(val)47 b(to_string)g(:)g(t)g(->)g(string)227
+776 y Ff(Generates)31 b(an)g(ISO-8601)g(string)g(from)f(a)g(date/time)i
+(v)-5 b(alue.)0 1137 y Fi(4)131 b(Mo)t(dule)44 b Fe(XmlRpcBase64)39
+b Fi(:)58 b(Base64)44 b(co)t(dec.)0 1340 y Ff(8-bit)33
+b(c)m(haracters)h(are)f(enco)s(ded)h(in)m(to)f(6-bit)g(ones)g(using)g
+(ASCI)s(I)e(lo)s(okup)i(tables.)48 b(Default)32 b(tables)h(maps)g
+(0..63)0 1453 y(v)-5 b(alues)30 b(on)h(c)m(haracters)h(A-Z,)e(a-z,)h
+(0-9,)g('+')f(and)h('/')g(\(in)f(that)h(order\).)0 1709
+y Fg(exception)47 b(Invalid_char)227 1847 y Ff(This)31
+b(exception)g(is)f(raised)h(when)g(reading)g(an)g(in)m(v)-5
+b(alid)31 b(c)m(haracter)h(from)f(a)f(base64)h(input.)0
+2059 y Fg(exception)47 b(Invalid_table)227 2197 y Ff(This)31
+b(exception)g(is)f(raised)h(if)e(the)i(enco)s(ding)g(or)g(deco)s(ding)g
+(table)g(size)f(is)g(not)h(correct.)0 2410 y Fg(type)47
+b(encoding_table)g(=)f(char)h(array)227 2547 y Ff(An)30
+b(enco)s(ding)i(table)f(maps)f(in)m(tegers)i(0..63)f(to)f(the)h
+(corresp)s(onding)g(c)m(har.)0 2760 y Fg(type)47 b(decoding_table)g(=)f
+(int)h(array)227 2898 y Ff(A)30 b(deco)s(ding)h(table)g(maps)g(c)m
+(hars)g(0..255)g(to)g(the)f(corresp)s(onding)i(0..63)f(v)-5
+b(alue)30 b(or)h(-1)f(if)g(the)h(c)m(har)g(is)f(not)227
+3011 y(accepted.)0 3223 y Fg(val)47 b(str_encode)g(:)g
+(?tbl:encoding_table)f(->)h(string)g(->)g(string)227
+3361 y Ff(Enco)s(de)31 b(a)g(string)f(in)m(to)i(Base64.)0
+3574 y Fg(val)47 b(str_decode)g(:)g(?tbl:decoding_table)f(->)h(string)g
+(->)g(string)227 3711 y Ff(Deco)s(de)30 b(a)f(string)g(enco)s(ded)h(in)
+m(to)g(Base64,)g(raise)f Fg(Invalid_char)g Ff(if)g(a)g(c)m(haracter)i
+(in)e(the)h(input)g(string)f(is)227 3824 y(not)i(a)f(v)-5
+b(alid)31 b(one.)0 4037 y Fg(val)47 b(encode)g(:)g(?tbl:encoding_table)
+f(->)h(char)g(Stream.t)g(->)g(char)g(Stream.t)227 4175
+y Ff(Generic)31 b(base64)g(enco)s(ding)g(o)m(v)m(er)h(a)e(c)m(haracter)
+i(stream.)0 4387 y Fg(val)47 b(decode)g(:)g(?tbl:decoding_table)f(->)h
+(char)g(Stream.t)g(->)g(char)g(Stream.t)227 4525 y Ff(Generic)31
+b(base64)g(deco)s(ding)g(o)m(v)m(er)h(a)e(c)m(haracter)i(stream.)0
+4738 y Fg(val)47 b(make_decoding_table)f(:)h(encoding_table)g(->)g
+(decoding_table)227 4875 y Ff(Create)32 b(a)e(v)-5 b(alid)30
+b(deco)s(ding)i(table)f(from)f(an)h(enco)s(ding)g(one.)1905
+5400 y(13)p eop end
+%%Trailer
+
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/doc/xmlrpc-light/latex/doc.tex b/doc/xmlrpc-light/latex/doc.tex
new file mode 100644
index 0000000..f9bde20
--- /dev/null
+++ b/doc/xmlrpc-light/latex/doc.tex
@@ -0,0 +1,1551 @@
+\documentclass[11pt]{article}
+\usepackage[latin1]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage{fullpage}
+\usepackage{url}
+\usepackage{ocamldoc}
+\begin{document}
+\tableofcontents
+\section{Module {\tt{XmlRpc}} : XmlRpc Light.}
+\label{module:XmlRpc}\index{XmlRpc@\verb`XmlRpc`}
+
+
+
+ XmlRpc Light is a minimal XmlRpc library based on Xml Light and Ocamlnet.
+
+
+ It provides a type for values, a client class with a simple calling
+ interface, and low-level tools that can be used to implement a server.
+
+
+ {\it (c) 2007-2009 Dave Benjamin}
+
+
+
+\ocamldocvspace{0.5cm}
+
+
+
+\label{val:XmlRpc.version}\begin{ocamldoccode}
+val version : string
+\end{ocamldoccode}
+\index{version@\verb`version`}
+\begin{ocamldocdescription}
+Version of XmlRpc-Light as a string.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\subsection{High-level interface}
+
+
+
+
+Example: \begin{ocamldoccode}
+
+ let rpc = new XmlRpc.client "http://localhost:8000" in
+ let result = rpc#call "echo" [`String "hello!"] in
+ print_endline (XmlRpc.dump result)
+\end{ocamldoccode}
+
+
+
+
+\label{exception:XmlRpc.Error}\begin{ocamldoccode}
+exception Error of (int * string)
+\end{ocamldoccode}
+\index{Error@\verb`Error`}
+\begin{ocamldocdescription}
+Raised for all errors including XmlRpc faults (code, string).
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{type:XmlRpc.value}\begin{ocamldoccode}
+type value = [ `Array of value list
+ | `Binary of string
+ | `Boolean of bool
+ | `DateTime of XmlRpcDateTime.t
+ | `Double of float
+ | `Int of int
+ | `Int32 of int32
+ | `Nil
+ | `String of string
+ | `Struct of (string * value) list ]
+\end{ocamldoccode}
+\index{value@\verb`value`}
+\begin{ocamldocdescription}
+Polymorphic variant type for XmlRpc values:\begin{itemize}
+\item {\tt{`Array}}: An ordered list of values
+\item {\tt{`Binary}}: A string containing binary data
+\item {\tt{`Boolean}}: A boolean
+\item {\tt{`DateTime}}: A date/time value
+\item {\tt{`Double}}: A floating-point value
+\item {\tt{`Int}}: An integer
+\item {\tt{`Int32}}: A 32-bit integer
+\item {\tt{`Nil}}: A null value
+\item {\tt{`String}}: A string
+\item {\tt{`Struct}}: An association list of (name, value) pairs
+\end{itemize}
+
+ Note that base64-encoding of {\tt{`Binary}} values is done automatically.
+ You do not need to do the encoding yourself.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\begin{ocamldoccode}
+{\tt{class client : }}{\tt{?debug:bool -> ?headers:(string * string) list -> ?insecure\_ssl:bool -> ?timeout:float -> ?useragent:string -> string -> }}\end{ocamldoccode}
+\label{class:XmlRpc.client}\index{client@\verb`client`}
+
+\begin{ocamldocobjectend}
+
+
+\label{val:XmlRpc.client.url}\begin{ocamldoccode}
+val url : string
+\end{ocamldoccode}
+\index{url@\verb`url`}
+\begin{ocamldocdescription}
+Url of the remote XmlRpc server.
+
+
+\end{ocamldocdescription}
+
+
+\label{val:XmlRpc.client.debug}\begin{ocamldoccode}
+val mutable debug : bool
+\end{ocamldoccode}
+\index{debug@\verb`debug`}
+\begin{ocamldocdescription}
+If true, Xml messages will be printed to standard error.
+
+
+\end{ocamldocdescription}
+
+
+\label{val:XmlRpc.client.headers}\begin{ocamldoccode}
+val mutable headers : (string * string) list
+\end{ocamldoccode}
+\index{headers@\verb`headers`}
+\begin{ocamldocdescription}
+List of custom HTTP headers to send with each request.
+
+
+\end{ocamldocdescription}
+
+
+\label{val:XmlRpc.client.insecure-underscoressl}\begin{ocamldoccode}
+val mutable insecure_ssl : bool
+\end{ocamldoccode}
+\index{insecure-underscoressl@\verb`insecure_ssl`}
+\begin{ocamldocdescription}
+If true, SSL will be allowed even if the certificate is self-signed.
+
+
+\end{ocamldocdescription}
+
+
+\label{val:XmlRpc.client.timeout}\begin{ocamldoccode}
+val mutable timeout : float
+\end{ocamldoccode}
+\index{timeout@\verb`timeout`}
+\begin{ocamldocdescription}
+Maximum time to wait for a request to complete, in seconds.
+
+
+\end{ocamldocdescription}
+
+
+\label{val:XmlRpc.client.useragent}\begin{ocamldoccode}
+val mutable useragent : string
+\end{ocamldoccode}
+\index{useragent@\verb`useragent`}
+\begin{ocamldocdescription}
+User-agent to send in request headers.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpc.client.url}\begin{ocamldoccode}
+method url : string
+\end{ocamldoccode}
+\index{url@\verb`url`}
+\begin{ocamldocdescription}
+Gets {\tt{url}}.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpc.client.debug}\begin{ocamldoccode}
+method debug : bool
+\end{ocamldoccode}
+\index{debug@\verb`debug`}
+\begin{ocamldocdescription}
+Gets {\tt{debug}}.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpc.client.set-underscoredebug}\begin{ocamldoccode}
+method set_debug : bool -> unit
+\end{ocamldoccode}
+\index{set-underscoredebug@\verb`set_debug`}
+\begin{ocamldocdescription}
+Sets {\tt{debug}}.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpc.client.headers}\begin{ocamldoccode}
+method headers : (string * string) list
+\end{ocamldoccode}
+\index{headers@\verb`headers`}
+\begin{ocamldocdescription}
+Gets {\tt{headers}}.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpc.client.set-underscoreheaders}\begin{ocamldoccode}
+method set_headers : (string * string) list -> unit
+\end{ocamldoccode}
+\index{set-underscoreheaders@\verb`set_headers`}
+\begin{ocamldocdescription}
+Sets {\tt{headers}}.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpc.client.insecure-underscoressl}\begin{ocamldoccode}
+method insecure_ssl : bool
+\end{ocamldoccode}
+\index{insecure-underscoressl@\verb`insecure_ssl`}
+\begin{ocamldocdescription}
+Gets {\tt{insecure\_ssl}}.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpc.client.set-underscoreinsecure-underscoressl}\begin{ocamldoccode}
+method set_insecure_ssl : bool -> unit
+\end{ocamldoccode}
+\index{set-underscoreinsecure-underscoressl@\verb`set_insecure_ssl`}
+\begin{ocamldocdescription}
+Sets {\tt{insecure\_ssl}}.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpc.client.timeout}\begin{ocamldoccode}
+method timeout : float
+\end{ocamldoccode}
+\index{timeout@\verb`timeout`}
+\begin{ocamldocdescription}
+Gets {\tt{timeout}}.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpc.client.set-underscoretimeout}\begin{ocamldoccode}
+method set_timeout : float -> unit
+\end{ocamldoccode}
+\index{set-underscoretimeout@\verb`set_timeout`}
+\begin{ocamldocdescription}
+Sets {\tt{timeout}}.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpc.client.useragent}\begin{ocamldoccode}
+method useragent : string
+\end{ocamldoccode}
+\index{useragent@\verb`useragent`}
+\begin{ocamldocdescription}
+Gets {\tt{useragent}}.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpc.client.set-underscoreuseragent}\begin{ocamldoccode}
+method set_useragent : string -> unit
+\end{ocamldoccode}
+\index{set-underscoreuseragent@\verb`set_useragent`}
+\begin{ocamldocdescription}
+Sets {\tt{useragent}}.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpc.client.set-underscorebase64-underscoreencoder}\begin{ocamldoccode}
+method set_base64_encoder : (string -> string) -> unit
+\end{ocamldoccode}
+\index{set-underscorebase64-underscoreencoder@\verb`set_base64_encoder`}
+\begin{ocamldocdescription}
+Sets an alternate Base-64 binary encoding function.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpc.client.set-underscorebase64-underscoredecoder}\begin{ocamldoccode}
+method set_base64_decoder : (string -> string) -> unit
+\end{ocamldoccode}
+\index{set-underscorebase64-underscoredecoder@\verb`set_base64_decoder`}
+\begin{ocamldocdescription}
+Sets an alternate Base-64 binary decoding function.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpc.client.set-underscoredatetime-underscoreencoder}\begin{ocamldoccode}
+method set_datetime_encoder : (XmlRpcDateTime.t -> string) -> unit
+\end{ocamldoccode}
+\index{set-underscoredatetime-underscoreencoder@\verb`set_datetime_encoder`}
+\begin{ocamldocdescription}
+Sets an alternate ISO-8601 date/time encoding function.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpc.client.set-underscoredatetime-underscoredecoder}\begin{ocamldoccode}
+method set_datetime_decoder : (string -> XmlRpcDateTime.t) -> unit
+\end{ocamldoccode}
+\index{set-underscoredatetime-underscoredecoder@\verb`set_datetime_decoder`}
+\begin{ocamldocdescription}
+Sets an alternate ISO-8601 date/time decoding function.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpc.client.call}\begin{ocamldoccode}
+method call : string -> XmlRpc.value list -> XmlRpc.value
+\end{ocamldoccode}
+\index{call@\verb`call`}
+\begin{ocamldocdescription}
+{\tt{call name params}} invokes an XmlRpc method and returns the result,
+ or raises {\tt{XmlRpc.Error}}[\ref{exception:XmlRpc.Error}] on error.
+
+
+\end{ocamldocdescription}
+\end{ocamldocobjectend}
+
+
+\begin{ocamldocdescription}
+Class for XmlRpc clients. Takes a single mandatory argument, {\tt{url}}.
+
+
+ If {\tt{url}} is of the form "http://username:password@$\ldots$", basic
+ authentication will be used.
+
+
+ If {\tt{url}} starts with "https", Curl will be used instead of Ocamlnet.
+ The "curl" command-line program must be in your path for this to work.
+ You can use the {\tt{insecure\_ssl}} setting to allow connections to servers
+ with self-signed certificates; by default this is false and certificates
+ must be valid.
+
+
+ {\tt{timeout}} can be used to specify the maximum amount of time
+ elapsed before a connection is cancelled. It defaults to 300.0 seconds.
+
+
+ {\tt{headers}} may contain an array of (name, value) pairs of additional
+ headers to send with each request.
+
+
+ The {\tt{useragent}} setting provides a convenient way to change the
+ User-Agent header, which defaults to "XmlRpc-Light/$<$version$>$".
+
+
+ The {\tt{debug}} setting, if true, will enable verbose debugging output to
+ the standard error stream.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\begin{ocamldoccode}
+{\tt{class multicall : }}{\tt{client -> }}\end{ocamldoccode}
+\label{class:XmlRpc.multicall}\index{multicall@\verb`multicall`}
+
+\begin{ocamldocobjectend}
+
+
+\label{method:XmlRpc.multicall.call}\begin{ocamldoccode}
+method call : string -> XmlRpc.value list -> XmlRpc.value Lazy.t
+\end{ocamldoccode}
+\index{call@\verb`call`}
+\begin{ocamldocdescription}
+Adds a call to this {\tt{multicall}} instance.
+ If the call has already executed, the following exception will
+ be raised:
+ Failure "multicall\verb`#`call: already executed".
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpc.multicall.execute}\begin{ocamldoccode}
+method execute : unit -> unit
+\end{ocamldoccode}
+\index{execute@\verb`execute`}
+\begin{ocamldocdescription}
+Forces the call to execute immediately.
+ If the call has already executed and completed successfully, the
+ following exception will be raised:
+ Failure "multicall\verb`#`execute: already completed".
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpc.multicall.result}\begin{ocamldoccode}
+method result : int -> XmlRpc.value
+\end{ocamldoccode}
+\index{result@\verb`result`}
+\begin{ocamldocdescription}
+Returns a {\tt{multicall}} result, executing the call if necessary.
+ The results are numbered starting with zero.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpc.multicall.executed}\begin{ocamldoccode}
+method executed : bool
+\end{ocamldoccode}
+\index{executed@\verb`executed`}
+\begin{ocamldocdescription}
+True if the call has executed, whether or not it succeeded.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpc.multicall.completed}\begin{ocamldoccode}
+method completed : bool
+\end{ocamldoccode}
+\index{completed@\verb`completed`}
+\begin{ocamldocdescription}
+True of the call has executed and completed successfully.
+
+
+\end{ocamldocdescription}
+\end{ocamldocobjectend}
+
+
+\begin{ocamldocdescription}
+Convenience class for {\tt{system.multicall}} calls.
+
+
+ Instances take an {\tt{XmlRpc.client}}[\ref{class:XmlRpc.client}] as an argument: \begin{ocamldoccode}
+
+ # let mc = new XmlRpc.multicall client;;
+ val mc : XmlRpc.multicall = <obj>
+
+\end{ocamldoccode}
+
+ The "call" method works like {\tt{client\verb`#`call}}, but it returns a lazy
+ value: \begin{ocamldoccode}
+
+ # let a = mc#call "demo.addTwoNumbers" [`Int 3; `Int 4];;
+ val a : XmlRpc.value Lazy.t = <lazy>
+ # let b = mc#call "demo.addTwoNumbers" [`Int 42; `String "oh noes!"];;
+ val b : XmlRpc.value Lazy.t = <lazy>
+ # let c = mc#call "demo.addTwoNumbers" [`Double 3.0; `Double 4.0];;
+ val c : XmlRpc.value Lazy.t = <lazy>
+
+\end{ocamldoccode}
+
+ At this point, the call has not been executed yet: \begin{ocamldoccode}
+
+ # mc#executed;;
+ -- : bool = false
+
+\end{ocamldoccode}
+
+ As soon as one of the return values is forced, the call is executed: \begin{ocamldoccode}
+
+ # Lazy.force a;;
+ -- : XmlRpc.value = `Int 7
+ # mc#executed;;
+ -- : bool = true
+
+\end{ocamldoccode}
+
+ Once a call has been executed, this instance cannot be used to make any
+ further calls; instead, a new {\tt{multicall}} instance must be created: \begin{ocamldoccode}
+
+ # mc#call "demo.addTwoNumbers" [`Int 2; `Int 2];;
+ Exception: Failure "multicall#call: already executed".
+
+\end{ocamldoccode}
+
+ If an XmlRpc fault occurred, the exception will be thrown when the lazy
+ value is forced: \begin{ocamldoccode}
+
+ # Lazy.force b;;
+ Exception: XmlRpc.Error (-32602, "server error. invalid method parameters").
+
+\end{ocamldoccode}
+
+ This will not prevent further methods from executing successfully: \begin{ocamldoccode}
+
+ # Lazy.force c;;
+ -- : XmlRpc.value = `Double 7.
+
+\end{ocamldoccode}
+
+ It is possible for a {\tt{multicall}} to be executed but not completed, for
+ example if a transport error occurs. Aside from catching the exception,
+ the {\tt{completed}} property indicates if the call actually went through
+ or not: \begin{ocamldoccode}
+
+ # mc#completed;;
+ -- : bool = true
+
+\end{ocamldoccode}
+
+ It is not necessary to use lazy values. Instead, the call can be
+ executed explicitly, and the results can be retrieved by number: \begin{ocamldoccode}
+
+ # let mc = new XmlRpc.multicall client;;
+ val mc : XmlRpc.multicall = <obj>
+ # ignore (mc#call "demo.addTwoNumbers" [`Int 2; `Int 2]);;
+ -- : unit = ()
+ # ignore (mc#call "demo.addTwoNumbers" [`Int 3; `Int 3]);;
+ -- : unit = ()
+ # mc#result 1;;
+ -- : XmlRpc.value = `Int 6
+
+\end{ocamldoccode}
+
+
+
+\end{ocamldocdescription}
+
+
+
+
+\subsection{Utility functions}
+
+
+
+
+\label{val:XmlRpc.dump}\begin{ocamldoccode}
+val dump : value -> string
+\end{ocamldoccode}
+\index{dump@\verb`dump`}
+\begin{ocamldocdescription}
+Converts an XmlRpc value to a human-readable string.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\subsection{Low-level interface}
+
+
+
+
+\label{type:XmlRpc.message}\begin{ocamldoccode}
+type message =
+ | MethodCall of (string * value list)
+ | MethodResponse of value
+ | Fault of (int * string)
+\end{ocamldoccode}
+\index{message@\verb`message`}
+\begin{ocamldocdescription}
+Type for XmlRpc messages.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{val:XmlRpc.message-underscoreof-underscorexml-underscoreelement}\begin{ocamldoccode}
+val message_of_xml_element :
+ ?base64_decoder:(string -> string) ->
+ ?datetime_decoder:(string -> XmlRpcDateTime.t) -> Xml.xml -> message
+\end{ocamldoccode}
+\index{message-underscoreof-underscorexml-underscoreelement@\verb`message_of_xml_element`}
+\begin{ocamldocdescription}
+Converts an Xml Light element to an XmlRpc message.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{val:XmlRpc.xml-underscoreelement-underscoreof-underscoremessage}\begin{ocamldoccode}
+val xml_element_of_message :
+ ?base64_encoder:(string -> string) ->
+ ?datetime_encoder:(XmlRpcDateTime.t -> string) -> message -> Xml.xml
+\end{ocamldoccode}
+\index{xml-underscoreelement-underscoreof-underscoremessage@\verb`xml_element_of_message`}
+\begin{ocamldocdescription}
+Converts an XmlRpc message to an Xml Light element.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{val:XmlRpc.value-underscoreof-underscorexml-underscoreelement}\begin{ocamldoccode}
+val value_of_xml_element :
+ ?base64_decoder:(string -> string) ->
+ ?datetime_decoder:(string -> XmlRpcDateTime.t) -> Xml.xml -> value
+\end{ocamldoccode}
+\index{value-underscoreof-underscorexml-underscoreelement@\verb`value_of_xml_element`}
+\begin{ocamldocdescription}
+Converts an Xml Light element to an XmlRpc value.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{val:XmlRpc.xml-underscoreelement-underscoreof-underscorevalue}\begin{ocamldoccode}
+val xml_element_of_value :
+ ?base64_encoder:(string -> string) ->
+ ?datetime_encoder:(XmlRpcDateTime.t -> string) -> value -> Xml.xml
+\end{ocamldoccode}
+\index{xml-underscoreelement-underscoreof-underscorevalue@\verb`xml_element_of_value`}
+\begin{ocamldocdescription}
+Converts an XmlRpc value to an Xml Light element.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\subsection{Server tools}
+
+
+
+
+\label{val:XmlRpc.serve}\begin{ocamldoccode}
+val serve :
+ ?base64_encoder:(string -> string) ->
+ ?base64_decoder:(string -> string) ->
+ ?datetime_encoder:(XmlRpcDateTime.t -> string) ->
+ ?datetime_decoder:(string -> XmlRpcDateTime.t) ->
+ ?error_handler:(exn -> message) ->
+ (string -> value list -> value) -> string -> string
+\end{ocamldoccode}
+\index{serve@\verb`serve`}
+\begin{ocamldocdescription}
+Creates a function from string (Xml representing a {\tt{MethodCall}}) to
+ string (Xml representing a {\tt{MethodResult}} or {\tt{Fault}}) given a function
+ of the form: ({\tt{name}} $\rightarrow$ {\tt{params}} $\rightarrow$ {\tt{result}}), where {\tt{name}} is the
+ name of the method, {\tt{params}} is a list of parameter values, and
+ {\tt{result}} is the result value.
+
+
+ This function can be used to build many different kinds of XmlRpc
+ servers since it makes no assumptions about the network library
+ or other communications method used.
+
+
+ If an exception other than {\tt{XmlRpc.Error}}[\ref{exception:XmlRpc.Error}] occurs, the exception is
+ passed to {\tt{error\_handler}}. If {\tt{error\_handler}} returns a message,
+ the message will be used as the result. If an {\tt{XmlRpc.Error}}[\ref{exception:XmlRpc.Error}] is
+ raised by either the main function or {\tt{error\_handler}}, it will be
+ converted to an XmlRpc {\tt{Fault}}. Any other exception raised by
+ {\tt{error\_handler}} is allowed to escape.
+
+
+ For a full-featured, easy-to-use, network-capable server implementation,
+ see the {\tt{XmlRpcServer}}[\ref{module:XmlRpcServer}] module.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{val:XmlRpc.serve-underscoremessage}\begin{ocamldoccode}
+val serve_message :
+ ?error_handler:(exn -> message) ->
+ (string -> value list -> value) ->
+ message -> message
+\end{ocamldoccode}
+\index{serve-underscoremessage@\verb`serve_message`}
+\begin{ocamldocdescription}
+Performs the same function as {\tt{serve}}, but operates on typed messages
+ instead of strings.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{val:XmlRpc.default-underscoreerror-underscorehandler}\begin{ocamldoccode}
+val default_error_handler : exn -> message
+\end{ocamldoccode}
+\index{default-underscoreerror-underscorehandler@\verb`default_error_handler`}
+\begin{ocamldocdescription}
+The default error handler for {\tt{serve}}.
+
+
+ This error handler catches all exceptions and converts them into
+ faults by wrapping them in {\tt{XmlRpc.Error}}.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{val:XmlRpc.quiet-underscoreerror-underscorehandler}\begin{ocamldoccode}
+val quiet_error_handler : exn -> message
+\end{ocamldoccode}
+\index{quiet-underscoreerror-underscorehandler@\verb`quiet_error_handler`}
+\begin{ocamldocdescription}
+A "quiet" error handler for {\tt{serve}}.
+
+
+ This error handler simply re-raises the exception. Use this if you
+ want exceptions to remain unhandled so that they will escape to the
+ error log. The client will receive a generic "transport error",
+ which is more secure since it does not reveal any information about
+ the specific exception that occurred.
+
+
+\end{ocamldocdescription}
+
+
+\section{Module {\tt{XmlRpcServer}} : XmlRpc Light server.}
+\label{module:XmlRpcServer}\index{XmlRpcServer@\verb`XmlRpcServer`}
+
+
+
+
+\ocamldocvspace{0.5cm}
+
+
+
+Example: \begin{ocamldoccode}
+
+ let server = new XmlRpcServer.cgi () in
+ server#register "demo.sayHello"
+ (fun _ -> `String "Hello!");
+ server#run ()
+\end{ocamldoccode}
+
+
+
+ By inheriting from {\tt{XmlRpcServer.base}}[\ref{class:XmlRpcServer.base}], all servers provide
+ the following introspection functions by default: {\tt{system.listMethods}},
+ {\tt{system.getCapabilities}}. To prevent their use, use {\tt{server\verb`#`unregister}}.
+
+
+ Additionally, the methods {\tt{system.methodHelp}} and {\tt{system.methodSignature}}
+ will be made available if at least one method help or method signature is
+ provided.
+
+
+
+\label{type:XmlRpcServer.param-underscoretype}\begin{ocamldoccode}
+type param_type = [ `Array
+ | `Binary
+ | `Boolean
+ | `DateTime
+ | `Double
+ | `Int
+ | `String
+ | `Struct
+ | `Undefined ]
+\end{ocamldoccode}
+\index{param-underscoretype@\verb`param_type`}
+\begin{ocamldocdescription}
+Type of parameters used in method signatures.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\subsection{Base classes}
+
+
+
+
+\begin{ocamldoccode}
+{\tt{class virtual base : }}\end{ocamldoccode}
+\label{class:XmlRpcServer.base}\index{base@\verb`base`}
+
+\begin{ocamldocobjectend}
+
+
+\label{val:XmlRpcServer.base.methods}\begin{ocamldoccode}
+val methods : (string, XmlRpc.value list -> XmlRpc.value) Hashtbl.t
+\end{ocamldoccode}
+\index{methods@\verb`methods`}
+\begin{ocamldocdescription}
+Hashtable mapping method names to implementation functions.
+
+
+\end{ocamldocdescription}
+
+
+\label{val:XmlRpcServer.base.base64-underscoreencoder}\begin{ocamldoccode}
+val mutable base64_encoder : string -> string
+\end{ocamldoccode}
+\index{base64-underscoreencoder@\verb`base64_encoder`}
+\begin{ocamldocdescription}
+Base-64 binary encoding function.
+
+
+\end{ocamldocdescription}
+
+
+\label{val:XmlRpcServer.base.base64-underscoredecoder}\begin{ocamldoccode}
+val mutable base64_decoder : string -> string
+\end{ocamldoccode}
+\index{base64-underscoredecoder@\verb`base64_decoder`}
+\begin{ocamldocdescription}
+Base-64 binary decoding function.
+
+
+\end{ocamldocdescription}
+
+
+\label{val:XmlRpcServer.base.datetime-underscoreencoder}\begin{ocamldoccode}
+val mutable datetime_encoder : XmlRpcDateTime.t -> string
+\end{ocamldoccode}
+\index{datetime-underscoreencoder@\verb`datetime_encoder`}
+\begin{ocamldocdescription}
+ISO-8601 date/time encoding function.
+
+
+\end{ocamldocdescription}
+
+
+\label{val:XmlRpcServer.base.datetime-underscoredecoder}\begin{ocamldoccode}
+val mutable datetime_decoder : string -> XmlRpcDateTime.t
+\end{ocamldoccode}
+\index{datetime-underscoredecoder@\verb`datetime_decoder`}
+\begin{ocamldocdescription}
+ISO-8601 date/time decoding function.
+
+
+\end{ocamldocdescription}
+
+
+\label{val:XmlRpcServer.base.error-underscorehandler}\begin{ocamldoccode}
+val mutable error_handler : exn -> XmlRpc.message
+\end{ocamldoccode}
+\index{error-underscorehandler@\verb`error_handler`}
+\begin{ocamldocdescription}
+Handler for unhandled exceptions.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpcServer.base.set-underscorebase64-underscoreencoder}\begin{ocamldoccode}
+method set_base64_encoder : (string -> string) -> unit
+\end{ocamldoccode}
+\index{set-underscorebase64-underscoreencoder@\verb`set_base64_encoder`}
+\begin{ocamldocdescription}
+Sets an alternate Base-64 binary encoding function.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpcServer.base.set-underscorebase64-underscoredecoder}\begin{ocamldoccode}
+method set_base64_decoder : (string -> string) -> unit
+\end{ocamldoccode}
+\index{set-underscorebase64-underscoredecoder@\verb`set_base64_decoder`}
+\begin{ocamldocdescription}
+Sets an alternate Base-64 binary decoding function.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpcServer.base.set-underscoredatetime-underscoreencoder}\begin{ocamldoccode}
+method set_datetime_encoder : (XmlRpcDateTime.t -> string) -> unit
+\end{ocamldoccode}
+\index{set-underscoredatetime-underscoreencoder@\verb`set_datetime_encoder`}
+\begin{ocamldocdescription}
+Sets an alternate ISO-8601 date/time encoding function.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpcServer.base.set-underscoredatetime-underscoredecoder}\begin{ocamldoccode}
+method set_datetime_decoder : (string -> XmlRpcDateTime.t) -> unit
+\end{ocamldoccode}
+\index{set-underscoredatetime-underscoredecoder@\verb`set_datetime_decoder`}
+\begin{ocamldocdescription}
+Sets an alternate ISO-8601 date/time decoding function.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpcServer.base.set-underscoreerror-underscorehandler}\begin{ocamldoccode}
+method set_error_handler : (exn -> XmlRpc.message) -> unit
+\end{ocamldoccode}
+\index{set-underscoreerror-underscorehandler@\verb`set_error_handler`}
+\begin{ocamldocdescription}
+Sets an alternate handler for unhandled exceptions.
+ See {\tt{XmlRpc.default\_error\_handler}}[\ref{val:XmlRpc.default-underscoreerror-underscorehandler}] and
+ {\tt{XmlRpc.quiet\_error\_handler}}[\ref{val:XmlRpc.quiet-underscoreerror-underscorehandler}] for examples.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpcServer.base.serve}\begin{ocamldoccode}
+method serve :
+ (string -> XmlRpc.value list -> XmlRpc.value) -> string -> string
+\end{ocamldoccode}
+\index{serve@\verb`serve`}
+\begin{ocamldocdescription}
+For use in subclasses; calls {\tt{XmlRpc.serve}}[\ref{val:XmlRpc.serve}] with the current
+ encoders, decoders, and error handler.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpcServer.base.serve-underscoremessage}\begin{ocamldoccode}
+method serve_message :
+ (string -> XmlRpc.value list -> XmlRpc.value) ->
+ XmlRpc.message -> XmlRpc.message
+\end{ocamldoccode}
+\index{serve-underscoremessage@\verb`serve_message`}
+\begin{ocamldocdescription}
+Like {\tt{serve}}, but operates on messages instead of strings.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpcServer.base.register}\begin{ocamldoccode}
+method register :
+ string ->
+ ?help:string ->
+ ?signature:XmlRpcServer.param_type list ->
+ ?signatures:XmlRpcServer.param_type list list ->
+ (XmlRpc.value list -> XmlRpc.value) -> unit
+\end{ocamldoccode}
+\index{register@\verb`register`}
+\begin{ocamldocdescription}
+Registers a method with the server.
+
+
+ If a {\tt{help}} string is specified, its contents will be returned for
+ calls to {\tt{system.methodHelp}} for this method.
+
+
+ If {\tt{signature}} is specified, this method's signature will be published
+ by {\tt{system.methodSignature}} and (shallow) type-checking will be enabled
+ for parameters passed into this method.
+
+
+ Multiple signatures can be supplied via {\tt{signatures}} if desired to
+ provide for overloaded methods.
+
+
+ Signatures are of the form {\tt{return-type; param1-type; param2-type; ...}}
+ where each type is an instance of the {\tt{XmlRpcServer.param\_type}}[\ref{type:XmlRpcServer.param-underscoretype}] variant.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpcServer.base.unregister}\begin{ocamldoccode}
+method unregister : string -> unit
+\end{ocamldoccode}
+\index{unregister@\verb`unregister`}
+\begin{ocamldocdescription}
+Removes a method from the server.
+
+
+\end{ocamldocdescription}
+
+
+\label{method:XmlRpcServer.base.run}\begin{ocamldoccode}
+method virtual run : unit -> unit
+\end{ocamldoccode}
+\index{run@\verb`run`}
+\begin{ocamldocdescription}
+Starts the main server process.
+
+
+\end{ocamldocdescription}
+\end{ocamldocobjectend}
+
+
+\begin{ocamldocdescription}
+Abstract base class for XmlRpc servers.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\begin{ocamldoccode}
+{\tt{class type server = }}\end{ocamldoccode}
+\label{classtype:XmlRpcServer.server}\index{server@\verb`server`}
+
+\begin{ocamldocobjectend}
+
+
+{\tt{inherit XmlRpcServer.base}} [\ref{class:XmlRpcServer.base}]
+
+\label{method:XmlRpcServer.server.run}\begin{ocamldoccode}
+method run : unit -> unit
+\end{ocamldoccode}
+\index{run@\verb`run`}
+\begin{ocamldocdescription}
+Starts the main server process.
+
+
+\end{ocamldocdescription}
+\end{ocamldocobjectend}
+
+
+\begin{ocamldocdescription}
+Type of concrete XmlRpc server classes.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\subsection{Server implementations}
+
+
+
+
+\begin{ocamldoccode}
+{\tt{class cgi : }}{\tt{unit -> }}{\tt{server}}\end{ocamldoccode}
+\label{class:XmlRpcServer.cgi}\index{cgi@\verb`cgi`}
+
+
+
+\begin{ocamldocdescription}
+CGI XmlRpc server based on Netcgi2.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\begin{ocamldoccode}
+{\tt{class netplex : }}{\tt{?parallelizer:Netplex\_types.parallelizer -> ?handler:string -> unit -> }}{\tt{server}}\end{ocamldoccode}
+\label{class:XmlRpcServer.netplex}\index{netplex@\verb`netplex`}
+
+
+
+\begin{ocamldocdescription}
+Stand-alone XmlRpc server based on Netplex.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\subsection{Utility functions}
+
+
+
+
+\label{val:XmlRpcServer.invalid-underscoremethod}\begin{ocamldoccode}
+val invalid_method : string -> 'a
+\end{ocamldoccode}
+\index{invalid-underscoremethod@\verb`invalid_method`}
+\begin{ocamldocdescription}
+Raise an {\tt{XmlRpc.Error}}[\ref{exception:XmlRpc.Error}] indicating a method name not found.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{val:XmlRpcServer.invalid-underscoreparams}\begin{ocamldoccode}
+val invalid_params : unit -> 'a
+\end{ocamldoccode}
+\index{invalid-underscoreparams@\verb`invalid_params`}
+\begin{ocamldocdescription}
+Raise an {\tt{XmlRpc.Error}}[\ref{exception:XmlRpc.Error}] indicating invalid method parameters.
+
+
+\end{ocamldocdescription}
+
+
+\section{Module {\tt{XmlRpcDateTime}} : Date/time type.}
+\label{module:XmlRpcDateTime}\index{XmlRpcDateTime@\verb`XmlRpcDateTime`}
+
+
+
+
+\ocamldocvspace{0.5cm}
+
+
+
+\subsection{Types}
+
+
+
+
+\label{exception:XmlRpcDateTime.Parse-underscoreerror}\begin{ocamldoccode}
+exception Parse_error of string
+\end{ocamldoccode}
+\index{Parse-underscoreerror@\verb`Parse_error`}
+\begin{ocamldocdescription}
+Raised by {\tt{XmlRpcDateTime.of\_string}}[\ref{val:XmlRpcDateTime.of-underscorestring}] if a string could not be parsed. The exception
+ contains the input string.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{type:XmlRpcDateTime.t}\begin{ocamldoccode}
+type t = int * int * int * int * int * int * int
+\end{ocamldoccode}
+\index{t@\verb`t`}
+\begin{ocamldocdescription}
+Type of XmlRpc-compatible date/time values.
+ (year, month, day, hour, minute, second, time zone offset in minutes)
+
+
+\end{ocamldocdescription}
+
+
+
+
+\subsection{Comparison}
+
+
+
+
+\label{val:XmlRpcDateTime.compare}\begin{ocamldoccode}
+val compare : t -> t -> int
+\end{ocamldoccode}
+\index{compare@\verb`compare`}
+\begin{ocamldocdescription}
+Standard comparator for date/time values. Converts all values to UTC
+ before comparing to ensure correct behavior with values of differing
+ time zones.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{val:XmlRpcDateTime.equal}\begin{ocamldoccode}
+val equal : t -> t -> bool
+\end{ocamldoccode}
+\index{equal@\verb`equal`}
+\begin{ocamldocdescription}
+Standard equality function for date/time values. Converts all values
+ to UTC before comparing.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{val:XmlRpcDateTime.hash}\begin{ocamldoccode}
+val hash : t -> int
+\end{ocamldoccode}
+\index{hash@\verb`hash`}
+\begin{ocamldocdescription}
+Standard hash function for date/time values. Converts values to UTC
+ before hashing.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\subsection{Current date and time}
+
+
+
+
+\label{val:XmlRpcDateTime.now}\begin{ocamldoccode}
+val now : unit -> t
+\end{ocamldoccode}
+\index{now@\verb`now`}
+\begin{ocamldocdescription}
+Returns the current date and time in the local time zone.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{val:XmlRpcDateTime.now-underscoreutc}\begin{ocamldoccode}
+val now_utc : unit -> t
+\end{ocamldoccode}
+\index{now-underscoreutc@\verb`now_utc`}
+\begin{ocamldocdescription}
+Returns the current date and time in UTC.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\subsection{Time zone adjustments}
+
+
+
+
+\label{val:XmlRpcDateTime.set-underscoretz-underscoreoffset}\begin{ocamldoccode}
+val set_tz_offset : int -> t -> t
+\end{ocamldoccode}
+\index{set-underscoretz-underscoreoffset@\verb`set_tz_offset`}
+\begin{ocamldocdescription}
+Adjusts the time zone offset, preserving equality.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{val:XmlRpcDateTime.fix-underscoretz-underscoreoffset}\begin{ocamldoccode}
+val fix_tz_offset : int -> t -> t
+\end{ocamldoccode}
+\index{fix-underscoretz-underscoreoffset@\verb`fix_tz_offset`}
+\begin{ocamldocdescription}
+Forces the time zone offset to a different value, ignoring all other
+ fields. Use this to correct the time zone of a date/time value that
+ was received without a time zone offset and is known not to be UTC.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\subsection{Conversion}
+
+
+
+
+\label{val:XmlRpcDateTime.from-underscoreunixfloat}\begin{ocamldoccode}
+val from_unixfloat : float -> t
+\end{ocamldoccode}
+\index{from-underscoreunixfloat@\verb`from_unixfloat`}
+\begin{ocamldocdescription}
+Builds a date/time value from epoch seconds in the local time zone.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{val:XmlRpcDateTime.from-underscoreunixfloat-underscoreutc}\begin{ocamldoccode}
+val from_unixfloat_utc : float -> t
+\end{ocamldoccode}
+\index{from-underscoreunixfloat-underscoreutc@\verb`from_unixfloat_utc`}
+\begin{ocamldocdescription}
+Builds a date/time value from epoch seconds in UTC.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{val:XmlRpcDateTime.to-underscoreunixfloat}\begin{ocamldoccode}
+val to_unixfloat : t -> float
+\end{ocamldoccode}
+\index{to-underscoreunixfloat@\verb`to_unixfloat`}
+\begin{ocamldocdescription}
+Converts a date/time value to epoch seconds in the local time zone.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{val:XmlRpcDateTime.to-underscoreunixfloat-underscoreutc}\begin{ocamldoccode}
+val to_unixfloat_utc : t -> float
+\end{ocamldoccode}
+\index{to-underscoreunixfloat-underscoreutc@\verb`to_unixfloat_utc`}
+\begin{ocamldocdescription}
+Converts a date/time value to epoch seconds in UTC.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{val:XmlRpcDateTime.from-underscoreunixtm}\begin{ocamldoccode}
+val from_unixtm : Unix.tm -> t
+\end{ocamldoccode}
+\index{from-underscoreunixtm@\verb`from_unixtm`}
+\begin{ocamldocdescription}
+Builds a date/time value from a Unix.tm value in the local time zone.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{val:XmlRpcDateTime.from-underscoreunixtm-underscoreutc}\begin{ocamldoccode}
+val from_unixtm_utc : Unix.tm -> t
+\end{ocamldoccode}
+\index{from-underscoreunixtm-underscoreutc@\verb`from_unixtm_utc`}
+\begin{ocamldocdescription}
+Builds a date/time value from a Unix.tm value in UTC.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{val:XmlRpcDateTime.to-underscoreunixtm}\begin{ocamldoccode}
+val to_unixtm : t -> Unix.tm
+\end{ocamldoccode}
+\index{to-underscoreunixtm@\verb`to_unixtm`}
+\begin{ocamldocdescription}
+Converts a date/time value to a Unix.tm value in the local time zone.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{val:XmlRpcDateTime.to-underscoreunixtm-underscoreutc}\begin{ocamldoccode}
+val to_unixtm_utc : t -> Unix.tm
+\end{ocamldoccode}
+\index{to-underscoreunixtm-underscoreutc@\verb`to_unixtm_utc`}
+\begin{ocamldocdescription}
+Converts a date/time value to a Unix.tm value in UTC.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\subsection{ISO-8601 parsing and generation}
+
+
+
+
+\label{val:XmlRpcDateTime.of-underscorestring}\begin{ocamldoccode}
+val of_string : string -> t
+\end{ocamldoccode}
+\index{of-underscorestring@\verb`of_string`}
+\begin{ocamldocdescription}
+Parses an (XmlRpc-flavor) ISO-8601 date/time value from a string.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{val:XmlRpcDateTime.to-underscorestring}\begin{ocamldoccode}
+val to_string : t -> string
+\end{ocamldoccode}
+\index{to-underscorestring@\verb`to_string`}
+\begin{ocamldocdescription}
+Generates an ISO-8601 string from a date/time value.
+
+
+\end{ocamldocdescription}
+
+
+\section{Module {\tt{XmlRpcBase64}} : Base64 codec.}
+\label{module:XmlRpcBase64}\index{XmlRpcBase64@\verb`XmlRpcBase64`}
+
+
+
+ 8-bit characters are encoded into 6-bit ones using ASCII lookup tables.
+ Default tables maps 0..63 values on characters A-Z, a-z, 0-9, '+' and '/'
+ (in that order).
+
+
+
+\ocamldocvspace{0.5cm}
+
+
+
+\label{exception:XmlRpcBase64.Invalid-underscorechar}\begin{ocamldoccode}
+exception Invalid_char
+\end{ocamldoccode}
+\index{Invalid-underscorechar@\verb`Invalid_char`}
+\begin{ocamldocdescription}
+This exception is raised when reading an invalid character
+ from a base64 input.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{exception:XmlRpcBase64.Invalid-underscoretable}\begin{ocamldoccode}
+exception Invalid_table
+\end{ocamldoccode}
+\index{Invalid-underscoretable@\verb`Invalid_table`}
+\begin{ocamldocdescription}
+This exception is raised if the encoding or decoding table
+ size is not correct.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{type:XmlRpcBase64.encoding-underscoretable}\begin{ocamldoccode}
+type encoding_table = char array
+\end{ocamldoccode}
+\index{encoding-underscoretable@\verb`encoding_table`}
+\begin{ocamldocdescription}
+An encoding table maps integers 0..63 to the corresponding char.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{type:XmlRpcBase64.decoding-underscoretable}\begin{ocamldoccode}
+type decoding_table = int array
+\end{ocamldoccode}
+\index{decoding-underscoretable@\verb`decoding_table`}
+\begin{ocamldocdescription}
+A decoding table maps chars 0..255 to the corresponding 0..63 value
+ or -1 if the char is not accepted.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{val:XmlRpcBase64.str-underscoreencode}\begin{ocamldoccode}
+val str_encode : ?tbl:encoding_table -> string -> string
+\end{ocamldoccode}
+\index{str-underscoreencode@\verb`str_encode`}
+\begin{ocamldocdescription}
+Encode a string into Base64.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{val:XmlRpcBase64.str-underscoredecode}\begin{ocamldoccode}
+val str_decode : ?tbl:decoding_table -> string -> string
+\end{ocamldoccode}
+\index{str-underscoredecode@\verb`str_decode`}
+\begin{ocamldocdescription}
+Decode a string encoded into Base64, raise {\tt{Invalid\_char}} if a
+ character in the input string is not a valid one.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{val:XmlRpcBase64.encode}\begin{ocamldoccode}
+val encode : ?tbl:encoding_table -> char Stream.t -> char Stream.t
+\end{ocamldoccode}
+\index{encode@\verb`encode`}
+\begin{ocamldocdescription}
+Generic base64 encoding over a character stream.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{val:XmlRpcBase64.decode}\begin{ocamldoccode}
+val decode : ?tbl:decoding_table -> char Stream.t -> char Stream.t
+\end{ocamldoccode}
+\index{decode@\verb`decode`}
+\begin{ocamldocdescription}
+Generic base64 decoding over a character stream.
+
+
+\end{ocamldocdescription}
+
+
+
+
+\label{val:XmlRpcBase64.make-underscoredecoding-underscoretable}\begin{ocamldoccode}
+val make_decoding_table : encoding_table -> decoding_table
+\end{ocamldoccode}
+\index{make-underscoredecoding-underscoretable@\verb`make_decoding_table`}
+\begin{ocamldocdescription}
+Create a valid decoding table from an encoding one.
+
+
+\end{ocamldocdescription}
+
+
+\end{document} \ No newline at end of file
diff --git a/doc/xmlrpc-light/latex/doc.toc b/doc/xmlrpc-light/latex/doc.toc
new file mode 100644
index 0000000..e36b64e
--- /dev/null
+++ b/doc/xmlrpc-light/latex/doc.toc
@@ -0,0 +1,17 @@
+\contentsline {section}{\numberline {1}Module {\tt {XmlRpc}} : XmlRpc Light.}{1}
+\contentsline {subsection}{\numberline {1.1}High-level interface}{1}
+\contentsline {subsection}{\numberline {1.2}Utility functions}{6}
+\contentsline {subsection}{\numberline {1.3}Low-level interface}{6}
+\contentsline {subsection}{\numberline {1.4}Server tools}{7}
+\contentsline {section}{\numberline {2}Module {\tt {XmlRpcServer}} : XmlRpc Light server.}{8}
+\contentsline {subsection}{\numberline {2.1}Base classes}{9}
+\contentsline {subsection}{\numberline {2.2}Server implementations}{11}
+\contentsline {subsection}{\numberline {2.3}Utility functions}{11}
+\contentsline {section}{\numberline {3}Module {\tt {XmlRpcDateTime}} : Date/time type.}{11}
+\contentsline {subsection}{\numberline {3.1}Types}{11}
+\contentsline {subsection}{\numberline {3.2}Comparison}{11}
+\contentsline {subsection}{\numberline {3.3}Current date and time}{12}
+\contentsline {subsection}{\numberline {3.4}Time zone adjustments}{12}
+\contentsline {subsection}{\numberline {3.5}Conversion}{12}
+\contentsline {subsection}{\numberline {3.6}ISO-8601 parsing and generation}{13}
+\contentsline {section}{\numberline {4}Module {\tt {XmlRpcBase64}} : Base64 codec.}{13}
diff --git a/doc/xmlrpc-light/latex/ocamldoc.sty b/doc/xmlrpc-light/latex/ocamldoc.sty
new file mode 100644
index 0000000..b176c9b
--- /dev/null
+++ b/doc/xmlrpc-light/latex/ocamldoc.sty
@@ -0,0 +1,75 @@
+
+%% Support macros for LaTeX documentation generated by ocamldoc.
+%% This file is in the public domain; do what you want with it.
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{ocamldoc}
+ [2001/12/04 v1.0 ocamldoc support]
+
+\newenvironment{ocamldoccode}{%
+ \bgroup
+ \leftskip\@totalleftmargin
+ \rightskip\z@skip
+ \parindent\z@
+ \parfillskip\@flushglue
+ \parskip\z@skip
+ %\noindent
+ \@@par\smallskip
+ \@tempswafalse
+ \def\par{%
+ \if@tempswa
+ \leavevmode\null\@@par\penalty\interlinepenalty
+ \else
+ \@tempswatrue
+ \ifhmode\@@par\penalty\interlinepenalty\fi
+ \fi}
+ \obeylines
+ \verbatim@font
+ \let\org@prime~%
+ \@noligs
+ \let\org@dospecials\dospecials
+ \g@remfrom@specials{\\}
+ \g@remfrom@specials{\{}
+ \g@remfrom@specials{\}}
+ \let\do\@makeother
+ \dospecials
+ \let\dospecials\org@dospecials
+ \frenchspacing\@vobeyspaces
+ \everypar \expandafter{\the\everypar \unpenalty}}
+{\egroup\par}
+
+\def\g@remfrom@specials#1{%
+ \def\@new@specials{}
+ \def\@remove##1{%
+ \ifx##1#1\else
+ \g@addto@macro\@new@specials{\do ##1}\fi}
+ \let\do\@remove\dospecials
+ \let\dospecials\@new@specials
+ }
+
+\newenvironment{ocamldocdescription}
+{\list{}{\rightmargin0pt \topsep0pt}\raggedright\item\noindent\relax\ignorespaces}
+{\endlist\medskip}
+
+\newenvironment{ocamldoccomment}
+{\list{}{\leftmargin 2\leftmargini \rightmargin0pt \topsep0pt}\raggedright\item\noindent\relax}
+{\endlist}
+
+\let \ocamldocparagraph \paragraph
+\def \paragraph #1{\ocamldocparagraph {#1}\noindent}
+\let \ocamldocsubparagraph \subparagraph
+\def \subparagraph #1{\ocamldocsubparagraph {#1}\noindent}
+
+\let\ocamldocvspace\vspace
+
+\newenvironment{ocamldocindent}{\list{}{}\item\relax}{\endlist}
+\newenvironment{ocamldocsigend}
+ {\noindent\quad\texttt{sig}\ocamldocindent}
+ {\endocamldocindent\vskip -\lastskip
+ \noindent\quad\texttt{end}\medskip}
+\newenvironment{ocamldocobjectend}
+ {\noindent\quad\texttt{object}\ocamldocindent}
+ {\endocamldocindent\vskip -\lastskip
+ \noindent\quad\texttt{end}\medskip}
+
+\endinput
diff --git a/examples/README.txt b/examples/README.txt
new file mode 100644
index 0000000..9ef0b22
--- /dev/null
+++ b/examples/README.txt
@@ -0,0 +1,9 @@
+XmlRpc Light, a small XmlRpc client based on Xml Light and Ocamlnet
+===================================================================
+
+Source code examples:
+
+ - adder: simple XmlRpcServer example, adds two numbers
+ - genclient: code generation tool using introspection methods
+ - ubigraph: bindings to Ubigraph visualization tool
+ - wordpress: client interface for WordPress blog API
diff --git a/examples/adder/Makefile b/examples/adder/Makefile
new file mode 100644
index 0000000..0504c93
--- /dev/null
+++ b/examples/adder/Makefile
@@ -0,0 +1,9 @@
+OCAMLMAKEFILE = OCamlMakefile
+
+RESULT = adder
+SOURCES = adder.ml
+PACKS = xmlrpc-light,nethttpd-for-netcgi2
+
+all: native-code
+
+include $(OCAMLMAKEFILE)
diff --git a/examples/adder/OCamlMakefile b/examples/adder/OCamlMakefile
new file mode 100644
index 0000000..6f62c91
--- /dev/null
+++ b/examples/adder/OCamlMakefile
@@ -0,0 +1,1154 @@
+###########################################################################
+# OCamlMakefile
+# Copyright (C) 1999-2004 Markus Mottl
+#
+# For updates see:
+# http://www.ocaml.info/home/ocaml_sources.html
+#
+# $Id: OCamlMakefile,v 1.72 2005/12/09 15:30:50 mottl Exp $
+#
+###########################################################################
+
+# Modified by damien for .glade.ml compilation
+
+# Set these variables to the names of the sources to be processed and
+# the result variable. Order matters during linkage!
+
+ifndef SOURCES
+ SOURCES := foo.ml
+endif
+export SOURCES
+
+ifndef RES_CLIB_SUF
+ RES_CLIB_SUF := _stubs
+endif
+export RES_CLIB_SUF
+
+ifndef RESULT
+ RESULT := foo
+endif
+export RESULT
+
+export LIB_PACK_NAME
+
+ifndef DOC_FILES
+ DOC_FILES := $(filter %.mli, $(SOURCES))
+endif
+export DOC_FILES
+
+export BCSUFFIX
+export NCSUFFIX
+
+ifndef TOPSUFFIX
+ TOPSUFFIX := .top
+endif
+export TOPSUFFIX
+
+# Eventually set include- and library-paths, libraries to link,
+# additional compilation-, link- and ocamlyacc-flags
+# Path- and library information needs not be written with "-I" and such...
+# Define THREADS if you need it, otherwise leave it unset (same for
+# USE_CAMLP4)!
+
+export THREADS
+export VMTHREADS
+export ANNOTATE
+export USE_CAMLP4
+
+export INCDIRS
+export LIBDIRS
+export EXTLIBDIRS
+export RESULTDEPS
+export OCAML_DEFAULT_DIRS
+
+export LIBS
+export CLIBS
+
+export OCAMLFLAGS
+export OCAMLNCFLAGS
+export OCAMLBCFLAGS
+
+export OCAMLLDFLAGS
+export OCAMLNLDFLAGS
+export OCAMLBLDFLAGS
+
+ifndef OCAMLCPFLAGS
+ OCAMLCPFLAGS := a
+endif
+
+export OCAMLCPFLAGS
+
+export PPFLAGS
+
+export YFLAGS
+export IDLFLAGS
+
+export OCAMLDOCFLAGS
+
+export OCAMLFIND_INSTFLAGS
+
+export DVIPSFLAGS
+
+export STATIC
+
+# Add a list of optional trash files that should be deleted by "make clean"
+export TRASH
+
+#################### variables depending on your OCaml-installation
+
+ifdef MINGW
+ export MINGW
+ WIN32 := 1
+ CFLAGS_WIN32 := -mno-cygwin
+endif
+ifdef MSVC
+ export MSVC
+ WIN32 := 1
+ ifndef STATIC
+ CPPFLAGS_WIN32 := -DCAML_DLL
+ endif
+ CFLAGS_WIN32 += -nologo
+ EXT_OBJ := obj
+ EXT_LIB := lib
+ ifeq ($(CC),gcc)
+ # work around GNU Make default value
+ ifdef THREADS
+ CC := cl -MT
+ else
+ CC := cl
+ endif
+ endif
+ ifeq ($(CXX),g++)
+ # work around GNU Make default value
+ CXX := $(CC)
+ endif
+ CFLAG_O := -Fo
+endif
+ifdef WIN32
+ EXT_CXX := cpp
+ EXE := .exe
+endif
+
+ifndef EXT_OBJ
+ EXT_OBJ := o
+endif
+ifndef EXT_LIB
+ EXT_LIB := a
+endif
+ifndef EXT_CXX
+ EXT_CXX := cc
+endif
+ifndef EXE
+ EXE := # empty
+endif
+ifndef CFLAG_O
+ CFLAG_O := -o # do not delete this comment (preserves trailing whitespace)!
+endif
+
+export CC
+export CXX
+export CFLAGS
+export CXXFLAGS
+export LDFLAGS
+export CPPFLAGS
+
+ifndef RPATH_FLAG
+ RPATH_FLAG := -R
+endif
+export RPATH_FLAG
+
+ifndef MSVC
+ifndef PIC_CFLAGS
+ PIC_CFLAGS := -fPIC
+endif
+ifndef PIC_CPPFLAGS
+ PIC_CPPFLAGS := -DPIC
+endif
+endif
+
+export PIC_CFLAGS
+export PIC_CPPFLAGS
+
+BCRESULT := $(addsuffix $(BCSUFFIX), $(RESULT))
+NCRESULT := $(addsuffix $(NCSUFFIX), $(RESULT))
+TOPRESULT := $(addsuffix $(TOPSUFFIX), $(RESULT))
+
+ifndef OCAMLFIND
+ OCAMLFIND := ocamlfind
+endif
+export OCAMLFIND
+
+ifndef OCAMLC
+ OCAMLC := ocamlc
+endif
+export OCAMLC
+
+ifndef OCAMLOPT
+ OCAMLOPT := ocamlopt
+endif
+export OCAMLOPT
+
+ifndef OCAMLMKTOP
+ OCAMLMKTOP := ocamlmktop
+endif
+export OCAMLMKTOP
+
+ifndef OCAMLCP
+ OCAMLCP := ocamlcp
+endif
+export OCAMLCP
+
+ifndef OCAMLDEP
+ OCAMLDEP := ocamldep
+endif
+export OCAMLDEP
+
+ifndef OCAMLLEX
+ OCAMLLEX := ocamllex
+endif
+export OCAMLLEX
+
+ifndef OCAMLYACC
+ OCAMLYACC := ocamlyacc
+endif
+export OCAMLYACC
+
+ifndef OCAMLMKLIB
+ OCAMLMKLIB := ocamlmklib
+endif
+export OCAMLMKLIB
+
+ifndef OCAML_GLADECC
+ OCAML_GLADECC := lablgladecc2
+endif
+export OCAML_GLADECC
+
+ifndef OCAML_GLADECC_FLAGS
+ OCAML_GLADECC_FLAGS :=
+endif
+export OCAML_GLADECC_FLAGS
+
+ifndef CAMELEON_REPORT
+ CAMELEON_REPORT := report
+endif
+export CAMELEON_REPORT
+
+ifndef CAMELEON_REPORT_FLAGS
+ CAMELEON_REPORT_FLAGS :=
+endif
+export CAMELEON_REPORT_FLAGS
+
+ifndef CAMELEON_ZOGGY
+ CAMELEON_ZOGGY := camlp4o pa_zog.cma pr_o.cmo
+endif
+export CAMELEON_ZOGGY
+
+ifndef CAMELEON_ZOGGY_FLAGS
+ CAMELEON_ZOGGY_FLAGS :=
+endif
+export CAMELEON_ZOGGY_FLAGS
+
+ifndef OXRIDL
+ OXRIDL := oxridl
+endif
+export OXRIDL
+
+ifndef CAMLIDL
+ CAMLIDL := camlidl
+endif
+export CAMLIDL
+
+ifndef CAMLIDLDLL
+ CAMLIDLDLL := camlidldll
+endif
+export CAMLIDLDLL
+
+ifndef NOIDLHEADER
+ MAYBE_IDL_HEADER := -header
+endif
+export NOIDLHEADER
+
+export NO_CUSTOM
+
+ifndef CAMLP4
+ CAMLP4 := camlp4
+endif
+export CAMLP4
+
+ifndef REAL_OCAMLFIND
+ ifdef PACKS
+ ifndef CREATE_LIB
+ ifdef THREADS
+ PACKS += threads
+ endif
+ endif
+ empty :=
+ space := $(empty) $(empty)
+ comma := ,
+ ifdef PREDS
+ PRE_OCAML_FIND_PREDICATES := $(subst $(space),$(comma),$(PREDS))
+ PRE_OCAML_FIND_PACKAGES := $(subst $(space),$(comma),$(PACKS))
+ OCAML_FIND_PREDICATES := -predicates $(PRE_OCAML_FIND_PREDICATES)
+ # OCAML_DEP_PREDICATES := -syntax $(PRE_OCAML_FIND_PREDICATES)
+ OCAML_FIND_PACKAGES := $(OCAML_FIND_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES)
+ OCAML_DEP_PACKAGES := $(OCAML_DEP_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES)
+ else
+ OCAML_FIND_PACKAGES := -package $(subst $(space),$(comma),$(PACKS))
+ OCAML_DEP_PACKAGES :=
+ endif
+ OCAML_FIND_LINKPKG := -linkpkg
+ REAL_OCAMLFIND := $(OCAMLFIND)
+ endif
+endif
+
+export OCAML_FIND_PACKAGES
+export OCAML_DEP_PACKAGES
+export OCAML_FIND_LINKPKG
+export REAL_OCAMLFIND
+
+ifndef OCAMLDOC
+ OCAMLDOC := ocamldoc
+endif
+export OCAMLDOC
+
+ifndef LATEX
+ LATEX := latex
+endif
+export LATEX
+
+ifndef DVIPS
+ DVIPS := dvips
+endif
+export DVIPS
+
+ifndef PS2PDF
+ PS2PDF := ps2pdf
+endif
+export PS2PDF
+
+ifndef OCAMLMAKEFILE
+ OCAMLMAKEFILE := OCamlMakefile
+endif
+export OCAMLMAKEFILE
+
+ifndef OCAMLLIBPATH
+ OCAMLLIBPATH := \
+ $(shell $(OCAMLC) 2>/dev/null -where || echo /usr/lib/ocaml)
+endif
+export OCAMLLIBPATH
+
+ifndef OCAML_LIB_INSTALL
+ OCAML_LIB_INSTALL := $(OCAMLLIBPATH)/contrib
+endif
+export OCAML_LIB_INSTALL
+
+###########################################################################
+
+#################### change following sections only if
+#################### you know what you are doing!
+
+# delete target files when a build command fails
+.PHONY: .DELETE_ON_ERROR
+.DELETE_ON_ERROR:
+
+# for pedants using "--warn-undefined-variables"
+export MAYBE_IDL
+export REAL_RESULT
+export CAMLIDLFLAGS
+export THREAD_FLAG
+export RES_CLIB
+export MAKEDLL
+export ANNOT_FLAG
+export C_OXRIDL
+export SUBPROJS
+export CFLAGS_WIN32
+export CPPFLAGS_WIN32
+
+INCFLAGS :=
+
+SHELL := /bin/sh
+
+MLDEPDIR := ._d
+BCDIDIR := ._bcdi
+NCDIDIR := ._ncdi
+
+FILTER_EXTNS := %.mli %.ml %.mll %.mly %.idl %.oxridl %.c %.$(EXT_CXX) %.rep %.zog %.glade
+
+FILTERED := $(filter $(FILTER_EXTNS), $(SOURCES))
+SOURCE_DIRS := $(filter-out ./, $(sort $(dir $(FILTERED))))
+
+FILTERED_REP := $(filter %.rep, $(FILTERED))
+DEP_REP := $(FILTERED_REP:%.rep=$(MLDEPDIR)/%.d)
+AUTO_REP := $(FILTERED_REP:.rep=.ml)
+
+FILTERED_ZOG := $(filter %.zog, $(FILTERED))
+DEP_ZOG := $(FILTERED_ZOG:%.zog=$(MLDEPDIR)/%.d)
+AUTO_ZOG := $(FILTERED_ZOG:.zog=.ml)
+
+FILTERED_GLADE := $(filter %.glade, $(FILTERED))
+DEP_GLADE := $(FILTERED_GLADE:%.glade=$(MLDEPDIR)/%.d)
+AUTO_GLADE := $(FILTERED_GLADE:.glade=.ml)
+
+FILTERED_ML := $(filter %.ml, $(FILTERED))
+DEP_ML := $(FILTERED_ML:%.ml=$(MLDEPDIR)/%.d)
+
+FILTERED_MLI := $(filter %.mli, $(FILTERED))
+DEP_MLI := $(FILTERED_MLI:.mli=.di)
+
+FILTERED_MLL := $(filter %.mll, $(FILTERED))
+DEP_MLL := $(FILTERED_MLL:%.mll=$(MLDEPDIR)/%.d)
+AUTO_MLL := $(FILTERED_MLL:.mll=.ml)
+
+FILTERED_MLY := $(filter %.mly, $(FILTERED))
+DEP_MLY := $(FILTERED_MLY:%.mly=$(MLDEPDIR)/%.d) $(FILTERED_MLY:.mly=.di)
+AUTO_MLY := $(FILTERED_MLY:.mly=.mli) $(FILTERED_MLY:.mly=.ml)
+
+FILTERED_IDL := $(filter %.idl, $(FILTERED))
+DEP_IDL := $(FILTERED_IDL:%.idl=$(MLDEPDIR)/%.d) $(FILTERED_IDL:.idl=.di)
+C_IDL := $(FILTERED_IDL:%.idl=%_stubs.c)
+ifndef NOIDLHEADER
+ C_IDL += $(FILTERED_IDL:.idl=.h)
+endif
+OBJ_C_IDL := $(FILTERED_IDL:%.idl=%_stubs.$(EXT_OBJ))
+AUTO_IDL := $(FILTERED_IDL:.idl=.mli) $(FILTERED_IDL:.idl=.ml) $(C_IDL)
+
+FILTERED_OXRIDL := $(filter %.oxridl, $(FILTERED))
+DEP_OXRIDL := $(FILTERED_OXRIDL:%.oxridl=$(MLDEPDIR)/%.d) $(FILTERED_OXRIDL:.oxridl=.di)
+AUTO_OXRIDL := $(FILTERED_OXRIDL:.oxridl=.mli) $(FILTERED_OXRIDL:.oxridl=.ml) $(C_OXRIDL)
+
+FILTERED_C_CXX := $(filter %.c %.$(EXT_CXX), $(FILTERED))
+OBJ_C_CXX := $(FILTERED_C_CXX:.c=.$(EXT_OBJ))
+OBJ_C_CXX := $(OBJ_C_CXX:.$(EXT_CXX)=.$(EXT_OBJ))
+
+PRE_TARGETS += $(AUTO_MLL) $(AUTO_MLY) $(AUTO_IDL) $(AUTO_OXRIDL) $(AUTO_ZOG) $(AUTO_REP) $(AUTO_GLADE)
+
+ALL_DEPS := $(DEP_ML) $(DEP_MLI) $(DEP_MLL) $(DEP_MLY) $(DEP_IDL) $(DEP_OXRIDL) $(DEP_ZOG) $(DEP_REP) $(DEP_GLADE)
+
+MLDEPS := $(filter %.d, $(ALL_DEPS))
+MLIDEPS := $(filter %.di, $(ALL_DEPS))
+BCDEPIS := $(MLIDEPS:%.di=$(BCDIDIR)/%.di)
+NCDEPIS := $(MLIDEPS:%.di=$(NCDIDIR)/%.di)
+
+ALLML := $(filter %.mli %.ml %.mll %.mly %.idl %.oxridl %.rep %.zog %.glade, $(FILTERED))
+
+IMPLO_INTF := $(ALLML:%.mli=%.mli.__)
+IMPLO_INTF := $(foreach file, $(IMPLO_INTF), \
+ $(basename $(file)).cmi $(basename $(file)).cmo)
+IMPLO_INTF := $(filter-out %.mli.cmo, $(IMPLO_INTF))
+IMPLO_INTF := $(IMPLO_INTF:%.mli.cmi=%.cmi)
+
+IMPLX_INTF := $(IMPLO_INTF:.cmo=.cmx)
+
+INTF := $(filter %.cmi, $(IMPLO_INTF))
+IMPL_CMO := $(filter %.cmo, $(IMPLO_INTF))
+IMPL_CMX := $(IMPL_CMO:.cmo=.cmx)
+IMPL_ASM := $(IMPL_CMO:.cmo=.asm)
+IMPL_S := $(IMPL_CMO:.cmo=.s)
+
+OBJ_LINK := $(OBJ_C_IDL) $(OBJ_C_CXX)
+OBJ_FILES := $(IMPL_CMO:.cmo=.$(EXT_OBJ)) $(OBJ_LINK)
+
+EXECS := $(addsuffix $(EXE), \
+ $(sort $(TOPRESULT) $(BCRESULT) $(NCRESULT)))
+ifdef WIN32
+ EXECS += $(BCRESULT).dll $(NCRESULT).dll
+endif
+
+CLIB_BASE := $(RESULT)$(RES_CLIB_SUF)
+ifneq ($(strip $(OBJ_LINK)),)
+ RES_CLIB := lib$(CLIB_BASE).$(EXT_LIB)
+endif
+
+ifdef WIN32
+DLLSONAME := $(CLIB_BASE).dll
+else
+DLLSONAME := dll$(CLIB_BASE).so
+endif
+
+NONEXECS := $(INTF) $(IMPL_CMO) $(IMPL_CMX) $(IMPL_ASM) $(IMPL_S) \
+ $(OBJ_FILES) $(PRE_TARGETS) $(BCRESULT).cma $(NCRESULT).cmxa \
+ $(NCRESULT).$(EXT_LIB) $(BCRESULT).cmi $(BCRESULT).cmo \
+ $(NCRESULT).cmi $(NCRESULT).cmx $(NCRESULT).o \
+ $(RES_CLIB) $(IMPL_CMO:.cmo=.annot) \
+ $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(LIB_PACK_NAME).cmx $(LIB_PACK_NAME).o
+
+ifndef STATIC
+ NONEXECS += $(DLLSONAME)
+endif
+
+ifndef LIBINSTALL_FILES
+ LIBINSTALL_FILES := $(RESULT).mli $(RESULT).cmi $(RESULT).cma \
+ $(RESULT).cmxa $(RESULT).$(EXT_LIB) $(RES_CLIB)
+ ifndef STATIC
+ ifneq ($(strip $(OBJ_LINK)),)
+ LIBINSTALL_FILES += $(DLLSONAME)
+ endif
+ endif
+endif
+
+export LIBINSTALL_FILES
+
+ifdef WIN32
+ # some extra stuff is created while linking DLLs
+ NONEXECS += $(BCRESULT).$(EXT_LIB) $(BCRESULT).exp $(NCRESULT).exp $(CLIB_BASE).exp $(CLIB_BASE).lib
+endif
+
+TARGETS := $(EXECS) $(NONEXECS)
+
+# If there are IDL-files
+ifneq ($(strip $(FILTERED_IDL)),)
+ MAYBE_IDL := -cclib -lcamlidl
+endif
+
+ifdef USE_CAMLP4
+ CAMLP4PATH := \
+ $(shell $(CAMLP4) -where 2>/dev/null || echo /usr/lib/camlp4)
+ INCFLAGS := -I $(CAMLP4PATH)
+ CINCFLAGS := -I$(CAMLP4PATH)
+endif
+
+DINCFLAGS := $(INCFLAGS) $(SOURCE_DIRS:%=-I %) $(OCAML_DEFAULT_DIRS:%=-I %)
+INCFLAGS := $(DINCFLAGS) $(INCDIRS:%=-I %)
+CINCFLAGS += $(SOURCE_DIRS:%=-I%) $(INCDIRS:%=-I%) $(OCAML_DEFAULT_DIRS:%=-I%)
+
+ifndef MSVC
+CLIBFLAGS += $(SOURCE_DIRS:%=-L%) $(LIBDIRS:%=-L%) \
+ $(EXTLIBDIRS:%=-L%) $(EXTLIBDIRS:%=-Wl,$(RPATH_FLAG)%) \
+ $(OCAML_DEFAULT_DIRS:%=-L%)
+endif
+
+ifndef PROFILING
+ INTF_OCAMLC := $(OCAMLC)
+else
+ ifndef THREADS
+ INTF_OCAMLC := $(OCAMLCP) -p $(OCAMLCPFLAGS)
+ else
+ # OCaml does not support profiling byte code
+ # with threads (yet), therefore we force an error.
+ ifndef REAL_OCAMLC
+ $(error Profiling of multithreaded byte code not yet supported by OCaml)
+ endif
+ INTF_OCAMLC := $(OCAMLC)
+ endif
+endif
+
+ifndef MSVC
+COMMON_LDFLAGS := $(LDFLAGS:%=-ccopt %) $(SOURCE_DIRS:%=-ccopt -L%) \
+ $(LIBDIRS:%=-ccopt -L%) $(EXTLIBDIRS:%=-ccopt -L%) \
+ $(EXTLIBDIRS:%=-ccopt -Wl,$(RPATH_FLAG)%) \
+ $(OCAML_DEFAULT_DIRS:%=-ccopt -L%)
+else
+COMMON_LDFLAGS := -ccopt "/link -NODEFAULTLIB:LIBC $(LDFLAGS:%=%) $(SOURCE_DIRS:%=-LIBPATH:%) \
+ $(LIBDIRS:%=-LIBPATH:%) $(EXTLIBDIRS:%=-LIBPATH:%) \
+ $(OCAML_DEFAULT_DIRS:%=-LIBPATH:%) "
+endif
+
+CLIBS_OPTS := $(CLIBS:%=-cclib -l%)
+ifdef MSVC
+ ifndef STATIC
+ # MSVC libraries do not have 'lib' prefix
+ CLIBS_OPTS := $(CLIBS:%=-cclib %.lib)
+ endif
+endif
+
+ifneq ($(strip $(OBJ_LINK)),)
+ ifdef CREATE_LIB
+ OBJS_LIBS := -cclib -l$(CLIB_BASE) $(CLIBS_OPTS) $(MAYBE_IDL)
+ else
+ OBJS_LIBS := $(OBJ_LINK) $(CLIBS_OPTS) $(MAYBE_IDL)
+ endif
+else
+ OBJS_LIBS := $(CLIBS_OPTS) $(MAYBE_IDL)
+endif
+
+# If we have to make byte-code
+ifndef REAL_OCAMLC
+ BYTE_OCAML := y
+
+ # EXTRADEPS is added dependencies we have to insert for all
+ # executable files we generate. Ideally it should be all of the
+ # libraries we use, but it's hard to find the ones that get searched on
+ # the path since I don't know the paths built into the compiler, so
+ # just include the ones with slashes in their names.
+ EXTRADEPS := $(addsuffix .cma,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i))))
+ SPECIAL_OCAMLFLAGS := $(OCAMLBCFLAGS)
+
+ REAL_OCAMLC := $(INTF_OCAMLC)
+
+ REAL_IMPL := $(IMPL_CMO)
+ REAL_IMPL_INTF := $(IMPLO_INTF)
+ IMPL_SUF := .cmo
+
+ DEPFLAGS :=
+ MAKE_DEPS := $(MLDEPS) $(BCDEPIS)
+
+ ifdef CREATE_LIB
+ override CFLAGS := $(PIC_CFLAGS) $(CFLAGS)
+ override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS)
+ ifndef STATIC
+ ifneq ($(strip $(OBJ_LINK)),)
+ MAKEDLL := $(DLLSONAME)
+ ALL_LDFLAGS := -dllib $(DLLSONAME)
+ endif
+ endif
+ endif
+
+ ifndef NO_CUSTOM
+ ifneq "$(strip $(OBJ_LINK) $(THREADS) $(MAYBE_IDL) $(CLIBS))" ""
+ ALL_LDFLAGS += -custom
+ endif
+ endif
+
+ ALL_LDFLAGS += $(INCFLAGS) $(OCAMLLDFLAGS) $(OCAMLBLDFLAGS) \
+ $(COMMON_LDFLAGS) $(LIBS:%=%.cma)
+ CAMLIDLDLLFLAGS :=
+
+ ifdef THREADS
+ ifdef VMTHREADS
+ THREAD_FLAG := -vmthread
+ else
+ THREAD_FLAG := -thread
+ endif
+ ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS)
+ ifndef CREATE_LIB
+ ifndef REAL_OCAMLFIND
+ ALL_LDFLAGS := unix.cma threads.cma $(ALL_LDFLAGS)
+ endif
+ endif
+ endif
+
+# we have to make native-code
+else
+ EXTRADEPS := $(addsuffix .cmxa,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i))))
+ ifndef PROFILING
+ SPECIAL_OCAMLFLAGS := $(OCAMLNCFLAGS)
+ PLDFLAGS :=
+ else
+ SPECIAL_OCAMLFLAGS := -p $(OCAMLNCFLAGS)
+ PLDFLAGS := -p
+ endif
+
+ REAL_IMPL := $(IMPL_CMX)
+ REAL_IMPL_INTF := $(IMPLX_INTF)
+ IMPL_SUF := .cmx
+
+ override CPPFLAGS := -DNATIVE_CODE $(CPPFLAGS)
+
+ DEPFLAGS := -native
+ MAKE_DEPS := $(MLDEPS) $(NCDEPIS)
+
+ ALL_LDFLAGS := $(PLDFLAGS) $(INCFLAGS) $(OCAMLLDFLAGS) \
+ $(OCAMLNLDFLAGS) $(COMMON_LDFLAGS)
+ CAMLIDLDLLFLAGS := -opt
+
+ ifndef CREATE_LIB
+ ALL_LDFLAGS += $(LIBS:%=%.cmxa)
+ else
+ override CFLAGS := $(PIC_CFLAGS) $(CFLAGS)
+ override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS)
+ endif
+
+ ifdef THREADS
+ THREAD_FLAG := -thread
+ ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS)
+ ifndef CREATE_LIB
+ ifndef REAL_OCAMLFIND
+ ALL_LDFLAGS := unix.cmxa threads.cmxa $(ALL_LDFLAGS)
+ endif
+ endif
+ endif
+endif
+
+export MAKE_DEPS
+
+ifdef ANNOTATE
+ ANNOT_FLAG := -dtypes
+else
+endif
+
+ALL_OCAMLCFLAGS := $(THREAD_FLAG) $(ANNOT_FLAG) $(OCAMLFLAGS) \
+ $(INCFLAGS) $(SPECIAL_OCAMLFLAGS)
+
+ifdef make_deps
+ -include $(MAKE_DEPS)
+ PRE_TARGETS :=
+endif
+
+###########################################################################
+# USER RULES
+
+# Call "OCamlMakefile QUIET=" to get rid of all of the @'s.
+QUIET=@
+
+# generates byte-code (default)
+byte-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes
+bc: byte-code
+
+byte-code-nolink: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes
+bcnl: byte-code-nolink
+
+top: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(TOPRESULT) \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes
+
+# generates native-code
+
+native-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ make_deps=yes
+nc: native-code
+
+native-code-nolink: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ make_deps=yes
+ncnl: native-code-nolink
+
+# generates byte-code libraries
+byte-code-library: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(BCRESULT).cma \
+ REAL_RESULT="$(BCRESULT)" \
+ CREATE_LIB=yes \
+ make_deps=yes
+bcl: byte-code-library
+
+# generates native-code libraries
+native-code-library: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(NCRESULT).cmxa \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ CREATE_LIB=yes \
+ make_deps=yes
+ncl: native-code-library
+
+ifdef WIN32
+# generates byte-code dll
+byte-code-dll: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(BCRESULT).dll \
+ REAL_RESULT="$(BCRESULT)" \
+ make_deps=yes
+bcd: byte-code-dll
+
+# generates native-code dll
+native-code-dll: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(NCRESULT).dll \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ make_deps=yes
+ncd: native-code-dll
+endif
+
+# generates byte-code with debugging information
+debug-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes \
+ OCAMLFLAGS="-g $(OCAMLFLAGS)" \
+ OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
+dc: debug-code
+
+debug-code-nolink: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes \
+ OCAMLFLAGS="-g $(OCAMLFLAGS)" \
+ OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
+dcnl: debug-code-nolink
+
+# generates byte-code libraries with debugging information
+debug-code-library: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(BCRESULT).cma \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes \
+ CREATE_LIB=yes \
+ OCAMLFLAGS="-g $(OCAMLFLAGS)" \
+ OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
+dcl: debug-code-library
+
+# generates byte-code for profiling
+profiling-byte-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \
+ REAL_RESULT="$(BCRESULT)" PROFILING="y" \
+ make_deps=yes
+pbc: profiling-byte-code
+
+# generates native-code
+
+profiling-native-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ PROFILING="y" \
+ make_deps=yes
+pnc: profiling-native-code
+
+# generates byte-code libraries
+profiling-byte-code-library: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(BCRESULT).cma \
+ REAL_RESULT="$(BCRESULT)" PROFILING="y" \
+ CREATE_LIB=yes \
+ make_deps=yes
+pbcl: profiling-byte-code-library
+
+# generates native-code libraries
+profiling-native-code-library: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(NCRESULT).cmxa \
+ REAL_RESULT="$(NCRESULT)" PROFILING="y" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ CREATE_LIB=yes \
+ make_deps=yes
+pncl: profiling-native-code-library
+
+# packs byte-code objects
+pack-byte-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT).cmo \
+ REAL_RESULT="$(BCRESULT)" \
+ PACK_LIB=yes make_deps=yes
+pabc: pack-byte-code
+
+# packs native-code objects
+pack-native-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(NCRESULT).cmx $(NCRESULT).o \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ PACK_LIB=yes make_deps=yes
+panc: pack-native-code
+
+# generates HTML-documentation
+htdoc: doc/$(RESULT)/html
+
+# generates Latex-documentation
+ladoc: doc/$(RESULT)/latex
+
+# generates PostScript-documentation
+psdoc: doc/$(RESULT)/latex/doc.ps
+
+# generates PDF-documentation
+pdfdoc: doc/$(RESULT)/latex/doc.pdf
+
+# generates all supported forms of documentation
+doc: htdoc ladoc psdoc pdfdoc
+
+###########################################################################
+# LOW LEVEL RULES
+
+$(REAL_RESULT): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) $(RESULTDEPS)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) \
+ $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \
+ $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \
+ $(REAL_IMPL)
+
+nolink: $(REAL_IMPL_INTF) $(OBJ_LINK)
+
+ifdef WIN32
+$(REAL_RESULT).dll: $(REAL_IMPL_INTF) $(OBJ_LINK)
+ $(CAMLIDLDLL) $(CAMLIDLDLLFLAGS) $(OBJ_LINK) $(CLIBS) \
+ -o $@ $(REAL_IMPL)
+endif
+
+%$(TOPSUFFIX): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS)
+ $(REAL_OCAMLFIND) $(OCAMLMKTOP) \
+ $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \
+ $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \
+ $(REAL_IMPL)
+
+.SUFFIXES: .mli .ml .cmi .cmo .cmx .cma .cmxa .$(EXT_OBJ) \
+ .mly .di .d .$(EXT_LIB) .idl %.oxridl .c .$(EXT_CXX) .h .so \
+ .rep .zog .glade
+
+ifndef STATIC
+ifdef MINGW
+$(DLLSONAME): $(OBJ_LINK)
+ $(CC) $(CFLAGS) $(CFLAGS_WIN32) $(OBJ_LINK) -shared -o $@ \
+ -Wl,--whole-archive $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/lib%.a))) \
+ $(OCAMLLIBPATH)/ocamlrun.a \
+ -Wl,--export-all-symbols \
+ -Wl,--no-whole-archive
+else
+ifdef MSVC
+$(DLLSONAME): $(OBJ_LINK)
+ link /NOLOGO /DLL /OUT:$@ $(OBJ_LINK) \
+ $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/%.lib))) \
+ $(OCAMLLIBPATH)/ocamlrun.lib
+
+else
+$(DLLSONAME): $(OBJ_LINK)
+ $(OCAMLMKLIB) $(INCFLAGS) $(CLIBFLAGS) \
+ -o $(CLIB_BASE) $(OBJ_LINK) $(CLIBS:%=-l%) \
+ $(OCAMLMKLIB_FLAGS)
+endif
+endif
+endif
+
+ifndef LIB_PACK_NAME
+$(RESULT).cma: $(REAL_IMPL_INTF) $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) \
+ $(OBJS_LIBS) -o $@ $(OCAMLBLDFLAGS) $(REAL_IMPL)
+
+$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(REAL_IMPL_INTF) $(EXTRADEPS) $(RESULTDEPS)
+ $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) \
+ $(OCAMLNLDFLAGS) -o $@ $(REAL_IMPL)
+else
+ifdef BYTE_OCAML
+$(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo: $(REAL_IMPL_INTF)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmo $(REAL_IMPL)
+else
+$(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx: $(REAL_IMPL_INTF)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmx $(REAL_IMPL)
+endif
+
+$(RESULT).cma: $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) \
+ $(OBJS_LIBS) -o $@ $(OCAMLBLDFLAGS) $(LIB_PACK_NAME).cmo
+
+$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx $(EXTRADEPS) $(RESULTDEPS)
+ $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) \
+ $(OCAMLNLDFLAGS) -o $@ $(LIB_PACK_NAME).cmx
+endif
+
+$(RES_CLIB): $(OBJ_LINK)
+ifndef MSVC
+ ifneq ($(strip $(OBJ_LINK)),)
+ $(AR) rcs $@ $(OBJ_LINK)
+ endif
+else
+ ifneq ($(strip $(OBJ_LINK)),)
+ lib -nologo -debugtype:cv -out:$(RES_CLIB) $(OBJ_LINK)
+ endif
+endif
+
+.mli.cmi: $(EXTRADEPS)
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c $(THREAD_FLAG) $(ANNOT_FLAG) \
+ $(OCAMLFLAGS) $(INCFLAGS) $<; \
+ $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c $(THREAD_FLAG) $(ANNOT_FLAG) \
+ $(OCAMLFLAGS) $(INCFLAGS) $<; \
+ else \
+ echo $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c -pp \"$$pp $(PPFLAGS)\" $(THREAD_FLAG) $(ANNOT_FLAG) \
+ $(OCAMLFLAGS) $(INCFLAGS) $<; \
+ $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c -pp "$$pp $(PPFLAGS)" $(THREAD_FLAG) $(ANNOT_FLAG) \
+ $(OCAMLFLAGS) $(INCFLAGS) $<; \
+ fi
+
+.ml.cmi .ml.$(EXT_OBJ) .ml.cmx .ml.cmo: $(EXTRADEPS)
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c $(ALL_OCAMLCFLAGS) $<; \
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c $(ALL_OCAMLCFLAGS) $<; \
+ else \
+ echo $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c -pp \"$$pp $(PPFLAGS)\" $(ALL_OCAMLCFLAGS) $<; \
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c -pp "$$pp $(PPFLAGS)" $(ALL_OCAMLCFLAGS) $<; \
+ fi
+
+ifdef PACK_LIB
+$(REAL_RESULT).cmo $(REAL_RESULT).cmx $(REAL_RESULT).o: $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack $(ALL_LDFLAGS) \
+ $(OBJS_LIBS) -o $@ $(REAL_IMPL)
+endif
+
+.PRECIOUS: %.ml
+%.ml: %.mll
+ $(OCAMLLEX) $<
+
+.PRECIOUS: %.ml %.mli
+%.ml %.mli: %.mly
+ $(OCAMLYACC) $(YFLAGS) $<
+ $(QUIET)pp=`sed -n -e 's/.*(\*pp \([^*]*\) \*).*/\1/p;q' $<`; \
+ if [ ! -z "$$pp" ]; then \
+ mv $*.ml $*.ml.temporary; \
+ echo "(*pp $$pp $(PPFLAGS)*)" > $*.ml; \
+ cat $*.ml.temporary >> $*.ml; \
+ rm $*.ml.temporary; \
+ mv $*.mli $*.mli.temporary; \
+ echo "(*pp $$pp $(PPFLAGS)*)" > $*.mli; \
+ cat $*.mli.temporary >> $*.mli; \
+ rm $*.mli.temporary; \
+ fi
+
+
+.PRECIOUS: %.ml
+%.ml: %.rep
+ $(CAMELEON_REPORT) $(CAMELEON_REPORT_FLAGS) -gen $<
+
+.PRECIOUS: %.ml
+%.ml: %.zog
+ $(CAMELEON_ZOGGY) $(CAMELEON_ZOGGY_FLAGS) -impl $< > $@
+
+.PRECIOUS: %.ml
+%.ml: %.glade
+ $(OCAML_GLADECC) $(OCAML_GLADECC_FLAGS) $< > $@
+
+.PRECIOUS: %.ml %.mli
+%.ml %.mli: %.oxridl
+ $(OXRIDL) $<
+
+.PRECIOUS: %.ml %.mli %_stubs.c %.h
+%.ml %.mli %_stubs.c %.h: %.idl
+ $(CAMLIDL) $(MAYBE_IDL_HEADER) $(IDLFLAGS) \
+ $(CAMLIDLFLAGS) $<
+ $(QUIET)if [ $(NOIDLHEADER) ]; then touch $*.h; fi
+
+.c.$(EXT_OBJ):
+ $(OCAMLC) -c -cc "$(CC)" -ccopt "$(CFLAGS) \
+ $(CPPFLAGS) $(CPPFLAGS_WIN32) \
+ $(CFLAGS_WIN32) $(CINCFLAGS) $(CFLAG_O)$@ " $<
+
+.$(EXT_CXX).$(EXT_OBJ):
+ $(CXX) -c $(CXXFLAGS) $(CINCFLAGS) $(CPPFLAGS) \
+ -I'$(OCAMLLIBPATH)' \
+ $< $(CFLAG_O)$@
+
+$(MLDEPDIR)/%.d: %.ml
+ $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
+ $(DINCFLAGS) $< \> $@; \
+ $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
+ $(DINCFLAGS) $< > $@; \
+ else \
+ echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
+ -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \
+ $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
+ -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \
+ fi
+
+$(BCDIDIR)/%.di $(NCDIDIR)/%.di: %.mli
+ $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< \> $@; \
+ $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< > $@; \
+ else \
+ echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \
+ -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \
+ $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \
+ -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \
+ fi
+
+doc/$(RESULT)/html: $(DOC_FILES)
+ rm -rf $@
+ mkdir -p $@
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(OCAMLDOC) -html -d $@ $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \
+ $(OCAMLDOC) -html -d $@ $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \
+ else \
+ echo $(OCAMLDOC) -pp \"$$pp $(PPFLAGS)\" -html -d $@ $(OCAMLDOCFLAGS) \
+ $(INCFLAGS) $(DOC_FILES); \
+ $(OCAMLDOC) -pp "$$pp $(PPFLAGS)" -html -d $@ $(OCAMLDOCFLAGS) \
+ $(INCFLAGS) $(DOC_FILES); \
+ fi
+
+doc/$(RESULT)/latex: $(DOC_FILES)
+ rm -rf $@
+ mkdir -p $@
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(OCAMLDOC) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) \
+ $(DOC_FILES) -o $@/doc.tex; \
+ $(OCAMLDOC) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES) \
+ -o $@/doc.tex; \
+ else \
+ echo $(OCAMLDOC) -pp \"$$pp $(PPFLAGS)\" -latex $(OCAMLDOCFLAGS) \
+ $(INCFLAGS) $(DOC_FILES) -o $@/doc.tex; \
+ $(OCAMLDOC) -pp "$$pp $(PPFLAGS)" -latex $(OCAMLDOCFLAGS) \
+ $(INCFLAGS) $(DOC_FILES) -o $@/doc.tex; \
+ fi
+
+doc/$(RESULT)/latex/doc.ps: doc/$(RESULT)/latex
+ cd doc/$(RESULT)/latex && \
+ $(LATEX) doc.tex && \
+ $(LATEX) doc.tex && \
+ $(DVIPS) $(DVIPSFLAGS) doc.dvi -o $(@F)
+
+doc/$(RESULT)/latex/doc.pdf: doc/$(RESULT)/latex/doc.ps
+ cd doc/$(RESULT)/latex && $(PS2PDF) $(<F)
+
+define make_subproj
+.PHONY:
+subproj_$(1):
+ $$(eval $$(call PROJ_$(1)))
+ $(QUIET)if [ "$(SUBTARGET)" != "all" ]; then \
+ $(MAKE) -f $(OCAMLMAKEFILE) $(SUBTARGET); \
+ fi
+endef
+
+$(foreach subproj,$(SUBPROJS),$(eval $(call make_subproj,$(subproj))))
+
+.PHONY:
+subprojs: $(SUBPROJS:%=subproj_%)
+
+###########################################################################
+# (UN)INSTALL RULES FOR LIBRARIES
+
+.PHONY: libinstall
+libinstall: all
+ $(QUIET)printf "\nInstalling library with ocamlfind\n"
+ $(OCAMLFIND) install $(OCAMLFIND_INSTFLAGS) $(RESULT) META $(LIBINSTALL_FILES)
+ $(QUIET)printf "\nInstallation successful.\n"
+
+.PHONY: libuninstall
+libuninstall:
+ $(QUIET)printf "\nUninstalling library with ocamlfind\n"
+ $(OCAMLFIND) remove $(OCAMLFIND_INSTFLAGS) $(RESULT)
+ $(QUIET)printf "\nUninstallation successful.\n"
+
+.PHONY: rawinstall
+rawinstall: all
+ $(QUIET)printf "\nInstalling library to: $(OCAML_LIB_INSTALL)\n"
+ -install -d $(OCAML_LIB_INSTALL)
+ for i in $(LIBINSTALL_FILES); do \
+ if [ -f $$i ]; then \
+ install -c -m 0644 $$i $(OCAML_LIB_INSTALL); \
+ fi; \
+ done
+ $(QUIET)printf "\nInstallation successful.\n"
+
+.PHONY: rawuninstall
+rawuninstall:
+ $(QUIET)printf "\nUninstalling library from: $(OCAML_LIB_INSTALL)\n"
+ cd $(OCAML_LIB_INSTALL) && rm $(notdir $(LIBINSTALL_FILES))
+ $(QUIET)printf "\nUninstallation successful.\n"
+
+###########################################################################
+# MAINTAINANCE RULES
+
+.PHONY: clean
+clean::
+ rm -f $(TARGETS) $(TRASH)
+ rm -rf $(BCDIDIR) $(NCDIDIR) $(MLDEPDIR)
+
+.PHONY: cleanup
+cleanup::
+ rm -f $(NONEXECS) $(TRASH)
+ rm -rf $(BCDIDIR) $(NCDIDIR) $(MLDEPDIR)
+
+.PHONY: clean-doc
+clean-doc::
+ rm -rf doc
+
+.PHONY: nobackup
+nobackup:
+ rm -f *.bak *~ *.dup
diff --git a/examples/adder/adder.conf b/examples/adder/adder.conf
new file mode 100644
index 0000000..ecb3221
--- /dev/null
+++ b/examples/adder/adder.conf
@@ -0,0 +1,43 @@
+netplex {
+ controller {
+ max_level = "debug"; (* Log level *)
+ logging {
+ type = "stderr"; (* Log to stderr *)
+ }
+ };
+ service {
+ name = "XmlRpc-Light Server";
+ protocol {
+ (* This section creates the socket *)
+ name = "http";
+ address {
+ type = "internet";
+ bind = "0.0.0.0:8080"; (* Port 8080 on all interfaces *)
+ };
+ };
+ processor {
+ (* This section specifies how to process data of the socket *)
+ type = "nethttpd";
+ host {
+ (* Think of Apache's "virtual hosts" *)
+ pref_name = "localhost";
+ pref_port = 8080;
+ names = "*:0"; (* Which requests are matched here: all *)
+ uri {
+ path = "/";
+ service {
+ type = "dynamic";
+ handler = "xmlrpc";
+ }
+ };
+ };
+ };
+ workload_manager {
+ type = "dynamic";
+ max_jobs_per_thread = 1; (* Everything else is senseless *)
+ min_free_jobs_capacity = 1;
+ max_free_jobs_capacity = 1;
+ max_threads = 20;
+ };
+ }
+}
diff --git a/examples/adder/adder.ml b/examples/adder/adder.ml
new file mode 100644
index 0000000..f717499
--- /dev/null
+++ b/examples/adder/adder.ml
@@ -0,0 +1,37 @@
+(*
+ * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet
+ * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *)
+
+let () =
+ let server = new XmlRpcServer.netplex () in
+ server#register "demo.addTwoNumbers"
+ ~help:"Add two numbers together"
+ ~signatures:[[`Int; `Int; `Int];
+ [`Double; `Int; `Double];
+ [`Double; `Double; `Int];
+ [`Double; `Double; `Double];
+ [`Double; `String; `String]]
+ (function
+ | [`Int x; `Int y] -> `Int (x + y)
+ | [`Int x; `Double y] -> `Double (float_of_int x +. y)
+ | [`Double x; `Int y] -> `Double (x +. float_of_int y)
+ | [`Double x; `Double y] -> `Double (x +. y)
+ | [`String x; `String y] -> `Double (float_of_string x
+ +. float_of_string y)
+ | _ -> XmlRpcServer.invalid_params ());
+ server#run ()
diff --git a/examples/adder/run.sh b/examples/adder/run.sh
new file mode 100755
index 0000000..c7aff26
--- /dev/null
+++ b/examples/adder/run.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+./adder -conf adder.conf
diff --git a/examples/genclient/Makefile b/examples/genclient/Makefile
new file mode 100644
index 0000000..2eb0e03
--- /dev/null
+++ b/examples/genclient/Makefile
@@ -0,0 +1,7 @@
+OCAMLMAKEFILE = OCamlMakefile
+
+RESULT = genclient
+SOURCES = genclient.ml
+PACKS = xmlrpc-light
+
+include $(OCAMLMAKEFILE)
diff --git a/examples/genclient/OCamlMakefile b/examples/genclient/OCamlMakefile
new file mode 100644
index 0000000..9adb295
--- /dev/null
+++ b/examples/genclient/OCamlMakefile
@@ -0,0 +1,1154 @@
+###########################################################################
+# OCamlMakefile
+# Copyright (C) 1999-2004 Markus Mottl
+#
+# For updates see:
+# http://www.ocaml.info/home/ocaml_sources.html
+#
+# $Id: OCamlMakefile,v 1.72 2005/12/09 15:30:50 mottl Exp $
+#
+###########################################################################
+
+# Modified by damien for .glade.ml compilation
+
+# Set these variables to the names of the sources to be processed and
+# the result variable. Order matters during linkage!
+
+ifndef SOURCES
+ SOURCES := foo.ml
+endif
+export SOURCES
+
+ifndef RES_CLIB_SUF
+ RES_CLIB_SUF := _stubs
+endif
+export RES_CLIB_SUF
+
+ifndef RESULT
+ RESULT := foo
+endif
+export RESULT
+
+export LIB_PACK_NAME
+
+ifndef DOC_FILES
+ DOC_FILES := $(filter %.mli, $(SOURCES))
+endif
+export DOC_FILES
+
+export BCSUFFIX
+export NCSUFFIX
+
+ifndef TOPSUFFIX
+ TOPSUFFIX := .top
+endif
+export TOPSUFFIX
+
+# Eventually set include- and library-paths, libraries to link,
+# additional compilation-, link- and ocamlyacc-flags
+# Path- and library information needs not be written with "-I" and such...
+# Define THREADS if you need it, otherwise leave it unset (same for
+# USE_CAMLP4)!
+
+export THREADS
+export VMTHREADS
+export ANNOTATE
+export USE_CAMLP4
+
+export INCDIRS
+export LIBDIRS
+export EXTLIBDIRS
+export RESULTDEPS
+export OCAML_DEFAULT_DIRS
+
+export LIBS
+export CLIBS
+
+export OCAMLFLAGS
+export OCAMLNCFLAGS
+export OCAMLBCFLAGS
+
+export OCAMLLDFLAGS
+export OCAMLNLDFLAGS
+export OCAMLBLDFLAGS
+
+ifndef OCAMLCPFLAGS
+ OCAMLCPFLAGS := a
+endif
+
+export OCAMLCPFLAGS
+
+export PPFLAGS
+
+export YFLAGS
+export IDLFLAGS
+
+export OCAMLDOCFLAGS
+
+export OCAMLFIND_INSTFLAGS
+
+export DVIPSFLAGS
+
+export STATIC
+
+# Add a list of optional trash files that should be deleted by "make clean"
+export TRASH
+
+#################### variables depending on your OCaml-installation
+
+ifdef MINGW
+ export MINGW
+ WIN32 := 1
+ CFLAGS_WIN32 := -mno-cygwin
+endif
+ifdef MSVC
+ export MSVC
+ WIN32 := 1
+ ifndef STATIC
+ CPPFLAGS_WIN32 := -DCAML_DLL
+ endif
+ CFLAGS_WIN32 += -nologo
+ EXT_OBJ := obj
+ EXT_LIB := lib
+ ifeq ($(CC),gcc)
+ # work around GNU Make default value
+ ifdef THREADS
+ CC := cl -MT
+ else
+ CC := cl
+ endif
+ endif
+ ifeq ($(CXX),g++)
+ # work around GNU Make default value
+ CXX := $(CC)
+ endif
+ CFLAG_O := -Fo
+endif
+ifdef WIN32
+ EXT_CXX := cpp
+ EXE := .exe
+endif
+
+ifndef EXT_OBJ
+ EXT_OBJ := o
+endif
+ifndef EXT_LIB
+ EXT_LIB := a
+endif
+ifndef EXT_CXX
+ EXT_CXX := cc
+endif
+ifndef EXE
+ EXE := # empty
+endif
+ifndef CFLAG_O
+ CFLAG_O := -o # do not delete this comment (preserves trailing whitespace)!
+endif
+
+export CC
+export CXX
+export CFLAGS
+export CXXFLAGS
+export LDFLAGS
+export CPPFLAGS
+
+ifndef RPATH_FLAG
+ RPATH_FLAG := -R
+endif
+export RPATH_FLAG
+
+ifndef MSVC
+ifndef PIC_CFLAGS
+ PIC_CFLAGS := -fPIC
+endif
+ifndef PIC_CPPFLAGS
+ PIC_CPPFLAGS := -DPIC
+endif
+endif
+
+export PIC_CFLAGS
+export PIC_CPPFLAGS
+
+BCRESULT := $(addsuffix $(BCSUFFIX), $(RESULT))
+NCRESULT := $(addsuffix $(NCSUFFIX), $(RESULT))
+TOPRESULT := $(addsuffix $(TOPSUFFIX), $(RESULT))
+
+ifndef OCAMLFIND
+ OCAMLFIND := ocamlfind
+endif
+export OCAMLFIND
+
+ifndef OCAMLC
+ OCAMLC := ocamlc
+endif
+export OCAMLC
+
+ifndef OCAMLOPT
+ OCAMLOPT := ocamlopt
+endif
+export OCAMLOPT
+
+ifndef OCAMLMKTOP
+ OCAMLMKTOP := ocamlmktop
+endif
+export OCAMLMKTOP
+
+ifndef OCAMLCP
+ OCAMLCP := ocamlcp
+endif
+export OCAMLCP
+
+ifndef OCAMLDEP
+ OCAMLDEP := ocamldep
+endif
+export OCAMLDEP
+
+ifndef OCAMLLEX
+ OCAMLLEX := ocamllex
+endif
+export OCAMLLEX
+
+ifndef OCAMLYACC
+ OCAMLYACC := ocamlyacc
+endif
+export OCAMLYACC
+
+ifndef OCAMLMKLIB
+ OCAMLMKLIB := ocamlmklib
+endif
+export OCAMLMKLIB
+
+ifndef OCAML_GLADECC
+ OCAML_GLADECC := lablgladecc2
+endif
+export OCAML_GLADECC
+
+ifndef OCAML_GLADECC_FLAGS
+ OCAML_GLADECC_FLAGS :=
+endif
+export OCAML_GLADECC_FLAGS
+
+ifndef CAMELEON_REPORT
+ CAMELEON_REPORT := report
+endif
+export CAMELEON_REPORT
+
+ifndef CAMELEON_REPORT_FLAGS
+ CAMELEON_REPORT_FLAGS :=
+endif
+export CAMELEON_REPORT_FLAGS
+
+ifndef CAMELEON_ZOGGY
+ CAMELEON_ZOGGY := camlp4o pa_zog.cma pr_o.cmo
+endif
+export CAMELEON_ZOGGY
+
+ifndef CAMELEON_ZOGGY_FLAGS
+ CAMELEON_ZOGGY_FLAGS :=
+endif
+export CAMELEON_ZOGGY_FLAGS
+
+ifndef OXRIDL
+ OXRIDL := oxridl
+endif
+export OXRIDL
+
+ifndef CAMLIDL
+ CAMLIDL := camlidl
+endif
+export CAMLIDL
+
+ifndef CAMLIDLDLL
+ CAMLIDLDLL := camlidldll
+endif
+export CAMLIDLDLL
+
+ifndef NOIDLHEADER
+ MAYBE_IDL_HEADER := -header
+endif
+export NOIDLHEADER
+
+export NO_CUSTOM
+
+ifndef CAMLP4
+ CAMLP4 := camlp4
+endif
+export CAMLP4
+
+ifndef REAL_OCAMLFIND
+ ifdef PACKS
+ ifndef CREATE_LIB
+ ifdef THREADS
+ PACKS += threads
+ endif
+ endif
+ empty :=
+ space := $(empty) $(empty)
+ comma := ,
+ ifdef PREDS
+ PRE_OCAML_FIND_PREDICATES := $(subst $(space),$(comma),$(PREDS))
+ PRE_OCAML_FIND_PACKAGES := $(subst $(space),$(comma),$(PACKS))
+ OCAML_FIND_PREDICATES := -predicates $(PRE_OCAML_FIND_PREDICATES)
+ # OCAML_DEP_PREDICATES := -syntax $(PRE_OCAML_FIND_PREDICATES)
+ OCAML_FIND_PACKAGES := $(OCAML_FIND_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES)
+ OCAML_DEP_PACKAGES := $(OCAML_DEP_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES)
+ else
+ OCAML_FIND_PACKAGES := -package $(subst $(space),$(comma),$(PACKS))
+ OCAML_DEP_PACKAGES :=
+ endif
+ OCAML_FIND_LINKPKG := -linkpkg
+ REAL_OCAMLFIND := $(OCAMLFIND)
+ endif
+endif
+
+export OCAML_FIND_PACKAGES
+export OCAML_DEP_PACKAGES
+export OCAML_FIND_LINKPKG
+export REAL_OCAMLFIND
+
+ifndef OCAMLDOC
+ OCAMLDOC := ocamldoc
+endif
+export OCAMLDOC
+
+ifndef LATEX
+ LATEX := latex
+endif
+export LATEX
+
+ifndef DVIPS
+ DVIPS := dvips
+endif
+export DVIPS
+
+ifndef PS2PDF
+ PS2PDF := ps2pdf
+endif
+export PS2PDF
+
+ifndef OCAMLMAKEFILE
+ OCAMLMAKEFILE := OCamlMakefile
+endif
+export OCAMLMAKEFILE
+
+ifndef OCAMLLIBPATH
+ OCAMLLIBPATH := \
+ $(shell $(OCAMLC) 2>/dev/null -where || echo /usr/lib/ocaml)
+endif
+export OCAMLLIBPATH
+
+ifndef OCAML_LIB_INSTALL
+ OCAML_LIB_INSTALL := $(OCAMLLIBPATH)/contrib
+endif
+export OCAML_LIB_INSTALL
+
+###########################################################################
+
+#################### change following sections only if
+#################### you know what you are doing!
+
+# delete target files when a build command fails
+.PHONY: .DELETE_ON_ERROR
+.DELETE_ON_ERROR:
+
+# for pedants using "--warn-undefined-variables"
+export MAYBE_IDL
+export REAL_RESULT
+export CAMLIDLFLAGS
+export THREAD_FLAG
+export RES_CLIB
+export MAKEDLL
+export ANNOT_FLAG
+export C_OXRIDL
+export SUBPROJS
+export CFLAGS_WIN32
+export CPPFLAGS_WIN32
+
+INCFLAGS :=
+
+SHELL := /bin/sh
+
+MLDEPDIR := ._d
+BCDIDIR := ._bcdi
+NCDIDIR := ._ncdi
+
+FILTER_EXTNS := %.mli %.ml %.mll %.mly %.idl %.oxridl %.c %.$(EXT_CXX) %.rep %.zog %.glade
+
+FILTERED := $(filter $(FILTER_EXTNS), $(SOURCES))
+SOURCE_DIRS := $(filter-out ./, $(sort $(dir $(FILTERED))))
+
+FILTERED_REP := $(filter %.rep, $(FILTERED))
+DEP_REP := $(FILTERED_REP:%.rep=$(MLDEPDIR)/%.d)
+AUTO_REP := $(FILTERED_REP:.rep=.ml)
+
+FILTERED_ZOG := $(filter %.zog, $(FILTERED))
+DEP_ZOG := $(FILTERED_ZOG:%.zog=$(MLDEPDIR)/%.d)
+AUTO_ZOG := $(FILTERED_ZOG:.zog=.ml)
+
+FILTERED_GLADE := $(filter %.glade, $(FILTERED))
+DEP_GLADE := $(FILTERED_GLADE:%.glade=$(MLDEPDIR)/%.d)
+AUTO_GLADE := $(FILTERED_GLADE:.glade=.ml)
+
+FILTERED_ML := $(filter %.ml, $(FILTERED))
+DEP_ML := $(FILTERED_ML:%.ml=$(MLDEPDIR)/%.d)
+
+FILTERED_MLI := $(filter %.mli, $(FILTERED))
+DEP_MLI := $(FILTERED_MLI:.mli=.di)
+
+FILTERED_MLL := $(filter %.mll, $(FILTERED))
+DEP_MLL := $(FILTERED_MLL:%.mll=$(MLDEPDIR)/%.d)
+AUTO_MLL := $(FILTERED_MLL:.mll=.ml)
+
+FILTERED_MLY := $(filter %.mly, $(FILTERED))
+DEP_MLY := $(FILTERED_MLY:%.mly=$(MLDEPDIR)/%.d) $(FILTERED_MLY:.mly=.di)
+AUTO_MLY := $(FILTERED_MLY:.mly=.mli) $(FILTERED_MLY:.mly=.ml)
+
+FILTERED_IDL := $(filter %.idl, $(FILTERED))
+DEP_IDL := $(FILTERED_IDL:%.idl=$(MLDEPDIR)/%.d) $(FILTERED_IDL:.idl=.di)
+C_IDL := $(FILTERED_IDL:%.idl=%_stubs.c)
+ifndef NOIDLHEADER
+ C_IDL += $(FILTERED_IDL:.idl=.h)
+endif
+OBJ_C_IDL := $(FILTERED_IDL:%.idl=%_stubs.$(EXT_OBJ))
+AUTO_IDL := $(FILTERED_IDL:.idl=.mli) $(FILTERED_IDL:.idl=.ml) $(C_IDL)
+
+FILTERED_OXRIDL := $(filter %.oxridl, $(FILTERED))
+DEP_OXRIDL := $(FILTERED_OXRIDL:%.oxridl=$(MLDEPDIR)/%.d) $(FILTERED_OXRIDL:.oxridl=.di)
+AUTO_OXRIDL := $(FILTERED_OXRIDL:.oxridl=.mli) $(FILTERED_OXRIDL:.oxridl=.ml) $(C_OXRIDL)
+
+FILTERED_C_CXX := $(filter %.c %.$(EXT_CXX), $(FILTERED))
+OBJ_C_CXX := $(FILTERED_C_CXX:.c=.$(EXT_OBJ))
+OBJ_C_CXX := $(OBJ_C_CXX:.$(EXT_CXX)=.$(EXT_OBJ))
+
+PRE_TARGETS += $(AUTO_MLL) $(AUTO_MLY) $(AUTO_IDL) $(AUTO_OXRIDL) $(AUTO_ZOG) $(AUTO_REP) $(AUTO_GLADE)
+
+ALL_DEPS := $(DEP_ML) $(DEP_MLI) $(DEP_MLL) $(DEP_MLY) $(DEP_IDL) $(DEP_OXRIDL) $(DEP_ZOG) $(DEP_REP) $(DEP_GLADE)
+
+MLDEPS := $(filter %.d, $(ALL_DEPS))
+MLIDEPS := $(filter %.di, $(ALL_DEPS))
+BCDEPIS := $(MLIDEPS:%.di=$(BCDIDIR)/%.di)
+NCDEPIS := $(MLIDEPS:%.di=$(NCDIDIR)/%.di)
+
+ALLML := $(filter %.mli %.ml %.mll %.mly %.idl %.oxridl %.rep %.zog %.glade, $(FILTERED))
+
+IMPLO_INTF := $(ALLML:%.mli=%.mli.__)
+IMPLO_INTF := $(foreach file, $(IMPLO_INTF), \
+ $(basename $(file)).cmi $(basename $(file)).cmo)
+IMPLO_INTF := $(filter-out %.mli.cmo, $(IMPLO_INTF))
+IMPLO_INTF := $(IMPLO_INTF:%.mli.cmi=%.cmi)
+
+IMPLX_INTF := $(IMPLO_INTF:.cmo=.cmx)
+
+INTF := $(filter %.cmi, $(IMPLO_INTF))
+IMPL_CMO := $(filter %.cmo, $(IMPLO_INTF))
+IMPL_CMX := $(IMPL_CMO:.cmo=.cmx)
+IMPL_ASM := $(IMPL_CMO:.cmo=.asm)
+IMPL_S := $(IMPL_CMO:.cmo=.s)
+
+OBJ_LINK := $(OBJ_C_IDL) $(OBJ_C_CXX)
+OBJ_FILES := $(IMPL_CMO:.cmo=.$(EXT_OBJ)) $(OBJ_LINK)
+
+EXECS := $(addsuffix $(EXE), \
+ $(sort $(TOPRESULT) $(BCRESULT) $(NCRESULT)))
+ifdef WIN32
+ EXECS += $(BCRESULT).dll $(NCRESULT).dll
+endif
+
+CLIB_BASE := $(RESULT)$(RES_CLIB_SUF)
+ifneq ($(strip $(OBJ_LINK)),)
+ RES_CLIB := lib$(CLIB_BASE).$(EXT_LIB)
+endif
+
+ifdef WIN32
+DLLSONAME := $(CLIB_BASE).dll
+else
+DLLSONAME := dll$(CLIB_BASE).so
+endif
+
+NONEXECS := $(INTF) $(IMPL_CMO) $(IMPL_CMX) $(IMPL_ASM) $(IMPL_S) \
+ $(OBJ_FILES) $(PRE_TARGETS) $(BCRESULT).cma $(NCRESULT).cmxa \
+ $(NCRESULT).$(EXT_LIB) $(BCRESULT).cmi $(BCRESULT).cmo \
+ $(NCRESULT).cmi $(NCRESULT).cmx $(NCRESULT).o \
+ $(RES_CLIB) $(IMPL_CMO:.cmo=.annot) \
+ $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(LIB_PACK_NAME).cmx $(LIB_PACK_NAME).o
+
+ifndef STATIC
+ NONEXECS += $(DLLSONAME)
+endif
+
+ifndef LIBINSTALL_FILES
+ LIBINSTALL_FILES := $(RESULT).mli $(RESULT).cmi $(RESULT).cma \
+ $(RESULT).cmxa $(RESULT).$(EXT_LIB) $(RES_CLIB)
+ ifndef STATIC
+ ifneq ($(strip $(OBJ_LINK)),)
+ LIBINSTALL_FILES += $(DLLSONAME)
+ endif
+ endif
+endif
+
+export LIBINSTALL_FILES
+
+ifdef WIN32
+ # some extra stuff is created while linking DLLs
+ NONEXECS += $(BCRESULT).$(EXT_LIB) $(BCRESULT).exp $(NCRESULT).exp $(CLIB_BASE).exp $(CLIB_BASE).lib
+endif
+
+TARGETS := $(EXECS) $(NONEXECS)
+
+# If there are IDL-files
+ifneq ($(strip $(FILTERED_IDL)),)
+ MAYBE_IDL := -cclib -lcamlidl
+endif
+
+ifdef USE_CAMLP4
+ CAMLP4PATH := \
+ $(shell $(CAMLP4) -where 2>/dev/null || echo /usr/lib/camlp4)
+ INCFLAGS := -I $(CAMLP4PATH)
+ CINCFLAGS := -I$(CAMLP4PATH)
+endif
+
+DINCFLAGS := $(INCFLAGS) $(SOURCE_DIRS:%=-I %) $(OCAML_DEFAULT_DIRS:%=-I %)
+INCFLAGS := $(DINCFLAGS) $(INCDIRS:%=-I %)
+CINCFLAGS += $(SOURCE_DIRS:%=-I%) $(INCDIRS:%=-I%) $(OCAML_DEFAULT_DIRS:%=-I%)
+
+ifndef MSVC
+CLIBFLAGS += $(SOURCE_DIRS:%=-L%) $(LIBDIRS:%=-L%) \
+ $(EXTLIBDIRS:%=-L%) $(EXTLIBDIRS:%=-Wl,$(RPATH_FLAG)%) \
+ $(OCAML_DEFAULT_DIRS:%=-L%)
+endif
+
+ifndef PROFILING
+ INTF_OCAMLC := $(OCAMLC)
+else
+ ifndef THREADS
+ INTF_OCAMLC := $(OCAMLCP) -p $(OCAMLCPFLAGS)
+ else
+ # OCaml does not support profiling byte code
+ # with threads (yet), therefore we force an error.
+ ifndef REAL_OCAMLC
+ $(error Profiling of multithreaded byte code not yet supported by OCaml)
+ endif
+ INTF_OCAMLC := $(OCAMLC)
+ endif
+endif
+
+ifndef MSVC
+COMMON_LDFLAGS := $(LDFLAGS:%=-ccopt %) $(SOURCE_DIRS:%=-ccopt -L%) \
+ $(LIBDIRS:%=-ccopt -L%) $(EXTLIBDIRS:%=-ccopt -L%) \
+ $(EXTLIBDIRS:%=-ccopt -Wl,$(RPATH_FLAG)%) \
+ $(OCAML_DEFAULT_DIRS:%=-ccopt -L%)
+else
+COMMON_LDFLAGS := -ccopt "/link -NODEFAULTLIB:LIBC $(LDFLAGS:%=%) $(SOURCE_DIRS:%=-LIBPATH:%) \
+ $(LIBDIRS:%=-LIBPATH:%) $(EXTLIBDIRS:%=-LIBPATH:%) \
+ $(OCAML_DEFAULT_DIRS:%=-LIBPATH:%) "
+endif
+
+CLIBS_OPTS := $(CLIBS:%=-cclib -l%)
+ifdef MSVC
+ ifndef STATIC
+ # MSVC libraries do not have 'lib' prefix
+ CLIBS_OPTS := $(CLIBS:%=-cclib %.lib)
+ endif
+endif
+
+ifneq ($(strip $(OBJ_LINK)),)
+ ifdef CREATE_LIB
+ OBJS_LIBS := -cclib -l$(CLIB_BASE) $(CLIBS_OPTS) $(MAYBE_IDL)
+ else
+ OBJS_LIBS := $(OBJ_LINK) $(CLIBS_OPTS) $(MAYBE_IDL)
+ endif
+else
+ OBJS_LIBS := $(CLIBS_OPTS) $(MAYBE_IDL)
+endif
+
+# If we have to make byte-code
+ifndef REAL_OCAMLC
+ BYTE_OCAML := y
+
+ # EXTRADEPS is added dependencies we have to insert for all
+ # executable files we generate. Ideally it should be all of the
+ # libraries we use, but it's hard to find the ones that get searched on
+ # the path since I don't know the paths built into the compiler, so
+ # just include the ones with slashes in their names.
+ EXTRADEPS := $(addsuffix .cma,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i))))
+ SPECIAL_OCAMLFLAGS := $(OCAMLBCFLAGS)
+
+ REAL_OCAMLC := $(INTF_OCAMLC)
+
+ REAL_IMPL := $(IMPL_CMO)
+ REAL_IMPL_INTF := $(IMPLO_INTF)
+ IMPL_SUF := .cmo
+
+ DEPFLAGS :=
+ MAKE_DEPS := $(MLDEPS) $(BCDEPIS)
+
+ ifdef CREATE_LIB
+ override CFLAGS := $(PIC_CFLAGS) $(CFLAGS)
+ override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS)
+ ifndef STATIC
+ ifneq ($(strip $(OBJ_LINK)),)
+ MAKEDLL := $(DLLSONAME)
+ ALL_LDFLAGS := -dllib $(DLLSONAME)
+ endif
+ endif
+ endif
+
+ ifndef NO_CUSTOM
+ ifneq "$(strip $(OBJ_LINK) $(THREADS) $(MAYBE_IDL) $(CLIBS))" ""
+ ALL_LDFLAGS += -custom
+ endif
+ endif
+
+ ALL_LDFLAGS += $(INCFLAGS) $(OCAMLLDFLAGS) $(OCAMLBLDFLAGS) \
+ $(COMMON_LDFLAGS) $(LIBS:%=%.cma)
+ CAMLIDLDLLFLAGS :=
+
+ ifdef THREADS
+ ifdef VMTHREADS
+ THREAD_FLAG := -vmthread
+ else
+ THREAD_FLAG := -thread
+ endif
+ ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS)
+ ifndef CREATE_LIB
+ ifndef REAL_OCAMLFIND
+ ALL_LDFLAGS := unix.cma threads.cma $(ALL_LDFLAGS)
+ endif
+ endif
+ endif
+
+# we have to make native-code
+else
+ EXTRADEPS := $(addsuffix .cmxa,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i))))
+ ifndef PROFILING
+ SPECIAL_OCAMLFLAGS := $(OCAMLNCFLAGS)
+ PLDFLAGS :=
+ else
+ SPECIAL_OCAMLFLAGS := -p $(OCAMLNCFLAGS)
+ PLDFLAGS := -p
+ endif
+
+ REAL_IMPL := $(IMPL_CMX)
+ REAL_IMPL_INTF := $(IMPLX_INTF)
+ IMPL_SUF := .cmx
+
+ override CPPFLAGS := -DNATIVE_CODE $(CPPFLAGS)
+
+ DEPFLAGS := -native
+ MAKE_DEPS := $(MLDEPS) $(NCDEPIS)
+
+ ALL_LDFLAGS := $(PLDFLAGS) $(INCFLAGS) $(OCAMLLDFLAGS) \
+ $(OCAMLNLDFLAGS) $(COMMON_LDFLAGS)
+ CAMLIDLDLLFLAGS := -opt
+
+ ifndef CREATE_LIB
+ ALL_LDFLAGS += $(LIBS:%=%.cmxa)
+ else
+ override CFLAGS := $(PIC_CFLAGS) $(CFLAGS)
+ override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS)
+ endif
+
+ ifdef THREADS
+ THREAD_FLAG := -thread
+ ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS)
+ ifndef CREATE_LIB
+ ifndef REAL_OCAMLFIND
+ ALL_LDFLAGS := unix.cmxa threads.cmxa $(ALL_LDFLAGS)
+ endif
+ endif
+ endif
+endif
+
+export MAKE_DEPS
+
+ifdef ANNOTATE
+ ANNOT_FLAG := -dtypes
+else
+endif
+
+ALL_OCAMLCFLAGS := $(THREAD_FLAG) $(ANNOT_FLAG) $(OCAMLFLAGS) \
+ $(INCFLAGS) $(SPECIAL_OCAMLFLAGS)
+
+ifdef make_deps
+ -include $(MAKE_DEPS)
+ PRE_TARGETS :=
+endif
+
+###########################################################################
+# USER RULES
+
+# Call "OCamlMakefile QUIET=" to get rid of all of the @'s.
+QUIET=@
+
+# generates byte-code (default)
+byte-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes
+bc: byte-code
+
+byte-code-nolink: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes
+bcnl: byte-code-nolink
+
+top: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(TOPRESULT) \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes
+
+# generates native-code
+
+native-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ make_deps=yes
+nc: native-code
+
+native-code-nolink: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ make_deps=yes
+ncnl: native-code-nolink
+
+# generates byte-code libraries
+byte-code-library: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(BCRESULT).cma \
+ REAL_RESULT="$(BCRESULT)" \
+ CREATE_LIB=yes \
+ make_deps=yes
+bcl: byte-code-library
+
+# generates native-code libraries
+native-code-library: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(NCRESULT).cmxa \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ CREATE_LIB=yes \
+ make_deps=yes
+ncl: native-code-library
+
+ifdef WIN32
+# generates byte-code dll
+byte-code-dll: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(BCRESULT).dll \
+ REAL_RESULT="$(BCRESULT)" \
+ make_deps=yes
+bcd: byte-code-dll
+
+# generates native-code dll
+native-code-dll: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(NCRESULT).dll \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ make_deps=yes
+ncd: native-code-dll
+endif
+
+# generates byte-code with debugging information
+debug-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes \
+ OCAMLFLAGS="-g $(OCAMLFLAGS)" \
+ OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
+dc: debug-code
+
+debug-code-nolink: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes \
+ OCAMLFLAGS="-g $(OCAMLFLAGS)" \
+ OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
+dcnl: debug-code-nolink
+
+# generates byte-code libraries with debugging information
+debug-code-library: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(BCRESULT).cma \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes \
+ CREATE_LIB=yes \
+ OCAMLFLAGS="-g $(OCAMLFLAGS)" \
+ OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
+dcl: debug-code-library
+
+# generates byte-code for profiling
+profiling-byte-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \
+ REAL_RESULT="$(BCRESULT)" PROFILING="y" \
+ make_deps=yes
+pbc: profiling-byte-code
+
+# generates native-code
+
+profiling-native-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ PROFILING="y" \
+ make_deps=yes
+pnc: profiling-native-code
+
+# generates byte-code libraries
+profiling-byte-code-library: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(BCRESULT).cma \
+ REAL_RESULT="$(BCRESULT)" PROFILING="y" \
+ CREATE_LIB=yes \
+ make_deps=yes
+pbcl: profiling-byte-code-library
+
+# generates native-code libraries
+profiling-native-code-library: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(NCRESULT).cmxa \
+ REAL_RESULT="$(NCRESULT)" PROFILING="y" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ CREATE_LIB=yes \
+ make_deps=yes
+pncl: profiling-native-code-library
+
+# packs byte-code objects
+pack-byte-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT).cmo \
+ REAL_RESULT="$(BCRESULT)" \
+ PACK_LIB=yes make_deps=yes
+pabc: pack-byte-code
+
+# packs native-code objects
+pack-native-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(NCRESULT).cmx $(NCRESULT).o \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ PACK_LIB=yes make_deps=yes
+panc: pack-native-code
+
+# generates HTML-documentation
+htdoc: doc/$(RESULT)/html
+
+# generates Latex-documentation
+ladoc: doc/$(RESULT)/latex
+
+# generates PostScript-documentation
+psdoc: doc/$(RESULT)/latex/doc.ps
+
+# generates PDF-documentation
+pdfdoc: doc/$(RESULT)/latex/doc.pdf
+
+# generates all supported forms of documentation
+doc: htdoc ladoc psdoc pdfdoc
+
+###########################################################################
+# LOW LEVEL RULES
+
+$(REAL_RESULT): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) $(RESULTDEPS)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) \
+ $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \
+ $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \
+ $(REAL_IMPL)
+
+nolink: $(REAL_IMPL_INTF) $(OBJ_LINK)
+
+ifdef WIN32
+$(REAL_RESULT).dll: $(REAL_IMPL_INTF) $(OBJ_LINK)
+ $(CAMLIDLDLL) $(CAMLIDLDLLFLAGS) $(OBJ_LINK) $(CLIBS) \
+ -o $@ $(REAL_IMPL)
+endif
+
+%$(TOPSUFFIX): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS)
+ $(REAL_OCAMLFIND) $(OCAMLMKTOP) \
+ $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \
+ $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \
+ $(REAL_IMPL)
+
+.SUFFIXES: .mli .ml .cmi .cmo .cmx .cma .cmxa .$(EXT_OBJ) \
+ .mly .di .d .$(EXT_LIB) .idl %.oxridl .c .$(EXT_CXX) .h .so \
+ .rep .zog .glade
+
+ifndef STATIC
+ifdef MINGW
+$(DLLSONAME): $(OBJ_LINK)
+ $(CC) $(CFLAGS) $(CFLAGS_WIN32) $(OBJ_LINK) -shared -o $@ \
+ -Wl,--whole-archive $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/lib%.a))) \
+ $(OCAMLLIBPATH)/ocamlrun.a \
+ -Wl,--export-all-symbols \
+ -Wl,--no-whole-archive
+else
+ifdef MSVC
+$(DLLSONAME): $(OBJ_LINK)
+ link /NOLOGO /DLL /OUT:$@ $(OBJ_LINK) \
+ $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/%.lib))) \
+ $(OCAMLLIBPATH)/ocamlrun.lib
+
+else
+$(DLLSONAME): $(OBJ_LINK)
+ $(OCAMLMKLIB) $(INCFLAGS) $(CLIBFLAGS) \
+ -o $(CLIB_BASE) $(OBJ_LINK) $(CLIBS:%=-l%) \
+ $(OCAMLMKLIB_FLAGS)
+endif
+endif
+endif
+
+ifndef LIB_PACK_NAME
+$(RESULT).cma: $(REAL_IMPL_INTF) $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) \
+ $(OBJS_LIBS) -o $@ $(OCAMLBLDFLAGS) $(REAL_IMPL)
+
+$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(REAL_IMPL_INTF) $(EXTRADEPS) $(RESULTDEPS)
+ $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) \
+ $(OCAMLNLDFLAGS) -o $@ $(REAL_IMPL)
+else
+ifdef BYTE_OCAML
+$(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo: $(REAL_IMPL_INTF)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmo $(REAL_IMPL)
+else
+$(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx: $(REAL_IMPL_INTF)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmx $(REAL_IMPL)
+endif
+
+$(RESULT).cma: $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) \
+ $(OBJS_LIBS) -o $@ $(OCAMLBLDFLAGS) $(LIB_PACK_NAME).cmo
+
+$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx $(EXTRADEPS) $(RESULTDEPS)
+ $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) \
+ $(OCAMLNLDFLAGS) -o $@ $(LIB_PACK_NAME).cmx
+endif
+
+$(RES_CLIB): $(OBJ_LINK)
+ifndef MSVC
+ ifneq ($(strip $(OBJ_LINK)),)
+ $(AR) rcs $@ $(OBJ_LINK)
+ endif
+else
+ ifneq ($(strip $(OBJ_LINK)),)
+ lib -nologo -debugtype:cv -out:$(RES_CLIB) $(OBJ_LINK)
+ endif
+endif
+
+.mli.cmi: $(EXTRADEPS)
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c $(THREAD_FLAG) $(ANNOT_FLAG) \
+ $(OCAMLFLAGS) $(INCFLAGS) $<; \
+ $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c $(THREAD_FLAG) $(ANNOT_FLAG) \
+ $(OCAMLFLAGS) $(INCFLAGS) $<; \
+ else \
+ echo $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c -pp \"$$pp $(PPFLAGS)\" $(THREAD_FLAG) $(ANNOT_FLAG) \
+ $(OCAMLFLAGS) $(INCFLAGS) $<; \
+ $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c -pp "$$pp $(PPFLAGS)" $(THREAD_FLAG) $(ANNOT_FLAG) \
+ $(OCAMLFLAGS) $(INCFLAGS) $<; \
+ fi
+
+.ml.cmi .ml.$(EXT_OBJ) .ml.cmx .ml.cmo: $(EXTRADEPS)
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c $(ALL_OCAMLCFLAGS) $<; \
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c $(ALL_OCAMLCFLAGS) $<; \
+ else \
+ echo $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c -pp \"$$pp $(PPFLAGS)\" $(ALL_OCAMLCFLAGS) $<; \
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c -pp "$$pp $(PPFLAGS)" $(ALL_OCAMLCFLAGS) $<; \
+ fi
+
+ifdef PACK_LIB
+$(REAL_RESULT).cmo $(REAL_RESULT).cmx $(REAL_RESULT).o: $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack $(ALL_LDFLAGS) \
+ $(OBJS_LIBS) -o $@ $(REAL_IMPL)
+endif
+
+.PRECIOUS: %.ml
+%.ml: %.mll
+ $(OCAMLLEX) $<
+
+.PRECIOUS: %.ml %.mli
+%.ml %.mli: %.mly
+ $(OCAMLYACC) $(YFLAGS) $<
+ $(QUIET)pp=`sed -n -e 's/.*(\*pp \([^*]*\) \*).*/\1/p;q' $<`; \
+ if [ ! -z "$$pp" ]; then \
+ mv $*.ml $*.ml.temporary; \
+ echo "(*pp $$pp $(PPFLAGS)*)" > $*.ml; \
+ cat $*.ml.temporary >> $*.ml; \
+ rm $*.ml.temporary; \
+ mv $*.mli $*.mli.temporary; \
+ echo "(*pp $$pp $(PPFLAGS)*)" > $*.mli; \
+ cat $*.mli.temporary >> $*.mli; \
+ rm $*.mli.temporary; \
+ fi
+
+
+.PRECIOUS: %.ml
+%.ml: %.rep
+ $(CAMELEON_REPORT) $(CAMELEON_REPORT_FLAGS) -gen $<
+
+.PRECIOUS: %.ml
+%.ml: %.zog
+ $(CAMELEON_ZOGGY) $(CAMELEON_ZOGGY_FLAGS) -impl $< > $@
+
+.PRECIOUS: %.ml
+%.ml: %.glade
+ $(OCAML_GLADECC) $(OCAML_GLADECC_FLAGS) $< > $@
+
+.PRECIOUS: %.ml %.mli
+%.ml %.mli: %.oxridl
+ $(OXRIDL) $<
+
+.PRECIOUS: %.ml %.mli %_stubs.c %.h
+%.ml %.mli %_stubs.c %.h: %.idl
+ $(CAMLIDL) $(MAYBE_IDL_HEADER) $(IDLFLAGS) \
+ $(CAMLIDLFLAGS) $<
+ $(QUIET)if [ $(NOIDLHEADER) ]; then touch $*.h; fi
+
+.c.$(EXT_OBJ):
+ $(OCAMLC) -c -cc "$(CC)" -ccopt "$(CFLAGS) \
+ $(CPPFLAGS) $(CPPFLAGS_WIN32) \
+ $(CFLAGS_WIN32) $(CINCFLAGS) $(CFLAG_O)$@ " $<
+
+.$(EXT_CXX).$(EXT_OBJ):
+ $(CXX) -c $(CXXFLAGS) $(CINCFLAGS) $(CPPFLAGS) \
+ -I'$(OCAMLLIBPATH)' \
+ $< $(CFLAG_O)$@
+
+$(MLDEPDIR)/%.d: %.ml
+ $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
+ $(DINCFLAGS) $< \> $@; \
+ $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
+ $(DINCFLAGS) $< > $@; \
+ else \
+ echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
+ -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \
+ $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
+ -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \
+ fi
+
+$(BCDIDIR)/%.di $(NCDIDIR)/%.di: %.mli
+ $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< \> $@; \
+ $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< > $@; \
+ else \
+ echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \
+ -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \
+ $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \
+ -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \
+ fi
+
+doc/$(RESULT)/html: $(DOC_FILES)
+ #rm -rf $@
+ #mkdir -p $@
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(OCAMLDOC) -html -d $@ $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \
+ $(OCAMLDOC) -html -d $@ $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \
+ else \
+ echo $(OCAMLDOC) -pp \"$$pp $(PPFLAGS)\" -html -d $@ $(OCAMLDOCFLAGS) \
+ $(INCFLAGS) $(DOC_FILES); \
+ $(OCAMLDOC) -pp "$$pp $(PPFLAGS)" -html -d $@ $(OCAMLDOCFLAGS) \
+ $(INCFLAGS) $(DOC_FILES); \
+ fi
+
+doc/$(RESULT)/latex: $(DOC_FILES)
+ #rm -rf $@
+ #mkdir -p $@
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(OCAMLDOC) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) \
+ $(DOC_FILES) -o $@/doc.tex; \
+ $(OCAMLDOC) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES) \
+ -o $@/doc.tex; \
+ else \
+ echo $(OCAMLDOC) -pp \"$$pp $(PPFLAGS)\" -latex $(OCAMLDOCFLAGS) \
+ $(INCFLAGS) $(DOC_FILES) -o $@/doc.tex; \
+ $(OCAMLDOC) -pp "$$pp $(PPFLAGS)" -latex $(OCAMLDOCFLAGS) \
+ $(INCFLAGS) $(DOC_FILES) -o $@/doc.tex; \
+ fi
+
+doc/$(RESULT)/latex/doc.ps: doc/$(RESULT)/latex
+ cd doc/$(RESULT)/latex && \
+ $(LATEX) doc.tex && \
+ $(LATEX) doc.tex && \
+ $(DVIPS) $(DVIPSFLAGS) doc.dvi -o $(@F)
+
+doc/$(RESULT)/latex/doc.pdf: doc/$(RESULT)/latex/doc.ps
+ cd doc/$(RESULT)/latex && $(PS2PDF) $(<F)
+
+define make_subproj
+.PHONY:
+subproj_$(1):
+ $$(eval $$(call PROJ_$(1)))
+ $(QUIET)if [ "$(SUBTARGET)" != "all" ]; then \
+ $(MAKE) -f $(OCAMLMAKEFILE) $(SUBTARGET); \
+ fi
+endef
+
+$(foreach subproj,$(SUBPROJS),$(eval $(call make_subproj,$(subproj))))
+
+.PHONY:
+subprojs: $(SUBPROJS:%=subproj_%)
+
+###########################################################################
+# (UN)INSTALL RULES FOR LIBRARIES
+
+.PHONY: libinstall
+libinstall: all
+ $(QUIET)printf "\nInstalling library with ocamlfind\n"
+ $(OCAMLFIND) install $(OCAMLFIND_INSTFLAGS) $(RESULT) META $(LIBINSTALL_FILES)
+ $(QUIET)printf "\nInstallation successful.\n"
+
+.PHONY: libuninstall
+libuninstall:
+ $(QUIET)printf "\nUninstalling library with ocamlfind\n"
+ $(OCAMLFIND) remove $(OCAMLFIND_INSTFLAGS) $(RESULT)
+ $(QUIET)printf "\nUninstallation successful.\n"
+
+.PHONY: rawinstall
+rawinstall: all
+ $(QUIET)printf "\nInstalling library to: $(OCAML_LIB_INSTALL)\n"
+ -install -d $(OCAML_LIB_INSTALL)
+ for i in $(LIBINSTALL_FILES); do \
+ if [ -f $$i ]; then \
+ install -c -m 0644 $$i $(OCAML_LIB_INSTALL); \
+ fi; \
+ done
+ $(QUIET)printf "\nInstallation successful.\n"
+
+.PHONY: rawuninstall
+rawuninstall:
+ $(QUIET)printf "\nUninstalling library from: $(OCAML_LIB_INSTALL)\n"
+ cd $(OCAML_LIB_INSTALL) && rm $(notdir $(LIBINSTALL_FILES))
+ $(QUIET)printf "\nUninstallation successful.\n"
+
+###########################################################################
+# MAINTAINANCE RULES
+
+.PHONY: clean
+clean::
+ rm -f $(TARGETS) $(TRASH)
+ rm -rf $(BCDIDIR) $(NCDIDIR) $(MLDEPDIR)
+
+.PHONY: cleanup
+cleanup::
+ rm -f $(NONEXECS) $(TRASH)
+ rm -rf $(BCDIDIR) $(NCDIDIR) $(MLDEPDIR)
+
+.PHONY: clean-doc
+clean-doc::
+ rm -rf doc
+
+.PHONY: nobackup
+nobackup:
+ rm -f *.bak *~ *.dup
diff --git a/examples/genclient/genclient.ml b/examples/genclient/genclient.ml
new file mode 100644
index 0000000..388335e
--- /dev/null
+++ b/examples/genclient/genclient.ml
@@ -0,0 +1,266 @@
+(*
+ * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet
+ * Copyright (C) 2007-2008 Dave Benjamin (dave@ramenlabs.com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *)
+
+open Printf
+
+module StringMap = Map.Make(String)
+
+let url = ref ""
+
+let use_int32 = ref false
+let use_multicall = ref false
+let verbose = ref false
+
+let variant_name = function
+ | `String "array" -> Some "`Array"
+ | `String "base64" -> Some "`Binary"
+ | `String "boolean" -> Some "`Boolean"
+ | `String "dateTime.iso8601" -> Some "`DateTime"
+ | `String "double" -> Some "`Double"
+ | `String "int" -> Some (if !use_int32 then "`Int32" else "`Int")
+ | `String "string" -> Some "`String"
+ | `String "struct" -> Some "`Struct"
+ | `String "undefined" -> None
+ | _ as it -> failwith (XmlRpc.dump it)
+
+let dot_to_underscore s =
+ let s = String.copy s in
+ let len = String.length s in
+ for i = 0 to len - 1 do
+ match s.[i] with
+ | '.' -> s.[i] <- '_'
+ | _ -> ()
+ done;
+ s
+
+let () =
+ let specs =
+ ["-i", Arg.Set use_int32, "Use int32 for all integers";
+ "-m", Arg.Set use_multicall, "Generate lazy interface using multicall";
+ "-v", Arg.Set verbose, "Display verbose debugging output"] in
+ let usage = (sprintf "Usage: %s [-i] [-m] [-v] url" Sys.argv.(0)) in
+ Arg.parse specs (fun url' -> url := url') usage;
+ if !url = "" then (Arg.usage specs usage; exit 2)
+
+let rpc = new XmlRpc.client ~debug:!verbose !url
+
+let methods = rpc#call "system.listMethods" []
+
+let mc = new XmlRpc.multicall rpc
+let signatures =
+ match methods with
+ | `Array methods ->
+ List.map
+ (function
+ | `String meth ->
+ (meth, mc#call "system.methodSignature" [`String meth])
+ | _ -> failwith "got non-string for method name")
+ methods
+ | _ -> failwith "got non-array from system.listMethods"
+
+let module_map =
+ List.fold_left
+ (fun acc (name, signature) ->
+ let dot_index = String.index name '.' in
+ let module_name = String.sub name 0 dot_index in
+ let meth_name =
+ String.sub name
+ (dot_index + 1)
+ (String.length name - dot_index - 1) in
+ let acc =
+ if StringMap.mem module_name acc
+ then acc
+ else StringMap.add module_name [] acc in
+ try
+ match Lazy.force signature with
+ | `Array param_lists ->
+ StringMap.add
+ module_name
+ ((meth_name, Some param_lists) :: StringMap.find module_name acc)
+ acc
+ | _ ->
+ StringMap.add
+ module_name
+ ((meth_name, None) :: StringMap.find module_name acc)
+ acc
+ with
+ | XmlRpc.Error _ ->
+ StringMap.add
+ module_name
+ ((meth_name, None) :: StringMap.find module_name acc)
+ acc
+ | Xml.Error (msg, pos) ->
+ prerr_endline (Xml.error_msg msg);
+ acc)
+ StringMap.empty
+ signatures
+
+let values map =
+ let result = ref [] in
+ StringMap.iter (fun _ v -> result := v :: !result) map;
+ List.rev !result
+
+let impl_with_signature module_name func_name name =
+ function
+ | `Array params ->
+ let result = List.hd params in
+ let params = Array.of_list (List.tl params) in
+ let param_names =
+ String.concat " "
+ (Array.to_list
+ (Array.mapi
+ (fun i _ ->
+ sprintf "_%d" i)
+ params)) in
+ let param_values =
+ String.concat "; "
+ (Array.to_list
+ (Array.mapi
+ (fun i param ->
+ match variant_name param with
+ | Some n ->
+ sprintf "%s _%d" n i
+ | None ->
+ sprintf "_%d" i)
+ params)) in
+ let mc_init =
+ if !use_multicall
+ then "if mc#executed then mc <- new XmlRpc.multicall rpc;\n "
+ else "" in
+ let rpc_call = if !use_multicall then "mc#call" else "rpc#call" in
+ let begin_lazy_force, lazy_force, end_lazy_force =
+ if !use_multicall
+ then "lazy (", "Lazy.force ", ")"
+ else "", "", "" in
+ (match variant_name result with
+ | Some result_type ->
+ sprintf " method %s %s =
+ %slet result = %s \"%s.%s\" [%s] in
+ %smatch %sresult with
+ | %s r -> r
+ | other -> raise (Type_error (XmlRpc.dump other))%s"
+ func_name
+ (if param_names = "" then "()" else param_names)
+ mc_init
+ rpc_call
+ module_name
+ name
+ param_values
+ begin_lazy_force
+ lazy_force
+ (if result_type = "`Int32"
+ then "`Int r -> Int32.of_int r | `Int32"
+ else result_type)
+ end_lazy_force
+ | None ->
+ sprintf " method %s %s =
+ %s%s \"%s.%s\" [%s]"
+ func_name
+ (if param_names = "" then "()" else param_names)
+ mc_init
+ rpc_call
+ module_name
+ name
+ param_values)
+ | _ -> failwith "method signature was not an array"
+
+let impl_without_signature module_name func_name name =
+ let mc_init =
+ if !use_multicall
+ then "if mc#executed then mc <- new XmlRpc.multicall rpc;\n "
+ else "" in
+ let rpc_call = if !use_multicall then "mc#call" else "rpc#call" in
+ sprintf " method %s params =
+ %s%s \"%s.%s\" params"
+ func_name
+ mc_init
+ rpc_call
+ module_name
+ name
+
+let impls module_name meths =
+ let seen_names = Hashtbl.create 0 in
+ let make_func_name name =
+ let base_name = dot_to_underscore name in
+ let func_name = ref base_name in
+ let counter = ref 1 in
+ while Hashtbl.mem seen_names !func_name do
+ incr counter;
+ func_name := base_name ^ (string_of_int !counter)
+ done;
+ Hashtbl.replace seen_names !func_name 0;
+ !func_name in
+ String.concat "\n\n"
+ (List.flatten
+ (List.map
+ (function
+ | (name, Some param_lists) ->
+ List.map
+ (fun signature ->
+ impl_with_signature
+ module_name
+ (make_func_name name)
+ name
+ signature)
+ param_lists
+ | (name, None) ->
+ [impl_without_signature
+ module_name
+ (make_func_name name)
+ name])
+ meths))
+
+let objects =
+ String.concat "\n"
+ (values
+ (StringMap.mapi
+ (fun module_name meths ->
+ sprintf " method %s = object
+%s
+ end
+"
+ module_name
+ (impls module_name meths))
+ module_map))
+
+let multicall =
+ if !use_multicall
+ then "
+ val mutable mc = new XmlRpc.multicall rpc
+ method mc = mc
+"
+ else ""
+
+let () =
+ printf "(* Automatically generated from an XML-RPC server
+ by running the following command:
+
+ %s
+*)
+
+exception Type_error of string
+
+class client url =
+ let rpc = new XmlRpc.client url in
+object (self)
+ method rpc = rpc
+%s
+%s
+end
+" (String.concat " " (Array.to_list Sys.argv)) multicall objects
diff --git a/examples/ubigraph/Makefile b/examples/ubigraph/Makefile
new file mode 100644
index 0000000..fd29771
--- /dev/null
+++ b/examples/ubigraph/Makefile
@@ -0,0 +1,7 @@
+OCAMLMAKEFILE = OCamlMakefile
+
+RESULT = test
+SOURCES = Ubigraph.mli Ubigraph.ml test.ml
+PACKS = xmlrpc-light
+
+include $(OCAMLMAKEFILE)
diff --git a/examples/ubigraph/OCamlMakefile b/examples/ubigraph/OCamlMakefile
new file mode 100644
index 0000000..9adb295
--- /dev/null
+++ b/examples/ubigraph/OCamlMakefile
@@ -0,0 +1,1154 @@
+###########################################################################
+# OCamlMakefile
+# Copyright (C) 1999-2004 Markus Mottl
+#
+# For updates see:
+# http://www.ocaml.info/home/ocaml_sources.html
+#
+# $Id: OCamlMakefile,v 1.72 2005/12/09 15:30:50 mottl Exp $
+#
+###########################################################################
+
+# Modified by damien for .glade.ml compilation
+
+# Set these variables to the names of the sources to be processed and
+# the result variable. Order matters during linkage!
+
+ifndef SOURCES
+ SOURCES := foo.ml
+endif
+export SOURCES
+
+ifndef RES_CLIB_SUF
+ RES_CLIB_SUF := _stubs
+endif
+export RES_CLIB_SUF
+
+ifndef RESULT
+ RESULT := foo
+endif
+export RESULT
+
+export LIB_PACK_NAME
+
+ifndef DOC_FILES
+ DOC_FILES := $(filter %.mli, $(SOURCES))
+endif
+export DOC_FILES
+
+export BCSUFFIX
+export NCSUFFIX
+
+ifndef TOPSUFFIX
+ TOPSUFFIX := .top
+endif
+export TOPSUFFIX
+
+# Eventually set include- and library-paths, libraries to link,
+# additional compilation-, link- and ocamlyacc-flags
+# Path- and library information needs not be written with "-I" and such...
+# Define THREADS if you need it, otherwise leave it unset (same for
+# USE_CAMLP4)!
+
+export THREADS
+export VMTHREADS
+export ANNOTATE
+export USE_CAMLP4
+
+export INCDIRS
+export LIBDIRS
+export EXTLIBDIRS
+export RESULTDEPS
+export OCAML_DEFAULT_DIRS
+
+export LIBS
+export CLIBS
+
+export OCAMLFLAGS
+export OCAMLNCFLAGS
+export OCAMLBCFLAGS
+
+export OCAMLLDFLAGS
+export OCAMLNLDFLAGS
+export OCAMLBLDFLAGS
+
+ifndef OCAMLCPFLAGS
+ OCAMLCPFLAGS := a
+endif
+
+export OCAMLCPFLAGS
+
+export PPFLAGS
+
+export YFLAGS
+export IDLFLAGS
+
+export OCAMLDOCFLAGS
+
+export OCAMLFIND_INSTFLAGS
+
+export DVIPSFLAGS
+
+export STATIC
+
+# Add a list of optional trash files that should be deleted by "make clean"
+export TRASH
+
+#################### variables depending on your OCaml-installation
+
+ifdef MINGW
+ export MINGW
+ WIN32 := 1
+ CFLAGS_WIN32 := -mno-cygwin
+endif
+ifdef MSVC
+ export MSVC
+ WIN32 := 1
+ ifndef STATIC
+ CPPFLAGS_WIN32 := -DCAML_DLL
+ endif
+ CFLAGS_WIN32 += -nologo
+ EXT_OBJ := obj
+ EXT_LIB := lib
+ ifeq ($(CC),gcc)
+ # work around GNU Make default value
+ ifdef THREADS
+ CC := cl -MT
+ else
+ CC := cl
+ endif
+ endif
+ ifeq ($(CXX),g++)
+ # work around GNU Make default value
+ CXX := $(CC)
+ endif
+ CFLAG_O := -Fo
+endif
+ifdef WIN32
+ EXT_CXX := cpp
+ EXE := .exe
+endif
+
+ifndef EXT_OBJ
+ EXT_OBJ := o
+endif
+ifndef EXT_LIB
+ EXT_LIB := a
+endif
+ifndef EXT_CXX
+ EXT_CXX := cc
+endif
+ifndef EXE
+ EXE := # empty
+endif
+ifndef CFLAG_O
+ CFLAG_O := -o # do not delete this comment (preserves trailing whitespace)!
+endif
+
+export CC
+export CXX
+export CFLAGS
+export CXXFLAGS
+export LDFLAGS
+export CPPFLAGS
+
+ifndef RPATH_FLAG
+ RPATH_FLAG := -R
+endif
+export RPATH_FLAG
+
+ifndef MSVC
+ifndef PIC_CFLAGS
+ PIC_CFLAGS := -fPIC
+endif
+ifndef PIC_CPPFLAGS
+ PIC_CPPFLAGS := -DPIC
+endif
+endif
+
+export PIC_CFLAGS
+export PIC_CPPFLAGS
+
+BCRESULT := $(addsuffix $(BCSUFFIX), $(RESULT))
+NCRESULT := $(addsuffix $(NCSUFFIX), $(RESULT))
+TOPRESULT := $(addsuffix $(TOPSUFFIX), $(RESULT))
+
+ifndef OCAMLFIND
+ OCAMLFIND := ocamlfind
+endif
+export OCAMLFIND
+
+ifndef OCAMLC
+ OCAMLC := ocamlc
+endif
+export OCAMLC
+
+ifndef OCAMLOPT
+ OCAMLOPT := ocamlopt
+endif
+export OCAMLOPT
+
+ifndef OCAMLMKTOP
+ OCAMLMKTOP := ocamlmktop
+endif
+export OCAMLMKTOP
+
+ifndef OCAMLCP
+ OCAMLCP := ocamlcp
+endif
+export OCAMLCP
+
+ifndef OCAMLDEP
+ OCAMLDEP := ocamldep
+endif
+export OCAMLDEP
+
+ifndef OCAMLLEX
+ OCAMLLEX := ocamllex
+endif
+export OCAMLLEX
+
+ifndef OCAMLYACC
+ OCAMLYACC := ocamlyacc
+endif
+export OCAMLYACC
+
+ifndef OCAMLMKLIB
+ OCAMLMKLIB := ocamlmklib
+endif
+export OCAMLMKLIB
+
+ifndef OCAML_GLADECC
+ OCAML_GLADECC := lablgladecc2
+endif
+export OCAML_GLADECC
+
+ifndef OCAML_GLADECC_FLAGS
+ OCAML_GLADECC_FLAGS :=
+endif
+export OCAML_GLADECC_FLAGS
+
+ifndef CAMELEON_REPORT
+ CAMELEON_REPORT := report
+endif
+export CAMELEON_REPORT
+
+ifndef CAMELEON_REPORT_FLAGS
+ CAMELEON_REPORT_FLAGS :=
+endif
+export CAMELEON_REPORT_FLAGS
+
+ifndef CAMELEON_ZOGGY
+ CAMELEON_ZOGGY := camlp4o pa_zog.cma pr_o.cmo
+endif
+export CAMELEON_ZOGGY
+
+ifndef CAMELEON_ZOGGY_FLAGS
+ CAMELEON_ZOGGY_FLAGS :=
+endif
+export CAMELEON_ZOGGY_FLAGS
+
+ifndef OXRIDL
+ OXRIDL := oxridl
+endif
+export OXRIDL
+
+ifndef CAMLIDL
+ CAMLIDL := camlidl
+endif
+export CAMLIDL
+
+ifndef CAMLIDLDLL
+ CAMLIDLDLL := camlidldll
+endif
+export CAMLIDLDLL
+
+ifndef NOIDLHEADER
+ MAYBE_IDL_HEADER := -header
+endif
+export NOIDLHEADER
+
+export NO_CUSTOM
+
+ifndef CAMLP4
+ CAMLP4 := camlp4
+endif
+export CAMLP4
+
+ifndef REAL_OCAMLFIND
+ ifdef PACKS
+ ifndef CREATE_LIB
+ ifdef THREADS
+ PACKS += threads
+ endif
+ endif
+ empty :=
+ space := $(empty) $(empty)
+ comma := ,
+ ifdef PREDS
+ PRE_OCAML_FIND_PREDICATES := $(subst $(space),$(comma),$(PREDS))
+ PRE_OCAML_FIND_PACKAGES := $(subst $(space),$(comma),$(PACKS))
+ OCAML_FIND_PREDICATES := -predicates $(PRE_OCAML_FIND_PREDICATES)
+ # OCAML_DEP_PREDICATES := -syntax $(PRE_OCAML_FIND_PREDICATES)
+ OCAML_FIND_PACKAGES := $(OCAML_FIND_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES)
+ OCAML_DEP_PACKAGES := $(OCAML_DEP_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES)
+ else
+ OCAML_FIND_PACKAGES := -package $(subst $(space),$(comma),$(PACKS))
+ OCAML_DEP_PACKAGES :=
+ endif
+ OCAML_FIND_LINKPKG := -linkpkg
+ REAL_OCAMLFIND := $(OCAMLFIND)
+ endif
+endif
+
+export OCAML_FIND_PACKAGES
+export OCAML_DEP_PACKAGES
+export OCAML_FIND_LINKPKG
+export REAL_OCAMLFIND
+
+ifndef OCAMLDOC
+ OCAMLDOC := ocamldoc
+endif
+export OCAMLDOC
+
+ifndef LATEX
+ LATEX := latex
+endif
+export LATEX
+
+ifndef DVIPS
+ DVIPS := dvips
+endif
+export DVIPS
+
+ifndef PS2PDF
+ PS2PDF := ps2pdf
+endif
+export PS2PDF
+
+ifndef OCAMLMAKEFILE
+ OCAMLMAKEFILE := OCamlMakefile
+endif
+export OCAMLMAKEFILE
+
+ifndef OCAMLLIBPATH
+ OCAMLLIBPATH := \
+ $(shell $(OCAMLC) 2>/dev/null -where || echo /usr/lib/ocaml)
+endif
+export OCAMLLIBPATH
+
+ifndef OCAML_LIB_INSTALL
+ OCAML_LIB_INSTALL := $(OCAMLLIBPATH)/contrib
+endif
+export OCAML_LIB_INSTALL
+
+###########################################################################
+
+#################### change following sections only if
+#################### you know what you are doing!
+
+# delete target files when a build command fails
+.PHONY: .DELETE_ON_ERROR
+.DELETE_ON_ERROR:
+
+# for pedants using "--warn-undefined-variables"
+export MAYBE_IDL
+export REAL_RESULT
+export CAMLIDLFLAGS
+export THREAD_FLAG
+export RES_CLIB
+export MAKEDLL
+export ANNOT_FLAG
+export C_OXRIDL
+export SUBPROJS
+export CFLAGS_WIN32
+export CPPFLAGS_WIN32
+
+INCFLAGS :=
+
+SHELL := /bin/sh
+
+MLDEPDIR := ._d
+BCDIDIR := ._bcdi
+NCDIDIR := ._ncdi
+
+FILTER_EXTNS := %.mli %.ml %.mll %.mly %.idl %.oxridl %.c %.$(EXT_CXX) %.rep %.zog %.glade
+
+FILTERED := $(filter $(FILTER_EXTNS), $(SOURCES))
+SOURCE_DIRS := $(filter-out ./, $(sort $(dir $(FILTERED))))
+
+FILTERED_REP := $(filter %.rep, $(FILTERED))
+DEP_REP := $(FILTERED_REP:%.rep=$(MLDEPDIR)/%.d)
+AUTO_REP := $(FILTERED_REP:.rep=.ml)
+
+FILTERED_ZOG := $(filter %.zog, $(FILTERED))
+DEP_ZOG := $(FILTERED_ZOG:%.zog=$(MLDEPDIR)/%.d)
+AUTO_ZOG := $(FILTERED_ZOG:.zog=.ml)
+
+FILTERED_GLADE := $(filter %.glade, $(FILTERED))
+DEP_GLADE := $(FILTERED_GLADE:%.glade=$(MLDEPDIR)/%.d)
+AUTO_GLADE := $(FILTERED_GLADE:.glade=.ml)
+
+FILTERED_ML := $(filter %.ml, $(FILTERED))
+DEP_ML := $(FILTERED_ML:%.ml=$(MLDEPDIR)/%.d)
+
+FILTERED_MLI := $(filter %.mli, $(FILTERED))
+DEP_MLI := $(FILTERED_MLI:.mli=.di)
+
+FILTERED_MLL := $(filter %.mll, $(FILTERED))
+DEP_MLL := $(FILTERED_MLL:%.mll=$(MLDEPDIR)/%.d)
+AUTO_MLL := $(FILTERED_MLL:.mll=.ml)
+
+FILTERED_MLY := $(filter %.mly, $(FILTERED))
+DEP_MLY := $(FILTERED_MLY:%.mly=$(MLDEPDIR)/%.d) $(FILTERED_MLY:.mly=.di)
+AUTO_MLY := $(FILTERED_MLY:.mly=.mli) $(FILTERED_MLY:.mly=.ml)
+
+FILTERED_IDL := $(filter %.idl, $(FILTERED))
+DEP_IDL := $(FILTERED_IDL:%.idl=$(MLDEPDIR)/%.d) $(FILTERED_IDL:.idl=.di)
+C_IDL := $(FILTERED_IDL:%.idl=%_stubs.c)
+ifndef NOIDLHEADER
+ C_IDL += $(FILTERED_IDL:.idl=.h)
+endif
+OBJ_C_IDL := $(FILTERED_IDL:%.idl=%_stubs.$(EXT_OBJ))
+AUTO_IDL := $(FILTERED_IDL:.idl=.mli) $(FILTERED_IDL:.idl=.ml) $(C_IDL)
+
+FILTERED_OXRIDL := $(filter %.oxridl, $(FILTERED))
+DEP_OXRIDL := $(FILTERED_OXRIDL:%.oxridl=$(MLDEPDIR)/%.d) $(FILTERED_OXRIDL:.oxridl=.di)
+AUTO_OXRIDL := $(FILTERED_OXRIDL:.oxridl=.mli) $(FILTERED_OXRIDL:.oxridl=.ml) $(C_OXRIDL)
+
+FILTERED_C_CXX := $(filter %.c %.$(EXT_CXX), $(FILTERED))
+OBJ_C_CXX := $(FILTERED_C_CXX:.c=.$(EXT_OBJ))
+OBJ_C_CXX := $(OBJ_C_CXX:.$(EXT_CXX)=.$(EXT_OBJ))
+
+PRE_TARGETS += $(AUTO_MLL) $(AUTO_MLY) $(AUTO_IDL) $(AUTO_OXRIDL) $(AUTO_ZOG) $(AUTO_REP) $(AUTO_GLADE)
+
+ALL_DEPS := $(DEP_ML) $(DEP_MLI) $(DEP_MLL) $(DEP_MLY) $(DEP_IDL) $(DEP_OXRIDL) $(DEP_ZOG) $(DEP_REP) $(DEP_GLADE)
+
+MLDEPS := $(filter %.d, $(ALL_DEPS))
+MLIDEPS := $(filter %.di, $(ALL_DEPS))
+BCDEPIS := $(MLIDEPS:%.di=$(BCDIDIR)/%.di)
+NCDEPIS := $(MLIDEPS:%.di=$(NCDIDIR)/%.di)
+
+ALLML := $(filter %.mli %.ml %.mll %.mly %.idl %.oxridl %.rep %.zog %.glade, $(FILTERED))
+
+IMPLO_INTF := $(ALLML:%.mli=%.mli.__)
+IMPLO_INTF := $(foreach file, $(IMPLO_INTF), \
+ $(basename $(file)).cmi $(basename $(file)).cmo)
+IMPLO_INTF := $(filter-out %.mli.cmo, $(IMPLO_INTF))
+IMPLO_INTF := $(IMPLO_INTF:%.mli.cmi=%.cmi)
+
+IMPLX_INTF := $(IMPLO_INTF:.cmo=.cmx)
+
+INTF := $(filter %.cmi, $(IMPLO_INTF))
+IMPL_CMO := $(filter %.cmo, $(IMPLO_INTF))
+IMPL_CMX := $(IMPL_CMO:.cmo=.cmx)
+IMPL_ASM := $(IMPL_CMO:.cmo=.asm)
+IMPL_S := $(IMPL_CMO:.cmo=.s)
+
+OBJ_LINK := $(OBJ_C_IDL) $(OBJ_C_CXX)
+OBJ_FILES := $(IMPL_CMO:.cmo=.$(EXT_OBJ)) $(OBJ_LINK)
+
+EXECS := $(addsuffix $(EXE), \
+ $(sort $(TOPRESULT) $(BCRESULT) $(NCRESULT)))
+ifdef WIN32
+ EXECS += $(BCRESULT).dll $(NCRESULT).dll
+endif
+
+CLIB_BASE := $(RESULT)$(RES_CLIB_SUF)
+ifneq ($(strip $(OBJ_LINK)),)
+ RES_CLIB := lib$(CLIB_BASE).$(EXT_LIB)
+endif
+
+ifdef WIN32
+DLLSONAME := $(CLIB_BASE).dll
+else
+DLLSONAME := dll$(CLIB_BASE).so
+endif
+
+NONEXECS := $(INTF) $(IMPL_CMO) $(IMPL_CMX) $(IMPL_ASM) $(IMPL_S) \
+ $(OBJ_FILES) $(PRE_TARGETS) $(BCRESULT).cma $(NCRESULT).cmxa \
+ $(NCRESULT).$(EXT_LIB) $(BCRESULT).cmi $(BCRESULT).cmo \
+ $(NCRESULT).cmi $(NCRESULT).cmx $(NCRESULT).o \
+ $(RES_CLIB) $(IMPL_CMO:.cmo=.annot) \
+ $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(LIB_PACK_NAME).cmx $(LIB_PACK_NAME).o
+
+ifndef STATIC
+ NONEXECS += $(DLLSONAME)
+endif
+
+ifndef LIBINSTALL_FILES
+ LIBINSTALL_FILES := $(RESULT).mli $(RESULT).cmi $(RESULT).cma \
+ $(RESULT).cmxa $(RESULT).$(EXT_LIB) $(RES_CLIB)
+ ifndef STATIC
+ ifneq ($(strip $(OBJ_LINK)),)
+ LIBINSTALL_FILES += $(DLLSONAME)
+ endif
+ endif
+endif
+
+export LIBINSTALL_FILES
+
+ifdef WIN32
+ # some extra stuff is created while linking DLLs
+ NONEXECS += $(BCRESULT).$(EXT_LIB) $(BCRESULT).exp $(NCRESULT).exp $(CLIB_BASE).exp $(CLIB_BASE).lib
+endif
+
+TARGETS := $(EXECS) $(NONEXECS)
+
+# If there are IDL-files
+ifneq ($(strip $(FILTERED_IDL)),)
+ MAYBE_IDL := -cclib -lcamlidl
+endif
+
+ifdef USE_CAMLP4
+ CAMLP4PATH := \
+ $(shell $(CAMLP4) -where 2>/dev/null || echo /usr/lib/camlp4)
+ INCFLAGS := -I $(CAMLP4PATH)
+ CINCFLAGS := -I$(CAMLP4PATH)
+endif
+
+DINCFLAGS := $(INCFLAGS) $(SOURCE_DIRS:%=-I %) $(OCAML_DEFAULT_DIRS:%=-I %)
+INCFLAGS := $(DINCFLAGS) $(INCDIRS:%=-I %)
+CINCFLAGS += $(SOURCE_DIRS:%=-I%) $(INCDIRS:%=-I%) $(OCAML_DEFAULT_DIRS:%=-I%)
+
+ifndef MSVC
+CLIBFLAGS += $(SOURCE_DIRS:%=-L%) $(LIBDIRS:%=-L%) \
+ $(EXTLIBDIRS:%=-L%) $(EXTLIBDIRS:%=-Wl,$(RPATH_FLAG)%) \
+ $(OCAML_DEFAULT_DIRS:%=-L%)
+endif
+
+ifndef PROFILING
+ INTF_OCAMLC := $(OCAMLC)
+else
+ ifndef THREADS
+ INTF_OCAMLC := $(OCAMLCP) -p $(OCAMLCPFLAGS)
+ else
+ # OCaml does not support profiling byte code
+ # with threads (yet), therefore we force an error.
+ ifndef REAL_OCAMLC
+ $(error Profiling of multithreaded byte code not yet supported by OCaml)
+ endif
+ INTF_OCAMLC := $(OCAMLC)
+ endif
+endif
+
+ifndef MSVC
+COMMON_LDFLAGS := $(LDFLAGS:%=-ccopt %) $(SOURCE_DIRS:%=-ccopt -L%) \
+ $(LIBDIRS:%=-ccopt -L%) $(EXTLIBDIRS:%=-ccopt -L%) \
+ $(EXTLIBDIRS:%=-ccopt -Wl,$(RPATH_FLAG)%) \
+ $(OCAML_DEFAULT_DIRS:%=-ccopt -L%)
+else
+COMMON_LDFLAGS := -ccopt "/link -NODEFAULTLIB:LIBC $(LDFLAGS:%=%) $(SOURCE_DIRS:%=-LIBPATH:%) \
+ $(LIBDIRS:%=-LIBPATH:%) $(EXTLIBDIRS:%=-LIBPATH:%) \
+ $(OCAML_DEFAULT_DIRS:%=-LIBPATH:%) "
+endif
+
+CLIBS_OPTS := $(CLIBS:%=-cclib -l%)
+ifdef MSVC
+ ifndef STATIC
+ # MSVC libraries do not have 'lib' prefix
+ CLIBS_OPTS := $(CLIBS:%=-cclib %.lib)
+ endif
+endif
+
+ifneq ($(strip $(OBJ_LINK)),)
+ ifdef CREATE_LIB
+ OBJS_LIBS := -cclib -l$(CLIB_BASE) $(CLIBS_OPTS) $(MAYBE_IDL)
+ else
+ OBJS_LIBS := $(OBJ_LINK) $(CLIBS_OPTS) $(MAYBE_IDL)
+ endif
+else
+ OBJS_LIBS := $(CLIBS_OPTS) $(MAYBE_IDL)
+endif
+
+# If we have to make byte-code
+ifndef REAL_OCAMLC
+ BYTE_OCAML := y
+
+ # EXTRADEPS is added dependencies we have to insert for all
+ # executable files we generate. Ideally it should be all of the
+ # libraries we use, but it's hard to find the ones that get searched on
+ # the path since I don't know the paths built into the compiler, so
+ # just include the ones with slashes in their names.
+ EXTRADEPS := $(addsuffix .cma,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i))))
+ SPECIAL_OCAMLFLAGS := $(OCAMLBCFLAGS)
+
+ REAL_OCAMLC := $(INTF_OCAMLC)
+
+ REAL_IMPL := $(IMPL_CMO)
+ REAL_IMPL_INTF := $(IMPLO_INTF)
+ IMPL_SUF := .cmo
+
+ DEPFLAGS :=
+ MAKE_DEPS := $(MLDEPS) $(BCDEPIS)
+
+ ifdef CREATE_LIB
+ override CFLAGS := $(PIC_CFLAGS) $(CFLAGS)
+ override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS)
+ ifndef STATIC
+ ifneq ($(strip $(OBJ_LINK)),)
+ MAKEDLL := $(DLLSONAME)
+ ALL_LDFLAGS := -dllib $(DLLSONAME)
+ endif
+ endif
+ endif
+
+ ifndef NO_CUSTOM
+ ifneq "$(strip $(OBJ_LINK) $(THREADS) $(MAYBE_IDL) $(CLIBS))" ""
+ ALL_LDFLAGS += -custom
+ endif
+ endif
+
+ ALL_LDFLAGS += $(INCFLAGS) $(OCAMLLDFLAGS) $(OCAMLBLDFLAGS) \
+ $(COMMON_LDFLAGS) $(LIBS:%=%.cma)
+ CAMLIDLDLLFLAGS :=
+
+ ifdef THREADS
+ ifdef VMTHREADS
+ THREAD_FLAG := -vmthread
+ else
+ THREAD_FLAG := -thread
+ endif
+ ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS)
+ ifndef CREATE_LIB
+ ifndef REAL_OCAMLFIND
+ ALL_LDFLAGS := unix.cma threads.cma $(ALL_LDFLAGS)
+ endif
+ endif
+ endif
+
+# we have to make native-code
+else
+ EXTRADEPS := $(addsuffix .cmxa,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i))))
+ ifndef PROFILING
+ SPECIAL_OCAMLFLAGS := $(OCAMLNCFLAGS)
+ PLDFLAGS :=
+ else
+ SPECIAL_OCAMLFLAGS := -p $(OCAMLNCFLAGS)
+ PLDFLAGS := -p
+ endif
+
+ REAL_IMPL := $(IMPL_CMX)
+ REAL_IMPL_INTF := $(IMPLX_INTF)
+ IMPL_SUF := .cmx
+
+ override CPPFLAGS := -DNATIVE_CODE $(CPPFLAGS)
+
+ DEPFLAGS := -native
+ MAKE_DEPS := $(MLDEPS) $(NCDEPIS)
+
+ ALL_LDFLAGS := $(PLDFLAGS) $(INCFLAGS) $(OCAMLLDFLAGS) \
+ $(OCAMLNLDFLAGS) $(COMMON_LDFLAGS)
+ CAMLIDLDLLFLAGS := -opt
+
+ ifndef CREATE_LIB
+ ALL_LDFLAGS += $(LIBS:%=%.cmxa)
+ else
+ override CFLAGS := $(PIC_CFLAGS) $(CFLAGS)
+ override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS)
+ endif
+
+ ifdef THREADS
+ THREAD_FLAG := -thread
+ ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS)
+ ifndef CREATE_LIB
+ ifndef REAL_OCAMLFIND
+ ALL_LDFLAGS := unix.cmxa threads.cmxa $(ALL_LDFLAGS)
+ endif
+ endif
+ endif
+endif
+
+export MAKE_DEPS
+
+ifdef ANNOTATE
+ ANNOT_FLAG := -dtypes
+else
+endif
+
+ALL_OCAMLCFLAGS := $(THREAD_FLAG) $(ANNOT_FLAG) $(OCAMLFLAGS) \
+ $(INCFLAGS) $(SPECIAL_OCAMLFLAGS)
+
+ifdef make_deps
+ -include $(MAKE_DEPS)
+ PRE_TARGETS :=
+endif
+
+###########################################################################
+# USER RULES
+
+# Call "OCamlMakefile QUIET=" to get rid of all of the @'s.
+QUIET=@
+
+# generates byte-code (default)
+byte-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes
+bc: byte-code
+
+byte-code-nolink: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes
+bcnl: byte-code-nolink
+
+top: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(TOPRESULT) \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes
+
+# generates native-code
+
+native-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ make_deps=yes
+nc: native-code
+
+native-code-nolink: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ make_deps=yes
+ncnl: native-code-nolink
+
+# generates byte-code libraries
+byte-code-library: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(BCRESULT).cma \
+ REAL_RESULT="$(BCRESULT)" \
+ CREATE_LIB=yes \
+ make_deps=yes
+bcl: byte-code-library
+
+# generates native-code libraries
+native-code-library: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(NCRESULT).cmxa \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ CREATE_LIB=yes \
+ make_deps=yes
+ncl: native-code-library
+
+ifdef WIN32
+# generates byte-code dll
+byte-code-dll: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(BCRESULT).dll \
+ REAL_RESULT="$(BCRESULT)" \
+ make_deps=yes
+bcd: byte-code-dll
+
+# generates native-code dll
+native-code-dll: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(NCRESULT).dll \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ make_deps=yes
+ncd: native-code-dll
+endif
+
+# generates byte-code with debugging information
+debug-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes \
+ OCAMLFLAGS="-g $(OCAMLFLAGS)" \
+ OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
+dc: debug-code
+
+debug-code-nolink: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes \
+ OCAMLFLAGS="-g $(OCAMLFLAGS)" \
+ OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
+dcnl: debug-code-nolink
+
+# generates byte-code libraries with debugging information
+debug-code-library: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(BCRESULT).cma \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes \
+ CREATE_LIB=yes \
+ OCAMLFLAGS="-g $(OCAMLFLAGS)" \
+ OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
+dcl: debug-code-library
+
+# generates byte-code for profiling
+profiling-byte-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \
+ REAL_RESULT="$(BCRESULT)" PROFILING="y" \
+ make_deps=yes
+pbc: profiling-byte-code
+
+# generates native-code
+
+profiling-native-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ PROFILING="y" \
+ make_deps=yes
+pnc: profiling-native-code
+
+# generates byte-code libraries
+profiling-byte-code-library: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(BCRESULT).cma \
+ REAL_RESULT="$(BCRESULT)" PROFILING="y" \
+ CREATE_LIB=yes \
+ make_deps=yes
+pbcl: profiling-byte-code-library
+
+# generates native-code libraries
+profiling-native-code-library: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(NCRESULT).cmxa \
+ REAL_RESULT="$(NCRESULT)" PROFILING="y" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ CREATE_LIB=yes \
+ make_deps=yes
+pncl: profiling-native-code-library
+
+# packs byte-code objects
+pack-byte-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT).cmo \
+ REAL_RESULT="$(BCRESULT)" \
+ PACK_LIB=yes make_deps=yes
+pabc: pack-byte-code
+
+# packs native-code objects
+pack-native-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(NCRESULT).cmx $(NCRESULT).o \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ PACK_LIB=yes make_deps=yes
+panc: pack-native-code
+
+# generates HTML-documentation
+htdoc: doc/$(RESULT)/html
+
+# generates Latex-documentation
+ladoc: doc/$(RESULT)/latex
+
+# generates PostScript-documentation
+psdoc: doc/$(RESULT)/latex/doc.ps
+
+# generates PDF-documentation
+pdfdoc: doc/$(RESULT)/latex/doc.pdf
+
+# generates all supported forms of documentation
+doc: htdoc ladoc psdoc pdfdoc
+
+###########################################################################
+# LOW LEVEL RULES
+
+$(REAL_RESULT): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) $(RESULTDEPS)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) \
+ $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \
+ $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \
+ $(REAL_IMPL)
+
+nolink: $(REAL_IMPL_INTF) $(OBJ_LINK)
+
+ifdef WIN32
+$(REAL_RESULT).dll: $(REAL_IMPL_INTF) $(OBJ_LINK)
+ $(CAMLIDLDLL) $(CAMLIDLDLLFLAGS) $(OBJ_LINK) $(CLIBS) \
+ -o $@ $(REAL_IMPL)
+endif
+
+%$(TOPSUFFIX): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS)
+ $(REAL_OCAMLFIND) $(OCAMLMKTOP) \
+ $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \
+ $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \
+ $(REAL_IMPL)
+
+.SUFFIXES: .mli .ml .cmi .cmo .cmx .cma .cmxa .$(EXT_OBJ) \
+ .mly .di .d .$(EXT_LIB) .idl %.oxridl .c .$(EXT_CXX) .h .so \
+ .rep .zog .glade
+
+ifndef STATIC
+ifdef MINGW
+$(DLLSONAME): $(OBJ_LINK)
+ $(CC) $(CFLAGS) $(CFLAGS_WIN32) $(OBJ_LINK) -shared -o $@ \
+ -Wl,--whole-archive $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/lib%.a))) \
+ $(OCAMLLIBPATH)/ocamlrun.a \
+ -Wl,--export-all-symbols \
+ -Wl,--no-whole-archive
+else
+ifdef MSVC
+$(DLLSONAME): $(OBJ_LINK)
+ link /NOLOGO /DLL /OUT:$@ $(OBJ_LINK) \
+ $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/%.lib))) \
+ $(OCAMLLIBPATH)/ocamlrun.lib
+
+else
+$(DLLSONAME): $(OBJ_LINK)
+ $(OCAMLMKLIB) $(INCFLAGS) $(CLIBFLAGS) \
+ -o $(CLIB_BASE) $(OBJ_LINK) $(CLIBS:%=-l%) \
+ $(OCAMLMKLIB_FLAGS)
+endif
+endif
+endif
+
+ifndef LIB_PACK_NAME
+$(RESULT).cma: $(REAL_IMPL_INTF) $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) \
+ $(OBJS_LIBS) -o $@ $(OCAMLBLDFLAGS) $(REAL_IMPL)
+
+$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(REAL_IMPL_INTF) $(EXTRADEPS) $(RESULTDEPS)
+ $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) \
+ $(OCAMLNLDFLAGS) -o $@ $(REAL_IMPL)
+else
+ifdef BYTE_OCAML
+$(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo: $(REAL_IMPL_INTF)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmo $(REAL_IMPL)
+else
+$(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx: $(REAL_IMPL_INTF)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmx $(REAL_IMPL)
+endif
+
+$(RESULT).cma: $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) \
+ $(OBJS_LIBS) -o $@ $(OCAMLBLDFLAGS) $(LIB_PACK_NAME).cmo
+
+$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx $(EXTRADEPS) $(RESULTDEPS)
+ $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) \
+ $(OCAMLNLDFLAGS) -o $@ $(LIB_PACK_NAME).cmx
+endif
+
+$(RES_CLIB): $(OBJ_LINK)
+ifndef MSVC
+ ifneq ($(strip $(OBJ_LINK)),)
+ $(AR) rcs $@ $(OBJ_LINK)
+ endif
+else
+ ifneq ($(strip $(OBJ_LINK)),)
+ lib -nologo -debugtype:cv -out:$(RES_CLIB) $(OBJ_LINK)
+ endif
+endif
+
+.mli.cmi: $(EXTRADEPS)
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c $(THREAD_FLAG) $(ANNOT_FLAG) \
+ $(OCAMLFLAGS) $(INCFLAGS) $<; \
+ $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c $(THREAD_FLAG) $(ANNOT_FLAG) \
+ $(OCAMLFLAGS) $(INCFLAGS) $<; \
+ else \
+ echo $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c -pp \"$$pp $(PPFLAGS)\" $(THREAD_FLAG) $(ANNOT_FLAG) \
+ $(OCAMLFLAGS) $(INCFLAGS) $<; \
+ $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c -pp "$$pp $(PPFLAGS)" $(THREAD_FLAG) $(ANNOT_FLAG) \
+ $(OCAMLFLAGS) $(INCFLAGS) $<; \
+ fi
+
+.ml.cmi .ml.$(EXT_OBJ) .ml.cmx .ml.cmo: $(EXTRADEPS)
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c $(ALL_OCAMLCFLAGS) $<; \
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c $(ALL_OCAMLCFLAGS) $<; \
+ else \
+ echo $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c -pp \"$$pp $(PPFLAGS)\" $(ALL_OCAMLCFLAGS) $<; \
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c -pp "$$pp $(PPFLAGS)" $(ALL_OCAMLCFLAGS) $<; \
+ fi
+
+ifdef PACK_LIB
+$(REAL_RESULT).cmo $(REAL_RESULT).cmx $(REAL_RESULT).o: $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack $(ALL_LDFLAGS) \
+ $(OBJS_LIBS) -o $@ $(REAL_IMPL)
+endif
+
+.PRECIOUS: %.ml
+%.ml: %.mll
+ $(OCAMLLEX) $<
+
+.PRECIOUS: %.ml %.mli
+%.ml %.mli: %.mly
+ $(OCAMLYACC) $(YFLAGS) $<
+ $(QUIET)pp=`sed -n -e 's/.*(\*pp \([^*]*\) \*).*/\1/p;q' $<`; \
+ if [ ! -z "$$pp" ]; then \
+ mv $*.ml $*.ml.temporary; \
+ echo "(*pp $$pp $(PPFLAGS)*)" > $*.ml; \
+ cat $*.ml.temporary >> $*.ml; \
+ rm $*.ml.temporary; \
+ mv $*.mli $*.mli.temporary; \
+ echo "(*pp $$pp $(PPFLAGS)*)" > $*.mli; \
+ cat $*.mli.temporary >> $*.mli; \
+ rm $*.mli.temporary; \
+ fi
+
+
+.PRECIOUS: %.ml
+%.ml: %.rep
+ $(CAMELEON_REPORT) $(CAMELEON_REPORT_FLAGS) -gen $<
+
+.PRECIOUS: %.ml
+%.ml: %.zog
+ $(CAMELEON_ZOGGY) $(CAMELEON_ZOGGY_FLAGS) -impl $< > $@
+
+.PRECIOUS: %.ml
+%.ml: %.glade
+ $(OCAML_GLADECC) $(OCAML_GLADECC_FLAGS) $< > $@
+
+.PRECIOUS: %.ml %.mli
+%.ml %.mli: %.oxridl
+ $(OXRIDL) $<
+
+.PRECIOUS: %.ml %.mli %_stubs.c %.h
+%.ml %.mli %_stubs.c %.h: %.idl
+ $(CAMLIDL) $(MAYBE_IDL_HEADER) $(IDLFLAGS) \
+ $(CAMLIDLFLAGS) $<
+ $(QUIET)if [ $(NOIDLHEADER) ]; then touch $*.h; fi
+
+.c.$(EXT_OBJ):
+ $(OCAMLC) -c -cc "$(CC)" -ccopt "$(CFLAGS) \
+ $(CPPFLAGS) $(CPPFLAGS_WIN32) \
+ $(CFLAGS_WIN32) $(CINCFLAGS) $(CFLAG_O)$@ " $<
+
+.$(EXT_CXX).$(EXT_OBJ):
+ $(CXX) -c $(CXXFLAGS) $(CINCFLAGS) $(CPPFLAGS) \
+ -I'$(OCAMLLIBPATH)' \
+ $< $(CFLAG_O)$@
+
+$(MLDEPDIR)/%.d: %.ml
+ $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
+ $(DINCFLAGS) $< \> $@; \
+ $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
+ $(DINCFLAGS) $< > $@; \
+ else \
+ echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
+ -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \
+ $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
+ -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \
+ fi
+
+$(BCDIDIR)/%.di $(NCDIDIR)/%.di: %.mli
+ $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< \> $@; \
+ $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< > $@; \
+ else \
+ echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \
+ -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \
+ $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \
+ -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \
+ fi
+
+doc/$(RESULT)/html: $(DOC_FILES)
+ #rm -rf $@
+ #mkdir -p $@
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(OCAMLDOC) -html -d $@ $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \
+ $(OCAMLDOC) -html -d $@ $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \
+ else \
+ echo $(OCAMLDOC) -pp \"$$pp $(PPFLAGS)\" -html -d $@ $(OCAMLDOCFLAGS) \
+ $(INCFLAGS) $(DOC_FILES); \
+ $(OCAMLDOC) -pp "$$pp $(PPFLAGS)" -html -d $@ $(OCAMLDOCFLAGS) \
+ $(INCFLAGS) $(DOC_FILES); \
+ fi
+
+doc/$(RESULT)/latex: $(DOC_FILES)
+ #rm -rf $@
+ #mkdir -p $@
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(OCAMLDOC) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) \
+ $(DOC_FILES) -o $@/doc.tex; \
+ $(OCAMLDOC) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES) \
+ -o $@/doc.tex; \
+ else \
+ echo $(OCAMLDOC) -pp \"$$pp $(PPFLAGS)\" -latex $(OCAMLDOCFLAGS) \
+ $(INCFLAGS) $(DOC_FILES) -o $@/doc.tex; \
+ $(OCAMLDOC) -pp "$$pp $(PPFLAGS)" -latex $(OCAMLDOCFLAGS) \
+ $(INCFLAGS) $(DOC_FILES) -o $@/doc.tex; \
+ fi
+
+doc/$(RESULT)/latex/doc.ps: doc/$(RESULT)/latex
+ cd doc/$(RESULT)/latex && \
+ $(LATEX) doc.tex && \
+ $(LATEX) doc.tex && \
+ $(DVIPS) $(DVIPSFLAGS) doc.dvi -o $(@F)
+
+doc/$(RESULT)/latex/doc.pdf: doc/$(RESULT)/latex/doc.ps
+ cd doc/$(RESULT)/latex && $(PS2PDF) $(<F)
+
+define make_subproj
+.PHONY:
+subproj_$(1):
+ $$(eval $$(call PROJ_$(1)))
+ $(QUIET)if [ "$(SUBTARGET)" != "all" ]; then \
+ $(MAKE) -f $(OCAMLMAKEFILE) $(SUBTARGET); \
+ fi
+endef
+
+$(foreach subproj,$(SUBPROJS),$(eval $(call make_subproj,$(subproj))))
+
+.PHONY:
+subprojs: $(SUBPROJS:%=subproj_%)
+
+###########################################################################
+# (UN)INSTALL RULES FOR LIBRARIES
+
+.PHONY: libinstall
+libinstall: all
+ $(QUIET)printf "\nInstalling library with ocamlfind\n"
+ $(OCAMLFIND) install $(OCAMLFIND_INSTFLAGS) $(RESULT) META $(LIBINSTALL_FILES)
+ $(QUIET)printf "\nInstallation successful.\n"
+
+.PHONY: libuninstall
+libuninstall:
+ $(QUIET)printf "\nUninstalling library with ocamlfind\n"
+ $(OCAMLFIND) remove $(OCAMLFIND_INSTFLAGS) $(RESULT)
+ $(QUIET)printf "\nUninstallation successful.\n"
+
+.PHONY: rawinstall
+rawinstall: all
+ $(QUIET)printf "\nInstalling library to: $(OCAML_LIB_INSTALL)\n"
+ -install -d $(OCAML_LIB_INSTALL)
+ for i in $(LIBINSTALL_FILES); do \
+ if [ -f $$i ]; then \
+ install -c -m 0644 $$i $(OCAML_LIB_INSTALL); \
+ fi; \
+ done
+ $(QUIET)printf "\nInstallation successful.\n"
+
+.PHONY: rawuninstall
+rawuninstall:
+ $(QUIET)printf "\nUninstalling library from: $(OCAML_LIB_INSTALL)\n"
+ cd $(OCAML_LIB_INSTALL) && rm $(notdir $(LIBINSTALL_FILES))
+ $(QUIET)printf "\nUninstallation successful.\n"
+
+###########################################################################
+# MAINTAINANCE RULES
+
+.PHONY: clean
+clean::
+ rm -f $(TARGETS) $(TRASH)
+ rm -rf $(BCDIDIR) $(NCDIDIR) $(MLDEPDIR)
+
+.PHONY: cleanup
+cleanup::
+ rm -f $(NONEXECS) $(TRASH)
+ rm -rf $(BCDIDIR) $(NCDIDIR) $(MLDEPDIR)
+
+.PHONY: clean-doc
+clean-doc::
+ rm -rf doc
+
+.PHONY: nobackup
+nobackup:
+ rm -f *.bak *~ *.dup
diff --git a/examples/ubigraph/Ubigraph.ml b/examples/ubigraph/Ubigraph.ml
new file mode 100644
index 0000000..7998eae
--- /dev/null
+++ b/examples/ubigraph/Ubigraph.ml
@@ -0,0 +1,169 @@
+(*
+ * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet
+ * Copyright (C) 2008 Dave Benjamin (dave@ramenlabs.com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *)
+
+(* Automatically generated from an XML-RPC server
+ by running the following command:
+
+ ../genclient/genclient -i http://localhost:20738/RPC2
+*)
+
+exception Type_error of string
+
+class client url =
+ let rpc = new XmlRpc.client url in
+object (self)
+ method rpc = rpc
+
+ method system = object
+ method shutdown _0 =
+ let result = rpc#call "system.shutdown" [`String _0] in
+ match result with
+ | `Int r -> Int32.of_int r | `Int32 r -> r
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method multicall _0 =
+ let result = rpc#call "system.multicall" [`Array _0] in
+ match result with
+ | `Array r -> r
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method methodHelp _0 =
+ let result = rpc#call "system.methodHelp" [`String _0] in
+ match result with
+ | `String r -> r
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method methodSignature _0 =
+ let result = rpc#call "system.methodSignature" [`String _0] in
+ match result with
+ | `Array r -> r
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method listMethods () =
+ let result = rpc#call "system.listMethods" [] in
+ match result with
+ | `Array r -> r
+ | other -> raise (Type_error (XmlRpc.dump other))
+ end
+
+ method ubigraph = object
+ method change_edge_style _0 _1 =
+ let result = rpc#call "ubigraph.change_edge_style" [`Int32 _0; `Int32 _1] in
+ match result with
+ | `Int r -> Int32.of_int r | `Int32 r -> r
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method new_edge_style_w_id _0 _1 =
+ let result = rpc#call "ubigraph.new_edge_style_w_id" [`Int32 _0; `Int32 _1] in
+ match result with
+ | `Int r -> Int32.of_int r | `Int32 r -> r
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method new_edge_style _0 =
+ let result = rpc#call "ubigraph.new_edge_style" [`Int32 _0] in
+ match result with
+ | `Int r -> Int32.of_int r | `Int32 r -> r
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method set_edge_style_attribute _0 _1 _2 =
+ let result = rpc#call "ubigraph.set_edge_style_attribute" [`Int32 _0; `String _1; `String _2] in
+ match result with
+ | `Int r -> Int32.of_int r | `Int32 r -> r
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method set_edge_attribute _0 _1 _2 =
+ let result = rpc#call "ubigraph.set_edge_attribute" [`Int32 _0; `String _1; `String _2] in
+ match result with
+ | `Int r -> Int32.of_int r | `Int32 r -> r
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method change_vertex_style _0 _1 =
+ let result = rpc#call "ubigraph.change_vertex_style" [`Int32 _0; `Int32 _1] in
+ match result with
+ | `Int r -> Int32.of_int r | `Int32 r -> r
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method new_vertex_style_w_id _0 _1 =
+ let result = rpc#call "ubigraph.new_vertex_style_w_id" [`Int32 _0; `Int32 _1] in
+ match result with
+ | `Int r -> Int32.of_int r | `Int32 r -> r
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method new_vertex_style _0 =
+ let result = rpc#call "ubigraph.new_vertex_style" [`Int32 _0] in
+ match result with
+ | `Int r -> Int32.of_int r | `Int32 r -> r
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method set_vertex_style_attribute _0 _1 _2 =
+ let result = rpc#call "ubigraph.set_vertex_style_attribute" [`Int32 _0; `String _1; `String _2] in
+ match result with
+ | `Int r -> Int32.of_int r | `Int32 r -> r
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method set_vertex_attribute _0 _1 _2 =
+ let result = rpc#call "ubigraph.set_vertex_attribute" [`Int32 _0; `String _1; `String _2] in
+ match result with
+ | `Int r -> Int32.of_int r | `Int32 r -> r
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method clear () =
+ let result = rpc#call "ubigraph.clear" [] in
+ match result with
+ | `Int r -> Int32.of_int r | `Int32 r -> r
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method remove_edge _0 =
+ let result = rpc#call "ubigraph.remove_edge" [`Int32 _0] in
+ match result with
+ | `Int r -> Int32.of_int r | `Int32 r -> r
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method remove_vertex _0 =
+ let result = rpc#call "ubigraph.remove_vertex" [`Int32 _0] in
+ match result with
+ | `Int r -> Int32.of_int r | `Int32 r -> r
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method new_edge _0 _1 =
+ let result = rpc#call "ubigraph.new_edge" [`Int32 _0; `Int32 _1] in
+ match result with
+ | `Int r -> Int32.of_int r | `Int32 r -> r
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method new_edge_w_id _0 _1 _2 =
+ let result = rpc#call "ubigraph.new_edge_w_id" [`Int32 _0; `Int32 _1; `Int32 _2] in
+ match result with
+ | `Int r -> Int32.of_int r | `Int32 r -> r
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method new_vertex () =
+ let result = rpc#call "ubigraph.new_vertex" [] in
+ match result with
+ | `Int r -> Int32.of_int r | `Int32 r -> r
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method new_vertex_w_id _0 =
+ let result = rpc#call "ubigraph.new_vertex_w_id" [`Int32 _0] in
+ match result with
+ | `Int r -> Int32.of_int r | `Int32 r -> r
+ | other -> raise (Type_error (XmlRpc.dump other))
+ end
+
+end
diff --git a/examples/ubigraph/Ubigraph.mli b/examples/ubigraph/Ubigraph.mli
new file mode 100644
index 0000000..363354a
--- /dev/null
+++ b/examples/ubigraph/Ubigraph.mli
@@ -0,0 +1,51 @@
+(*
+ * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet
+ * Copyright (C) 2008 Dave Benjamin (dave@ramenlabs.com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *)
+
+exception Type_error of string
+
+class client : string ->
+object
+ method rpc : XmlRpc.client
+
+ method ubigraph :
+ < change_edge_style : int32 -> int32 -> int32;
+ change_vertex_style : int32 -> int32 -> int32;
+ clear : unit -> int32;
+ new_edge : int32 -> int32 -> int32;
+ new_edge_style : int32 -> int32;
+ new_edge_style_w_id : int32 -> int32 -> int32;
+ new_edge_w_id : int32 -> int32 -> int32 -> int32;
+ new_vertex : unit -> int32;
+ new_vertex_style : int32 -> int32;
+ new_vertex_style_w_id : int32 -> int32 -> int32;
+ new_vertex_w_id : int32 -> int32;
+ remove_edge : int32 -> int32;
+ remove_vertex : int32 -> int32;
+ set_edge_attribute : int32 -> string -> string -> int32;
+ set_edge_style_attribute : int32 -> string -> string -> int32;
+ set_vertex_attribute : int32 -> string -> string -> int32;
+ set_vertex_style_attribute : int32 -> string -> string -> int32 >
+
+ method system :
+ < listMethods : unit -> XmlRpc.value list;
+ methodHelp : string -> string;
+ methodSignature : string -> XmlRpc.value list;
+ multicall : XmlRpc.value list -> XmlRpc.value list;
+ shutdown : string -> int32 >
+end
diff --git a/examples/ubigraph/test.ml b/examples/ubigraph/test.ml
new file mode 100644
index 0000000..892c564
--- /dev/null
+++ b/examples/ubigraph/test.ml
@@ -0,0 +1,54 @@
+(*
+ * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet
+ * Copyright (C) 2008 Dave Benjamin (dave@ramenlabs.com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *)
+
+(* Based on Python example, "examples/Python/ubigraph_example.py",
+ distributed with Ubigraph. For details, see the Ubigraph website:
+ http://ubietylab.net/ubigraph/
+*)
+
+let client = new Ubigraph.client "http://localhost:20738/RPC2"
+let u = client#ubigraph
+let _ = u#clear ()
+
+let x = u#new_vertex ()
+let _ = u#set_vertex_attribute x "shape" "sphere"
+let _ = u#set_vertex_attribute x "color" "#ffff00"
+
+let small_red = u#new_vertex_style 0l
+let _ = u#set_vertex_style_attribute small_red "shape" "sphere"
+let _ = u#set_vertex_style_attribute small_red "color" "#ff0000"
+let _ = u#set_vertex_style_attribute small_red "size" "0.2"
+
+let previous_r = ref None
+let () =
+ for i = 0 to 9 do
+ let r = u#new_vertex () in
+ let _ = u#change_vertex_style r small_red in
+ let _ = u#set_vertex_attribute r "label" (string_of_int i) in
+ let e = u#new_edge x r in
+ let _ = u#set_edge_attribute e "arrow" "true" in
+ match !previous_r with
+ | None ->
+ previous_r := Some r
+ | Some r' ->
+ let e = u#new_edge r r' in
+ let _ = u#set_edge_attribute e "spline" "true" in
+ let _ = u#set_edge_attribute e "stroke" "dashed" in
+ previous_r := Some r
+ done
diff --git a/examples/wordpress/Makefile b/examples/wordpress/Makefile
new file mode 100644
index 0000000..b9676d9
--- /dev/null
+++ b/examples/wordpress/Makefile
@@ -0,0 +1,7 @@
+OCAMLMAKEFILE = OCamlMakefile
+
+RESULT = test
+SOURCES = WordPress.mli WordPress.ml test.ml
+PACKS = xmlrpc-light
+
+include $(OCAMLMAKEFILE)
diff --git a/examples/wordpress/OCamlMakefile b/examples/wordpress/OCamlMakefile
new file mode 100644
index 0000000..9adb295
--- /dev/null
+++ b/examples/wordpress/OCamlMakefile
@@ -0,0 +1,1154 @@
+###########################################################################
+# OCamlMakefile
+# Copyright (C) 1999-2004 Markus Mottl
+#
+# For updates see:
+# http://www.ocaml.info/home/ocaml_sources.html
+#
+# $Id: OCamlMakefile,v 1.72 2005/12/09 15:30:50 mottl Exp $
+#
+###########################################################################
+
+# Modified by damien for .glade.ml compilation
+
+# Set these variables to the names of the sources to be processed and
+# the result variable. Order matters during linkage!
+
+ifndef SOURCES
+ SOURCES := foo.ml
+endif
+export SOURCES
+
+ifndef RES_CLIB_SUF
+ RES_CLIB_SUF := _stubs
+endif
+export RES_CLIB_SUF
+
+ifndef RESULT
+ RESULT := foo
+endif
+export RESULT
+
+export LIB_PACK_NAME
+
+ifndef DOC_FILES
+ DOC_FILES := $(filter %.mli, $(SOURCES))
+endif
+export DOC_FILES
+
+export BCSUFFIX
+export NCSUFFIX
+
+ifndef TOPSUFFIX
+ TOPSUFFIX := .top
+endif
+export TOPSUFFIX
+
+# Eventually set include- and library-paths, libraries to link,
+# additional compilation-, link- and ocamlyacc-flags
+# Path- and library information needs not be written with "-I" and such...
+# Define THREADS if you need it, otherwise leave it unset (same for
+# USE_CAMLP4)!
+
+export THREADS
+export VMTHREADS
+export ANNOTATE
+export USE_CAMLP4
+
+export INCDIRS
+export LIBDIRS
+export EXTLIBDIRS
+export RESULTDEPS
+export OCAML_DEFAULT_DIRS
+
+export LIBS
+export CLIBS
+
+export OCAMLFLAGS
+export OCAMLNCFLAGS
+export OCAMLBCFLAGS
+
+export OCAMLLDFLAGS
+export OCAMLNLDFLAGS
+export OCAMLBLDFLAGS
+
+ifndef OCAMLCPFLAGS
+ OCAMLCPFLAGS := a
+endif
+
+export OCAMLCPFLAGS
+
+export PPFLAGS
+
+export YFLAGS
+export IDLFLAGS
+
+export OCAMLDOCFLAGS
+
+export OCAMLFIND_INSTFLAGS
+
+export DVIPSFLAGS
+
+export STATIC
+
+# Add a list of optional trash files that should be deleted by "make clean"
+export TRASH
+
+#################### variables depending on your OCaml-installation
+
+ifdef MINGW
+ export MINGW
+ WIN32 := 1
+ CFLAGS_WIN32 := -mno-cygwin
+endif
+ifdef MSVC
+ export MSVC
+ WIN32 := 1
+ ifndef STATIC
+ CPPFLAGS_WIN32 := -DCAML_DLL
+ endif
+ CFLAGS_WIN32 += -nologo
+ EXT_OBJ := obj
+ EXT_LIB := lib
+ ifeq ($(CC),gcc)
+ # work around GNU Make default value
+ ifdef THREADS
+ CC := cl -MT
+ else
+ CC := cl
+ endif
+ endif
+ ifeq ($(CXX),g++)
+ # work around GNU Make default value
+ CXX := $(CC)
+ endif
+ CFLAG_O := -Fo
+endif
+ifdef WIN32
+ EXT_CXX := cpp
+ EXE := .exe
+endif
+
+ifndef EXT_OBJ
+ EXT_OBJ := o
+endif
+ifndef EXT_LIB
+ EXT_LIB := a
+endif
+ifndef EXT_CXX
+ EXT_CXX := cc
+endif
+ifndef EXE
+ EXE := # empty
+endif
+ifndef CFLAG_O
+ CFLAG_O := -o # do not delete this comment (preserves trailing whitespace)!
+endif
+
+export CC
+export CXX
+export CFLAGS
+export CXXFLAGS
+export LDFLAGS
+export CPPFLAGS
+
+ifndef RPATH_FLAG
+ RPATH_FLAG := -R
+endif
+export RPATH_FLAG
+
+ifndef MSVC
+ifndef PIC_CFLAGS
+ PIC_CFLAGS := -fPIC
+endif
+ifndef PIC_CPPFLAGS
+ PIC_CPPFLAGS := -DPIC
+endif
+endif
+
+export PIC_CFLAGS
+export PIC_CPPFLAGS
+
+BCRESULT := $(addsuffix $(BCSUFFIX), $(RESULT))
+NCRESULT := $(addsuffix $(NCSUFFIX), $(RESULT))
+TOPRESULT := $(addsuffix $(TOPSUFFIX), $(RESULT))
+
+ifndef OCAMLFIND
+ OCAMLFIND := ocamlfind
+endif
+export OCAMLFIND
+
+ifndef OCAMLC
+ OCAMLC := ocamlc
+endif
+export OCAMLC
+
+ifndef OCAMLOPT
+ OCAMLOPT := ocamlopt
+endif
+export OCAMLOPT
+
+ifndef OCAMLMKTOP
+ OCAMLMKTOP := ocamlmktop
+endif
+export OCAMLMKTOP
+
+ifndef OCAMLCP
+ OCAMLCP := ocamlcp
+endif
+export OCAMLCP
+
+ifndef OCAMLDEP
+ OCAMLDEP := ocamldep
+endif
+export OCAMLDEP
+
+ifndef OCAMLLEX
+ OCAMLLEX := ocamllex
+endif
+export OCAMLLEX
+
+ifndef OCAMLYACC
+ OCAMLYACC := ocamlyacc
+endif
+export OCAMLYACC
+
+ifndef OCAMLMKLIB
+ OCAMLMKLIB := ocamlmklib
+endif
+export OCAMLMKLIB
+
+ifndef OCAML_GLADECC
+ OCAML_GLADECC := lablgladecc2
+endif
+export OCAML_GLADECC
+
+ifndef OCAML_GLADECC_FLAGS
+ OCAML_GLADECC_FLAGS :=
+endif
+export OCAML_GLADECC_FLAGS
+
+ifndef CAMELEON_REPORT
+ CAMELEON_REPORT := report
+endif
+export CAMELEON_REPORT
+
+ifndef CAMELEON_REPORT_FLAGS
+ CAMELEON_REPORT_FLAGS :=
+endif
+export CAMELEON_REPORT_FLAGS
+
+ifndef CAMELEON_ZOGGY
+ CAMELEON_ZOGGY := camlp4o pa_zog.cma pr_o.cmo
+endif
+export CAMELEON_ZOGGY
+
+ifndef CAMELEON_ZOGGY_FLAGS
+ CAMELEON_ZOGGY_FLAGS :=
+endif
+export CAMELEON_ZOGGY_FLAGS
+
+ifndef OXRIDL
+ OXRIDL := oxridl
+endif
+export OXRIDL
+
+ifndef CAMLIDL
+ CAMLIDL := camlidl
+endif
+export CAMLIDL
+
+ifndef CAMLIDLDLL
+ CAMLIDLDLL := camlidldll
+endif
+export CAMLIDLDLL
+
+ifndef NOIDLHEADER
+ MAYBE_IDL_HEADER := -header
+endif
+export NOIDLHEADER
+
+export NO_CUSTOM
+
+ifndef CAMLP4
+ CAMLP4 := camlp4
+endif
+export CAMLP4
+
+ifndef REAL_OCAMLFIND
+ ifdef PACKS
+ ifndef CREATE_LIB
+ ifdef THREADS
+ PACKS += threads
+ endif
+ endif
+ empty :=
+ space := $(empty) $(empty)
+ comma := ,
+ ifdef PREDS
+ PRE_OCAML_FIND_PREDICATES := $(subst $(space),$(comma),$(PREDS))
+ PRE_OCAML_FIND_PACKAGES := $(subst $(space),$(comma),$(PACKS))
+ OCAML_FIND_PREDICATES := -predicates $(PRE_OCAML_FIND_PREDICATES)
+ # OCAML_DEP_PREDICATES := -syntax $(PRE_OCAML_FIND_PREDICATES)
+ OCAML_FIND_PACKAGES := $(OCAML_FIND_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES)
+ OCAML_DEP_PACKAGES := $(OCAML_DEP_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES)
+ else
+ OCAML_FIND_PACKAGES := -package $(subst $(space),$(comma),$(PACKS))
+ OCAML_DEP_PACKAGES :=
+ endif
+ OCAML_FIND_LINKPKG := -linkpkg
+ REAL_OCAMLFIND := $(OCAMLFIND)
+ endif
+endif
+
+export OCAML_FIND_PACKAGES
+export OCAML_DEP_PACKAGES
+export OCAML_FIND_LINKPKG
+export REAL_OCAMLFIND
+
+ifndef OCAMLDOC
+ OCAMLDOC := ocamldoc
+endif
+export OCAMLDOC
+
+ifndef LATEX
+ LATEX := latex
+endif
+export LATEX
+
+ifndef DVIPS
+ DVIPS := dvips
+endif
+export DVIPS
+
+ifndef PS2PDF
+ PS2PDF := ps2pdf
+endif
+export PS2PDF
+
+ifndef OCAMLMAKEFILE
+ OCAMLMAKEFILE := OCamlMakefile
+endif
+export OCAMLMAKEFILE
+
+ifndef OCAMLLIBPATH
+ OCAMLLIBPATH := \
+ $(shell $(OCAMLC) 2>/dev/null -where || echo /usr/lib/ocaml)
+endif
+export OCAMLLIBPATH
+
+ifndef OCAML_LIB_INSTALL
+ OCAML_LIB_INSTALL := $(OCAMLLIBPATH)/contrib
+endif
+export OCAML_LIB_INSTALL
+
+###########################################################################
+
+#################### change following sections only if
+#################### you know what you are doing!
+
+# delete target files when a build command fails
+.PHONY: .DELETE_ON_ERROR
+.DELETE_ON_ERROR:
+
+# for pedants using "--warn-undefined-variables"
+export MAYBE_IDL
+export REAL_RESULT
+export CAMLIDLFLAGS
+export THREAD_FLAG
+export RES_CLIB
+export MAKEDLL
+export ANNOT_FLAG
+export C_OXRIDL
+export SUBPROJS
+export CFLAGS_WIN32
+export CPPFLAGS_WIN32
+
+INCFLAGS :=
+
+SHELL := /bin/sh
+
+MLDEPDIR := ._d
+BCDIDIR := ._bcdi
+NCDIDIR := ._ncdi
+
+FILTER_EXTNS := %.mli %.ml %.mll %.mly %.idl %.oxridl %.c %.$(EXT_CXX) %.rep %.zog %.glade
+
+FILTERED := $(filter $(FILTER_EXTNS), $(SOURCES))
+SOURCE_DIRS := $(filter-out ./, $(sort $(dir $(FILTERED))))
+
+FILTERED_REP := $(filter %.rep, $(FILTERED))
+DEP_REP := $(FILTERED_REP:%.rep=$(MLDEPDIR)/%.d)
+AUTO_REP := $(FILTERED_REP:.rep=.ml)
+
+FILTERED_ZOG := $(filter %.zog, $(FILTERED))
+DEP_ZOG := $(FILTERED_ZOG:%.zog=$(MLDEPDIR)/%.d)
+AUTO_ZOG := $(FILTERED_ZOG:.zog=.ml)
+
+FILTERED_GLADE := $(filter %.glade, $(FILTERED))
+DEP_GLADE := $(FILTERED_GLADE:%.glade=$(MLDEPDIR)/%.d)
+AUTO_GLADE := $(FILTERED_GLADE:.glade=.ml)
+
+FILTERED_ML := $(filter %.ml, $(FILTERED))
+DEP_ML := $(FILTERED_ML:%.ml=$(MLDEPDIR)/%.d)
+
+FILTERED_MLI := $(filter %.mli, $(FILTERED))
+DEP_MLI := $(FILTERED_MLI:.mli=.di)
+
+FILTERED_MLL := $(filter %.mll, $(FILTERED))
+DEP_MLL := $(FILTERED_MLL:%.mll=$(MLDEPDIR)/%.d)
+AUTO_MLL := $(FILTERED_MLL:.mll=.ml)
+
+FILTERED_MLY := $(filter %.mly, $(FILTERED))
+DEP_MLY := $(FILTERED_MLY:%.mly=$(MLDEPDIR)/%.d) $(FILTERED_MLY:.mly=.di)
+AUTO_MLY := $(FILTERED_MLY:.mly=.mli) $(FILTERED_MLY:.mly=.ml)
+
+FILTERED_IDL := $(filter %.idl, $(FILTERED))
+DEP_IDL := $(FILTERED_IDL:%.idl=$(MLDEPDIR)/%.d) $(FILTERED_IDL:.idl=.di)
+C_IDL := $(FILTERED_IDL:%.idl=%_stubs.c)
+ifndef NOIDLHEADER
+ C_IDL += $(FILTERED_IDL:.idl=.h)
+endif
+OBJ_C_IDL := $(FILTERED_IDL:%.idl=%_stubs.$(EXT_OBJ))
+AUTO_IDL := $(FILTERED_IDL:.idl=.mli) $(FILTERED_IDL:.idl=.ml) $(C_IDL)
+
+FILTERED_OXRIDL := $(filter %.oxridl, $(FILTERED))
+DEP_OXRIDL := $(FILTERED_OXRIDL:%.oxridl=$(MLDEPDIR)/%.d) $(FILTERED_OXRIDL:.oxridl=.di)
+AUTO_OXRIDL := $(FILTERED_OXRIDL:.oxridl=.mli) $(FILTERED_OXRIDL:.oxridl=.ml) $(C_OXRIDL)
+
+FILTERED_C_CXX := $(filter %.c %.$(EXT_CXX), $(FILTERED))
+OBJ_C_CXX := $(FILTERED_C_CXX:.c=.$(EXT_OBJ))
+OBJ_C_CXX := $(OBJ_C_CXX:.$(EXT_CXX)=.$(EXT_OBJ))
+
+PRE_TARGETS += $(AUTO_MLL) $(AUTO_MLY) $(AUTO_IDL) $(AUTO_OXRIDL) $(AUTO_ZOG) $(AUTO_REP) $(AUTO_GLADE)
+
+ALL_DEPS := $(DEP_ML) $(DEP_MLI) $(DEP_MLL) $(DEP_MLY) $(DEP_IDL) $(DEP_OXRIDL) $(DEP_ZOG) $(DEP_REP) $(DEP_GLADE)
+
+MLDEPS := $(filter %.d, $(ALL_DEPS))
+MLIDEPS := $(filter %.di, $(ALL_DEPS))
+BCDEPIS := $(MLIDEPS:%.di=$(BCDIDIR)/%.di)
+NCDEPIS := $(MLIDEPS:%.di=$(NCDIDIR)/%.di)
+
+ALLML := $(filter %.mli %.ml %.mll %.mly %.idl %.oxridl %.rep %.zog %.glade, $(FILTERED))
+
+IMPLO_INTF := $(ALLML:%.mli=%.mli.__)
+IMPLO_INTF := $(foreach file, $(IMPLO_INTF), \
+ $(basename $(file)).cmi $(basename $(file)).cmo)
+IMPLO_INTF := $(filter-out %.mli.cmo, $(IMPLO_INTF))
+IMPLO_INTF := $(IMPLO_INTF:%.mli.cmi=%.cmi)
+
+IMPLX_INTF := $(IMPLO_INTF:.cmo=.cmx)
+
+INTF := $(filter %.cmi, $(IMPLO_INTF))
+IMPL_CMO := $(filter %.cmo, $(IMPLO_INTF))
+IMPL_CMX := $(IMPL_CMO:.cmo=.cmx)
+IMPL_ASM := $(IMPL_CMO:.cmo=.asm)
+IMPL_S := $(IMPL_CMO:.cmo=.s)
+
+OBJ_LINK := $(OBJ_C_IDL) $(OBJ_C_CXX)
+OBJ_FILES := $(IMPL_CMO:.cmo=.$(EXT_OBJ)) $(OBJ_LINK)
+
+EXECS := $(addsuffix $(EXE), \
+ $(sort $(TOPRESULT) $(BCRESULT) $(NCRESULT)))
+ifdef WIN32
+ EXECS += $(BCRESULT).dll $(NCRESULT).dll
+endif
+
+CLIB_BASE := $(RESULT)$(RES_CLIB_SUF)
+ifneq ($(strip $(OBJ_LINK)),)
+ RES_CLIB := lib$(CLIB_BASE).$(EXT_LIB)
+endif
+
+ifdef WIN32
+DLLSONAME := $(CLIB_BASE).dll
+else
+DLLSONAME := dll$(CLIB_BASE).so
+endif
+
+NONEXECS := $(INTF) $(IMPL_CMO) $(IMPL_CMX) $(IMPL_ASM) $(IMPL_S) \
+ $(OBJ_FILES) $(PRE_TARGETS) $(BCRESULT).cma $(NCRESULT).cmxa \
+ $(NCRESULT).$(EXT_LIB) $(BCRESULT).cmi $(BCRESULT).cmo \
+ $(NCRESULT).cmi $(NCRESULT).cmx $(NCRESULT).o \
+ $(RES_CLIB) $(IMPL_CMO:.cmo=.annot) \
+ $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(LIB_PACK_NAME).cmx $(LIB_PACK_NAME).o
+
+ifndef STATIC
+ NONEXECS += $(DLLSONAME)
+endif
+
+ifndef LIBINSTALL_FILES
+ LIBINSTALL_FILES := $(RESULT).mli $(RESULT).cmi $(RESULT).cma \
+ $(RESULT).cmxa $(RESULT).$(EXT_LIB) $(RES_CLIB)
+ ifndef STATIC
+ ifneq ($(strip $(OBJ_LINK)),)
+ LIBINSTALL_FILES += $(DLLSONAME)
+ endif
+ endif
+endif
+
+export LIBINSTALL_FILES
+
+ifdef WIN32
+ # some extra stuff is created while linking DLLs
+ NONEXECS += $(BCRESULT).$(EXT_LIB) $(BCRESULT).exp $(NCRESULT).exp $(CLIB_BASE).exp $(CLIB_BASE).lib
+endif
+
+TARGETS := $(EXECS) $(NONEXECS)
+
+# If there are IDL-files
+ifneq ($(strip $(FILTERED_IDL)),)
+ MAYBE_IDL := -cclib -lcamlidl
+endif
+
+ifdef USE_CAMLP4
+ CAMLP4PATH := \
+ $(shell $(CAMLP4) -where 2>/dev/null || echo /usr/lib/camlp4)
+ INCFLAGS := -I $(CAMLP4PATH)
+ CINCFLAGS := -I$(CAMLP4PATH)
+endif
+
+DINCFLAGS := $(INCFLAGS) $(SOURCE_DIRS:%=-I %) $(OCAML_DEFAULT_DIRS:%=-I %)
+INCFLAGS := $(DINCFLAGS) $(INCDIRS:%=-I %)
+CINCFLAGS += $(SOURCE_DIRS:%=-I%) $(INCDIRS:%=-I%) $(OCAML_DEFAULT_DIRS:%=-I%)
+
+ifndef MSVC
+CLIBFLAGS += $(SOURCE_DIRS:%=-L%) $(LIBDIRS:%=-L%) \
+ $(EXTLIBDIRS:%=-L%) $(EXTLIBDIRS:%=-Wl,$(RPATH_FLAG)%) \
+ $(OCAML_DEFAULT_DIRS:%=-L%)
+endif
+
+ifndef PROFILING
+ INTF_OCAMLC := $(OCAMLC)
+else
+ ifndef THREADS
+ INTF_OCAMLC := $(OCAMLCP) -p $(OCAMLCPFLAGS)
+ else
+ # OCaml does not support profiling byte code
+ # with threads (yet), therefore we force an error.
+ ifndef REAL_OCAMLC
+ $(error Profiling of multithreaded byte code not yet supported by OCaml)
+ endif
+ INTF_OCAMLC := $(OCAMLC)
+ endif
+endif
+
+ifndef MSVC
+COMMON_LDFLAGS := $(LDFLAGS:%=-ccopt %) $(SOURCE_DIRS:%=-ccopt -L%) \
+ $(LIBDIRS:%=-ccopt -L%) $(EXTLIBDIRS:%=-ccopt -L%) \
+ $(EXTLIBDIRS:%=-ccopt -Wl,$(RPATH_FLAG)%) \
+ $(OCAML_DEFAULT_DIRS:%=-ccopt -L%)
+else
+COMMON_LDFLAGS := -ccopt "/link -NODEFAULTLIB:LIBC $(LDFLAGS:%=%) $(SOURCE_DIRS:%=-LIBPATH:%) \
+ $(LIBDIRS:%=-LIBPATH:%) $(EXTLIBDIRS:%=-LIBPATH:%) \
+ $(OCAML_DEFAULT_DIRS:%=-LIBPATH:%) "
+endif
+
+CLIBS_OPTS := $(CLIBS:%=-cclib -l%)
+ifdef MSVC
+ ifndef STATIC
+ # MSVC libraries do not have 'lib' prefix
+ CLIBS_OPTS := $(CLIBS:%=-cclib %.lib)
+ endif
+endif
+
+ifneq ($(strip $(OBJ_LINK)),)
+ ifdef CREATE_LIB
+ OBJS_LIBS := -cclib -l$(CLIB_BASE) $(CLIBS_OPTS) $(MAYBE_IDL)
+ else
+ OBJS_LIBS := $(OBJ_LINK) $(CLIBS_OPTS) $(MAYBE_IDL)
+ endif
+else
+ OBJS_LIBS := $(CLIBS_OPTS) $(MAYBE_IDL)
+endif
+
+# If we have to make byte-code
+ifndef REAL_OCAMLC
+ BYTE_OCAML := y
+
+ # EXTRADEPS is added dependencies we have to insert for all
+ # executable files we generate. Ideally it should be all of the
+ # libraries we use, but it's hard to find the ones that get searched on
+ # the path since I don't know the paths built into the compiler, so
+ # just include the ones with slashes in their names.
+ EXTRADEPS := $(addsuffix .cma,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i))))
+ SPECIAL_OCAMLFLAGS := $(OCAMLBCFLAGS)
+
+ REAL_OCAMLC := $(INTF_OCAMLC)
+
+ REAL_IMPL := $(IMPL_CMO)
+ REAL_IMPL_INTF := $(IMPLO_INTF)
+ IMPL_SUF := .cmo
+
+ DEPFLAGS :=
+ MAKE_DEPS := $(MLDEPS) $(BCDEPIS)
+
+ ifdef CREATE_LIB
+ override CFLAGS := $(PIC_CFLAGS) $(CFLAGS)
+ override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS)
+ ifndef STATIC
+ ifneq ($(strip $(OBJ_LINK)),)
+ MAKEDLL := $(DLLSONAME)
+ ALL_LDFLAGS := -dllib $(DLLSONAME)
+ endif
+ endif
+ endif
+
+ ifndef NO_CUSTOM
+ ifneq "$(strip $(OBJ_LINK) $(THREADS) $(MAYBE_IDL) $(CLIBS))" ""
+ ALL_LDFLAGS += -custom
+ endif
+ endif
+
+ ALL_LDFLAGS += $(INCFLAGS) $(OCAMLLDFLAGS) $(OCAMLBLDFLAGS) \
+ $(COMMON_LDFLAGS) $(LIBS:%=%.cma)
+ CAMLIDLDLLFLAGS :=
+
+ ifdef THREADS
+ ifdef VMTHREADS
+ THREAD_FLAG := -vmthread
+ else
+ THREAD_FLAG := -thread
+ endif
+ ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS)
+ ifndef CREATE_LIB
+ ifndef REAL_OCAMLFIND
+ ALL_LDFLAGS := unix.cma threads.cma $(ALL_LDFLAGS)
+ endif
+ endif
+ endif
+
+# we have to make native-code
+else
+ EXTRADEPS := $(addsuffix .cmxa,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i))))
+ ifndef PROFILING
+ SPECIAL_OCAMLFLAGS := $(OCAMLNCFLAGS)
+ PLDFLAGS :=
+ else
+ SPECIAL_OCAMLFLAGS := -p $(OCAMLNCFLAGS)
+ PLDFLAGS := -p
+ endif
+
+ REAL_IMPL := $(IMPL_CMX)
+ REAL_IMPL_INTF := $(IMPLX_INTF)
+ IMPL_SUF := .cmx
+
+ override CPPFLAGS := -DNATIVE_CODE $(CPPFLAGS)
+
+ DEPFLAGS := -native
+ MAKE_DEPS := $(MLDEPS) $(NCDEPIS)
+
+ ALL_LDFLAGS := $(PLDFLAGS) $(INCFLAGS) $(OCAMLLDFLAGS) \
+ $(OCAMLNLDFLAGS) $(COMMON_LDFLAGS)
+ CAMLIDLDLLFLAGS := -opt
+
+ ifndef CREATE_LIB
+ ALL_LDFLAGS += $(LIBS:%=%.cmxa)
+ else
+ override CFLAGS := $(PIC_CFLAGS) $(CFLAGS)
+ override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS)
+ endif
+
+ ifdef THREADS
+ THREAD_FLAG := -thread
+ ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS)
+ ifndef CREATE_LIB
+ ifndef REAL_OCAMLFIND
+ ALL_LDFLAGS := unix.cmxa threads.cmxa $(ALL_LDFLAGS)
+ endif
+ endif
+ endif
+endif
+
+export MAKE_DEPS
+
+ifdef ANNOTATE
+ ANNOT_FLAG := -dtypes
+else
+endif
+
+ALL_OCAMLCFLAGS := $(THREAD_FLAG) $(ANNOT_FLAG) $(OCAMLFLAGS) \
+ $(INCFLAGS) $(SPECIAL_OCAMLFLAGS)
+
+ifdef make_deps
+ -include $(MAKE_DEPS)
+ PRE_TARGETS :=
+endif
+
+###########################################################################
+# USER RULES
+
+# Call "OCamlMakefile QUIET=" to get rid of all of the @'s.
+QUIET=@
+
+# generates byte-code (default)
+byte-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes
+bc: byte-code
+
+byte-code-nolink: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes
+bcnl: byte-code-nolink
+
+top: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(TOPRESULT) \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes
+
+# generates native-code
+
+native-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ make_deps=yes
+nc: native-code
+
+native-code-nolink: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ make_deps=yes
+ncnl: native-code-nolink
+
+# generates byte-code libraries
+byte-code-library: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(BCRESULT).cma \
+ REAL_RESULT="$(BCRESULT)" \
+ CREATE_LIB=yes \
+ make_deps=yes
+bcl: byte-code-library
+
+# generates native-code libraries
+native-code-library: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(NCRESULT).cmxa \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ CREATE_LIB=yes \
+ make_deps=yes
+ncl: native-code-library
+
+ifdef WIN32
+# generates byte-code dll
+byte-code-dll: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(BCRESULT).dll \
+ REAL_RESULT="$(BCRESULT)" \
+ make_deps=yes
+bcd: byte-code-dll
+
+# generates native-code dll
+native-code-dll: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(NCRESULT).dll \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ make_deps=yes
+ncd: native-code-dll
+endif
+
+# generates byte-code with debugging information
+debug-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes \
+ OCAMLFLAGS="-g $(OCAMLFLAGS)" \
+ OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
+dc: debug-code
+
+debug-code-nolink: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes \
+ OCAMLFLAGS="-g $(OCAMLFLAGS)" \
+ OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
+dcnl: debug-code-nolink
+
+# generates byte-code libraries with debugging information
+debug-code-library: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(BCRESULT).cma \
+ REAL_RESULT="$(BCRESULT)" make_deps=yes \
+ CREATE_LIB=yes \
+ OCAMLFLAGS="-g $(OCAMLFLAGS)" \
+ OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)"
+dcl: debug-code-library
+
+# generates byte-code for profiling
+profiling-byte-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \
+ REAL_RESULT="$(BCRESULT)" PROFILING="y" \
+ make_deps=yes
+pbc: profiling-byte-code
+
+# generates native-code
+
+profiling-native-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ PROFILING="y" \
+ make_deps=yes
+pnc: profiling-native-code
+
+# generates byte-code libraries
+profiling-byte-code-library: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(BCRESULT).cma \
+ REAL_RESULT="$(BCRESULT)" PROFILING="y" \
+ CREATE_LIB=yes \
+ make_deps=yes
+pbcl: profiling-byte-code-library
+
+# generates native-code libraries
+profiling-native-code-library: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(RES_CLIB) $(NCRESULT).cmxa \
+ REAL_RESULT="$(NCRESULT)" PROFILING="y" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ CREATE_LIB=yes \
+ make_deps=yes
+pncl: profiling-native-code-library
+
+# packs byte-code objects
+pack-byte-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT).cmo \
+ REAL_RESULT="$(BCRESULT)" \
+ PACK_LIB=yes make_deps=yes
+pabc: pack-byte-code
+
+# packs native-code objects
+pack-native-code: $(PRE_TARGETS)
+ $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \
+ $(NCRESULT).cmx $(NCRESULT).o \
+ REAL_RESULT="$(NCRESULT)" \
+ REAL_OCAMLC="$(OCAMLOPT)" \
+ PACK_LIB=yes make_deps=yes
+panc: pack-native-code
+
+# generates HTML-documentation
+htdoc: doc/$(RESULT)/html
+
+# generates Latex-documentation
+ladoc: doc/$(RESULT)/latex
+
+# generates PostScript-documentation
+psdoc: doc/$(RESULT)/latex/doc.ps
+
+# generates PDF-documentation
+pdfdoc: doc/$(RESULT)/latex/doc.pdf
+
+# generates all supported forms of documentation
+doc: htdoc ladoc psdoc pdfdoc
+
+###########################################################################
+# LOW LEVEL RULES
+
+$(REAL_RESULT): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) $(RESULTDEPS)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) \
+ $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \
+ $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \
+ $(REAL_IMPL)
+
+nolink: $(REAL_IMPL_INTF) $(OBJ_LINK)
+
+ifdef WIN32
+$(REAL_RESULT).dll: $(REAL_IMPL_INTF) $(OBJ_LINK)
+ $(CAMLIDLDLL) $(CAMLIDLDLLFLAGS) $(OBJ_LINK) $(CLIBS) \
+ -o $@ $(REAL_IMPL)
+endif
+
+%$(TOPSUFFIX): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS)
+ $(REAL_OCAMLFIND) $(OCAMLMKTOP) \
+ $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \
+ $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \
+ $(REAL_IMPL)
+
+.SUFFIXES: .mli .ml .cmi .cmo .cmx .cma .cmxa .$(EXT_OBJ) \
+ .mly .di .d .$(EXT_LIB) .idl %.oxridl .c .$(EXT_CXX) .h .so \
+ .rep .zog .glade
+
+ifndef STATIC
+ifdef MINGW
+$(DLLSONAME): $(OBJ_LINK)
+ $(CC) $(CFLAGS) $(CFLAGS_WIN32) $(OBJ_LINK) -shared -o $@ \
+ -Wl,--whole-archive $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/lib%.a))) \
+ $(OCAMLLIBPATH)/ocamlrun.a \
+ -Wl,--export-all-symbols \
+ -Wl,--no-whole-archive
+else
+ifdef MSVC
+$(DLLSONAME): $(OBJ_LINK)
+ link /NOLOGO /DLL /OUT:$@ $(OBJ_LINK) \
+ $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/%.lib))) \
+ $(OCAMLLIBPATH)/ocamlrun.lib
+
+else
+$(DLLSONAME): $(OBJ_LINK)
+ $(OCAMLMKLIB) $(INCFLAGS) $(CLIBFLAGS) \
+ -o $(CLIB_BASE) $(OBJ_LINK) $(CLIBS:%=-l%) \
+ $(OCAMLMKLIB_FLAGS)
+endif
+endif
+endif
+
+ifndef LIB_PACK_NAME
+$(RESULT).cma: $(REAL_IMPL_INTF) $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) \
+ $(OBJS_LIBS) -o $@ $(OCAMLBLDFLAGS) $(REAL_IMPL)
+
+$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(REAL_IMPL_INTF) $(EXTRADEPS) $(RESULTDEPS)
+ $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) \
+ $(OCAMLNLDFLAGS) -o $@ $(REAL_IMPL)
+else
+ifdef BYTE_OCAML
+$(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo: $(REAL_IMPL_INTF)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmo $(REAL_IMPL)
+else
+$(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx: $(REAL_IMPL_INTF)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmx $(REAL_IMPL)
+endif
+
+$(RESULT).cma: $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) \
+ $(OBJS_LIBS) -o $@ $(OCAMLBLDFLAGS) $(LIB_PACK_NAME).cmo
+
+$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx $(EXTRADEPS) $(RESULTDEPS)
+ $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) \
+ $(OCAMLNLDFLAGS) -o $@ $(LIB_PACK_NAME).cmx
+endif
+
+$(RES_CLIB): $(OBJ_LINK)
+ifndef MSVC
+ ifneq ($(strip $(OBJ_LINK)),)
+ $(AR) rcs $@ $(OBJ_LINK)
+ endif
+else
+ ifneq ($(strip $(OBJ_LINK)),)
+ lib -nologo -debugtype:cv -out:$(RES_CLIB) $(OBJ_LINK)
+ endif
+endif
+
+.mli.cmi: $(EXTRADEPS)
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c $(THREAD_FLAG) $(ANNOT_FLAG) \
+ $(OCAMLFLAGS) $(INCFLAGS) $<; \
+ $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c $(THREAD_FLAG) $(ANNOT_FLAG) \
+ $(OCAMLFLAGS) $(INCFLAGS) $<; \
+ else \
+ echo $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c -pp \"$$pp $(PPFLAGS)\" $(THREAD_FLAG) $(ANNOT_FLAG) \
+ $(OCAMLFLAGS) $(INCFLAGS) $<; \
+ $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c -pp "$$pp $(PPFLAGS)" $(THREAD_FLAG) $(ANNOT_FLAG) \
+ $(OCAMLFLAGS) $(INCFLAGS) $<; \
+ fi
+
+.ml.cmi .ml.$(EXT_OBJ) .ml.cmx .ml.cmo: $(EXTRADEPS)
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c $(ALL_OCAMLCFLAGS) $<; \
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c $(ALL_OCAMLCFLAGS) $<; \
+ else \
+ echo $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c -pp \"$$pp $(PPFLAGS)\" $(ALL_OCAMLCFLAGS) $<; \
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \
+ -c -pp "$$pp $(PPFLAGS)" $(ALL_OCAMLCFLAGS) $<; \
+ fi
+
+ifdef PACK_LIB
+$(REAL_RESULT).cmo $(REAL_RESULT).cmx $(REAL_RESULT).o: $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS)
+ $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack $(ALL_LDFLAGS) \
+ $(OBJS_LIBS) -o $@ $(REAL_IMPL)
+endif
+
+.PRECIOUS: %.ml
+%.ml: %.mll
+ $(OCAMLLEX) $<
+
+.PRECIOUS: %.ml %.mli
+%.ml %.mli: %.mly
+ $(OCAMLYACC) $(YFLAGS) $<
+ $(QUIET)pp=`sed -n -e 's/.*(\*pp \([^*]*\) \*).*/\1/p;q' $<`; \
+ if [ ! -z "$$pp" ]; then \
+ mv $*.ml $*.ml.temporary; \
+ echo "(*pp $$pp $(PPFLAGS)*)" > $*.ml; \
+ cat $*.ml.temporary >> $*.ml; \
+ rm $*.ml.temporary; \
+ mv $*.mli $*.mli.temporary; \
+ echo "(*pp $$pp $(PPFLAGS)*)" > $*.mli; \
+ cat $*.mli.temporary >> $*.mli; \
+ rm $*.mli.temporary; \
+ fi
+
+
+.PRECIOUS: %.ml
+%.ml: %.rep
+ $(CAMELEON_REPORT) $(CAMELEON_REPORT_FLAGS) -gen $<
+
+.PRECIOUS: %.ml
+%.ml: %.zog
+ $(CAMELEON_ZOGGY) $(CAMELEON_ZOGGY_FLAGS) -impl $< > $@
+
+.PRECIOUS: %.ml
+%.ml: %.glade
+ $(OCAML_GLADECC) $(OCAML_GLADECC_FLAGS) $< > $@
+
+.PRECIOUS: %.ml %.mli
+%.ml %.mli: %.oxridl
+ $(OXRIDL) $<
+
+.PRECIOUS: %.ml %.mli %_stubs.c %.h
+%.ml %.mli %_stubs.c %.h: %.idl
+ $(CAMLIDL) $(MAYBE_IDL_HEADER) $(IDLFLAGS) \
+ $(CAMLIDLFLAGS) $<
+ $(QUIET)if [ $(NOIDLHEADER) ]; then touch $*.h; fi
+
+.c.$(EXT_OBJ):
+ $(OCAMLC) -c -cc "$(CC)" -ccopt "$(CFLAGS) \
+ $(CPPFLAGS) $(CPPFLAGS_WIN32) \
+ $(CFLAGS_WIN32) $(CINCFLAGS) $(CFLAG_O)$@ " $<
+
+.$(EXT_CXX).$(EXT_OBJ):
+ $(CXX) -c $(CXXFLAGS) $(CINCFLAGS) $(CPPFLAGS) \
+ -I'$(OCAMLLIBPATH)' \
+ $< $(CFLAG_O)$@
+
+$(MLDEPDIR)/%.d: %.ml
+ $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
+ $(DINCFLAGS) $< \> $@; \
+ $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
+ $(DINCFLAGS) $< > $@; \
+ else \
+ echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
+ -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \
+ $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \
+ -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \
+ fi
+
+$(BCDIDIR)/%.di $(NCDIDIR)/%.di: %.mli
+ $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< \> $@; \
+ $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< > $@; \
+ else \
+ echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \
+ -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \
+ $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \
+ -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \
+ fi
+
+doc/$(RESULT)/html: $(DOC_FILES)
+ #rm -rf $@
+ #mkdir -p $@
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(OCAMLDOC) -html -d $@ $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \
+ $(OCAMLDOC) -html -d $@ $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \
+ else \
+ echo $(OCAMLDOC) -pp \"$$pp $(PPFLAGS)\" -html -d $@ $(OCAMLDOCFLAGS) \
+ $(INCFLAGS) $(DOC_FILES); \
+ $(OCAMLDOC) -pp "$$pp $(PPFLAGS)" -html -d $@ $(OCAMLDOCFLAGS) \
+ $(INCFLAGS) $(DOC_FILES); \
+ fi
+
+doc/$(RESULT)/latex: $(DOC_FILES)
+ #rm -rf $@
+ #mkdir -p $@
+ $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \
+ if [ -z "$$pp" ]; then \
+ echo $(OCAMLDOC) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) \
+ $(DOC_FILES) -o $@/doc.tex; \
+ $(OCAMLDOC) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES) \
+ -o $@/doc.tex; \
+ else \
+ echo $(OCAMLDOC) -pp \"$$pp $(PPFLAGS)\" -latex $(OCAMLDOCFLAGS) \
+ $(INCFLAGS) $(DOC_FILES) -o $@/doc.tex; \
+ $(OCAMLDOC) -pp "$$pp $(PPFLAGS)" -latex $(OCAMLDOCFLAGS) \
+ $(INCFLAGS) $(DOC_FILES) -o $@/doc.tex; \
+ fi
+
+doc/$(RESULT)/latex/doc.ps: doc/$(RESULT)/latex
+ cd doc/$(RESULT)/latex && \
+ $(LATEX) doc.tex && \
+ $(LATEX) doc.tex && \
+ $(DVIPS) $(DVIPSFLAGS) doc.dvi -o $(@F)
+
+doc/$(RESULT)/latex/doc.pdf: doc/$(RESULT)/latex/doc.ps
+ cd doc/$(RESULT)/latex && $(PS2PDF) $(<F)
+
+define make_subproj
+.PHONY:
+subproj_$(1):
+ $$(eval $$(call PROJ_$(1)))
+ $(QUIET)if [ "$(SUBTARGET)" != "all" ]; then \
+ $(MAKE) -f $(OCAMLMAKEFILE) $(SUBTARGET); \
+ fi
+endef
+
+$(foreach subproj,$(SUBPROJS),$(eval $(call make_subproj,$(subproj))))
+
+.PHONY:
+subprojs: $(SUBPROJS:%=subproj_%)
+
+###########################################################################
+# (UN)INSTALL RULES FOR LIBRARIES
+
+.PHONY: libinstall
+libinstall: all
+ $(QUIET)printf "\nInstalling library with ocamlfind\n"
+ $(OCAMLFIND) install $(OCAMLFIND_INSTFLAGS) $(RESULT) META $(LIBINSTALL_FILES)
+ $(QUIET)printf "\nInstallation successful.\n"
+
+.PHONY: libuninstall
+libuninstall:
+ $(QUIET)printf "\nUninstalling library with ocamlfind\n"
+ $(OCAMLFIND) remove $(OCAMLFIND_INSTFLAGS) $(RESULT)
+ $(QUIET)printf "\nUninstallation successful.\n"
+
+.PHONY: rawinstall
+rawinstall: all
+ $(QUIET)printf "\nInstalling library to: $(OCAML_LIB_INSTALL)\n"
+ -install -d $(OCAML_LIB_INSTALL)
+ for i in $(LIBINSTALL_FILES); do \
+ if [ -f $$i ]; then \
+ install -c -m 0644 $$i $(OCAML_LIB_INSTALL); \
+ fi; \
+ done
+ $(QUIET)printf "\nInstallation successful.\n"
+
+.PHONY: rawuninstall
+rawuninstall:
+ $(QUIET)printf "\nUninstalling library from: $(OCAML_LIB_INSTALL)\n"
+ cd $(OCAML_LIB_INSTALL) && rm $(notdir $(LIBINSTALL_FILES))
+ $(QUIET)printf "\nUninstallation successful.\n"
+
+###########################################################################
+# MAINTAINANCE RULES
+
+.PHONY: clean
+clean::
+ rm -f $(TARGETS) $(TRASH)
+ rm -rf $(BCDIDIR) $(NCDIDIR) $(MLDEPDIR)
+
+.PHONY: cleanup
+cleanup::
+ rm -f $(NONEXECS) $(TRASH)
+ rm -rf $(BCDIDIR) $(NCDIDIR) $(MLDEPDIR)
+
+.PHONY: clean-doc
+clean-doc::
+ rm -rf doc
+
+.PHONY: nobackup
+nobackup:
+ rm -f *.bak *~ *.dup
diff --git a/examples/wordpress/WordPress.ml b/examples/wordpress/WordPress.ml
new file mode 100644
index 0000000..f816848
--- /dev/null
+++ b/examples/wordpress/WordPress.ml
@@ -0,0 +1,746 @@
+(*
+ * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet
+ * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *)
+
+exception Type_error of string
+exception Unknown_field of string
+
+let strict = ref false
+
+let warn exn =
+ if !strict
+ then raise exn
+ else prerr_endline (Printexc.to_string exn)
+
+let map_array f = function
+ | `Array items -> List.map f items
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+let iter_struct f = function
+ | `Struct pairs -> List.iter f pairs
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+let int_value = function
+ | `Int n -> n
+ | `String s -> int_of_string s
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+module Blog = struct
+ type t = { mutable is_admin : bool;
+ mutable url : string;
+ mutable blog_id : int;
+ mutable blog_name : string;
+ mutable xmlrpc : string; }
+
+ let make () =
+ {is_admin=false;
+ url="";
+ blog_id=0;
+ blog_name="";
+ xmlrpc=""}
+
+ let of_xmlrpc value =
+ let result = make () in
+ iter_struct
+ (function
+ | ("isAdmin", `Boolean v) -> result.is_admin <- v
+ | ("url", `String v) -> result.url <- v
+ | ("blogid", `String v) -> result.blog_id <- int_of_string v
+ | ("blogid", `Int v) -> result.blog_id <- v
+ | ("blogName", `String v) -> result.blog_name <- v
+ | ("xmlrpc", `String v) -> result.xmlrpc <- v
+ | (field, _) -> warn (Unknown_field field))
+ value;
+ result
+end
+
+module Category = struct
+ type t = { mutable category_id : int;
+ mutable parent_id : int;
+ mutable description : string;
+ mutable category_name : string;
+ mutable html_url : string;
+ mutable rss_url : string; }
+
+ let make () =
+ {category_id=0;
+ parent_id=0;
+ description="";
+ category_name="";
+ html_url="";
+ rss_url=""}
+
+ let of_xmlrpc value =
+ let result = make () in
+ iter_struct
+ (function
+ | ("categoryId", `String v) -> result.category_id <- int_of_string v
+ | ("categoryId", `Int v) -> result.category_id <- v
+ | ("parentId", `String v) -> result.parent_id <- int_of_string v
+ | ("parentId", `Int v) -> result.parent_id <- v
+ | ("description", `String v) -> result.description <- v
+ | ("categoryName", `String v) -> result.category_name <- v
+ | ("htmlUrl", `String v) -> result.html_url <- v
+ | ("rssUrl", `String v) -> result.rss_url <- v
+ | (field, _) -> warn (Unknown_field field))
+ value;
+ result
+end
+
+module CommentCount = struct
+ type t = { mutable approved : int;
+ mutable awaiting_moderation : int;
+ mutable spam : int;
+ mutable total_comments : int; }
+
+ let make () =
+ {approved=0;
+ awaiting_moderation=0;
+ spam=0;
+ total_comments=0}
+
+ let of_xmlrpc value =
+ let result = make () in
+ iter_struct
+ (function
+ | ("approved", `String v) -> result.approved <- int_of_string v
+ | ("approved", `Int v) -> result.approved <- v
+ | ("awaiting_moderation", `Int v) -> result.awaiting_moderation <- v
+ | ("spam", `Int v) -> result.spam <- v
+ | ("total_comments", `Int v) -> result.total_comments <- v
+ | (field, _) -> warn (Unknown_field field))
+ value;
+ result
+end
+
+module Comment = struct
+ type t = { mutable date_created : XmlRpcDateTime.t;
+ mutable user_id : int;
+ mutable comment_id : int;
+ mutable parent : int;
+ mutable status : string;
+ mutable content : string;
+ mutable link : string;
+ mutable post_id : int;
+ mutable post_title : string;
+ mutable author : string;
+ mutable author_url : string;
+ mutable author_email : string;
+ mutable author_ip : string;
+ mutable typ : string }
+
+ let make () =
+ {date_created=(0,0,0,0,0,0,0);
+ user_id=0;
+ comment_id=0;
+ parent=0;
+ status="";
+ content="";
+ link="";
+ post_id=0;
+ post_title="";
+ author="";
+ author_url="";
+ author_email="";
+ author_ip="";
+ typ=""}
+
+ let of_xmlrpc value =
+ let result = make () in
+ iter_struct
+ (function
+ | ("date_created_gmt", `DateTime v) -> result.date_created <- v
+ | ("user_id", `String v) -> result.user_id <- int_of_string v
+ | ("user_id", `Int v) -> result.user_id <- v
+ | ("comment_id", `String v) -> result.comment_id <- int_of_string v
+ | ("comment_id", `Int v) -> result.comment_id <- v
+ | ("parent", `String v) -> result.parent <- int_of_string v
+ | ("parent", `Int v) -> result.parent <- v
+ | ("status", `String v) -> result.status <- v
+ | ("content", `String v) -> result.content <- v
+ | ("link", `String v) -> result.link <- v
+ | ("post_id", `String v) -> result.post_id <- int_of_string v
+ | ("post_id", `Int v) -> result.post_id <- v
+ | ("post_title", `String v) -> result.post_title <- v
+ | ("author", `String v) -> result.author <- v
+ | ("author_url", `String v) -> result.author_url <- v
+ | ("author_email", `String v) -> result.author_email <- v
+ | ("author_ip", `String v) -> result.author_ip <- v
+ | ("type", `String v) -> result.typ <- v
+ | (field, _) -> warn (Unknown_field field))
+ value;
+ result
+
+ let to_xmlrpc comment =
+ `Struct ["date_created_gmt", `DateTime (XmlRpcDateTime.set_tz_offset 0
+ comment.date_created);
+ "user_id", `Int comment.user_id;
+ "comment_id", `Int comment.comment_id;
+ "parent", `Int comment.parent;
+ "status", `String comment.status;
+ "content", `String comment.content;
+ "link", `String comment.link;
+ "post_id", `Int comment.post_id;
+ "post_title", `String comment.post_title;
+ "author", `String comment.author;
+ "author_url", `String comment.author_url;
+ "author_email", `String comment.author_email;
+ "author_ip", `String comment.author_ip;
+ "type", `String comment.typ]
+end
+
+module CustomField = struct
+ type t = { mutable id : int option;
+ mutable key : string option;
+ mutable value : string }
+
+ let make () =
+ {id=None;
+ key=None;
+ value=""}
+
+ let of_xmlrpc value =
+ let result = make () in
+ iter_struct
+ (function
+ | ("id", `String v) -> result.id <- Some (int_of_string v)
+ | ("id", `Int v) -> result.id <- Some v
+ | ("key", `String v) -> result.key <- Some v
+ | ("value", `String v) -> result.value <- v
+ | (field, _) -> warn (Unknown_field field))
+ value;
+ result
+
+ let to_xmlrpc field =
+ match field with
+ | {id=None; key=None; value=value} ->
+ `Struct ["value", `String value]
+ | {id=Some id; key=None; value=value} ->
+ `Struct ["id", `Int id; "value", `String value]
+ | {id=None; key=Some key; value=value} ->
+ `Struct ["key", `String key; "value", `String value]
+ | {id=Some id; key=Some key; value=value} ->
+ `Struct ["id", `Int id; "key", `String key; "value", `String value]
+end
+
+module Option = struct
+ type t = { mutable desc : string;
+ mutable readonly : bool;
+ mutable value : string; }
+
+ let make () =
+ {desc="";
+ readonly=false;
+ value=""}
+
+ let of_xmlrpc value =
+ let result = make () in
+ iter_struct
+ (function
+ | ("desc", `String v) -> result.desc <- v
+ | ("readonly", `Boolean v) -> result.readonly <- v
+ | ("value", `String v) -> result.value <- v
+ | (field, _) -> warn (Unknown_field field))
+ value;
+ result
+end
+
+module User = struct
+ type t = { mutable user_id : int;
+ mutable user_login : string;
+ mutable display_name : string;
+ mutable user_email : string;
+ mutable meta_value : string; }
+
+ let make () =
+ {user_id=0;
+ user_login="";
+ display_name="";
+ user_email="";
+ meta_value=""}
+
+ let of_xmlrpc value =
+ let result = make () in
+ iter_struct
+ (function
+ | ("user_id", `String v) -> result.user_id <- int_of_string v
+ | ("user_id", `Int v) -> result.user_id <- v
+ | ("user_login", `String v) -> result.user_login <- v
+ | ("display_name", `String v) -> result.display_name <- v
+ | ("user_email", `String v) -> result.user_email <- v
+ | ("meta_value", `String v) -> result.meta_value <- v
+ | (field, _) -> warn (Unknown_field field))
+ value;
+ result
+end
+
+module PageListItem = struct
+ type t = { mutable page_id : int;
+ mutable page_title : string;
+ mutable page_parent_id : int;
+ mutable date_created : XmlRpcDateTime.t;
+ }
+
+ let make () =
+ {page_id=0;
+ page_title="";
+ page_parent_id=0;
+ date_created=(0,0,0,0,0,0,0)}
+
+ let of_xmlrpc value =
+ let result = make () in
+ iter_struct
+ (function
+ | ("page_id", `String v) -> result.page_id <- int_of_string v
+ | ("page_id", `Int v) -> result.page_id <- v
+ | ("page_title", `String v) -> result.page_title <- v
+ | ("page_parent_id", `String v) -> result.page_parent_id <- int_of_string v
+ | ("page_parent_id", `Int v) -> result.page_parent_id <- v
+ | ("dateCreated", `DateTime v) -> result.date_created <- v
+ | ("date_created_gmt", `DateTime v) -> result.date_created <- v
+ | (field, _) -> warn (Unknown_field field))
+ value;
+ result
+end
+
+module Page = struct
+ type t = { mutable date_created : XmlRpcDateTime.t;
+ mutable user_id : int;
+ mutable page_id : int;
+ mutable page_status : string;
+ mutable description : string;
+ mutable title : string;
+ mutable link : string;
+ mutable permalink : string;
+ mutable categories : string list;
+ mutable excerpt : string;
+ mutable text_more : string;
+ mutable mt_allow_comments : bool;
+ mutable mt_allow_pings : bool;
+ mutable wp_slug : string;
+ mutable wp_password : string;
+ mutable wp_author : string;
+ mutable wp_page_parent_id : int;
+ mutable wp_page_parent_title : string;
+ mutable wp_page_order : int;
+ mutable wp_author_id : int;
+ mutable wp_author_display_name : string;
+ mutable custom_fields : CustomField.t list;
+ mutable wp_page_template : string; }
+
+ let make () =
+ {date_created=(0,0,0,0,0,0,0);
+ user_id=0;
+ page_id=0;
+ page_status="";
+ description="";
+ title="";
+ link="";
+ permalink="";
+ categories=[];
+ excerpt="";
+ text_more="";
+ mt_allow_comments=false;
+ mt_allow_pings=false;
+ wp_slug="";
+ wp_password="";
+ wp_author="";
+ wp_page_parent_id=0;
+ wp_page_parent_title="";
+ wp_page_order=0;
+ wp_author_id=0;
+ wp_author_display_name="";
+ custom_fields=[];
+ wp_page_template=""}
+
+ let of_xmlrpc value =
+ let result = make () in
+ iter_struct
+ (function
+ | ("dateCreated", `DateTime v) -> result.date_created <- v
+ | ("date_created_gmt", `DateTime v) -> result.date_created <- v
+ | ("userid", `String v) -> result.user_id <- int_of_string v
+ | ("userid", `Int v) -> result.user_id <- v
+ | ("page_id", `String v) -> result.page_id <- int_of_string v
+ | ("page_id", `Int v) -> result.page_id <- v
+ | ("page_status", `String v) -> result.page_status <- v
+ | ("description", `String v) -> result.description <- v
+ | ("title", `String v) -> result.title <- v
+ | ("link", `String v) -> result.link <- v
+ | ("permaLink", `String v) -> result.permalink <- v
+ | ("categories", `Array v) ->
+ result.categories <- List.map XmlRpc.dump v
+ | ("excerpt", `String v) -> result.excerpt <- v
+ | ("text_more", `String v) -> result.text_more <- v
+ | ("mt_excerpt", `String v) -> result.excerpt <- v
+ | ("mt_text_more", `String v) -> result.text_more <- v
+ | ("mt_allow_comments", `Int v) -> result.mt_allow_comments <- v<>0
+ | ("mt_allow_comments", `Boolean v) -> result.mt_allow_comments <- v
+ | ("mt_allow_pings", `Int v) -> result.mt_allow_pings <- v<>0
+ | ("mt_allow_pings", `Boolean v) -> result.mt_allow_pings <- v
+ | ("wp_slug", `String v) -> result.wp_slug <- v
+ | ("wp_password", `String v) -> result.wp_password <- v
+ | ("wp_author", `String v) -> result.wp_author <- v
+ | ("wp_author_display_name", `String v) ->
+ result.wp_author_display_name <- v
+ | ("wp_page_parent_id", `String v) ->
+ result.wp_page_parent_id <- int_of_string v
+ | ("wp_page_parent_id", `Int v) ->
+ result.wp_page_parent_id <- v
+ | ("wp_page_parent_title", `String v) ->
+ result.wp_page_parent_title <- v
+ | ("wp_page_order", `String v) ->
+ result.wp_page_order <- int_of_string v
+ | ("wp_page_order", `Int v) ->
+ result.wp_page_order <- v
+ | ("wp_author_id", `String v) ->
+ result.wp_author_id <- int_of_string v
+ | ("wp_author_id", `Int v) ->
+ result.wp_author_id <- v
+ | ("custom_fields", `Array v) ->
+ result.custom_fields <- List.map CustomField.of_xmlrpc v
+ | ("wp_page_template", `String v) ->
+ result.wp_page_template <- v
+ | (field, _) -> warn (Unknown_field field))
+ value;
+ result
+
+ let to_xmlrpc page =
+ `Struct ["userid", `Int page.user_id;
+ "page_id", `Int page.page_id;
+ "page_status", `String page.page_status;
+ "wp_slug", `String page.wp_slug;
+ "wp_password", `String page.wp_password;
+ "wp_author", `String page.wp_author;
+ "wp_author_display_name", `String page.wp_author_display_name;
+ "wp_page_parent_id", `Int page.wp_page_parent_id;
+ "wp_page_parent_title", `String page.wp_page_parent_title;
+ "wp_page_order", `Int page.wp_page_order;
+ "wp_author_id", `Int page.wp_author_id;
+ "title", `String page.title;
+ "description", `String page.description;
+ "link", `String page.link;
+ "permaLink", `String page.permalink;
+ "mt_excerpt", `String page.excerpt;
+ "mt_text_more", `String page.text_more;
+ "mt_allow_comments", `Boolean page.mt_allow_comments;
+ "mt_allow_pings", `Boolean page.mt_allow_pings;
+ "dateCreated", `DateTime page.date_created;
+ "date_created_gmt", `DateTime (XmlRpcDateTime.set_tz_offset 0
+ page.date_created);
+ "categories", `Array (List.map
+ (fun s -> `String s)
+ page.categories);
+ "custom_fields", `Array (List.map
+ CustomField.to_xmlrpc
+ page.custom_fields);
+ "wp_page_template", `String page.wp_page_template]
+end
+
+module Post = struct
+ type t = { mutable user_id : int;
+ mutable post_id : int;
+ mutable post_status : string;
+ mutable date_created : XmlRpcDateTime.t;
+ mutable description : string;
+ mutable title : string;
+ mutable link : string;
+ mutable permalink : string;
+ mutable categories : string list;
+ mutable excerpt : string;
+ mutable text_more : string;
+ mutable mt_allow_comments : bool;
+ mutable mt_allow_pings : bool;
+ mutable mt_keywords : string;
+ mutable wp_slug : string;
+ mutable wp_password : string;
+ mutable wp_author_id : int;
+ mutable wp_author_display_name : string;
+ mutable custom_fields : CustomField.t list; }
+
+ let make () =
+ {date_created=(0,0,0,0,0,0,0);
+ user_id=0;
+ post_id=0;
+ post_status="";
+ description="";
+ title="";
+ link="";
+ permalink="";
+ categories=[];
+ excerpt="";
+ text_more="";
+ mt_allow_comments=false;
+ mt_allow_pings=false;
+ mt_keywords="";
+ wp_slug="";
+ wp_password="";
+ wp_author_id=0;
+ wp_author_display_name="";
+ custom_fields=[]}
+
+ let of_xmlrpc value =
+ let result = make () in
+ iter_struct
+ (function
+ | ("dateCreated", `DateTime v) -> result.date_created <- v
+ | ("date_created_gmt", `DateTime v) -> result.date_created <- v
+ | ("userid", `String v) -> result.user_id <- int_of_string v
+ | ("userid", `Int v) -> result.user_id <- v
+ | ("postid", `String v) -> result.post_id <- int_of_string v
+ | ("postid", `Int v) -> result.post_id <- v
+ | ("post_status", `String v) -> result.post_status <- v
+ | ("description", `String v) -> result.description <- v
+ | ("title", `String v) -> result.title <- v
+ | ("link", `String v) -> result.link <- v
+ | ("permaLink", `String v) -> result.permalink <- v
+ | ("categories", `Array v) ->
+ result.categories <- List.map XmlRpc.dump v
+ | ("mt_excerpt", `String v) -> result.excerpt <- v
+ | ("mt_text_more", `String v) -> result.text_more <- v
+ | ("mt_allow_comments", `Int v) -> result.mt_allow_comments <- v<>0
+ | ("mt_allow_comments", `Boolean v) -> result.mt_allow_comments <- v
+ | ("mt_allow_pings", `Int v) -> result.mt_allow_pings <- v<>0
+ | ("mt_allow_pings", `Boolean v) -> result.mt_allow_pings <- v
+ | ("mt_keywords", `String v) -> result.mt_keywords <- v
+ | ("wp_slug", `String v) -> result.wp_slug <- v
+ | ("wp_password", `String v) -> result.wp_password <- v
+ | ("wp_author_id", `String v) -> result.wp_author_id <- int_of_string v
+ | ("wp_author_id", `Int v) -> result.wp_author_id <- v
+ | ("wp_author_display_name", `String v) ->
+ result.wp_author_display_name <- v
+ | ("custom_fields", `Array v) ->
+ result.custom_fields <- List.map CustomField.of_xmlrpc v
+ | (field, _) -> warn (Unknown_field field))
+ value;
+ result
+
+ let to_xmlrpc post =
+ `Struct ["dateCreated", `DateTime post.date_created;
+ "date_created_gmt", `DateTime (XmlRpcDateTime.set_tz_offset 0
+ post.date_created);
+ "userid", `Int post.user_id;
+ "postid", `Int post.post_id;
+ "post_status", `String post.post_status;
+ "description", `String post.description;
+ "title", `String post.title;
+ "link", `String post.link;
+ "permaLink", `String post.permalink;
+ "categories", `Array (List.map
+ (fun s -> `String s)
+ post.categories);
+ "mt_excerpt", `String post.excerpt;
+ "mt_text_more", `String post.text_more;
+ "mt_allow_comments", `Boolean post.mt_allow_comments;
+ "mt_allow_pings", `Boolean post.mt_allow_pings;
+ "mt_keywords", `String post.mt_keywords;
+ "wp_slug", `String post.wp_slug;
+ "wp_password", `String post.wp_password;
+ "wp_author_id", `Int post.wp_author_id;
+ "wp_author_display_name", `String post.wp_author_display_name;
+ "custom_fields", `Array (List.map
+ CustomField.to_xmlrpc
+ post.custom_fields)];
+end
+
+class api ~url ~blog_id ~username ~password =
+object (self)
+ val rpc = new XmlRpc.client url
+ val std_args = [`Int blog_id; `String username; `String password]
+ val blog_id = blog_id
+ val username = username
+ val password = password
+
+ method rpc = rpc
+
+ method get_page page_id =
+ Page.of_xmlrpc (rpc#call "wp.getPage"
+ [`Int blog_id;
+ `Int page_id;
+ `String username;
+ `String password])
+
+ method get_pages () =
+ map_array Page.of_xmlrpc (rpc#call "wp.getPages" std_args)
+
+ method get_page_list () =
+ map_array PageListItem.of_xmlrpc (rpc#call "wp.getPageList" std_args)
+
+ method get_page_status_list () =
+ match rpc#call "wp.getPageStatusList" std_args with
+ | `Struct pairs -> List.map (fun (k, v) -> (k, XmlRpc.dump v)) pairs
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method get_page_templates () =
+ match rpc#call "wp.getPageTemplates" std_args with
+ | `Struct pairs -> List.map (fun (k, v) -> (k, XmlRpc.dump v)) pairs
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method new_page content publish =
+ int_value
+ (rpc#call "wp.newPage"
+ (std_args @ [Page.to_xmlrpc content; `Boolean publish]))
+
+ method edit_page page_id content publish =
+ ignore
+ (rpc#call "wp.editPage" [`Int blog_id;
+ `Int page_id;
+ `String username;
+ `String password;
+ Page.to_xmlrpc content;
+ `Boolean publish])
+
+ method delete_page page_id =
+ ignore
+ (rpc#call "wp.deletePage" (std_args @ [`Int page_id]))
+
+ method get_post post_id =
+ Post.of_xmlrpc (rpc#call "metaWeblog.getPost"
+ [`Int post_id;
+ `String username;
+ `String password])
+
+ method get_recent_posts num_posts =
+ map_array Post.of_xmlrpc (rpc#call "metaWeblog.getRecentPosts"
+ (std_args @ [`Int num_posts]))
+
+ method get_post_status_list () =
+ match rpc#call "wp.getPostStatusList" std_args with
+ | `Struct pairs -> List.map (fun (k, v) -> (k, XmlRpc.dump v)) pairs
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method new_post content publish =
+ int_value
+ (rpc#call "metaWeblog.newPost"
+ (std_args @ [Post.to_xmlrpc content; `Boolean publish]))
+
+ method edit_post post_id content publish =
+ ignore
+ (rpc#call "metaWeblog.editPost" [`Int post_id;
+ `String username;
+ `String password;
+ Post.to_xmlrpc content;
+ `Boolean publish])
+
+ method delete_post post_id =
+ ignore
+ (rpc#call "metaWeblog.deletePost" [`Int blog_id;
+ `Int post_id;
+ `String username;
+ `String password;
+ `Boolean false])
+
+ method get_authors () =
+ map_array User.of_xmlrpc (rpc#call "wp.getAuthors" std_args)
+
+ method get_blogs () =
+ map_array Blog.of_xmlrpc (rpc#call "wp.getUsersBlogs" [`String username;
+ `String password])
+
+ method get_comment_count post_id =
+ CommentCount.of_xmlrpc
+ (rpc#call "wp.getCommentCount" (std_args @ [`Int post_id]))
+
+ method get_comment_status_list () =
+ match rpc#call "wp.getCommentStatusList" std_args with
+ | `Struct pairs -> List.map (fun (k, v) -> (k, XmlRpc.dump v)) pairs
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method get_comment comment_id =
+ Comment.of_xmlrpc
+ (rpc#call "wp.getComment" (std_args @ [`Int comment_id]))
+
+ method get_comments ?(status="") ?(post_id=0) ?(offset=0) ?(number=10) () =
+ map_array Comment.of_xmlrpc
+ (rpc#call "wp.getComments"
+ (std_args @ [`Struct ["status", `String status;
+ "post_id", `Int post_id;
+ "offset", `Int offset;
+ "number", `Int number]]))
+
+ method new_comment comment =
+ int_value
+ (rpc#call "wp.newComment"
+ (std_args @ [`Int comment.Comment.post_id;
+ Comment.to_xmlrpc comment]))
+
+ method edit_comment comment_id comment =
+ ignore
+ (rpc#call "wp.editComment"
+ (std_args @ [`Int comment_id;
+ Comment.to_xmlrpc comment]))
+
+ method delete_comment comment_id =
+ ignore
+ (rpc#call "wp.deleteComment" (std_args @ [`Int comment_id]))
+
+ method get_categories () =
+ map_array Category.of_xmlrpc (rpc#call "wp.getCategories" std_args)
+
+ method new_category ~name ~slug ~parent_id ~description =
+ int_value
+ (rpc#call "wp.newCategory"
+ (std_args @ [`Struct ["name", `String name;
+ "slug", `String slug;
+ "parent_id", `Int parent_id;
+ "description", `String description]]))
+
+ method suggest_categories category max_results =
+ rpc#call "wp.suggestCategories"
+ (std_args @ [`String category; `Int max_results])
+
+ method get_options names =
+ let result =
+ rpc#call
+ "wp.getOptions"
+ (std_args @ [`Array (List.map (fun s -> `String s) names)]) in
+ match result with
+ | `Struct pairs ->
+ List.map (fun (name, opt) -> (name, Option.of_xmlrpc opt)) pairs
+ | `Array [] -> []
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method set_options options =
+ let result =
+ rpc#call
+ "wp.setOptions"
+ (std_args @ [`Struct (List.map (fun (name, value) ->
+ (name, `String value)) options)]) in
+ match result with
+ | `Struct pairs ->
+ List.map (fun (name, opt) -> (name, Option.of_xmlrpc opt)) pairs
+ | `Array [] -> []
+ | other -> raise (Type_error (XmlRpc.dump other))
+
+ method upload_file ~name ~typ ~bits ~overwrite =
+ let value =
+ rpc#call "wp.uploadFile"
+ (std_args @ [`Struct ["name", `String name;
+ "type", `String typ;
+ "bits", `Binary bits;
+ "overwrite", `Boolean overwrite]]) in
+ let file, url, typ = ref "", ref "", ref "" in
+ iter_struct
+ (function
+ | ("file", `String v) -> file := v
+ | ("url", `String v) -> url := v
+ | ("type", `String v) -> typ := v
+ | (field, _) -> warn (Unknown_field field))
+ value;
+ (!file, !url, !typ)
+end
diff --git a/examples/wordpress/WordPress.mli b/examples/wordpress/WordPress.mli
new file mode 100644
index 0000000..47b5a18
--- /dev/null
+++ b/examples/wordpress/WordPress.mli
@@ -0,0 +1,242 @@
+(*
+ * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet
+ * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *)
+
+exception Type_error of string
+exception Unknown_field of string
+
+val strict : bool ref
+
+module Blog :
+sig
+ type t = {
+ mutable is_admin : bool;
+ mutable url : string;
+ mutable blog_id : int;
+ mutable blog_name : string;
+ mutable xmlrpc : string;
+ }
+ val make : unit -> t
+ val of_xmlrpc : XmlRpc.value -> t
+end
+
+module Category :
+sig
+ type t = {
+ mutable category_id : int;
+ mutable parent_id : int;
+ mutable description : string;
+ mutable category_name : string;
+ mutable html_url : string;
+ mutable rss_url : string;
+ }
+ val make : unit -> t
+ val of_xmlrpc : XmlRpc.value -> t
+end
+
+module CommentCount :
+sig
+ type t = {
+ mutable approved : int;
+ mutable awaiting_moderation : int;
+ mutable spam : int;
+ mutable total_comments : int;
+ }
+ val make : unit -> t
+ val of_xmlrpc : XmlRpc.value -> t
+end
+
+module Comment :
+sig
+ type t = {
+ mutable date_created : XmlRpcDateTime.t;
+ mutable user_id : int;
+ mutable comment_id : int;
+ mutable parent : int;
+ mutable status : string;
+ mutable content : string;
+ mutable link : string;
+ mutable post_id : int;
+ mutable post_title : string;
+ mutable author : string;
+ mutable author_url : string;
+ mutable author_email : string;
+ mutable author_ip : string;
+ mutable typ : string;
+ }
+ val make : unit -> t
+ val of_xmlrpc : XmlRpc.value -> t
+ val to_xmlrpc : t -> XmlRpc.value
+end
+
+module CustomField :
+sig
+ type t = {
+ mutable id : int option;
+ mutable key : string option;
+ mutable value : string;
+ }
+ val make : unit -> t
+ val of_xmlrpc : XmlRpc.value -> t
+ val to_xmlrpc : t -> XmlRpc.value
+end
+
+module Option :
+sig
+ type t = {
+ mutable desc : string;
+ mutable readonly : bool;
+ mutable value : string;
+ }
+ val make : unit -> t
+ val of_xmlrpc : XmlRpc.value -> t
+end
+
+module User :
+sig
+ type t = {
+ mutable user_id : int;
+ mutable user_login : string;
+ mutable display_name : string;
+ mutable user_email : string;
+ mutable meta_value : string;
+ }
+ val make : unit -> t
+ val of_xmlrpc : XmlRpc.value -> t
+end
+
+module PageListItem :
+sig
+ type t = {
+ mutable page_id : int;
+ mutable page_title : string;
+ mutable page_parent_id : int;
+ mutable date_created : XmlRpcDateTime.t;
+ }
+ val make : unit -> t
+ val of_xmlrpc : XmlRpc.value -> t
+end
+
+module Page :
+sig
+ type t = {
+ mutable date_created : XmlRpcDateTime.t;
+ mutable user_id : int;
+ mutable page_id : int;
+ mutable page_status : string;
+ mutable description : string;
+ mutable title : string;
+ mutable link : string;
+ mutable permalink : string;
+ mutable categories : string list;
+ mutable excerpt : string;
+ mutable text_more : string;
+ mutable mt_allow_comments : bool;
+ mutable mt_allow_pings : bool;
+ mutable wp_slug : string;
+ mutable wp_password : string;
+ mutable wp_author : string;
+ mutable wp_page_parent_id : int;
+ mutable wp_page_parent_title : string;
+ mutable wp_page_order : int;
+ mutable wp_author_id : int;
+ mutable wp_author_display_name : string;
+ mutable custom_fields : CustomField.t list;
+ mutable wp_page_template : string;
+ }
+ val make : unit -> t
+ val of_xmlrpc : XmlRpc.value -> t
+ val to_xmlrpc : t -> XmlRpc.value
+end
+
+module Post :
+sig
+ type t = {
+ mutable user_id : int;
+ mutable post_id : int;
+ mutable post_status : string;
+ mutable date_created : XmlRpcDateTime.t;
+ mutable description : string;
+ mutable title : string;
+ mutable link : string;
+ mutable permalink : string;
+ mutable categories : string list;
+ mutable excerpt : string;
+ mutable text_more : string;
+ mutable mt_allow_comments : bool;
+ mutable mt_allow_pings : bool;
+ mutable mt_keywords : string;
+ mutable wp_slug : string;
+ mutable wp_password : string;
+ mutable wp_author_id : int;
+ mutable wp_author_display_name : string;
+ mutable custom_fields : CustomField.t list;
+ }
+ val make : unit -> t
+ val of_xmlrpc : XmlRpc.value -> t
+ val to_xmlrpc : t -> XmlRpc.value
+end
+
+class api :
+ url:string ->
+ blog_id:int ->
+ username:string ->
+ password:string ->
+object
+ val blog_id : int
+ val password : string
+ val rpc : XmlRpc.client
+ val std_args : XmlRpc.value list
+ val username : string
+ method rpc : XmlRpc.client
+ method delete_comment : int -> unit
+ method delete_page : int -> unit
+ method delete_post : int -> unit
+ method edit_comment : int -> Comment.t -> unit
+ method edit_page : int -> Page.t -> bool -> unit
+ method edit_post : int -> Post.t -> bool -> unit
+ method get_authors : unit -> User.t list
+ method get_blogs : unit -> Blog.t list
+ method get_categories : unit -> Category.t list
+ method get_comment : int -> Comment.t
+ method get_comment_count : int -> CommentCount.t
+ method get_comment_status_list : unit -> (string * string) list
+ method get_comments :
+ ?status:string ->
+ ?post_id:int -> ?offset:int -> ?number:int -> unit -> Comment.t list
+ method get_options : string list -> (string * Option.t) list
+ method get_page : int -> Page.t
+ method get_page_list : unit -> PageListItem.t list
+ method get_page_status_list : unit -> (string * string) list
+ method get_page_templates : unit -> (string * string) list
+ method get_pages : unit -> Page.t list
+ method get_post : int -> Post.t
+ method get_post_status_list : unit -> (string * string) list
+ method get_recent_posts : int -> Post.t list
+ method new_category :
+ name:string ->
+ slug:string -> parent_id:int -> description:string -> int
+ method new_comment : Comment.t -> int
+ method new_page : Page.t -> bool -> int
+ method new_post : Post.t -> bool -> int
+ method set_options : (string * string) list -> (string * Option.t) list
+ method suggest_categories : string -> int -> XmlRpc.value
+ method upload_file :
+ name:string ->
+ typ:string -> bits:string -> overwrite:bool -> string * string * string
+end
diff --git a/examples/wordpress/test.ml b/examples/wordpress/test.ml
new file mode 100644
index 0000000..5bede7b
--- /dev/null
+++ b/examples/wordpress/test.ml
@@ -0,0 +1,34 @@
+(*
+ * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet
+ * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *)
+
+let wp =
+ new WordPress.api
+ ~url:"http://localhost/wordpress/xmlrpc.php"
+ ~blog_id:1
+ ~username:"admin"
+ ~password:"secret"
+
+let () =
+ List.iter
+ (fun {WordPress.Category.category_id=category_id;
+ category_name=name;
+ description=description} ->
+ Printf.printf "Category #%d\n Name: %s\n Description: %s\n\n"
+ category_id name description)
+ (wp#get_categories ())
diff --git a/test/test.ml b/test/test.ml
new file mode 100644
index 0000000..f1c919d
--- /dev/null
+++ b/test/test.ml
@@ -0,0 +1,40 @@
+(*
+ * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet
+ * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *)
+
+#use "topfind";;
+
+#require "oUnit";;
+#require "netclient";;
+#require "nethttpd-for-netcgi2";;
+#require "xml-light";;
+
+#load "xmlrpc-light.cma";;
+
+open OUnit;;
+open Printf;;
+
+let tests = [];;
+
+#use "test/test_base64.ml";;
+#use "test/test_datetime.ml";;
+#use "test/test_value.ml";;
+#use "test/test_message.ml";;
+#use "test/test_serve.ml";;
+
+OUnit.run_test_tt_main (TestList tests);;
diff --git a/test/test_base64.ml b/test/test_base64.ml
new file mode 100644
index 0000000..e8e11e4
--- /dev/null
+++ b/test/test_base64.ml
@@ -0,0 +1,46 @@
+(*
+ * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet
+ * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *)
+
+let test = "test_base64" >:::
+ [
+ "encode" >::
+ (fun () ->
+ assert_equal
+ ~printer:(fun s -> s)
+ "UnVsaW5nIHRoZSBjb3VudHJ5IGlzIGxpa2UgY29va2luZyBhIHNtYWxsIGZpc2guCkFwcHJvYWNoIHRoZSB1bml2ZXJzZSB3aXRoIFRhbywKQW5kIGV2aWwgaXMgbm90IHBvd2VyZnVsLApCdXQgaXRzIHBvd2VyIHdpbGwgbm90IGJlIHVzZWQgdG8gaGFybSBvdGhlcnMuCk5vdCBvbmx5IHdpbGwgaXQgZG8gbm8gaGFybSB0byBvdGhlcnMsCkJ1dCB0aGUgc2FnZSBoaW1zZWxmIHdpbGwgYWxzbyBiZSBwcm90ZWN0ZWQuClRoZXkgZG8gbm90IGh1cnQgZWFjaCBvdGhlciwKQW5kIHRoZSBWaXJ0dWUgaW4gZWFjaCBvbmUgcmVmcmVzaGVzIGJvdGguCg=="
+ (XmlRpcBase64.str_encode "\
+Ruling the country is like cooking a small fish.
+Approach the universe with Tao,
+And evil is not powerful,
+But its power will not be used to harm others.
+Not only will it do no harm to others,
+But the sage himself will also be protected.
+They do not hurt each other,
+And the Virtue in each one refreshes both.
+"));
+
+ "decode" >::
+ (fun () ->
+ assert_equal
+ ~printer:(fun s -> s)
+ "When someone says \"I want a programming language in which I need only\nsay what I wish done,\" give him a lollipop.\n"
+ (XmlRpcBase64.str_decode "V2hlbiBzb21lb25lIHNheXMgIkkgd2FudCBhIHByb2dyYW1taW5nIGxhbmd1YWdlIGluIHdoaWNo\nIEkgbmVlZCBvbmx5CnNheSB3aGF0IEkgd2lzaCBkb25lLCIgZ2l2ZSBoaW0gYSBsb2xsaXBvcC4K\n"));
+ ]
+
+let tests = test :: tests
diff --git a/test/test_datetime.ml b/test/test_datetime.ml
new file mode 100644
index 0000000..4960126
--- /dev/null
+++ b/test/test_datetime.ml
@@ -0,0 +1,198 @@
+(*
+ * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet
+ * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *)
+
+let string_of_unixtm
+ {Unix.tm_sec=tm_sec; tm_min=tm_min; tm_hour=tm_hour;
+ tm_mday=tm_mday; tm_mon=tm_mon; tm_year=tm_year;
+ tm_wday=tm_wday; tm_yday=tm_yday; tm_isdst=tm_isdst} =
+ sprintf "{Unix.tm_year=%d; tm_mon=%d; tm_mday=%d; tm_hour=%d; tm_min=%d; tm_sec=%d; tm_yday=%d; tm_wday=%d; tm_isdst=%b}"
+ tm_year tm_mon tm_mday
+ tm_hour tm_min tm_sec
+ tm_yday tm_wday tm_isdst
+
+let string_of_datetime (y, m, d, h, m', s, tz) =
+ sprintf "(%d, %d, %d, %d, %d, %d, %d)"
+ y m d h m' s tz
+
+let test = "test_datetime" >:::
+ [
+ "unixfloat" >::
+ (fun () ->
+ let unixfloat = Unix.time () in
+ assert_equal
+ ~printer:string_of_float
+ unixfloat
+ (XmlRpcDateTime.to_unixfloat (XmlRpcDateTime.from_unixfloat unixfloat)));
+
+ "unixfloat_utc" >::
+ (fun () ->
+ let unixfloat = Unix.time () in
+ assert_equal
+ ~printer:string_of_float
+ unixfloat
+ (XmlRpcDateTime.to_unixfloat_utc (XmlRpcDateTime.from_unixfloat_utc unixfloat)));
+
+ "unix" >::
+ (fun () ->
+ let time = Unix.localtime (Unix.time ()) in
+ assert_equal
+ ~printer:string_of_unixtm
+ time
+ (XmlRpcDateTime.to_unixtm (XmlRpcDateTime.from_unixtm time)));
+
+ "unix_utc" >::
+ (fun () ->
+ let time = Unix.gmtime (Unix.time ()) in
+ assert_equal
+ ~printer:string_of_unixtm
+ time
+ (XmlRpcDateTime.to_unixtm_utc (XmlRpcDateTime.from_unixtm_utc time)));
+
+ "to_unixfloat" >::
+ (fun () ->
+ let dt_local = (2007, 10, 14, 7, 16, 18, -420) in
+ let dt_utc = (2007, 10, 14, 14, 16, 18, 0) in
+ assert_equal
+ ~printer:string_of_float
+ (XmlRpcDateTime.to_unixfloat dt_local)
+ (XmlRpcDateTime.to_unixfloat dt_utc));
+
+ "to_unixfloat_utc" >::
+ (fun () ->
+ let dt_local = (2007, 10, 14, 7, 16, 18, -420) in
+ let dt_utc = (2007, 10, 14, 14, 16, 18, 0) in
+ assert_equal
+ ~printer:string_of_float
+ (XmlRpcDateTime.to_unixfloat_utc dt_local)
+ (XmlRpcDateTime.to_unixfloat_utc dt_utc));
+
+ "to_unixtm" >::
+ (fun () ->
+ let dt = (2007, 1, 1, 18, 34, 9, -420) in
+ assert_equal
+ ~printer:string_of_unixtm
+ (snd (Unix.mktime
+ {Unix.tm_year=107;
+ tm_mon=0;
+ tm_mday=1;
+ tm_hour=18;
+ tm_min=34;
+ tm_sec=9;
+ tm_yday=0;
+ tm_wday=0;
+ tm_isdst=false}))
+ (XmlRpcDateTime.to_unixtm dt));
+
+ "to_unixtm_utc" >::
+ (fun () ->
+ let dt = (2007, 1, 1, 14, 34, 9, -420) in
+ assert_equal
+ ~printer:string_of_unixtm
+ (snd (Unix.mktime
+ {Unix.tm_year=107;
+ tm_mon=0;
+ tm_mday=1;
+ tm_hour=21;
+ tm_min=34;
+ tm_sec=9;
+ tm_yday=0;
+ tm_wday=0;
+ tm_isdst=false}))
+ (XmlRpcDateTime.to_unixtm_utc dt));
+
+ "to_string" >::
+ (fun () ->
+ let dt = (2007, 1, 1, 14, 34, 9, 0) in
+ assert_equal
+ ~printer:(fun s -> s)
+ "20070101T14:34:09"
+ (XmlRpcDateTime.to_string dt));
+
+ "to_string_tz" >::
+ (fun () ->
+ let dt = (2007, 1, 1, 14, 34, 9, -420) in
+ assert_equal
+ ~printer:(fun s -> s)
+ "20070101T14:34:09-07:00"
+ (XmlRpcDateTime.to_string dt));
+
+ "of_string" >::
+ (fun () ->
+ let s = "20070101T14:34:09" in
+ assert_equal
+ ~printer:string_of_datetime
+ (2007, 1, 1, 14, 34, 9, 0)
+ (XmlRpcDateTime.of_string s));
+
+ "of_string_z" >::
+ (fun () ->
+ let s = "20070101T14:34:09Z" in
+ assert_equal
+ ~printer:string_of_datetime
+ (2007, 1, 1, 14, 34, 9, 0)
+ (XmlRpcDateTime.of_string s));
+
+ "to_string_tz" >::
+ (fun () ->
+ let s = "20070101T14:34:09-07:00" in
+ assert_equal
+ ~printer:string_of_datetime
+ (2007, 1, 1, 14, 34, 9, -420)
+ (XmlRpcDateTime.of_string s));
+
+ "optional_delimiters" >::
+ (fun () ->
+ let s1 = "20071013T22:03:09-0700" in
+ let s2 = "2007-10-13 22:03:09-07:00" in
+ assert_equal
+ ~printer:string_of_datetime
+ (XmlRpcDateTime.of_string s1)
+ (XmlRpcDateTime.of_string s2));
+
+ "set_tz_offset" >::
+ (fun () ->
+ let offset = 360 in
+ let dt1 = XmlRpcDateTime.now () in
+ let dt2 = XmlRpcDateTime.set_tz_offset offset dt1 in
+ assert_equal
+ ~printer:string_of_int
+ offset
+ (match dt2 with (_, _, _, _, _, _, tz) -> tz);
+ assert_equal
+ ~printer:string_of_datetime
+ ~cmp:XmlRpcDateTime.equal
+ dt1 dt2);
+
+ "fix_tz_offset" >::
+ (fun () ->
+ let offset = -420 in
+ let dt1 = XmlRpcDateTime.now_utc () in
+ let dt2 = XmlRpcDateTime.fix_tz_offset offset dt1 in
+ assert_equal
+ ~printer:string_of_int
+ offset
+ (match dt2 with (_, _, _, _, _, _, tz) -> tz);
+ assert_equal
+ ~printer:string_of_int
+ (int_of_float (XmlRpcDateTime.to_unixfloat dt1))
+ (int_of_float (XmlRpcDateTime.to_unixfloat dt2)
+ + offset * 60));
+ ]
+
+let tests = test :: tests
diff --git a/test/test_message.ml b/test/test_message.ml
new file mode 100644
index 0000000..ef67096
--- /dev/null
+++ b/test/test_message.ml
@@ -0,0 +1,236 @@
+(*
+ * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet
+ * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *)
+
+let string_of_message = function
+ | XmlRpc.MethodCall (name, params) ->
+ sprintf "MethodCall (%s, [%s])"
+ name (String.concat "; " (List.map XmlRpc.dump params))
+ | XmlRpc.MethodResponse value ->
+ sprintf "MethodResponse (%s)" (XmlRpc.dump value)
+ | XmlRpc.Fault (code, string) ->
+ sprintf "Fault (%d, %s)" code string
+
+let test = "test_message" >:::
+ [
+ "of_method_call" >::
+ (fun () ->
+ assert_equal
+ ~printer:Xml.to_string
+ (Xml.Element
+ ("methodCall", [],
+ [Xml.Element ("methodName", [],
+ [Xml.PCData "demo.addTwoNumbers"]);
+ Xml.Element
+ ("params", [],
+ [Xml.Element
+ ("param", [],
+ [Xml.Element
+ ("value", [],
+ [Xml.Element ("int", [], [Xml.PCData "4"])])]);
+ Xml.Element
+ ("param", [],
+ [Xml.Element
+ ("value", [],
+ [Xml.Element ("int", [], [Xml.PCData "5"])])])])]))
+ (XmlRpc.xml_element_of_message
+ (XmlRpc.MethodCall ("demo.addTwoNumbers", [`Int 4; `Int 5]))));
+
+ "to_method_call" >::
+ (fun () ->
+ assert_equal
+ ~printer:string_of_message
+ (XmlRpc.MethodCall ("demo.addTwoNumbers",
+ [`String "4"; `String "5"]))
+ (XmlRpc.message_of_xml_element
+ (Xml.Element
+ ("methodCall", [],
+ [Xml.Element ("methodName", [],
+ [Xml.PCData "demo.addTwoNumbers"]);
+ Xml.Element
+ ("params", [],
+ [Xml.Element
+ ("param", [],
+ [Xml.Element
+ ("value", [],
+ [Xml.Element ("string", [],
+ [Xml.PCData "4"])])]);
+ (* test untyped value - should be treated as string *)
+ Xml.Element
+ ("param", [],
+ [Xml.Element
+ ("value", [], [Xml.PCData "5"])])])]))));
+
+ "to_method_call_no_params" >::
+ (fun () ->
+ assert_equal
+ ~printer:string_of_message
+ (XmlRpc.MethodCall ("demo.helloWorld", []))
+ (XmlRpc.message_of_xml_element
+ (Xml.Element
+ ("methodCall", [],
+ [Xml.Element ("methodName", [],
+ [Xml.PCData "demo.helloWorld"])]))));
+
+ "of_method_response" >::
+ (fun () ->
+ assert_equal
+ ~printer:Xml.to_string
+ (Xml.Element
+ ("methodResponse", [],
+ [Xml.Element
+ ("params", [],
+ [Xml.Element
+ ("param", [],
+ [Xml.Element
+ ("value", [],
+ [Xml.Element ("string", [],
+ [Xml.PCData "test"])])])])]))
+ (XmlRpc.xml_element_of_message
+ (XmlRpc.MethodResponse (`String "test"))));
+
+ "to_method_response" >::
+ (fun () ->
+ assert_equal
+ ~printer:string_of_message
+ (XmlRpc.MethodResponse (`String "test"))
+ (XmlRpc.message_of_xml_element
+ (Xml.Element
+ ("methodResponse", [],
+ [Xml.Element
+ ("params", [],
+ [Xml.Element
+ ("param", [],
+ [Xml.Element
+ ("value", [],
+ [Xml.Element ("string", [],
+ [Xml.PCData "test"])])])])])));
+ assert_equal
+ ~printer:string_of_message
+ (XmlRpc.MethodResponse (`String "test"))
+ (XmlRpc.message_of_xml_element
+ (Xml.Element
+ ("methodResponse", [],
+ [Xml.Element
+ ("params", [],
+ [Xml.Element
+ ("param", [],
+ (* test untyped value *)
+ [Xml.Element
+ ("value", [], [Xml.PCData "test"])])])]))));
+
+ "of_fault" >::
+ (fun () ->
+ assert_equal
+ ~printer:Xml.to_string
+ (Xml.Element
+ ("methodResponse", [],
+ [Xml.Element
+ ("fault", [],
+ [Xml.Element
+ ("value", [],
+ [Xml.Element
+ ("struct", [],
+ [Xml.Element
+ ("member", [],
+ [Xml.Element ("name", [],
+ [Xml.PCData "faultCode"]);
+ Xml.Element
+ ("value", [],
+ [Xml.Element ("int", [],
+ [Xml.PCData "12345"])])]);
+ Xml.Element
+ ("member", [],
+ [Xml.Element ("name", [],
+ [Xml.PCData "faultString"]);
+ Xml.Element
+ ("value", [],
+ [Xml.Element
+ ("string", [],
+ [Xml.PCData
+ "something terrible happened"
+ ])])])])])])]))
+ (XmlRpc.xml_element_of_message
+ (XmlRpc.Fault (12345, "something terrible happened"))));
+
+ "to_fault" >::
+ (fun () ->
+ assert_equal
+ ~printer:string_of_message
+ (XmlRpc.Fault (12345, "something terrible happened"))
+ (XmlRpc.message_of_xml_element
+ (Xml.Element
+ ("methodResponse", [],
+ [Xml.Element
+ ("fault", [],
+ [Xml.Element
+ ("value", [],
+ [Xml.Element
+ ("struct", [],
+ [Xml.Element
+ ("member", [],
+ [Xml.Element ("name", [],
+ [Xml.PCData "faultCode"]);
+ Xml.Element
+ ("value", [],
+ [Xml.Element ("int", [],
+ [Xml.PCData "12345"])])]);
+ Xml.Element
+ ("member", [],
+ [Xml.Element ("name", [],
+ [Xml.PCData "faultString"]);
+ Xml.Element
+ ("value", [],
+ [Xml.Element
+ ("string", [],
+ [Xml.PCData
+ "something terrible happened"
+ ])])])])])])])));
+ assert_equal
+ ~printer:string_of_message
+ (XmlRpc.Fault (12345, "something terrible happened"))
+ (XmlRpc.message_of_xml_element
+ (Xml.Element
+ ("methodResponse", [],
+ [Xml.Element
+ ("fault", [],
+ [Xml.Element
+ ("value", [],
+ [Xml.Element
+ ("struct", [],
+ [Xml.Element
+ ("member", [],
+ [Xml.Element ("name", [],
+ [Xml.PCData "faultCode"]);
+ Xml.Element
+ ("value", [],
+ [Xml.Element ("int", [],
+ [Xml.PCData "12345"])])]);
+ Xml.Element
+ ("member", [],
+ [Xml.Element ("name", [],
+ [Xml.PCData "faultString"]);
+ (* test untyped value *)
+ Xml.Element
+ ("value", [],
+ [Xml.PCData
+ "something terrible happened"
+ ])])])])])]))));
+ ]
+
+let tests = test :: tests
diff --git a/test/test_serve.ml b/test/test_serve.ml
new file mode 100644
index 0000000..aef07a2
--- /dev/null
+++ b/test/test_serve.ml
@@ -0,0 +1,85 @@
+(*
+ * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet
+ * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *)
+
+let test = "test_serve" >:::
+ [
+ "reverse" >::
+ (fun () ->
+ let data = [`Int 1; `Int 2; `Int 3] in
+ assert_equal
+ ~printer:string_of_message
+ (XmlRpc.MethodResponse (`Array (List.rev data)))
+ (XmlRpc.message_of_xml_element
+ (Xml.parse_string
+ (XmlRpc.serve
+ (function
+ | "reverse" ->
+ (function
+ | [`Array items] ->
+ `Array (List.rev items)
+ | _ -> failwith "wrong parameters")
+ | _ -> failwith "unknown method")
+ (Xml.to_string
+ (XmlRpc.xml_element_of_message
+ (XmlRpc.MethodCall
+ ("reverse", [`Array data]))))))));
+
+ "error_normal" >::
+ (fun () ->
+ let fault = (12345, "My fault") in
+ assert_equal
+ ~printer:string_of_message
+ (XmlRpc.Fault fault)
+ (XmlRpc.message_of_xml_element
+ (Xml.parse_string
+ (XmlRpc.serve
+ (fun _ _ -> raise (XmlRpc.Error fault))
+ (Xml.to_string
+ (XmlRpc.xml_element_of_message
+ (XmlRpc.MethodCall ("dummy", []))))))));
+
+ "error_exception" >::
+ (fun () ->
+ assert_equal
+ ~printer:string_of_message
+ (XmlRpc.Fault
+ (-32500, "application error. Failure(\"WHAT HAPPEN ?\")"))
+ (XmlRpc.message_of_xml_element
+ (Xml.parse_string
+ (XmlRpc.serve
+ (fun _ _ -> failwith "WHAT HAPPEN ?")
+ (Xml.to_string
+ (XmlRpc.xml_element_of_message
+ (XmlRpc.MethodCall ("dummy", []))))))));
+
+ "error_quiet" >::
+ (fun () ->
+ assert_raises
+ (Failure "SOMEONE SET UP US THE BOMB")
+ (fun () ->
+ (ignore
+ (XmlRpc.serve
+ ~error_handler:XmlRpc.quiet_error_handler
+ (fun _ _ -> failwith "SOMEONE SET UP US THE BOMB")
+ (Xml.to_string
+ (XmlRpc.xml_element_of_message
+ (XmlRpc.MethodCall ("dummy", []))))))));
+ ]
+
+let tests = test :: tests
diff --git a/test/test_value.ml b/test/test_value.ml
new file mode 100644
index 0000000..8c1f61a
--- /dev/null
+++ b/test/test_value.ml
@@ -0,0 +1,284 @@
+(*
+ * XmlRpc Light, a small XmlRpc library based on Xml Light and Ocamlnet
+ * Copyright (C) 2007-2009 Dave Benjamin (dave@ramenlabs.com)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *)
+
+let test = "test_value" >:::
+ [
+ "of_int" >::
+ (fun () ->
+ assert_equal
+ ~printer:Xml.to_string
+ (Xml.Element ("int", [], [Xml.PCData "42"]))
+ (XmlRpc.xml_element_of_value (`Int 42)));
+
+ "to_int" >::
+ (fun () ->
+ assert_equal
+ ~printer:XmlRpc.dump
+ (`Int 42)
+ (XmlRpc.value_of_xml_element
+ (Xml.Element ("int", [], [Xml.PCData "42"]))));
+
+ "to_int_i4" >::
+ (fun () ->
+ assert_equal
+ ~printer:XmlRpc.dump
+ (`Int 42)
+ (XmlRpc.value_of_xml_element
+ (Xml.Element ("i4", [], [Xml.PCData "42"]))));
+
+ "of_int32" >::
+ (fun () ->
+ assert_equal
+ ~printer:Xml.to_string
+ (Xml.Element ("int", [], [Xml.PCData "2000000000"]))
+ (XmlRpc.xml_element_of_value (`Int32 2000000000l)));
+
+ "to_int32" >::
+ (fun () ->
+ if Sys.word_size = 32
+ then
+ assert_equal
+ ~printer:XmlRpc.dump
+ (`Int32 2000000000l)
+ (XmlRpc.value_of_xml_element
+ (Xml.Element ("int", [], [Xml.PCData "2000000000"]))));
+
+ "of_double" >::
+ (fun () ->
+ assert_equal
+ ~printer:Xml.to_string
+ (Xml.Element ("double", [], [Xml.PCData "42.000000001"]))
+ (XmlRpc.xml_element_of_value (`Double 42.000000001)));
+
+ "to_double" >::
+ (fun () ->
+ assert_equal
+ ~printer:XmlRpc.dump
+ (`Double 42.000000001)
+ (XmlRpc.value_of_xml_element
+ (Xml.Element ("double", [], [Xml.PCData "42.000000001"]))));
+
+ "of_nil" >::
+ (fun () ->
+ assert_equal
+ ~printer:Xml.to_string
+ (Xml.Element ("nil", [], []))
+ (XmlRpc.xml_element_of_value `Nil));
+
+ "to_nil" >::
+ (fun () ->
+ assert_equal
+ ~printer:XmlRpc.dump
+ `Nil
+ (XmlRpc.value_of_xml_element
+ (Xml.Element ("nil", [], []))));
+
+ "of_boolean" >::
+ (fun () ->
+ assert_equal
+ ~printer:Xml.to_string
+ (Xml.Element ("boolean", [], [Xml.PCData "1"]))
+ (XmlRpc.xml_element_of_value (`Boolean true)));
+
+ "to_boolean" >::
+ (fun () ->
+ assert_equal
+ ~printer:XmlRpc.dump
+ (`Boolean false)
+ (XmlRpc.value_of_xml_element
+ (Xml.Element ("boolean", [], [Xml.PCData "0"]))));
+
+ "of_string" >::
+ (fun () ->
+ assert_equal
+ ~printer:Xml.to_string
+ (Xml.Element ("string", [],
+ [Xml.PCData " <&>ABCDEFG012345 \r~!@#$%^&*()\t\r\n "]))
+ (XmlRpc.xml_element_of_value
+ (`String " <&>ABCDEFG012345 \r~!@#$%^&*()\t\r\n ")));
+
+ "to_string" >::
+ (fun () ->
+ assert_equal
+ ~printer:XmlRpc.dump
+ (`String " <&>ABCDEFG012345 \r~!@#$%^&*()\t\r\n ")
+ (XmlRpc.value_of_xml_element
+ (Xml.Element ("string", [],
+ [Xml.PCData " <&>ABCDEFG012345 \r~!@#$%^&*()\t\r\n "]))));
+
+ "of_binary" >::
+ (fun () ->
+ assert_equal
+ ~printer:Xml.to_string
+ (Xml.Element ("base64", [],
+ [Xml.PCData "IDwmPkFCQ0RFRkcwMTIzNDUgDX4hQCMkJV4mKigpCQ0KIA=="]))
+ (XmlRpc.xml_element_of_value
+ (`Binary " <&>ABCDEFG012345 \r~!@#$%^&*()\t\r\n ")));
+
+ "to_binary" >::
+ (fun () ->
+ assert_equal
+ ~printer:XmlRpc.dump
+ (`Binary " <&>ABCDEFG012345 \r~!@#$%^&*()\t\r\n ")
+ (XmlRpc.value_of_xml_element
+ (Xml.Element ("base64", [],
+ [Xml.PCData "IDwmPkFCQ0\r\nRFRkcwMTIzN\nDUgDX4hQCMkJV4mKigpCQ0KIA=="]))));
+
+ "of_array" >::
+ (fun () ->
+ assert_equal
+ ~printer:Xml.to_string
+ (Xml.Element
+ ("array", [],
+ [Xml.Element
+ ("data", [],
+ [Xml.Element ("value", [],
+ [Xml.Element ("int", [], [Xml.PCData "5"])]);
+ Xml.Element
+ ("value", [],
+ [Xml.Element ("string", [], [Xml.PCData "six"])]);
+ Xml.Element
+ ("value", [],
+ [Xml.Element
+ ("array", [],
+ [Xml.Element
+ ("data", [],
+ [Xml.Element
+ ("value", [],
+ [Xml.Element
+ ("boolean", [], [Xml.PCData "0"])]);
+ Xml.Element
+ ("value", [],
+ [Xml.Element
+ ("double", [],
+ [Xml.PCData "-1."])])])])])])]))
+ (XmlRpc.xml_element_of_value
+ (`Array
+ [`Int 5; `String "six";
+ `Array [`Boolean false; `Double (-1.0)]])));
+
+ "to_array" >::
+ (fun () ->
+ assert_equal
+ ~printer:XmlRpc.dump
+ (`Array
+ [`Int 5; `String "six";
+ `Array [`Boolean false; `Double (-1.0)]])
+ (XmlRpc.value_of_xml_element
+ (Xml.Element
+ ("array", [],
+ [Xml.Element
+ ("data", [],
+ [Xml.Element ("value", [],
+ [Xml.Element ("int", [],
+ [Xml.PCData "5"])]);
+ (* test untyped value - should be treated as string *)
+ Xml.Element ("value", [], [Xml.PCData "six"]);
+ Xml.Element
+ ("value", [],
+ [Xml.Element
+ ("array", [],
+ [Xml.Element
+ ("data", [],
+ [Xml.Element
+ ("value", [],
+ [Xml.Element
+ ("boolean", [], [Xml.PCData "0"])]);
+ Xml.Element
+ ("value", [],
+ [Xml.Element
+ ("double", [],
+ [Xml.PCData "-1."])])])])])])]))));
+
+ "of_struct" >::
+ (fun () ->
+ assert_equal
+ ~printer:Xml.to_string
+ (Xml.Element
+ ("struct", [],
+ [Xml.Element
+ ("member", [],
+ [Xml.Element ("name", [], [Xml.PCData "foo"]);
+ Xml.Element ("value", [],
+ [Xml.Element ("int", [],
+ [Xml.PCData "42"])])]);
+ Xml.Element
+ ("member", [],
+ [Xml.Element ("name", [], [Xml.PCData "bar"]);
+ Xml.Element
+ ("value", [],
+ [Xml.Element
+ ("struct", [],
+ [Xml.Element
+ ("member", [],
+ [Xml.Element ("name", [], [Xml.PCData "baz"]);
+ Xml.Element
+ ("value", [],
+ [Xml.Element ("string", [],
+ [Xml.PCData
+ "rutabega"])])])])])])]))
+ (XmlRpc.xml_element_of_value
+ (`Struct
+ ["foo", `Int 42;
+ "bar", `Struct ["baz", `String "rutabega"]])));
+
+ "to_struct" >::
+ (fun () ->
+ assert_equal
+ ~printer:XmlRpc.dump
+ (`Struct
+ ["foo", `Int 42;
+ "bar", `Struct ["baz", `String "rutabega"]])
+ (XmlRpc.value_of_xml_element
+ (Xml.Element
+ ("struct", [],
+ [Xml.Element
+ ("member", [],
+ [Xml.Element ("name", [], [Xml.PCData "foo"]);
+ Xml.Element ("value", [],
+ [Xml.Element ("int", [],
+ [Xml.PCData "42"])])]);
+ Xml.Element
+ ("member", [],
+ [Xml.Element ("name", [], [Xml.PCData "bar"]);
+ Xml.Element
+ ("value", [],
+ [Xml.Element
+ ("struct", [],
+ [Xml.Element
+ ("member", [],
+ [Xml.Element ("name", [], [Xml.PCData "baz"]);
+ (* test untyped value *)
+ Xml.Element
+ ("value", [],
+ [Xml.PCData "rutabega"])])])])])]))));
+ "to_struct_empty_name" >::
+ (fun () ->
+ assert_equal
+ ~printer:XmlRpc.dump
+ (`Struct ["", `String ""; "", `Int 42])
+ (XmlRpc.value_of_xml_element
+ (Xml.parse_string
+ "<struct>
+ <member><name></name><value></value></member>
+ <member><name/><value><int>42</int></value></member>
+ </struct>")));
+ ]
+
+let tests = test :: tests