
<!--
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.
-->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

<head>
  <title>{{ page.title }}</title>
  <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />

  <link rel="stylesheet" href="{{ site.url }}/style/style.css" type="text/css" media="screen" />
  <link rel="stylesheet" href="{{ site.url }}/style/toc.css" type="text/css" media="screen" />
  <link rel="stylesheet" href="{{ site.url }}/style/docs/code.css" type="text/css" media="screen" />

    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
  
	<!-- Sidebar/ToC Scripts and CSS -->
	<script src="{{ site.url }}/style/js/jquery/jquery-1.7.1.min.js"></script>
	<script src="{{ site.url }}/style/js/jquery/jquery-ui-1.8.18.custom.min.js"></script>
	<link rel="stylesheet" type="text/css" href="{{ site.url }}/style/js/jquery/smoothness/jquery-ui-1.8.18.custom.css" />
	
	<script type="text/javascript" src="{{ site.url }}/style/js/superfish.js"></script>
	<script type="text/javascript" src="{{ site.url }}/style/js/jquery.cookie.js"></script>
	
	
<!-- Clipboard support -->
<script src="//cdnjs.cloudflare.com/ajax/libs/zeroclipboard/1.3.1/ZeroClipboard.min.js"></script>
<style type="text/css">
.clipboard_container { float: right; padding: 8px; }
.clipboard_button {
    background-image: url("{{ site.url }}/style/icons/clipboard-green-normal.png");
    background-size: 18px 21px;
    width: 18px; height: 21px;
}
.clipboard_button:hover, .clipboard_button.zeroclipboard-is-hover { background-image: url("{{ site.url }}/style/icons/clipboard-green-hover.png"); }
.clipboard_button:active, .clipboard_button.zeroclipboard-is-active { background-image: url("{{ site.url }}/style/icons/clipboard-green-click.png"); }'
</style>
<script type="text/javascript"> <!-- clipboard -->
  ZeroClipboard.config({ moviePath: '//cdnjs.cloudflare.com/ajax/libs/zeroclipboard/1.3.1/ZeroClipboard.swf' });
</script>
<script type="text/javascript"> <!-- clipboard positioning -->
$(document).ready(function() {
  $('<div class="clipboard_container" title="Copy to Clipboard">'+
    '<div class="clipboard_button"/>'+
  '</div>').insertBefore($('div.highlight'))
  $('div.clipboard_container').each(function(index) {
    var clipboard = new ZeroClipboard();
    clipboard.clip( $(this).find(":first")[0], $(this)[0] );
    var target = $(this).next();
    var txt = target.text().trim();
    if (target.find('code.bash')) {
      // Strip out bash prompts from the start of each line (i.e. '$' or '%' characters
      // at the very start, or immediately following any newline). Correctly handles continuation
      // lines, where a leading '$' or '%' is *not* a prompt character.
      txt = txt.replace(/(^|[^\\]\n)[$%] /g, "$1");
    }
console.log("setting text to "+txt);
    clipboard.on( 'dataRequested', function (client, args) {
      client.setText( txt );
    });
  });
});
</script>

    <script type="text/javascript">
        // initialise menu delay
        jQuery(function(){
            jQuery('ul#mainmenu').superfish({ 
                autoArrows:  false,  // disable generation of arrow mark-up 
                dropShadows: false,  // disable drop shadows 
                disableHI:   true,   // set to true to disable hoverIntent detection 
                delay:       500,    // the delay in milliseconds that the mouse can remain outside a submenu without it closing 
                speed:       'fast', 
            });
        });
    </script>

<script type="text/javascript">

<!-- search -->
	$(function() {
		$('#simple_google')
			.submit(function() {
				$('input[name="q"]').val("site:" + document.location.hostname + " " + $('input[name="brooklyn-search"]').val());
			return true;
			});
		$('input[name="brooklyn-search"]').focus(function() {
				if ($(this).val() === $(this).attr('placeholder')) {
					$(this).val('');
				}
			})
			.blur(function() {
				if ($(this).val() === '') {
					$(this).val($(this).attr('placeholder'));
				}
			})
			.blur();
    });
    
<!-- page notes -->
   	$(function() {
		if (document.location.pathname.replace(/^\/([^\/]*).*$/, '$1') === "v"){
			var thisversion = document.location.pathname.split("/")[2],
				msg = "";
			
			if (!$.cookie('brooklyn_versions') || 
			        (($.inArray('ALL', $.cookie('brooklyn_versions').split(",")) === -1) &&
			        ($.inArray(thisversion, $.cookie('brooklyn_versions').split(",")) === -1)) ){
			    msg += "<div class='warning_banner_image'><img src='{{ site.url }}/style/icons/warning.png'/></div>";
				msg += "<p>This content is for <strong>Brooklyn "+thisversion+"</strong>, and may differ across versions.</p>";
			    msg += "<p>Are you using version "+thisversion+"?</p>";
				msg += "<p class='warning_banner_buttons'>";
				msg += "<a href = '#' onclick=\"set_user_version('"+thisversion+"');\">Yes, hide this warning</a>";
			    msg += "<a href = '/'>No, show me the latest version</a>";
				msg += "<a href = '/meta/versions.html'>Show all versions</a>";
				msg += "</p>"
							
				$('#page_notes').html(msg);
				$('#page_notes').fadeIn('slow');
			}
		}
	});
   	function get_user_versions() {
   	    return $.cookie("brooklyn_versions") ? $.cookie("brooklyn_versions").split(",") : [];
   	};
	function set_user_version(version) {
		var version_cookie = get_user_versions();
		version_cookie.push(version);
		$.cookie('brooklyn_versions', version_cookie, { expires: 365, path: '/' });
		$('#page_notes').fadeOut();
		event.preventDefault ? event.preventDefault() : event.returnValue = false;
	};
    function set_user_versions_all() {
        var version_cookie = get_user_versions();
        version_cookie.push("ALL");
        $.cookie('brooklyn_versions', version_cookie, { expires: 365, path: '/' });
        $('#page_notes').fadeOut();
        event.preventDefault ? event.preventDefault() : event.returnValue = false;
    };
    function clear_user_versions() {
        $.removeCookie('brooklyn_versions', { path: '/' });
        $('#page_notes').fadeIn('slow');
        event.preventDefault ? event.preventDefault() : event.returnValue = false;
    };
	
   
 <!-- analytics -->
	var _gaq = _gaq || [];
	_gaq.push(['_setAccount', 'UA-30530918-1']);
	_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>

</head>

<body>

    <ul id="shortcuts" title="Accessibility shortcuts menu">
        <li><a href="#maincontent">Skip to main content</a></li>
    </ul>
   

<div id="container">

    <div id="header">
    
        <div id="identity">
            <a href="http://brooklyncentral.github.com/" rel="home">Brooklyn</a>
        </div>
        
        <ul id="quicklinks">
            <li><a href="{{site.url}}/meta/versions.html">{{ site.brooklyn-version }}</a></li>
            <li><a href="{{site.url}}/start/download.html">Download</a></li>
            <li><a href="https://github.com/brooklyncentral">GitHub</a></li>
            <li><a href="https://twitter.com/#!/search?q=brooklyncentral">Twitter</a></li>
            <li><a href="{{site.url}}/meta/contact.html">Contact</a></li>
        </ul>

        <div id="menubar">  

{% include topbar.html %}                    

            <form method="get" id="simple_google" class="searchform" action="http://www.google.com/search" method="get">
                <input type="text" class="searchinput" name="brooklyn-search" placeholder="Search: type &amp; hit enter" />
                <input type="hidden" name="q" value="" />
            </form>
            
        </div>
                
    </div><!--header-->
    
    <div id="contentcontainer">
    
        <div id="maincontent">

{% include breadcrumbs.html %}

<div id="page_notes"></div>

<h1 id="header_title">{{ page.title }}</h1>
    
{{ content }}

        </div><!--maincontent-->
        
      <div id="sidebar">
      
{% include sidebar.html %}

      </div>

    </div><!--contentcontainer-->
        
    <div id="footer">
        <p id="copyright">
            <b>brooklyn is distributed under the Apache License v2.0.</b><br/>
            brooklyn is a registered trademark of Cloudsoft Corporation.<br/>
            &copy; 2013 Cloudsoft Corporation.
        </p>
    </div><!--footer -->

</div><!--container-->

</body>
</html>
