/*
 * 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.
 */
div:not(.highlight) > pre {
    background: #fff;
    border: 1px solid #e1e4e5;
    color: #404040;
    margin: 1px 0 24px 0;
    overflow-x: auto;
    padding: 12px 12px;
    font-size: 12px;
}

a.reference.internal code.literal {
    border: none;
    font-size: 12px;
    color: #2980B9;
    padding: 0;
    background: none;
}

a.reference.internal:visited code.literal {
    color: #9B59B6;
    padding: 0;
    background: none;
}


/* override table width restrictions */
.wy-table-responsive table td, .wy-table-responsive table th {
    white-space: normal;
}

.wy-table-responsive {
    margin-bottom: 24px;
    max-width: 100%;
    overflow: visible;
}

table.contentstable {
    margin: 0;
}

td.rightcolumn {
    padding-left: 30px;
}

div#wipwarning {
    font-size: 14px;
    border: 1px solid #ecc;
    color: #f66;
    background: #ffe8e8;
    padding: 10px 30px;
    margin-bottom: 30px;
}
.content-container{
    padding-right: 15px;
    padding-left: 15px;
    margin-right: auto;
    margin-left: auto;
    width:100%;
}
