<!--

Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License.  You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

-->

Apache Flex
Copyright 2014 The Apache Software Foundation

Apache Flex SDK Installer 3.1
1. Fixed bugs in ant_on_air library to support more checkums in installer scripts.
2. Reports more information when an install fails or is aborted.
3. Caching is now implemented in the ant scripts.  This means that Apache Flex SDK
   4.12.1 and earlier will not use the download cache and may install more slowly.
4. Minor UI/usability improvements
5. Installer log now saved to disk in installation directory

Apache Flex SDK Installer 3.0
1. Now uses external localized strings
2. Added support for install scripts based on Apache Ant

Apache Flex SDK Installer 2.7
1. Added support for OSMF2.0 [http://blogs.adobe.com/osmf/2012/03/osmf-2-0-now-available.html]
   From Apache Flex 4.11.0 onwards, support for OSMF2.0 has been added.  
2. The osmf.swf RSL now gets generated by the Installer.  

Apache Flex SDK Installer 2.6
Here is a list of significant issues that were fixed with this release:
1. Able to select which version of AIR and Flash Player to use.

Apache Flex SDK Installer 2.5

Issues addressed in this release:
Here is a list of significant issues that were fixed with this release:
1.  Enable Flex SDK download stats tracking
2.  https://issues.apache.org/jira/browse/FLEX-33426 (UI fix for license screen (show regular checkboxes))
3.  https://issues.apache.org/jira/browse/FLEX-33151 (Auto-update logic fix)
4.  French and Dutch language locale fixes.
5.  Added the SDK version number to be downloaded in the window title.
6.  https://issues.apache.org/jira/browse/FLEX-33202 (more issues).
7.  https://issues.apache.org/jira/browse/FLEX-33419 (added german language).


Apache Flex SDK Installer 2.0
1.  If you have previously installed a release candidate (RC) version of
    Apache Flex SDK Installer, you need to uninstall it first.  
    And then run the downloaded installer file.
2.  From Flex 4.9 onwards, the Text Layout Framework (TLF) is part of the Flex SDK.  
    So the installer does not download it separately anymore.
3.  By default, Apache Flex SDK Installer 2.0 downloads Adobe Flash Player 11.1 
    and Adobe AIR SDK 3.4.  If you want to change it to any other supported 
    combination, save a copy of the config file found at: 
       http://incubator.apache.org/flex/sdk-installer-config-2.0.xml, 
    modify the download urls to point to the required versions.  Then run the app 
    from command line mode with the optional command line parameter:
	 -config=<path to config file>.  
    The new urls will be used to download the required dependencies.

Issues addressed in this release:
Here is a list of significant issues that were fixed with this release:
1.  https://issues.apache.org/jira/browse/FLEX-33214 (Fix UI of license screen)
2.  https://issues.apache.org/jira/browse/FLEX-33122 (Enable language switching)
    Available languages: English(US), English(AU), English(GB), Español (ES), 
                         Français, Greek, Nederlands and Português

Apache Flex Installer SDK 1.0

1.  If you have previously installed a pre-release version of  Apache Flex SDK Installer, you need to uninstall it first.  And then run the downloaded installer file.
