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

This product includes software developed by
CoreMedia AG (http://www.coremedia.com/).

This product includes software developed by
castLabs GmbH (http://www.castlabs.com/).

This product includes software developed by
Sebastian Annies (Sebastian.Annies@gmail.com)

This product includes software (Base64 Encoder extracted from commons-codec) developed by
The Apache Software Foundation (http://www.apache.org/).

This product includes software (Hex Encoder extracted from commons-codec) developed by
The Apache Software Foundation (http://www.apache.org/).

This product includes software (package com.googlecode.mp4parser.h264) developed by
Stanislav Vitvitskiy and originally licensed under MIT license (http://www.opensource.org/licenses/mit-license.php)