<!--
  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.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
	<head>
		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
		<title>Tour de Flex Quick Start</title>
		<style type="text/css">
			body {
				font-family: Arial, Verdana, Helvetica, Sans-Serif;
				font-size: 62.5%; /* Resets 1em to 10px */
				color: #434346;
				margin: 0px 0px 0px 0px;
				padding: 0px 0px 0px 0px;
			}

			h1{
				font-size: 1.5em;
				font-weight: bold;
				margin: 0px 0xp 0xp 0px;
				padding: 0px 0px 0px 22px;
			}

			#links li {
				list-style-image: url("images/popArrows.gif");
				font-size: 80.0%; /* Resets 1em to 10px */

				margin: 0px 0px 0px 0px;
			}

			#links a {
				font-size: 1.2em;
			}

			
			#ltCol {
				width: 290px;
				margin: 10px 0px 0px 44px;
				float: left;
			}

			#rtCol {
				width: 310px;
				margin: 10px 44px 0px 0px;
				float: right;
			}

			.clearFloat{
				clear: both;
			}
			
			#main {
				background-image: url("images/qs_banner_plain_big2.jpg");
				padding: 45px 0px 0px 0px;
				/*border: solid 1px #323232;*/
				/*
				width: 700px;
				width: 740px;
				height: 576px;
				background-image: url("tempBkg.gif");
				background-repeat: no-repeat;
				margin: 0px 0px 0px 0px;
				padding: 56px 0px 0px 0px;
				*/
			}
		
			#mainSub {
				width: 700px;
			}
			#main p {
				margin: 0px 0px 0px 22px;
			}
			a, a:visited{
				color: #314983;
				text-decoration: none;
			}

			a:hover, a:active {
				color: #000000;
			}

			h2{
				margin: 0px 0px 0px 0px;
				padding: 0px 0px 0px 0px;
			}
			.news {
				margin: 0px 20px 10px 22px;
				padding: 0px 0px 6px 0px;
				border-bottom: solid 1px #E4E4E5;
			}
		</style>
	</head>
	<body>
		<div id="main">
			<h1>Welcome to Tour de Flex! Explore over 400 live samples of Flex components, APIs and <br /> coding techniques with source.</h1>
			<div id="mainSub">
            <center>
				<img src="images/quickstart.gif" alt="Tour de Flex Quick Start" width="675" height="190" />
			</center>
<BR><BR>
			<div class="news">
				<p>
					<h2>Tour de Flex is OFFLINE</h2>
					<BR>
					If you are seeing this, Tour de Flex has not detected an internet connection and you are offline.  Most of the AIR samples 
					will work offline but many other samples require an internet connection.  
				</p>
			</div>

            </div>
		</div>
		
	</body>
</html>