Apache Wicket
Copyright 2008 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

This is an aggregated NOTICE file for the Apache Wicket projects included
in this distribution.

NB: DO NOT ADD LICENSES/NOTICES/ATTRIBUTIONS TO THIS FILE, BUT IN THE
    NOTICE FILE OF THE CORRESPONDING PROJECT. THE RELEASE PROCEDURE WILL
    AUTOMATICALLY INCLUDE THE NOTICE IN THIS FILE.

---------------------------------------------------------------------------
src/./wicket-jmx
---------------------------------------------------------------------------
   Apache Wicket
   Copyright 2007 The Apache Software Foundation

   This product includes software developed at
   The Apache Software Foundation (http://www.apache.org/).

---------------------------------------------------------------------------
src/./wicket-guice
---------------------------------------------------------------------------
   Apache Wicket
   Copyright 2007 The Apache Software Foundation

   This product includes software developed at
   The Apache Software Foundation (http://www.apache.org/).

   This product includes Guice, developed at Google, and licensed
   under the Apache License 2.0. (http://code.google.com/p/google-guice/).
---------------------------------------------------------------------------
src/./wicket-spring
---------------------------------------------------------------------------
   Apache Wicket
   Copyright 2007 The Apache Software Foundation

   This product includes software developed at
   The Apache Software Foundation (http://www.apache.org/).

---------------------------------------------------------------------------
src/./wicket-quickstart/NOTICE
---------------------------------------------------------------------------
   Apache Wicket
   Copyright 2007 The Apache Software Foundation

   This product includes software developed at
   The Apache Software Foundation (http://www.apache.org/).

---------------------------------------------------------------------------
src/./wicket-ioc
---------------------------------------------------------------------------
   Apache Wicket
   Copyright 2007 The Apache Software Foundation

   This product includes software developed at
   The Apache Software Foundation (http://www.apache.org/).

---------------------------------------------------------------------------
src/./wicket-datetime
---------------------------------------------------------------------------
   Apache Wicket Date Time
   Copyright 2007 The Apache Software Foundation

   This product includes software developed at
   The Apache Software Foundation (http://www.apache.org/).
   
   Contains code of the Yahoo User Interface library (version: 0.12.2),
   released under the BSD License:
   http://developer.yahoo.net/yui/license.txt
   Copyright (c) 2006, Yahoo!

   This product includes software developed by
   Joda.org (http://www.joda.org/).
   
---------------------------------------------------------------------------
src/./wicket-examples
---------------------------------------------------------------------------
   Apache Wicket Examples
   Copyright 2007 The Apache Software Foundation

   This product includes software developed at
   The Apache Software Foundation (http://www.apache.org/).
   
   Contains Script.aculo.us javascript library released under a MIT license.
   Copyright (c) 2005 Thomas Fuchs
   
   Contains prototype.js javascript library released under a MIT style license.
   (c) 2005 Sam Stephenson
   
   Contains behaviour.js javascript library released under BSD license.
   Behaviour v1.1 by Ben Nolan, June 2005. Based largely on the work
   of Simon Willison
   
   com.meterware.httpunit.ParsedHTML is taken from HttpUnit, released
   under a MIT style license.
   Copyright (c) 2000-2004, Russell Gold
   
   Contains software developed by the Dojo foundation.
   The dojo javascript is dual licensed under the AFL and BSD license.
   Included in this software under the BSD license.
   Copyright (c) 2004-2005, The Dojo Foundation

   This product includes software developed by the Spring Framework Project
   (http://www.springframework.org).

   This product includes software developed by the CGLib Project
   (http://cglib.sourceforge.net).

   This product includes ASM, released under a BSD style license (http://asm.objectweb.org).
   Copyright (c) 2000-2005 INRIA, France Telecom

   This product includes software developed by
   Joda.org (http://www.joda.org/).

   This product includes jhighlight (https://jhighlight.dev.java.net/)
   which is released under CDDL 1.0 license (http://www.opensource.org/licenses/cddl1.php).

---------------------------------------------------------------------------
src/./wicket-extensions
---------------------------------------------------------------------------
   Apache Wicket Extensions
   Copyright 2007 The Apache Software Foundation

   This product includes software developed at
   The Apache Software Foundation (http://www.apache.org/).

   Contains software developed in Apache Turbine, released
   under the Apache Software License, Version 2.0. 
   (c) 2001-2005

---------------------------------------------------------------------------
src/./wicket-objectssizeof-agent
---------------------------------------------------------------------------
   Apache Wicket
   Copyright 2007 The Apache Software Foundation

   This product includes software developed at
   The Apache Software Foundation (http://www.apache.org/).


---------------------------------------------------------------------------
src/./wicket
---------------------------------------------------------------------------
   Apache Wicket
   Copyright 2006 The Apache Software Foundation

   This product includes software developed at
   The Apache Software Foundation (http://www.apache.org/).

   This product includes software from QOS.ch (http://slf4j.org) licensed under the X11 license
   Copyright (c) 2004-2007 QOS.ch
   
   Contains Diff library from Mavens JRCS, released under
   The Apache Software License, Version 1.1.
   (c) 1999-2003

   org.apache.wicket.util.upload contains parts of Apache Jakarta Commons FileUpload,
   released under the Apache Software License, Version 2.0. 
   (c) 2001-2004

   org.apache.wicket.util.io.IOUtils is taken from Apache Avalon, released
   under the Apache Software License, Version 2.0.
   (c) 2001-2004

   org.apache.wicket.util.io.ThresholdingOutputStream is taken from
   Apache Jakarta Commons IO, released under the
   Apache Software License, Version 2.0.
   (c) 2001-2004

   org.apache.wicket.util.crypt contains Base64 which is taken from
   Apache Jakarta Commons Codec, released under the
   Apache Software License, Version 2.0. Base64UrlSafe
   is derived from Base64.
   (c) 2001-2005

   org.apache.wicket.util.concurrent is taken from [1], which states the following:
     "All classes are released to the public domain and may be used for 
      any purpose whatsoever without permission or acknowledgment. 
      Portions of the CopyOnWriteArrayList and ConcurrentReaderHashMap 
      classes are adapted from Sun JDK source code. These are copyright 
      of Sun Microsystems, Inc, and are used with their kind permission,  
      as described in this license[2]."
   [1]: http://g.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html
   [2]: licenses/sun-u.c.license.pdf

   org.apache.wicket.markup.html.form.upload.MultiFileUploadField.js is taken from [1]
   and has the following notice:
      "Licence:
       Use this however/wherever you like, just don't blame me if it breaks
       anything.

       Credit:
       If you're nice, you'll leave this bit:

       Class by Stickman -- http://www.the-stickman.com
       with thanks to:
       [for Safari fixes]
          Luis Torrefranca -- http://www.law.pitt.edu
          and
          Shawn Parker & John Pennypacker -- http://www.fuzzycoconut.com
       [for duplicate name bug]
          'neal'"
   [1]: http://the-stickman.com/web-development/javascript/upload-multiple-files-with-a-single-file-element/

---------------------------------------------------------------------------
src/./wicket-auth-roles
---------------------------------------------------------------------------
   Apache Wicket Auth Roles
   Copyright 2007 The Apache Software Foundation

   This product includes software developed at
   The Apache Software Foundation (http://www.apache.org/).

