Apache UIMA-DUCC
Copyright 2012 The Apache Software Foundation

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

Portions of Apache UIMA were originally developed by
International Business Machines Corporation and are
licensed to the Apache Software Foundation under the
"Software Grant License Agreement", informally known as the
"IBM UIMA License Agreement".
Copyright (c) 2003, 2006 IBM Corporation.

Portions of UIMA-DUCC were originally developed by
International Business Machines Corporation and are
licensed to the Apache Software Foundation under the
"Software Grant License Agreement", informally known as the 
"IBM UIMA-DUCC License Agreement".
Copyright (c) 2012 IBM Corporation

Portions of UIMA-AS were originally developed by
International Business Machines Corporation and are
licensed to the Apache Software Foundation under the
"Software Grant License Agreement", informally known as the 
"IBM UIMA-EE License Agreement".
Copyright (c) 2007, 2008 IBM Corporation

This product includes software known as 
"The Saxon XSLT and XQuery Processor from Saxonica Limited", whose
home page URL is http://www.saxonica.com/ 

Saxon includes the org.apache.xerces.util.XMLChar module from the Apache 
Xerces product, renamed as net.sf.saxon.om.XMLChar but otherwise unchanged. 
See the copyright statements included in the source code of that module for
conditions of use.

Saxon includes code for performing Unicode normalization that is derived 
from the sample code published for this purpose by the Unicode consortium. 
For the terms of use of this code, see http://www.unicode.org/terms_of_use.html, 
which should be regarded as forming part of these conditions of use, and part 
of the Saxon documentation. 


This product includes image 
120px-Anas_platyrhynchos_-United_Kingdom_-adult_female_and_ducklings-8.jpg,
which is licensed under the Creative Commons license CC-BY-2.0. The license can 
be downloaded from 
http://creativecommons.org/licenses/by/2.0/legalcode. Source:
http://commons.wikimedia.org/wiki/File:Anas_platyrhynchos_-United_Kingdom_-adult_female_and_ducklings-8.jpg#metadata
jans canon / Wikimedia Commons / CC-BY-2.0

This product includes image 120px-Ducks_eating.jpg, which is licensed under 
the Creative Commons license CC-BY-2.0. The license can be downloaded from 
http://creativecommons.org/licenses/by/2.0/legalcode. Source:
http://commons.wikimedia.org/wiki/File:Ducks_eating.jpg
Neil Phillips / Wikimedia Commons / CC-BY-2.0

This product includes image 120px-Rubber_duckies_So_many_ducks.jpg, which is licensed 
under the Creative Commons  license CC-BY-2.0. The license can be downloaded from 
http://creativecommons.org/licenses/by/2.0/legalcode. Source:
http://commons.wikimedia.org/wiki/File:Rubber_duckies_So_many_ducks.jpg
Gaetan Lee / Wikimedia Commons / CC-BY-2.0  

This product includes image Ducklings_in_Shaw_Creek.jpg, 
which is licensed  under the Creative Commons  license CC-BY-2.0. The license 
can be downloaded from 
http://creativecommons.org/licenses/by/2.0/legalcode. Source:
http://commons.wikimedia.org/wiki/File:Ducklings_in_Shaw_Creek.jpg
Author:Peggy2012CREATIVELENZ / Wikimedia Commons / CC-BY-2.0 


This product includes image 120px-Head_of_a_white_domesticated_duck.jpg, which is licensed 
under the Creative Commons  license CC-BY-SA-2.0. The license can be downloaded from 
http://creativecommons.org/licenses/by-sa/2.0/legalcode.Source:
http://commons.wikimedia.org/wiki/File:Head_of_a_white_domesticated_duck.jpg
Ernst Vikne / Wikimedia Commons / CC-BY-SA-2.0 

This product includes image 90px-Mallards_nest_Culwatty_-_geograph.org.uk_-_813413.jpg, 
which is licensed  under the Creative Commons  license CC-BY-SA-2.0. The license 
can be downloaded from 
http://creativecommons.org/licenses/by-sa/2.0/legalcode. Source:
http://commons.wikimedia.org/wiki/File:Mallard%27s_nest,_Culwatty_-_geograph.org.uk_-_813413.jpg
Author:wfmillar / Wikimedia Commons / CC-BY-SA-2.0

This product includes image 90px-Swimming_white_domesticated_ducks.jpg, 
which is licensed  under the Creative Commons  license CC-BY-SA-2.0. The license 
can be downloaded from 
http://creativecommons.org/licenses/by-sa/2.0/legalcode. Source:
http://commons.wikimedia.org/wiki/File:Swimming_white_domesticated_ducks.jpg
Ernst Vikne / Wikimedia Commons / CC-BY-SA-2.0

This product includes image Delena-cancerides-huntsman-spider.jpg, 
which is licensed  under the Creative Commons  license CC-BY-SA-2.0. The license 
can be downloaded from 
http://creativecommons.org/licenses/by-sa/2.0/legalcode. Source:
http://commons.wikimedia.org/wiki/File:Delena-cancerides-huntsman-spider.jpg
Bryce McQuillan / Wikimedia Commons / CC-BY-SA-2.0

This product includes image refresh.png, which is licensed 
under the Creative Commons  license CC BY-SA 2.5. The license can be downloaded from 
http://creativecommons.org/licenses/by-sa/2.5/legalcode. Source:
http://commons.wikimedia.org/wiki/File:Human-gnome-session-reboot.svg
Pander / Wikimedia Commons / CC BY-SA 2.5

This product includes image 144x144Stick_figure_-_choosing.jpg, which is licensed 
under the Creative Commons  license CC-BY-SA-3.0. The license can be downloaded from 
http://creativecommons.org/licenses/by-sa/3.0/legalcode. Source:
http://commons.wikimedia.org/wiki/File:Stick_figure_-_choosing.jpg
User:Obsidian Soul / Wikimedia Commons / CC-BY-SA-3.0 

This product includes image 12x1.33in-Bariken_kid.JPG, which is licensed 
under the Creative Commons  license CC-BY-SA-3.0. The license can be downloaded from 
http://creativecommons.org/licenses/by-sa/3.0/legalcode. Source:
http://commons.wikimedia.org/wiki/File:Bariken_kid.JPG
User:Materialscientist / Wikimedia Commons / CC-BY-SA-3.0 

This product includes image 800px-Leg_Of_White_Duck.2x1.6.jpg, which is licensed 
under the Creative Commons  license CC-BY-SA-3.0. The license can be downloaded from 
http://creativecommons.org/licenses/by-sa/3.0/legalcode. Source:
http://commons.wikimedia.org/wiki/File:Leg_Of_White_Duck.jpg
User:Ezhuttukari / Wikimedia Commons / CC-BY-SA-3.0  

This product includes image Flying_mallard_duck_-_female_2.0x1.4.jpg, 
which is licensed  under the Creative Commons  license CC-BY-SA-3.0. The license 
can be downloaded from 
http://creativecommons.org/licenses/by-sa/3.0/legalcode. Source:
http://commons.wikimedia.org/wiki/File:Flying_mallard_duck_-_female.jpg
Author:Martin Correns / Wikimedia Commons / CC-BY-SA-3.0  

This product includes image 800px-Duck_crossing_Louisiana.2x1.4.jpg, which is in 
public domain in the United States. Source:
http://commons.wikimedia.org/wiki/File:Duck_crossing_Louisiana_2010-10-15.JPG
Richard David Ramsey

This product includes image indicator.gif, which is in 
public domain in the United States. Source:
http://commons.wikimedia.org/wiki/File:Birdleft.gif
Author:Pigpen  


