Apache Tuscany
Copyright (c) 2005-2010 The Apache Software Foundation

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

This product includes software under the OASIS Specification License
with the following copyright:

Copyright(C) OASIS(R) 2005,2009. All Rights Reserved.
OASIS trademark, IPR and other policies apply.

This product includes software under the W3C(c) Software License
with the following copyright:
    
Copyright (c) 2008 World Wide Web Consortium, (Massachusetts Institute of Technology, 
European Research Consortium for Informatics and Mathematics, Keio University). 
All Rights Reserved. This work is distributed under the W3C(c) Software License [1] 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.

[1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231

This product includes software under the W3C(c) Software License
with the following copyright:

Copyright 2001 The Internet Society and W3C (Massachusetts Institute
of Technology, Institut National de Recherche en Informatique et en
Automatique, Keio University). All Rights Reserved.
http://www.w3.org/Consortium/Legal/

This document is governed by the W3C Software License [1] as described
in the FAQ [2].

[1] http://www.w3.org/Consortium/Legal/copyright-software-19980720
[2] http://www.w3.org/Consortium/Legal/IPR-FAQ-20000620.html#DTD

This product includes software under the MIT license
with the following copyright:

Copyright (c) 2005-2009 Collecta, Inc.

This product includes software under the Apache 2.0 license
with the following copyright:

Copyright (c) 2007-2008 Facebook


