Apache Flex
Copyright 2014 The Apache Software Foundation

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

The Initial Developer of the Original Code, known as TourDeFlex, 
is Adobe Systems Incorporated (http://www.adobe.com/).
Copyright 2009 - 2013 Adobe Systems Incorporated. All Rights Reserved.

The ping sound effect (ping.mp3) in TourDeFlex3/src/mx/effects/assets
was created by CameronMusic. The original file can be found here:
http://www.freesound.org/people/cameronmusic/sounds/138420/

The text used in the summaries of each version of Apache Flex
in TourDeFlex3/apache can be found here:
http://www.freesound.org/people/cameronmusic/sounds/138420/