/*
 * 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.
 */
body {
	font-family: Verdana, Arial, Helvetica, sans-serif;
	margin-top: 12px;
	margin-top: 12px;
	margin-left: 12px;
	margin-right: 12px;
	font-size: 0.8em;
	color: #333333;
	background-color:#FFFFFF;
}

h1, h2, h3 {
	font-family: 'Trebuchet MS', 'Lucida Grande', Verdana, Arial, Sans-Serif;
	font-weight: bold;
}

h1 {
	font-weight: bold;
	margin-top: 4px;
	margin-bottom: 12px;
	font-size: 2em;
}

h2 {
	padding-top: 12px;
	margin-bottom: 0px;
	font-size: 1.6em;
	color: #333333;
}

h3 {
	margin-top: 0px;
	font-size: 1.3em;
	color: #004477;
}

h4 {
	margin-top: 20px;
	margin-bottom: 8px;
	font-size: 12px;
	color: #333333;
}

.item {
	border-bottom: 1px solid #CCCCCC;
	padding-top: 12px;
	padding-bottom: 0px;
}

.highlight {
	border: 1px solid #CCCCCC;
	padding-top:10px;
	padding-left:10px;
	padding-right:10px;
	padding-bottom:0px;
	border-color: #2080B3;
	margin-top:20px;
	margin-bottom:20px;
}

.footer {
	color: #666666;
	margin-top: 20px;
	font-size: 0.75em;
}

ul {
	margin-top:8px;
	margin-bottom:8px;
}

li {
	padding-bottom:8px;
}

code {
	color: #000099;
	font-family: "Courier New", Courier, monospace;
	font-size:1.1em;
}

img {
	border: 0;
}

#col1{
  	float:left;
	width: 20%;
	padding-right: 24px;
}

#col2{
  float: left;
  width: 55%;
}

#col3{
	float: right;
	width: 20%;
	margin: 0px;
	padding: 0px;
}

a:link {
	color: #006699;
	text-decoration: none;
}

a:visited {
	text-decoration: none;
	color: #006699;
}

a:hover {
	text-decoration: underline;
	color: #006699;
}

a:active {
	text-decoration: none;
	color: #006699;
}