/*
 * 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.
*/
 
/***********************************************
Reset
***********************************************/
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td {
border:0; 
margin:0; 
outline:0; 
padding:0;
font-size: 100%; 
background:transparent; 
vertical-align: baseline;
}

blockquote, q {quotes: none;}
blockquote:before,
blockquote:after,
q:before,
q:after {
content:''; 
content: none;
}

a, address, body, caption, cite, code, dfn, em, strong, th, var {
font-style: normal;
font-weight: normal;
text-decoration: none;
}

a img {border: none;}

:focus {
-moz-outline:0;
outline:0;
outline-offset:0;
}

ol, ul {list-style: none;}

table {border-collapse: collapse; border-spacing: 0;}

caption, th, td {text-align: left; font-weight: normal;}

ins {text-decoration: none;}
del {text-decoration: line-through;}

body {line-height: 1; color: black; background: white;}

/***********************************************
Clear Fix
***********************************************/
.clearfix:after {
content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden;
}

.clearfix {display: inline-block;}
html[xmlns] .clearfix { display: block; }
* html .clearfix { height: 1%;}
.clearfix {display: block;}