/*
 * 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.
 */
a:link {
    color:#0066cc;
}

a:visited {
    color:#6699cc;
}

h1 {
    color:#3c6eb4;
}

.producttitle {
    background: #3c6eb4 url(../images/h1-bg.png) top left repeat;
}

.section h1.title {
    color:#3c6eb4;
}


h2,h3,h4,h5,h6 {
    color:#3c6eb4
}

table {
    border:1px solid #3c6eb4;
}

table th {
    background-color:#3c6eb4;
}

table tr.even td {
    background-color:#f5f5f5;
}

#title a {
    height:54px;
}

.term{
    color:#a70000;
}

.revhistory table th {
    color:#3c6eb4;
}

.edition {
    color: #3c6eb4;
}

span.remark{
    background-color: #ffff00;
}

