<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!--
   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.
-->
<!-- Generated by Apache Maven Doxia at $dateFormat.format( $currentDate ) -->
#macro ( link $href $name $target $img $position $alt $border $width $height )
    #set ( $linkTitle = ' title="' + $name + '"' )
    #if( $target )
        #set ( $linkTarget = ' target="' + $target + '"' )
    #else
        #set ( $linkTarget = "" )
    #end
    #if ( $href.toLowerCase().startsWith("http:/") || $href.toLowerCase().startsWith("https:/") ||
        $href.toLowerCase().startsWith("ftp:/") || $href.toLowerCase().startsWith("mailto:/") ||
        $href.toLowerCase().startsWith("file:/") || ($href.toLowerCase().indexOf("://") != -1) )
        #set ( $linkClass = ' class="external" target="_blank"' )

        #if ( $linkTarget )
        #else
            #set ( $linkTarget = "_blank" )
        #end

    #else
        #set ( $linkClass = "" )
    #end
    #if ( $img )
        #if ( $position == "left" )
        <a href="$href"$linkClass$linkTarget$linkTitle>#image($img $alt $border $width $height)$name</a>
        #else
        <a href="$href"$linkClass$linkTarget$linkTitle>$name #image($img $alt $border $width $height)</a>
        #end
    #else
    <a href="$href"$linkClass$linkTarget$linkTitle>$name</a>
    #end
#end
##
#macro ( image $img $alt $border $width $height )
    #if( $img )
        #if ( ! ( $img.toLowerCase().startsWith("http:/") || $img.toLowerCase().startsWith("https:/") ||
            $img.toLowerCase().startsWith("ftp:/") || $img.toLowerCase().startsWith("mailto:/") ||
            $img.toLowerCase().startsWith("file:/") || ($img.toLowerCase().indexOf("://") != -1) ) )
            #set ( $imgSrc = $PathTool.calculateLink( $img, $relativePath ) )
            #set ( $imgSrc = $imgSrc.replaceAll( '\\', '/' ) )
            #set ( $imgSrc = ' src="' + $imgSrc + '"' )
        #else
            #set ( $imgSrc = ' src="' + $img + '"' )
        #end
        #if( $alt )
            #set ( $imgAlt = ' alt="' + $alt + '"' )
        #else
            #set ( $imgAlt = ' alt=""' )
        #end
        #if( $border )
            #set ( $imgBorder = ' border="' + $border + '"' )
        #else
            #set ( $imgBorder = "" )
        #end
        #if( $width )
            #set ( $imgWidth = ' width="' + $width + '"' )
        #else
            #set ( $imgWidth = "" )
        #end
        #if( $height )
            #set ( $imgHeight = ' height="' + $height + '"' )
        #else
            #set ( $imgHeight = "" )
        #end
    <img class="imageLink"$imgSrc$imgAlt$imgBorder$imgWidth$imgHeight/>
    #end
#end
#macro ( banner $banner $id )
    #if ( $banner )
        #if( $banner.href )
            #set ( $hrf = $banner.href )
            #if ( ! ( $hrf.toLowerCase().startsWith("http:/") || $hrf.toLowerCase().startsWith("https:/") ||
                $hrf.toLowerCase().startsWith("ftp:/") || $hrf.toLowerCase().startsWith("mailto:/") ||
                $hrf.toLowerCase().startsWith("file:/") || ($hrf.toLowerCase().indexOf("://") != -1) ) )
                #set ( $hrf = $PathTool.calculateLink( $hrf, $relativePath ) )
                #set ( $hrf = $hrf.replaceAll( '\\', '/' ) )
                #if ( ( $hrf == '' ) )
                    #set ( $hrf = './' )
                #end
            #end
        <a href="$hrf" id="$id"#if( $banner.alt ) title="$banner.alt"#end>
        #else
        <div id="$id">
        #end
    ##
        #if( $banner.src )
            #set ( $src = $banner.src )
            #if ( ! ( $src.toLowerCase().startsWith("http:/") || $src.toLowerCase().startsWith("https:/") ||
                $src.toLowerCase().startsWith("ftp:/") || $src.toLowerCase().startsWith("mailto:/") ||
                $src.toLowerCase().startsWith("file:/") || ($src.toLowerCase().indexOf("://") != -1) ) )
                #set ( $src = $PathTool.calculateLink( $src, $relativePath ) )
                #set ( $src = $src.replaceAll( '\\', '/' ) )
            #end
            #if ( $banner.alt )
                #set ( $alt = $banner.alt )
            #else
                #set ( $alt = $banner.name )
            #end
            <img src="$src" alt="$alt" />
        #else
            $banner.name
        #end
    ##
        #if( $banner.href )
        </a>
        #else
        </div>
        #end
    #end
#end
##
#macro ( links $links )
<ul class="nav">
    #set ( $counter = 0 )
    #foreach( $item in $links )
        #set ( $counter = $counter + 1 )
        #set ( $currentItemHref = $PathTool.calculateLink( $item.href, $relativePath ) )
        #set ( $currentItemHref = $currentItemHref.replaceAll( '\\', '/' ) )
        #set ( $activeClass = "" )
        #if ( $alignedFileName == $currentItemHref)
            #set ( $activeClass = ' class="active"' )
        #end
        <li$activeClass>
            #link( $currentItemHref $item.name $item.target $item.img $item.position $item.alt $item.border $item.width $item.height )
        </li>
    #end
</ul>
#end
##
#macro ( breadcrumbs $breadcrumbs )
    #foreach( $item in $breadcrumbs )
        #set ( $currentItemHref = $PathTool.calculateLink( $item.href, $relativePath ) )
        #set ( $currentItemHref = $currentItemHref.replaceAll( '\\', '/' ) )
        #if ( ( $currentItemHref == '' ) )
            #set ( $currentItemHref = './' )
        #end
    ##
        #link( $currentItemHref $item.name $item.target $item.img $item.position $item.alt $item.border $item.width $item.height )
    <span class="divider">&gt;</span>
    #end
    $title
#end
##
#macro ( displayTree $display $item )
    #if ( $item && $item.items && $item.items.size() > 0 )
        #foreach( $subitem in $item.items )
            #set ( $subitemHref = $PathTool.calculateLink( $subitem.href, $relativePath ) )
            #set ( $subitemHref = $subitemHref.replaceAll( '\\', '/' ) )
        ##
            #if ( $alignedFileName == $subitemHref )
                #set ( $display = true )
            #end
        ##
            #displayTree( $display $subitem )
        #end
    #end
#end
##
#macro ( menuItem $item $isComponentDocumentation )
    #set ( $collapse = "none" )
    #set ( $currentItemHref = $PathTool.calculateLink( $item.href, $relativePath ) )
    #set ( $currentItemHref = $currentItemHref.replaceAll( '\\', '/' ) )
##
    #if ( $item && $item.items && $item.items.size() > 0 )
        #if ( $item.collapse == false )
            #set ( $collapse = "expanded" )
        #else
        ## By default collapsed
            #set ( $collapse = "collapsed" )
        #end
    ##
        #set ( $display = false )
        #displayTree( $display $item )
    ##
        #if ( $alignedFileName == $currentItemHref || $display )
            #set ( $collapse = "expanded" )
        #end
    #end
    #set ( $active = "" )
    #if ( $alignedFileName == $currentItemHref )
        #set ($active = " active")
    #end
    #set ( $thisProjectDir = "../${project.artifactId}" )
    #if ($thisProjectDir == $PathTool.getDirectoryComponent( $item.href ))
        #set ($active = " active")
    #end
    #if (${project.artifactId} != "log4j" && $isComponentDocumentation &&
    ($item.href == "team-list.html" || $item.href == "mail-lists.html"
    || $item.href == "issue-tracking.html" || $item.href == "license.html"
    || $item.href == "source-repository.html"))
    <!-- Removing overall project item $item.name from component-specific menu -->
    #else
        #set ($thisItemName = $item.name)
        #if (${project.artifactId} != "log4j" && $isComponentDocumentation )
            #set ($thisItemName = $item.name.replace("Project Information", "Component Project"))
            #set ($thisItemName = $item.name.replace("Project", "Component"))
        #end
    <li class="$collapse$active">
        #link($currentItemHref $thisItemName $item.target $item.img $item.position $item.alt $item.border $item.width $item.height )
        #if ( $item && $item.items && $item.items.size() > 0 )
            #if ( $collapse == "expanded" )
                <ul>
                    #foreach( $subitem in $item.items )
						#menuItem( $subitem $isComponentDocumentation )
					#end
                </ul>
            #end
        #end
    </li>
    #end
#end
##
#macro ( mainMenu $menus )
    #foreach( $menu in $menus )
    <ul class="nav nav-list">
        #set ($isComponentDocumentation = false)
        #if ( $menu.name )
            #set ( $menuName = $menu.name )
            #if ( $menuName == "Project Documentation" )
                #set ( $menuName = "Component Documentation" )
                #set ($isComponentDocumentation = true)
            #end
            #if ( $menu.img )
                <li class="nav-header"><i class="$menu.img"></i>$menuName</li>
            #else
                <li class="nav-header">$menuName</li>
            #end
        #end
        #if ( $menu.items && $menu.items.size() > 0 )
            #foreach( $item in $menu.items )
                #menuItem( $item $isComponentDocumentation )
            #end
        #end
    </ul>
    #end
#end
##
#macro ( copyright )
    #if ( $project )
        #if ( ${project.organization} && ${project.organization.name} )
            #set ( $period = "" )
        #else
            #set ( $period = "." )
        #end
    ##
        #set ( $currentYear = ${currentDate.year} + 1900 )
    ##
        #if ( ${project.inceptionYear} && ( ${project.inceptionYear} != ${currentYear.toString()} ) )
            ${project.inceptionYear}-${currentYear}${period}
        #else
            ${currentYear}${period}
        #end
    ##
        #if ( ${project.organization} )
            #if ( ${project.organization.name} && ${project.organization.url} )
            <a href="$project.organization.url">${project.organization.name}</a>.
            #elseif ( ${project.organization.name} )
                ${project.organization.name}.
            #end
        #end
    #end
#end
##
#macro ( publishDate $position $publishDate $version )
    #if ( $publishDate && $publishDate.format )
        #set ( $format = $publishDate.format )
    #else
        #set ( $format = "yyyy-MM-dd" )
    #end
##
    $dateFormat.applyPattern( $format )
##
    #set ( $dateToday = $dateFormat.format( $currentDate ) )
##
    #if ( $publishDate && $publishDate.position )
        #set ( $datePosition = $publishDate.position )
    #else
        #set ( $datePosition = "left" )
    #end
##
    #if ( $version )
        #if ( $version.position )
            #set ( $versionPosition = $version.position )
        #else
            #set ( $versionPosition = "left" )
        #end
    #else
        #set ( $version = "" )
        #set ( $versionPosition = "left" )
    #end
##
    #set ( $breadcrumbs = $decoration.body.breadcrumbs )
    #set ( $links = $decoration.body.links )

    #if ( $datePosition.equalsIgnoreCase( $position ) )
        #if ( ( $datePosition.equalsIgnoreCase( "right" ) ) || ( $datePosition.equalsIgnoreCase( "bottom" ) ) )
        <span id="publishDate">$i18n.getString( "site-renderer", $locale, "template.lastpublished" ): $dateToday</span>
            #if ( $versionPosition.equalsIgnoreCase( $position ) )
            <span class="divider">|</span> <span id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</span>
            #end
        #elseif ( ( $datePosition.equalsIgnoreCase( "navigation-bottom" ) ) || ( $datePosition.equalsIgnoreCase( "navigation-top" ) ) )
        <div id="lastPublished">
            <span id="publishDate">$i18n.getString( "site-renderer", $locale, "template.lastpublished" ): $dateToday</span>
            #if ( $versionPosition.equalsIgnoreCase( $position ) )
                <span class="divider">|</span> <span id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</span>
            #end
        </div>
        #elseif ( $datePosition.equalsIgnoreCase("left") )
        <div class="pull-left">
            <span id="publishDate">$i18n.getString( "site-renderer", $locale, "template.lastpublished" ): $dateToday</span>
            #if ( $versionPosition.equalsIgnoreCase( $position ) )
                <span class="divider">|</span> <span id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</span>
            #end
            #if ( $breadcrumbs && $breadcrumbs.size() > 0 )
                <span class="divider">|</span> #breadcrumbs( $breadcrumbs )
            #end
        </div>
        #end
    #elseif ( $versionPosition.equalsIgnoreCase( $position ) )
        #if ( ( $versionPosition.equalsIgnoreCase( "right" ) ) || ( $versionPosition.equalsIgnoreCase( "bottom" ) ) )
            $prefix <span id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</span>
        #elseif ( ( $versionPosition.equalsIgnoreCase( "navigation-bottom" ) ) || ( $versionPosition.equalsIgnoreCase( "navigation-top" ) ) )
        <div id="lastPublished">
            <span id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</span>
        </div>
        #elseif ( $versionPosition.equalsIgnoreCase("left") )
        <div class="pull-left">
            <span id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</span>
            #if ( $breadcrumbs && $breadcrumbs.size() > 0 )
                <span class="divider">|</span> #breadcrumbs( $breadcrumbs )
            #end
        </div>
        #end
    #elseif ( $position.equalsIgnoreCase( "left" ) )
        #if ( $breadcrumbs && $breadcrumbs.size() > 0 )
        <div class="pull-left">
            #breadcrumbs( $breadcrumbs )
        </div>
        #end
    #end
#end
##
#macro ( poweredByLogo $poweredBy )
    #if( $poweredBy )
        #foreach ($item in $poweredBy)
            #if( $item.href )
                #set ( $href = $PathTool.calculateLink( $item.href, $relativePath ) )
                #set ( $href = $href.replaceAll( '\\', '/' ) )
            #else
                #set ( $href="http://maven.apache.org/" )
            #end
        ##
            #if( $item.name )
                #set ( $name = $item.name )
            #else
                #set ( $name = $i18n.getString( "site-renderer", $locale, "template.builtby" )	)
                #set ( $name = "${name} Maven"	)
            #end
        ##
            #if( $item.img )
                #set ( $img = $item.img )
            #else
                #set ( $img = "images/maven-feather.png" )
            #end
        ##
            #if ( ! ( $img.toLowerCase().startsWith("http:/") || $img.toLowerCase().startsWith("https:/") ||
                $img.toLowerCase().startsWith("ftp:/") || $img.toLowerCase().startsWith("mailto:/") ||
                $img.toLowerCase().startsWith("file:/") || ($img.toLowerCase().indexOf("://") != -1) ) )
                #set ( $img = $PathTool.calculateLink( $img, $relativePath ) )
                #set ( $img = $img.replaceAll( '\\', '/' ) )
            #end
        ##
            #if( $item.alt )
                #set ( $alt = ' alt="' + $item.alt + '"' )
            #else
                #set ( $alt = ' alt="' + $name + '"' )
            #end
        ##
            #if( $item.border )
                #set ( $border = ' border="' + $item.border + '"' )
            #else
                #set ( $border = "" )
            #end
        ##
            #if( $item.width )
                #set ( $width = ' width="' + $item.width + '"' )
            #else
                #set ( $width = "" )
            #end
            #if( $item.height )
                #set ( $height = ' height="' + $item.height + '"' )
            #else
                #set ( $height = "" )
            #end
        ##
        <a href="$href" title="$name" class="poweredBy">
            <img class="poweredBy" $alt src="$img" $border $width $height />
        </a>
        #end
        #if( $poweredBy.isEmpty() )
        <a href="http://maven.apache.org/" title="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven" class="poweredBy">
            <img class="poweredBy" alt="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven" src="$relativePath/images/maven-feather.png" />
        </a>
        #end
    #else
    <a href="http://maven.apache.org/" title="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven" class="poweredBy">
        <img class="poweredBy" alt="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven" src="$relativePath/images/maven-feather.png" />
    </a>
    #end
#end
##
#macro ( googleAnalytics $accountId )
    #if( $accountId && $accountId != "" )
    <!-- Google Analytics -->
    <script type="text/javascript">

        var _gaq = _gaq || [];
        _gaq.push(['_setAccount', '$accountId']);
        _gaq.push (['_gat._anonymizeIp']);
        _gaq.push(['_trackPageview']);

        (function() {
            var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
            ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
            var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
        })();

    </script>
    #end
#end
##
<html xmlns="http://www.w3.org/1999/xhtml"#if ( $locale ) xml:lang="$locale.language" lang="$locale.language"#end>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=${outputEncoding}" />
    <title>$title - $project.name</title>
    <link rel="stylesheet" href="$relativePath/css/bootstrap.min.css" type="text/css" />
    <link rel="stylesheet" href="$relativePath/css/site.css" type="text/css" />
    <script type="text/javascript" src="$relativePath/js/jquery.min.js"></script>
    <script type="text/javascript" src="$relativePath/js/bootstrap.min.js"></script>
    <script type="text/javascript" src="$relativePath/js/prettify.min.js"></script>
    <script type="text/javascript" src="$relativePath/js/site.js"></script>
    #foreach( $author in $authors )
        <meta name="author" content="$author" />
    #end
    #if ( $dateCreation )
        <meta name="Date-Creation-yyyymmdd" content="$dateCreation" />
    #end
    #if ( $dateRevision )
        <meta name="Date-Revision-yyyymmdd" content="$dateRevision" />
    #end
    #if ( $locale )
        <meta http-equiv="Content-Language" content="$locale.language" />
    #end
    $headContent
    #googleAnalytics( $decoration.googleAnalyticsAccountId )
</head>
<body class="composite">
<a  href="http://www.apache.org/events/current-event.html">
    <img class=logo-left src="http://www.apache.org/events/current-event-234x60.png"/>
</a>
<img class="logo-right" src="$relativePath/images/logo.png" alt="Apache log4j logo" />
<a href="https://logging.apache.org/">
    <img class="logo-center" src="$relativePath/images/ls-logo.jpg" alt="Apache logging services logo" />
</a>
<div class="clear"></div>

<div class="navbar">
    <div class="navbar-inner">
        <div class="container-fluid">
            <a class="brand" href="$project.url">$project.name &trade;</a>
            #links( $decoration.body.links )
        </div>
    </div>
</div>

<div class="container-fluid">
    <table class="layout-table">
        <tr>
            <td class="sidebar">
                <div class="well sidebar-nav">
                    #mainMenu( $decoration.body.menus )
                </div>
                <div id="poweredBy">
                    #poweredByLogo( $decoration.poweredBy )
                </div>
            </td>
            <td class="content">
                $bodyContent
            </td>
        </tr>
    </table>
</div>

<div class="footer">
    #set ( $currentYear = ${currentDate.year} + 1900 )
    <p>Copyright &copy; ${project.inceptionYear}-${currentYear} <a class="external" href="$project.organization.url">${project.organization.name}</a>. All Rights Reserved.</p>
    <p>Apache Logging, Apache Log4j, Log4j, Apache Log4j Audit, Log4j Audit, Apache, the Apache feather logo, and the Apache Logging project logo are trademarks of The Apache Software Foundation.</p>
    <p>Site powered by <a class="external" href="http://getbootstrap.com/">Twitter Bootstrap</a>. Icons from <a class="external" href="http://glyphicons.com/">Glyphicons Free</a>.</p>
</div>
</div>
</body>
</html>
