   =========================================================================
   ==  NOTICE file corresponding to section 4(d) of the Apache License,   ==
   ==  Version 2.0, in this case for the Apache XmlBeans distribution.    ==
   =========================================================================

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

   Portions of this software were originally based on the following:
     - software copyright (c) 2000-2003, BEA Systems, <http://www.bea.com/>.
   Note: The ASF Secretary has on hand a Software Grant Agreement (SGA) from
   BEA Systems, Inc. dated 9 Sep 2003 for XMLBeans signed by their EVP/CFO.

   Aside from contributions to the Apache XMLBeans project, this
   software also includes:

    - one or more source files from the Apache Xerces-J and Apache Axis
      products, Copyright (c) 1999-2003 Apache Software Foundation

    - W3C XML Schema documents Copyright 2001-2003 (c) World Wide Web
      Consortium (Massachusetts Institute of Technology, European Research
      Consortium for Informatics and Mathematics, Keio University)

    - resolver.jar from Apache Xml Commons project,
      Copyright (c) 2001-2003 Apache Software Foundation


    **********************
    THIRD PARTY COMPONENTS
    **********************
    This software includes third party software subject to the following copyrights:

    Apache Ant
    Copyright 1999-2023 The Apache Software Foundation

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

    The <sync> task is based on code Copyright (c) 2002, Landmark
    Graphics Corp that has been kindly donated to the Apache Software
    Foundation.

    Apache Commons Codec
    Copyright 2002-2020 The Apache Software Foundation

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

    src/test/org/apache/commons/codec/language/DoubleMetaphoneTest.java
    contains test data from http://aspell.net/test/orig/batch0.tab.
    Copyright (C) 2002 Kevin Atkinson (kevina@gnu.org)

    ===============================================================================

    The content of package org.apache.commons.codec.language.bm has been translated
    from the original php source code available at http://stevemorse.org/phoneticinfo.htm
    with permission from the original authors.
    Original source copyright:
    Copyright (c) 2008 Alexander Beider & Stephen P. Morse.

