<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.

-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<link rel="stylesheet" href="stylesheet.css" type="text/css">
</HEAD>

<BODY>
<center><img align="top" src="logo.jpg" border="0" alt="Log4j Logo"></center>
<h1>Chainsaw v2</h1>
<p>Brought to you by the Apache Logging Services Project team</p>
<p>Please send questions, bug reports and/or feature requests to <b>dev@logging.apache.org</b></p>
<br><br>
<table border="0" width="100%">
<tr valign="top"><td rowspan="2">Principle Developers</td><td>Scott Deboy</td></tr>
<tr valign="top"><td>Paul Smith</td></tr>
<tr><td colspan="2">&nbsp;</td></tr>
<tr valign="top"><td rowspan="3">Contributions from (thanks!):</td><td>Ceki G&uuml;lc&uuml; </td></tr>
<tr><td>Oliver Burn</td></tr>
<tr><td>Stephen Pain</td></tr>
<tr><td>Isuru Suriarachchi</td></tr>
<tr><td colspan="2">&nbsp;</td></tr>
<tr valign="top"><td rowspan="3">Using the following technologies</td></tr>
<tr valign="top"><td><a href="http://jakarta.apache.org/commons/vfs/">Jakarta Commons VFS</a></td></tr>
<tr valign="top"><td><a href="http://xstream.codehaus.org/">XStream (BSD License)</a></td></tr>
<tr valign="top"><td><a href="http://jmdns.sourceforge.net/">JmDNS</a></td></tr>`

</table>
</body>
</html>