You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2014/12/17 18:24:01 UTC

[27/50] [abbrv] incubator-brooklyn git commit: add website files, and update the build.sh script appropriately

add website files, and update the build.sh script appropriately


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/b86cbf04
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/b86cbf04
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/b86cbf04

Branch: refs/heads/master
Commit: b86cbf049bb3277ac444b8529edf35fab37e2368
Parents: ff06bfe
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Tue Dec 16 10:40:10 2014 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Dec 17 02:02:56 2014 +0000

----------------------------------------------------------------------
 docs/README.md                                  |   106 +
 docs/_build/build.sh                            |    45 +-
 docs/_build/config-website-root.yml             |     4 +
 docs/_config.yml                                |    16 +-
 docs/_layouts/website-base.html                 |    76 +
 docs/_layouts/website-landing.html              |    30 +
 docs/_layouts/website-normal.html               |    41 +
 docs/_plugins/brooklyn_metadata.rb              |    60 +
 docs/_plugins/dependency_url.rb                 |    31 +
 docs/_plugins/site_structure.rb                 |    85 +
 docs/index.md                                   |    12 +
 docs/style/css/website.css                      |    49 +
 docs/style/deps/bootstrap-theme.css             |   346 +
 docs/style/deps/bootstrap.css                   |     1 -
 .../img/apache-brooklyn-logo-244px-wide.png     |   Bin 0 -> 4892 bytes
 .../img/apache-brooklyn-logo-817px-wide.png     |   Bin 0 -> 10688 bytes
 docs/style/img/bridge-large-no-title.png        |   Bin 0 -> 66113 bytes
 docs/style/js/_readme.txt                       |     2 +
 docs/style/js/underscore-min.js                 |     6 +
 docs/style/js/underscore-min.map                |     1 +
 docs/website/community/committers.md            |   119 +
 docs/website/community/fork-after.png           |   Bin 0 -> 134377 bytes
 docs/website/community/fork-before.png          |   Bin 0 -> 131674 bytes
 docs/website/community/fork-new.png             |   Bin 0 -> 137626 bytes
 .../website/community/how-to-contribute-docs.md |   140 +
 docs/website/community/how-to-contribute.md     |    85 +
 docs/website/community/index.md                 |    86 +
 docs/website/community/migrate-to-apache.md     |   117 +
 docs/website/community/pull-request.png         |   Bin 0 -> 94166 bytes
 docs/website/documentation.md                   |    19 +
 docs/website/documentation/increase-entropy.md  |    31 +
 docs/website/documentation/install-on-server.md |   122 +
 docs/website/documentation/passwordless-ssh.md  |    29 +
 docs/website/documentation/ssh-key.md           |     9 +
 docs/website/download.md                        |    70 +
 docs/website/glossary.md                        |    92 +
 docs/website/index.md                           |    71 +
 docs/website/learnmore/catalog/common.js        |    94 +
 .../brooklyn.enricher.DeltaEnricher.html        |    59 +
 .../brooklyn.enricher.HttpLatencyDetector.html  |    59 +
 .../brooklyn.enricher.RollingMeanEnricher.html  |    59 +
 ....enricher.RollingTimeWindowMeanEnricher.html |    59 +
 ...klyn.enricher.TimeFractionDeltaEnricher.html |    59 +
 ...klyn.enricher.TimeWeightedDeltaEnricher.html |    59 +
 .../brooklyn.enricher.basic.Aggregator.html     |    59 +
 .../brooklyn.enricher.basic.Combiner.html       |    59 +
 .../brooklyn.enricher.basic.Propagator.html     |    59 +
 .../brooklyn.enricher.basic.Transformer.html    |    59 +
 ...ooklyn.policy.ha.ServiceFailureDetector.html |    59 +
 ...lyn.entity.basic.VanillaSoftwareProcess.html |    66 +
 ...ntity.brooklynnode.BrooklynEntityMirror.html |    66 +
 ...ooklyn.entity.brooklynnode.BrooklynNode.html |    66 +
 ...lyn.entity.database.mariadb.MariaDbNode.html |    66 +
 ...rooklyn.entity.database.mysql.MySqlNode.html |    66 +
 ...tity.database.postgresql.PostgreSqlNode.html |    66 +
 ...lyn.entity.database.rubyrep.RubyRepNode.html |    66 +
 .../brooklyn.entity.machine.MachineEntity.html  |    66 +
 ...ntity.messaging.activemq.ActiveMQBroker.html |    66 +
 ...lyn.entity.messaging.kafka.KafkaCluster.html |    66 +
 ...ooklyn.entity.messaging.qpid.QpidBroker.html |    66 +
 ...yn.entity.messaging.rabbit.RabbitBroker.html |    66 +
 .../brooklyn.entity.messaging.storm.Storm.html  |    66 +
 ....entity.messaging.storm.StormDeployment.html |    66 +
 ...oklyn.entity.monitoring.monit.MonitNode.html |    66 +
 ...oklyn.entity.network.bind.BindDnsServer.html |    66 +
 ...ity.nosql.cassandra.CassandraDatacenter.html |    66 +
 ....entity.nosql.cassandra.CassandraFabric.html |    66 +
 ...yn.entity.nosql.cassandra.CassandraNode.html |    66 +
 ...entity.nosql.couchbase.CouchbaseCluster.html |    66 +
 ...yn.entity.nosql.couchbase.CouchbaseNode.html |    66 +
 ...ooklyn.entity.nosql.couchdb.CouchDBNode.html |    66 +
 ...osql.elasticsearch.ElasticSearchCluster.html |    66 +
 ...y.nosql.elasticsearch.ElasticSearchNode.html |    66 +
 ...klyn.entity.nosql.mongodb.MongoDBServer.html |    66 +
 ...ty.nosql.mongodb.sharding.MongoDBRouter.html |    66 +
 ...ngodb.sharding.MongoDBShardedDeployment.html |    66 +
 ...rooklyn.entity.nosql.redis.RedisCluster.html |    66 +
 .../brooklyn.entity.nosql.redis.RedisStore.html |    66 +
 .../brooklyn.entity.nosql.riak.RiakCluster.html |    66 +
 .../brooklyn.entity.nosql.riak.RiakNode.html    |    66 +
 .../brooklyn.entity.nosql.solr.SolrServer.html  |    66 +
 ...ooklyn.entity.osgi.karaf.KarafContainer.html |    66 +
 .../brooklyn.entity.pool.ServerPool.html        |    66 +
 ...klyn.entity.proxy.nginx.NginxController.html |    66 +
 ...y.webapp.ControlledDynamicWebAppCluster.html |    66 +
 ...klyn.entity.webapp.DynamicWebAppCluster.html |    66 +
 ...ooklyn.entity.webapp.jboss.JBoss6Server.html |    66 +
 ...ooklyn.entity.webapp.jboss.JBoss7Server.html |    66 +
 ...ooklyn.entity.webapp.jetty.Jetty6Server.html |    66 +
 ...ntity.webapp.nodejs.NodeJsWebAppService.html |    66 +
 ...oklyn.entity.webapp.tomcat.TomcatServer.html |    66 +
 ...klyn.entity.zookeeper.ZooKeeperEnsemble.html |    66 +
 ...brooklyn.entity.zookeeper.ZooKeeperNode.html |    66 +
 docs/website/learnmore/catalog/index.html       |   147 +
 docs/website/learnmore/catalog/items.css        |   153 +
 docs/website/learnmore/catalog/items.js         | 24674 +++++++++++++++++
 .../learnmore/catalog/libs/js/bloodhound.js     |   727 +
 ...brooklyn.entity.pool.ServerPoolLocation.html |    62 +
 .../brooklyn.location.AddressableLocation.html  |    62 +
 .../brooklyn.location.MachineLocation.html      |    62 +
 ...tMixins$RichMachineProvisioningLocation.html |    62 +
 ...yn.location.MachineProvisioningLocation.html |    62 +
 ...rooklyn.location.basic.AbstractLocation.html |    62 +
 ....AggregatingMachineProvisioningLocation.html |    62 +
 ...ic.FixedListMachineProvisioningLocation.html |    62 +
 ...neProvisioningLocation$LocalhostMachine.html |    62 +
 ...ic.LocalhostMachineProvisioningLocation.html |    62 +
 ...rooklyn.location.basic.LocationInternal.html |    62 +
 .../brooklyn.location.basic.MultiLocation.html  |    62 +
 ...ooklyn.location.basic.SimulatedLocation.html |    62 +
 ...basic.SingleMachineProvisioningLocation.html |    62 +
 ...oklyn.location.basic.SshMachineLocation.html |    62 +
 ...bstractCloudMachineProvisioningLocation.html |    62 +
 ...AbstractJcloudsSubnetSshMachineLocation.html |    62 +
 ...ooklyn.location.jclouds.JcloudsLocation.html |    62 +
 ...ation.jclouds.JcloudsSshMachineLocation.html |    62 +
 ...followthesun.DefaultFollowTheSunModel$1.html |    62 +
 ...lyn.policy.autoscaling.AutoScalerPolicy.html |    59 +
 ....policy.followthesun.FollowTheSunPolicy.html |    59 +
 ...lyn.policy.ha.ConnectionFailureDetector.html |    59 +
 .../brooklyn.policy.ha.ServiceReplacer.html     |    59 +
 .../brooklyn.policy.ha.ServiceRestarter.html    |    59 +
 ...olicy.loadbalancing.LoadBalancingPolicy.html |    59 +
 docs/website/learnmore/index.md                 |    11 +
 docs/website/learnmore/theory.md                |   177 +
 docs/website/learnmore/yaml-explained.md        |     9 +
 docs/website/quickstart/_my-web-cluster.yaml    |    19 +
 docs/website/quickstart/brooklyn.properties     |   266 +
 docs/website/quickstart/catalog.xml             |    22 +
 ...cation-catalog-web-cluster-with-db-large.png |   Bin 0 -> 131618 bytes
 ...talog-web-cluster-with-db-location-large.png |   Bin 0 -> 152721 bytes
 ...ion-catalog-web-cluster-with-db-location.png |   Bin 0 -> 86425 bytes
 ...-application-catalog-web-cluster-with-db.png |   Bin 0 -> 76065 bytes
 .../images/add-application-modal-yaml.png       |   Bin 0 -> 68401 bytes
 .../images/jboss7-cluster-policies-large.png    |   Bin 0 -> 157883 bytes
 .../images/jboss7-cluster-policies.png          |   Bin 0 -> 94056 bytes
 .../images/my-db-activities-large.png           |   Bin 0 -> 208313 bytes
 .../quickstart/images/my-db-activities.png      |   Bin 0 -> 130262 bytes
 .../images/my-web-cluster-starting.png          |   Bin 0 -> 32948 bytes
 .../my-web-cluster-stop-confirm-large.png       |   Bin 0 -> 148155 bytes
 .../images/my-web-cluster-stop-confirm.png      |   Bin 0 -> 79280 bytes
 .../quickstart/images/my-web-summary-large.png  |   Bin 0 -> 178785 bytes
 .../quickstart/images/my-web-summary.png        |   Bin 0 -> 80583 bytes
 docs/website/quickstart/images/my-web.png       |   Bin 0 -> 83081 bytes
 docs/website/quickstart/index.md                |   215 +
 .../website/quickstart/policies-and-catalogs.md |    67 +
 146 files changed, 33616 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b86cbf04/docs/README.md
----------------------------------------------------------------------
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 0000000..6cac8b0
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,106 @@
+Brooklyn Website source
+=======================
+
+Contributor worflow
+-------------------
+
+The contributor workflow is identical to that used by the main project, with
+the exception of the different repository - `incubator-brooklyn-site` instead
+of `incubator-brooklyn`. Therefore you should familiarise yourself with the
+standard workflow for Apache Brooklyn:
+
+* [Guide for contributors][CONTRIB]
+* [Guide for committers][COMMIT]
+
+[CONTRIB]: https://brooklyn.incubator.apache.org/community/how-to-contribute.html
+[COMMIT]: https://brooklyn.incubator.apache.org/community/committers.html
+
+
+Workstation setup
+-----------------
+
+First, clone the `incubator-brooklyn-site` repository and set up the remotes as
+described in [Guide for committers][COMMIT].
+
+Install [RVM](http://rvm.io/); this manages Ruby installations and sets of Ruby
+gems.
+
+    \curl -sSL https://get.rvm.io | bash -s stable
+
+At this point, close your shell session and start a new one, to get the new
+environment that RVM has configured. Now change directory to the location where
+you checked out your repository, and then to the `_scripts` subdirectory.
+
+RVM should detect its configuration inside `Gemfile` and try to configure itself. 
+Most likely it will report that the required version of Ruby is not installed; 
+it will show the command that you need to run to install the correct version. 
+Follow these instructions.
+
+Once the correct version of Ruby is installed, change to your home directory
+(`cd ~`) and then change back to the repository again (`cd -`). This will cause
+RVM to re-load configuration from `Gemfile` with the correct version of Ruby.
+
+If you are running Ubuntu, there is a further dependency that is required:
+
+    sudo apt-get install libxslt-dev libxml2-dev
+
+Finally, run this command inside `_scripts` to install all the required Gems 
+in the correct versions:
+
+    bundle install
+
+Anytime you need to reset your Ruby environment for jekyll to run correctly,
+return to the `_scripts` directory and re-run the above command.
+
+
+Building and previewing the website
+-----------------------------------
+
+### Using Jekyll's in-built server
+
+Run the command:
+
+    jekyll serve --watch
+    
+This will start up a local web server. The URL is printed by Jekyll when the server starts,
+e.g. http://localhost:4000/brooklyn/ . The server will continue to run until you press Ctrl+C.
+Modified files will be detected and regenerated (but that might take up to 1m).
+Leave off the `--watch` argument to abandon that behaviour, or use `jekyll build` instead
+to generate a site in `_site` without a server, for instance if your browser supports running from disk.
+
+
+
+### Combining with Brooklyn user-manual / version docs
+
+TODO: Some links should come from the incubator-brooklyn/docs/ project.
+They can run in debug mode on a different port.
+
+
+Building and publishing the website
+-----------------------------------
+
+Run this script:
+
+    ./_scripts/build-for-publication
+
+This will run Jekyll with the correct base URL for the live website and place
+the output in the `_site` directory.
+
+The Apache website publication process is based around the Subversion repository; the generated HTML files must be checked in to Subversion, whereupon an automated process will publish the files to the live website.
+
+Starting in a suitable directory, check out the website directory from the repository:
+
+    svn co https://svn.apache.org/repos/asf/incubator/brooklyn/site incubator-brooklyn-site-public
+    cd incubator-brooklyn-site-public
+
+Synchronise the generated site into the Subversion working copy - please amend this command to include the correct paths for your setup:
+
+    rsync -rv --delete --exclude .svn --exclude v ~/incubator-brooklyn-site/_site/ ~/incubator-brooklyn-site-public
+
+Review the changes using the usual `svn` commands - e.g., `status`, `diff`, `add`, `rm`, etc.
+
+Once you are ready to publish, commit the changes to Subversion:
+
+    svn ci -m 'Update Brooklyn (incubating) website'
+
+The changes will become live within a few minutes.

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b86cbf04/docs/_build/build.sh
----------------------------------------------------------------------
diff --git a/docs/_build/build.sh b/docs/_build/build.sh
index d10dc82..b1a4032 100755
--- a/docs/_build/build.sh
+++ b/docs/_build/build.sh
@@ -4,7 +4,7 @@
 # override --url /myMountPoint  (as an argument to this script) if you don't like the default set in /_config.yml
 
 if [ ! -x _build/build.sh ] ; then
-  echo script must be run in root of docs dir
+  echo ERROR: script must be run in root of docs dir
   exit 1
 fi
 
@@ -12,9 +12,12 @@ function help() {
   echo "This will build the documentation in _site/."
   echo "Usage:  _build/build.sh MODE [ARGS]"
   echo "where MODE is:"
-  echo "* guide-root : to build the guide in the root"
-  echo "* guide-version : to build the guide in the versioned namespace /v/VERSION/"
-  echo "* default : to build the files in their natural location (e.g. guide in /guide/)"
+  echo "* root : to build root files for production, the website in the root and guide in /guide/"
+  # BROOKLYN_VERSION_BELOW
+  echo "* guide-version : to build a versioned guide for production; guide only, in the versioned namespace /v/0.7.0-SNAPSHOT/"
+  echo "* website-root : to build the website only, in the root"
+  echo "* guide-root : to build the guide only, in the root"
+  echo "* original : to build the files in their original location (e.g. guide in /guide/)"
   echo "and supported ARGS are:"
   echo "* --skip-javadoc : to skip javadoc build"
   echo 'with any remaining ARGS passed to jekyll as `jekyll build --config ... ARGS`.'
@@ -26,9 +29,27 @@ function deduce_config() {
   help)
     help
     exit 0 ;;
+  root)
+    CONFIG=_config.yml,_build/config-production.yml,_build/config-website-root.yml
+    DIRS_TO_MOVE[0]=website
+    DIRS_TO_MOVE_TARGET[0]=""
+    SKIP_JAVADOC=true
+    SUMMARY="root production files, website in root and guide in /guide/"
+    ;;
+  website-root)
+    CONFIG=_config.yml,_build/config-production.yml,_build/config-website-root.yml
+    DIRS_TO_MOVE[0]=website
+    DIRS_TO_MOVE_TARGET[0]=""
+    DIRS_TO_MOVE[1]=guide
+    DIRS_TO_MOVE_TARGET[1]=long_grass
+    SUMMARY="user guide files in the root"
+    ;;
   guide-root)
     CONFIG=_config.yml,_build/config-production.yml,_build/config-guide-root.yml
-    DIRS_TO_MOVE["guide"]=""
+    DIRS_TO_MOVE[0]=guide
+    DIRS_TO_MOVE_TARGET[0]=""
+    DIRS_TO_MOVE[1]=website
+    DIRS_TO_MOVE_TARGET[1]=long_grass
     SUMMARY="user guide files in the root"
     ;;
   guide-version)
@@ -39,22 +60,24 @@ function deduce_config() {
     DIRS_TO_MOVE_TARGET[0]=v/0.7.0-SNAPSHOT
     DIRS_TO_MOVE[1]=style
     DIRS_TO_MOVE_TARGET[1]=${DIRS_TO_MOVE_TARGET[0]}/style
+    DIRS_TO_MOVE[2]=website
+    DIRS_TO_MOVE_TARGET[2]=long_grass
     SUMMARY="user guide files in /${DIRS_TO_MOVE_TARGET[0]}"
     ;;
-  default)
+  original)
     CONFIG=_config.yml,_build/config-production.yml
-    SUMMARY="all files in their default place"
+    SUMMARY="all files in their original place"
     ;;
   "")
-    echo "Arguments are required. Try 'help'."
+    echo "ERROR: arguments are required; try 'help'"
     exit 1 ;;
   *)
-    echo "Invalid argument '$1'. Try 'help'."
+    echo "ERROR: invalid argument '$1'; try 'help'"
     exit 1 ;;
   esac
 }
 
-function build_jekyll() {
+function make_jekyll() {
   echo JEKYLL running with: jekyll build $CONFIG $@
   jekyll build --config $CONFIG $@ || return 1
   echo JEKYLL completed
@@ -80,7 +103,7 @@ if [ "$1" = "--skip-javadoc" ]; then
   shift
 fi
 
-build_jekyll || { echo ERROR: could not build docs in `pwd` ; exit 1 ; }
+make_jekyll || { echo ERROR: could not build docs in `pwd` ; exit 1 ; }
 
 if [ "$SKIP_JAVADOC" != "true" ]; then
   pushd _build > /dev/null

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b86cbf04/docs/_build/config-website-root.yml
----------------------------------------------------------------------
diff --git a/docs/_build/config-website-root.yml b/docs/_build/config-website-root.yml
new file mode 100644
index 0000000..3195f8c
--- /dev/null
+++ b/docs/_build/config-website-root.yml
@@ -0,0 +1,4 @@
+
+path:
+  website: ""
+

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b86cbf04/docs/_config.yml
----------------------------------------------------------------------
diff --git a/docs/_config.yml b/docs/_config.yml
index 5bb4372..8128967 100644
--- a/docs/_config.yml
+++ b/docs/_config.yml
@@ -26,9 +26,23 @@ brooklyn-snapshot-git-branch: master   # if line above is SNAPSHOT this should p
 url_root: http://0.0.0.0:4000
 
 # absolute base directories where things will land on the server
-# (prefix each with e.g. /brooklyn to test for absolute reference problems)
 path:
   style: /style
   guide: /guide
+  website: /website
   v: /v
+# (to test for absolute reference problems you can prefix each of the above,
+# with e.g. /brooklyn , and set the baseurl below)
+#baseurl: /brooklyn
+
+# Use local copies of dependencies in dev build (switched to remote using URLs for prod build)
+dependency_mode: local
+dependency_urls:
+  bootstrap.css: https://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css
+  bootstrap.js: https://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js
+  jquery.js: https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js
+
+# These files should not be included in the final build (in addition to _* contents)
+
+exclude: ['README.md']
 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b86cbf04/docs/_layouts/website-base.html
----------------------------------------------------------------------
diff --git a/docs/_layouts/website-base.html b/docs/_layouts/website-base.html
new file mode 100644
index 0000000..17cb459
--- /dev/null
+++ b/docs/_layouts/website-base.html
@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+<title>{{ page.title }} - Apache Brooklyn (incubating)</title>
+<meta http-equiv="content-type" content="text/html; charset=utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<link href="{% dependency_url bootstrap.css %}" rel="stylesheet">
+<link href="{{site.path.style}}/deps/bootstrap-theme.css" rel="stylesheet">
+<link href="{{site.path.style}}/css/website.css" rel="stylesheet">
+</head>
+
+<body>
+
+<nav class="navbar navbar-default navbar-fixed-top" id="header" role="navigation">
+    <div class="container">
+        <div class="container-fluid">
+            <!-- Brand and toggle get grouped for better mobile display -->
+            <div class="navbar-header">
+                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
+                    <span class="sr-only">Toggle navigation</span>
+                    <span class="icon-bar"></span>
+                    <span class="icon-bar"></span>
+                    <span class="icon-bar"></span>
+                </button>
+                {% if page.navgroup != 'home' %}<a class="navbar-brand" href="{{site.path.website}}/"><img src="{{site.path.style}}/img/apache-brooklyn-logo-244px-wide.png" alt="brooklyn"></a>{% endif %}
+            </div>
+
+            <!-- Collect the nav links, forms, and other content for toggling -->
+            <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
+                <ul class="nav navbar-nav navbar-right">
+                    {% for navgroup in site.data.navgroups %}
+                    {% if navgroup.page.menu2 %}
+                    <li class="dropdown{% if page.navgroup == navgroup.id %} active{% endif %}">
+                        <a href="{{navgroup.page.url}}">{{navgroup.title}}</a>
+                        <ul class="dropdown-menu" role="menu">
+                            <li>
+                                <a href="{{navgroup.page.url}}">{{navgroup.title_in_menu}}</a>
+                            </li>
+                            <li class="divider"></li>
+                            {% for child in navgroup.page.menu2 %}
+                            <li>
+                                <a href="{{child.reference.url}}">{{child.reference.title}}</a>
+                            </li>
+                            {% endfor %}
+                        </ul>
+                    </li><!-- {{ navgroup.id }} -->
+                    {% else %}
+                    <li class="{% if page.navgroup == navgroup.id %}active{% endif %}"><a href="{{navgroup.page.url}}">{{navgroup.title}}</a></li><!-- {{ navgroup.id }} -->
+                    {% endif %}
+                    {% endfor %}
+                </ul>
+            </div><!-- /.navbar-collapse -->
+        </div><!-- /.container-fluid -->
+    </div>
+</nav>
+
+{{ content }}
+
+<script src="{% dependency_url jquery.js %}"></script>
+<script src="{% dependency_url bootstrap.js %}"></script>
+
+<script language="JavaScript" type="application/javascript">
+    $(window).resize(function () { 
+        $('body').css('padding-top', parseInt($('#header').css("height"))+10);
+        $('body').css('padding-bottom', parseInt($('#footer').css("height"))+10);
+    });
+    
+    $(window).load(function () { 
+        $('body').css('padding-top', parseInt($('#header').css("height"))+10);        
+        $('body').css('padding-bottom', parseInt($('#footer').css("height"))+10);
+    });</script>
+</body>
+
+</html>
+

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b86cbf04/docs/_layouts/website-landing.html
----------------------------------------------------------------------
diff --git a/docs/_layouts/website-landing.html b/docs/_layouts/website-landing.html
new file mode 100644
index 0000000..6049fb0
--- /dev/null
+++ b/docs/_layouts/website-landing.html
@@ -0,0 +1,30 @@
+---
+# layout for front page, contianing only the footer, with a bit more text
+layout: website-base
+---
+<div class="container slightlyNarrowContainer">
+    {{ content }}
+</div>
+
+<div id="footer">
+    <div class="container">
+        <div class="row">
+            <div class="col-md-9 text-muted">
+                Apache Brooklyn is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the 
+                Apache Incubator. Incubation is required of all newly accepted projects until a further review indicates that the
+                infrastructure, communications, and decision making process have stabilized in a manner consistent with other
+                successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of
+                the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+                Apache Brooklyn is distributed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License v2.0</a>.
+            </div>
+            <div class="col-md-3">
+                <p><img src="https://incubator.apache.org/images/egg-logo.png" alt="Apache Incubator" /></p>
+                <p>
+                    <a class="btn btn-sm btn-default" href="https://github.com/apache/incubator-brooklyn-site/edit/master/{{ page.path }}">Edit This Page</a>
+                    <br />
+                    <a href="https://brooklyn.incubator.apache.org/community/how-to-contribute-docs.html">help with editing</a>
+                </p>
+            </div>
+        </div>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b86cbf04/docs/_layouts/website-normal.html
----------------------------------------------------------------------
diff --git a/docs/_layouts/website-normal.html b/docs/_layouts/website-normal.html
new file mode 100644
index 0000000..2fb7110
--- /dev/null
+++ b/docs/_layouts/website-normal.html
@@ -0,0 +1,41 @@
+---
+# layout for most website (non-guide) pages, inheriting base for the menu bar, and providing a main column of content and a menu column
+layout: website-base
+---
+<div class="container">
+    <div class="row">
+        <div class="col-md-9">
+            <h1>{{ page.title }}</h1>
+            {{ content }}
+        </div>
+        <div class="col-md-3">
+            {% if page.menu2 %}
+            <div class="list-group">
+                <h4><a href="{{page.menu2parent.url}}" class="list-group-item{% if page.menu2parent.path == page.path %} active{% endif %}">{{ page.menu2parent.title }}</a></h4>
+                {% for child in page.menu2 %}
+                <a href="{{child.reference.url}}" class="list-group-item{% if child.reference.path == page.path %} active{% endif %}">{{ child.reference.title }}</a>
+                {% endfor %}
+            </div>
+            {% endif %}
+        </div>
+    </div>
+</div>
+
+<div id="footer">
+    <div class="container">
+        <div class="row">
+            <div class="col-md-10 text-muted">
+                Apache Brooklyn is distributed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache
+                License v2.0</a>.
+                <br />
+                Apache Brooklyn is currently undergoing Incubation at The Apache Software
+                Foundation.
+            </div>
+            <div class="col-md-2">
+                <a class="btn btn-sm btn-default" href="https://github.com/apache/incubator-brooklyn-site/edit/master/{{ page.path }}">Edit This Page</a>
+                <br />
+                <a href="{{ site.url_root }}{{ site.path.website }}/community/how-to-contribute-docs.html">help with editing</a>
+            </div>
+        </div>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b86cbf04/docs/_plugins/brooklyn_metadata.rb
----------------------------------------------------------------------
diff --git a/docs/_plugins/brooklyn_metadata.rb b/docs/_plugins/brooklyn_metadata.rb
new file mode 100644
index 0000000..c0dcc3d
--- /dev/null
+++ b/docs/_plugins/brooklyn_metadata.rb
@@ -0,0 +1,60 @@
+# Inserts several useful fields that can be referenced using {{ name }} syntax
+#
+# site.data.brooklyn.version: brooklyn version, such as 0.7.0-M1
+# site.data.brooklyn.is_snapshot: true if this is a snapshot version, otherwise false
+# site.data.brooklyn.url.userguide: URL of the user guide for this version
+#
+module BrooklynMetadata
+
+  BROOKLYN_VERSION = "0.7.0-M1" unless defined? BROOKLYN_VERSION
+
+  class Generator < Jekyll::Generator
+    def generate(site)
+      is_snapshot = BrooklynMetadata::BROOKLYN_VERSION.end_with?('-SNAPSHOT')
+      
+      if is_snapshot
+        url_set = {
+            "search" => {
+                "all" => "https://oss.sonatype.org/index.html#nexus-search;gav~io.brooklyn~~#{ BrooklynMetadata::BROOKLYN_VERSION }~~",
+                "dist" => "https://oss.sonatype.org/index.html#nexus-search;gav~io.brooklyn~brooklyn-dist~#{ BrooklynMetadata::BROOKLYN_VERSION }~~",
+                "alljar" => "https://oss.sonatype.org/index.html#nexus-search;gav~io.brooklyn~brooklyn-dist~#{ BrooklynMetadata::BROOKLYN_VERSION }~~"
+            },
+            "dist" => {
+                "base" => "https://oss.sonatype.org/content/groups/public/io/brooklyn/brooklyn-dist/#{ BrooklynMetadata::BROOKLYN_VERSION }/",
+                "zip" => "https://oss.sonatype.org/service/local/artifact/maven/redirect?r=snapshots&g=io.brooklyn&v=#{ BrooklynMetadata::BROOKLYN_VERSION }&a=brooklyn-dist&c=dist&e=zip",
+                "tgz" => "https://oss.sonatype.org/service/local/artifact/maven/redirect?r=snapshots&g=io.brooklyn&v=#{ BrooklynMetadata::BROOKLYN_VERSION }&a=brooklyn-dist&c=dist&e=tar.gz"
+            },
+            "alljar" => {
+                "base" => "https://oss.sonatype.org/content/groups/public/io/brooklyn/brooklyn-all/#{ BrooklynMetadata::BROOKLYN_VERSION }/",
+                "jar" => "https://oss.sonatype.org/service/local/artifact/maven/redirect?r=snapshots&g=io.brooklyn&v=#{ BrooklynMetadata::BROOKLYN_VERSION }}&a=brooklyn-all&c=with-dependencies&e=jar"
+            }
+        }
+      else
+        url_set = {
+            "search" => {
+                "all" => "http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22io.brooklyn%22%20AND%20v%3A%22#{ BrooklynMetadata::BROOKLYN_VERSION }%22",
+                "dist" => "http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22io.brooklyn%22%20AND%20a%3A%22brooklyn-dist%22%20AND%20v%3A%22#{ BrooklynMetadata::BROOKLYN_VERSION }%22",
+                "alljar" => "http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22io.brooklyn%22%20AND%20a%3A%22brooklyn-all%22%20AND%20v%3A%22#{ BrooklynMetadata::BROOKLYN_VERSION }%22"
+            },
+            "dist" => {
+                "base" => "http://repo1.maven.org/maven2/io/brooklyn/brooklyn-dist/#{ BrooklynMetadata::BROOKLYN_VERSION }/",
+                "zip" => "http://repo1.maven.org/maven2/io/brooklyn/brooklyn-dist/#{ BrooklynMetadata::BROOKLYN_VERSION }/brooklyn-dist-#{ BrooklynMetadata::BROOKLYN_VERSION }-dist.zip",
+                "tgz" => "http://repo1.maven.org/maven2/io/brooklyn/brooklyn-dist/#{ BrooklynMetadata::BROOKLYN_VERSION }/brooklyn-dist-#{ BrooklynMetadata::BROOKLYN_VERSION }-dist.tar.gz"
+            },
+            "alljar" => {
+                "base" => "http://repo1.maven.org/maven2/io/brooklyn/brooklyn-all/#{ BrooklynMetadata::BROOKLYN_VERSION }/",
+                "jar" => "http://repo1.maven.org/maven2/io/brooklyn/brooklyn-all/#{ BrooklynMetadata::BROOKLYN_VERSION }/brooklyn-all-#{ BrooklynMetadata::BROOKLYN_VERSION }-with-dependencies.jar"
+            }
+        }
+      end
+      
+      url_set['userguide'] = "#{site.config['url']}/v/#{BrooklynMetadata::BROOKLYN_VERSION}"
+      
+      site.data['brooklyn'] = {
+          "version" => BrooklynMetadata::BROOKLYN_VERSION,
+          "is_snapshot" => is_snapshot,
+          "url" => url_set
+      }
+    end
+  end
+end

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b86cbf04/docs/_plugins/dependency_url.rb
----------------------------------------------------------------------
diff --git a/docs/_plugins/dependency_url.rb b/docs/_plugins/dependency_url.rb
new file mode 100644
index 0000000..8a72e17
--- /dev/null
+++ b/docs/_plugins/dependency_url.rb
@@ -0,0 +1,31 @@
+# tag to write the correct URL depending whether we are running with dependencies local (for offline) or remote (eg using a CDN)
+
+# specify a map of <basename>: <remote_url> in the key `dependency_urls` in your `_config.yml`,
+# then, if `dependency_mode: local` is defined, the path `{{site.path.style}}/deps/<basename>` will be used,
+# otherwise the <remote_url> will be used
+
+module JekyllDependencyUrl
+  class DependencyUrlTag < Liquid::Tag
+    def initialize(tag_name, text, tokens)
+      super
+      @text = text
+    end
+    def render(context)
+	jekyllSite = context.registers[:site]
+        mode = context['site']['dependency_mode']
+        if mode != 'local'
+          result = context['site']['dependency_urls'][@text.strip]
+          if result.to_s == ''
+            raise 'No value in dependency_urls specified for ' + @text.strip
+          end
+        end
+        if result.to_s == ''
+          result = context['site']['path']['style'] + "/deps/" + @text.strip
+        end
+        return result
+    end
+  end
+end
+
+Liquid::Template.register_tag('dependency_url', JekyllDependencyUrl::DependencyUrlTag)
+

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b86cbf04/docs/_plugins/site_structure.rb
----------------------------------------------------------------------
diff --git a/docs/_plugins/site_structure.rb b/docs/_plugins/site_structure.rb
new file mode 100644
index 0000000..6cfe1f9
--- /dev/null
+++ b/docs/_plugins/site_structure.rb
@@ -0,0 +1,85 @@
+# Builds a hierarchical structure for the site, based on the YAML front matter of each page
+# Starts from a page called "index.md", and follows "children" links in the YAML front matter
+module SiteStructure
+ 
+  BROOKLYN_WEBSITE_ROOT = "/website/index.md" unless defined? BROOKLYN_WEBSITE_ROOT
+  
+  class Generator < Jekyll::Generator
+    def find_page_with_path_absolute_or_relative_to(site, path, referrent)
+      page = site.pages.detect { |page| "/"+page.path == path }
+      if !page && referrent
+        page = site.pages.detect { |page| "/"+page.path == "/"+File.dirname(referrent.path)+"/"+path }
+      end
+      if !page
+        page = site.pages.detect { |page| page.path == path }
+        puts "WARNING: link to #{path} in #{referrent ? referrent.path : "root"} uses legacy absolute syntax without leading slash" if page
+      end
+
+      throw "Could not find a page called: #{path} (referenced from #{referrent ? referrent.path : "root"})" unless page
+
+      if (page.url.start_with?("/website"))
+        page.url.slice!("/website")
+        page.url.prepend(site.config['path']['website'])
+      end
+ 
+      page     
+    end
+
+    def generate(site)
+      root_page = find_page_with_path_absolute_or_relative_to(site, SiteStructure::BROOKLYN_WEBSITE_ROOT, nil)
+      navgroups = root_page.data['navgroups']
+      navgroups.each do |ng|
+        ng['page'] = find_page_with_path_absolute_or_relative_to(site, ng['page'], root_page)
+        if not ng['title_in_menu']
+          ng['title_in_menu'] = ng['title'].capitalize
+        end
+      end
+      site.data['navgroups'] = navgroups
+      site.data['structure'] = gen_structure(site, SiteStructure::BROOKLYN_WEBSITE_ROOT, nil, navgroups)
+    end
+    
+    def gen_structure(site, pagename, parent, navgroups)
+      page = find_page_with_path_absolute_or_relative_to(site, pagename, parent)
+      
+      # My navgroup is (first rule matches):
+      # 1. what I have explicitly declared
+      # 2. if I find my path referred to in the global navgroup list
+      # 3. my parent's navgroup
+      unless page.data['navgroup']
+        match = navgroups.detect { |ng| ng['page'] == page }
+        if match
+          page.data['navgroup'] = match['id']
+        elsif parent
+          page.data['navgroup'] = parent.data['navgroup']
+        end
+      end
+      
+      # Figure out second level menu
+      # If there's no parent => I'm at the top level, so no action
+      # If there's a parent, but parent has no parent => I'm at second level, so set second-level menu
+      # Otherwise, use the parent's second level menu
+      if parent && !parent.data['parent']
+        page.data['menu2parent'] = page
+        page.data['menu2'] = page.data['children']
+      elsif parent && parent.data['parent']
+        page.data['menu2parent'] = parent.data['menu2parent']
+        page.data['menu2'] = parent.data['menu2']
+      end
+      
+      page.data['parent'] = parent
+      if page.data['children']
+        page.data['children'].each do |c|
+          if c['path']
+            # links to another Jekyll site-structured page
+            c['reference'] = gen_structure(site, c['path'], page, navgroups)
+          elsif c['link']
+            # links to a non-site-structured page, on this site or elsewhere
+            c['reference'] = { 'url' => c['link'], 'title' => c['title'] }
+          end
+        end
+      end
+      
+      page
+    end
+  end
+end

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b86cbf04/docs/index.md
----------------------------------------------------------------------
diff --git a/docs/index.md b/docs/index.md
new file mode 100644
index 0000000..021df26
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,12 @@
+---
+layout: website-normal
+title: Brooklyn Website and Docs (dev build)
+---
+
+<i>This page is not copied into release builds. It is here as a convenience when doing dev builds.</i>
+
+Consider looking at:
+
+* <a href="website/">the brooklyn website</a>
+
+Also see the file <code>README.md</code> in this directory.

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b86cbf04/docs/style/css/website.css
----------------------------------------------------------------------
diff --git a/docs/style/css/website.css b/docs/style/css/website.css
new file mode 100644
index 0000000..135c2b0
--- /dev/null
+++ b/docs/style/css/website.css
@@ -0,0 +1,49 @@
+/* Sticky footer styles
+-------------------------------------------------- */
+html {
+    position: relative;
+    min-height: 100%;
+}
+
+@media (min-width: 1200px) {
+    .slightlyNarrowContainer {
+        width: 970px;
+    }
+}
+
+.navbar-brand {
+    margin-top: -4px;
+    margin-left: -30px !important;
+}
+
+ul.nav li.dropdown:hover > ul.dropdown-menu {
+    display: block;
+}
+
+#apachebrooklynbanner {
+    background-image: url("../img/apache-brooklyn-logo-817px-wide.png");
+    background-repeat: no-repeat;
+    background-position: center;
+    width: 817px;
+    height: 99px;
+    margin-bottom: 50px;
+}
+
+#brooklynbridge {
+    background-image: url("../img/bridge-large-no-title.png");
+    background-repeat: no-repeat;
+    background-position: center;
+    width: 342px;
+    height: 242px;
+}
+
+#footer {
+    position: absolute;
+    bottom: 0;
+    width: 100%;
+    /* Set the fixed height of the footer here */
+    padding-top: 1em;
+    padding-bottom: 1em;
+    background-color: #f5f5f5;
+    text-align: center;
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b86cbf04/docs/style/deps/bootstrap-theme.css
----------------------------------------------------------------------
diff --git a/docs/style/deps/bootstrap-theme.css b/docs/style/deps/bootstrap-theme.css
new file mode 100644
index 0000000..a2936d2
--- /dev/null
+++ b/docs/style/deps/bootstrap-theme.css
@@ -0,0 +1,346 @@
+/*!
+ * Bootstrap v3.1.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+.btn-default,
+.btn-primary,
+.btn-success,
+.btn-info,
+.btn-warning,
+.btn-danger {
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
+}
+.btn-default:active,
+.btn-primary:active,
+.btn-success:active,
+.btn-info:active,
+.btn-warning:active,
+.btn-danger:active,
+.btn-default.active,
+.btn-primary.active,
+.btn-success.active,
+.btn-info.active,
+.btn-warning.active,
+.btn-danger.active {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+}
+.btn:active,
+.btn.active {
+  background-image: none;
+}
+.btn-default {
+  text-shadow: 0 1px 0 #fff;
+  background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
+  background-image:         linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #dbdbdb;
+  border-color: #ccc;
+}
+.btn-default:hover,
+.btn-default:focus {
+  background-color: #e0e0e0;
+  background-position: 0 -15px;
+}
+.btn-default:active,
+.btn-default.active {
+  background-color: #e0e0e0;
+  border-color: #dbdbdb;
+}
+.btn-primary {
+  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
+  background-image:         linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #3e8f3e;
+}
+.btn-primary:hover,
+.btn-primary:focus {
+  background-color: #419641;
+  background-position: 0 -15px;
+}
+.btn-primary:active,
+.btn-primary.active {
+  background-color: #419641;
+  border-color: #3e8f3e;
+}
+.btn-success {
+  background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
+  background-image:         linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #2b669a;
+}
+.btn-success:hover,
+.btn-success:focus {
+  background-color: #2d6ca2;
+  background-position: 0 -15px;
+}
+.btn-success:active,
+.btn-success.active {
+  background-color: #2d6ca2;
+  border-color: #2b669a;
+}
+.btn-info {
+  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
+  background-image:         linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #28a4c9;
+}
+.btn-info:hover,
+.btn-info:focus {
+  background-color: #2aabd2;
+  background-position: 0 -15px;
+}
+.btn-info:active,
+.btn-info.active {
+  background-color: #2aabd2;
+  border-color: #28a4c9;
+}
+.btn-warning {
+  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
+  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #e38d13;
+}
+.btn-warning:hover,
+.btn-warning:focus {
+  background-color: #eb9316;
+  background-position: 0 -15px;
+}
+.btn-warning:active,
+.btn-warning.active {
+  background-color: #eb9316;
+  border-color: #e38d13;
+}
+.btn-danger {
+  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+  background-image:         linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #b92c28;
+}
+.btn-danger:hover,
+.btn-danger:focus {
+  background-color: #c12e2a;
+  background-position: 0 -15px;
+}
+.btn-danger:active,
+.btn-danger.active {
+  background-color: #c12e2a;
+  border-color: #b92c28;
+}
+.thumbnail,
+.img-thumbnail {
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+}
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+  background-color: #e8e8e8;
+  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
+  background-repeat: repeat-x;
+}
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+  background-color: #4cae4c;
+  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #4cae4c 100%);
+  background-image:         linear-gradient(to bottom, #5cb85c 0%, #4cae4c 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff4cae4c', GradientType=0);
+  background-repeat: repeat-x;
+}
+.navbar-default {
+  background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
+  background-image:         linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
+}
+.navbar-default .navbar-nav > .active > a {
+  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);
+  background-image:         linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);
+  background-repeat: repeat-x;
+  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
+}
+.navbar-brand,
+.navbar-nav > li > a {
+  text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
+}
+.navbar-inverse {
+  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
+  background-image:         linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+}
+.navbar-inverse .navbar-nav > .active > a {
+  background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%);
+  background-image:         linear-gradient(to bottom, #222 0%, #282828 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);
+  background-repeat: repeat-x;
+  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
+          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
+}
+.navbar-inverse .navbar-brand,
+.navbar-inverse .navbar-nav > li > a {
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
+}
+.navbar-static-top,
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  border-radius: 0;
+}
+.alert {
+  text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
+}
+.alert-success {
+  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
+  background-image:         linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #b2dba1;
+}
+.alert-info {
+  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+  background-image:         linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #9acfea;
+}
+.alert-warning {
+  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
+  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #f5e79e;
+}
+.alert-danger {
+  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
+  background-image:         linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #dca7a7;
+}
+.progress {
+  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
+  background-image:         linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar {
+  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
+  background-image:         linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-success {
+  background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%);
+  background-image:         linear-gradient(to bottom, #428bca 0%, #3071a9 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-info {
+  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
+  background-image:         linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-warning {
+  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
+  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-danger {
+  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
+  background-image:         linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
+  background-repeat: repeat-x;
+}
+.list-group {
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+}
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+  text-shadow: 0 -1px 0 #449d44;
+  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #48a648 100%);
+  background-image:         linear-gradient(to bottom, #5cb85c 0%, #48a648 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff48a648', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #48a648;
+}
+.panel {
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
+}
+.panel-default > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-primary > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #4cae4c 100%);
+  background-image:         linear-gradient(to bottom, #5cb85c 0%, #4cae4c 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff4cae4c', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-success > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
+  background-image:         linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-info > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
+  background-image:         linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-warning > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
+  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-danger > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
+  background-image:         linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
+  background-repeat: repeat-x;
+}
+.well {
+  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
+  background-image:         linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #dcdcdc;
+  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
+          box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b86cbf04/docs/style/deps/bootstrap.css
----------------------------------------------------------------------
diff --git a/docs/style/deps/bootstrap.css b/docs/style/deps/bootstrap.css
index cfe2b90..deb2231 100644
--- a/docs/style/deps/bootstrap.css
+++ b/docs/style/deps/bootstrap.css
@@ -5782,4 +5782,3 @@ button.close {
     display: none !important;
   }
 }
-/*# sourceMappingURL=bootstrap.css.map */

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b86cbf04/docs/style/img/apache-brooklyn-logo-244px-wide.png
----------------------------------------------------------------------
diff --git a/docs/style/img/apache-brooklyn-logo-244px-wide.png b/docs/style/img/apache-brooklyn-logo-244px-wide.png
new file mode 100644
index 0000000..7434e7a
Binary files /dev/null and b/docs/style/img/apache-brooklyn-logo-244px-wide.png differ

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b86cbf04/docs/style/img/apache-brooklyn-logo-817px-wide.png
----------------------------------------------------------------------
diff --git a/docs/style/img/apache-brooklyn-logo-817px-wide.png b/docs/style/img/apache-brooklyn-logo-817px-wide.png
new file mode 100644
index 0000000..65cfff4
Binary files /dev/null and b/docs/style/img/apache-brooklyn-logo-817px-wide.png differ

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b86cbf04/docs/style/img/bridge-large-no-title.png
----------------------------------------------------------------------
diff --git a/docs/style/img/bridge-large-no-title.png b/docs/style/img/bridge-large-no-title.png
new file mode 100644
index 0000000..0a7f878
Binary files /dev/null and b/docs/style/img/bridge-large-no-title.png differ

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b86cbf04/docs/style/js/_readme.txt
----------------------------------------------------------------------
diff --git a/docs/style/js/_readme.txt b/docs/style/js/_readme.txt
new file mode 100644
index 0000000..bed81ec
--- /dev/null
+++ b/docs/style/js/_readme.txt
@@ -0,0 +1,2 @@
+underscore files are kept here because the path is referenced by catalog items.
+TODO regenerate catalog with correct path (in deps/).

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b86cbf04/docs/style/js/underscore-min.js
----------------------------------------------------------------------
diff --git a/docs/style/js/underscore-min.js b/docs/style/js/underscore-min.js
new file mode 100644
index 0000000..11f1d96
--- /dev/null
+++ b/docs/style/js/underscore-min.js
@@ -0,0 +1,6 @@
+//     Underscore.js 1.7.0
+//     http://underscorejs.org
+//     (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+//     Underscore may be freely distributed under the MIT license.
+(function(){var n=this,t=n._,r=Array.prototype,e=Object.prototype,u=Function.prototype,i=r.push,a=r.slice,o=r.concat,l=e.toString,c=e.hasOwnProperty,f=Array.isArray,s=Object.keys,p=u.bind,h=function(n){return n instanceof h?n:this instanceof h?void(this._wrapped=n):new h(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=h),exports._=h):n._=h,h.VERSION="1.7.0";var g=function(n,t,r){if(t===void 0)return n;switch(null==r?3:r){case 1:return function(r){return n.call(t,r)};case 2:return function(r,e){return n.call(t,r,e)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)}}return function(){return n.apply(t,arguments)}};h.iteratee=function(n,t,r){return null==n?h.identity:h.isFunction(n)?g(n,t,r):h.isObject(n)?h.matches(n):h.property(n)},h.each=h.forEach=function(n,t,r){if(null==n)return n;t=g(t,r);var e,u=n.length;if(u===+u)for(e=0;u>e;e++)t(n[e],e,n);else{var i=h.keys(n);for(e
 =0,u=i.length;u>e;e++)t(n[i[e]],i[e],n)}return n},h.map=h.collect=function(n,t,r){if(null==n)return[];t=h.iteratee(t,r);for(var e,u=n.length!==+n.length&&h.keys(n),i=(u||n).length,a=Array(i),o=0;i>o;o++)e=u?u[o]:o,a[o]=t(n[e],e,n);return a};var v="Reduce of empty array with no initial value";h.reduce=h.foldl=h.inject=function(n,t,r,e){null==n&&(n=[]),t=g(t,e,4);var u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length,o=0;if(arguments.length<3){if(!a)throw new TypeError(v);r=n[i?i[o++]:o++]}for(;a>o;o++)u=i?i[o]:o,r=t(r,n[u],u,n);return r},h.reduceRight=h.foldr=function(n,t,r,e){null==n&&(n=[]),t=g(t,e,4);var u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length;if(arguments.length<3){if(!a)throw new TypeError(v);r=n[i?i[--a]:--a]}for(;a--;)u=i?i[a]:a,r=t(r,n[u],u,n);return r},h.find=h.detect=function(n,t,r){var e;return t=h.iteratee(t,r),h.some(n,function(n,r,u){return t(n,r,u)?(e=n,!0):void 0}),e},h.filter=h.select=function(n,t,r){var e=[];return null==n?e:(t=h.iteratee(t,r),h.each(n,
 function(n,r,u){t(n,r,u)&&e.push(n)}),e)},h.reject=function(n,t,r){return h.filter(n,h.negate(h.iteratee(t)),r)},h.every=h.all=function(n,t,r){if(null==n)return!0;t=h.iteratee(t,r);var e,u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length;for(e=0;a>e;e++)if(u=i?i[e]:e,!t(n[u],u,n))return!1;return!0},h.some=h.any=function(n,t,r){if(null==n)return!1;t=h.iteratee(t,r);var e,u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length;for(e=0;a>e;e++)if(u=i?i[e]:e,t(n[u],u,n))return!0;return!1},h.contains=h.include=function(n,t){return null==n?!1:(n.length!==+n.length&&(n=h.values(n)),h.indexOf(n,t)>=0)},h.invoke=function(n,t){var r=a.call(arguments,2),e=h.isFunction(t);return h.map(n,function(n){return(e?t:n[t]).apply(n,r)})},h.pluck=function(n,t){return h.map(n,h.property(t))},h.where=function(n,t){return h.filter(n,h.matches(t))},h.findWhere=function(n,t){return h.find(n,h.matches(t))},h.max=function(n,t,r){var e,u,i=-1/0,a=-1/0;if(null==t&&null!=n){n=n.length===+n.length?n:h.values(n);for(va
 r o=0,l=n.length;l>o;o++)e=n[o],e>i&&(i=e)}else t=h.iteratee(t,r),h.each(n,function(n,r,e){u=t(n,r,e),(u>a||u===-1/0&&i===-1/0)&&(i=n,a=u)});return i},h.min=function(n,t,r){var e,u,i=1/0,a=1/0;if(null==t&&null!=n){n=n.length===+n.length?n:h.values(n);for(var o=0,l=n.length;l>o;o++)e=n[o],i>e&&(i=e)}else t=h.iteratee(t,r),h.each(n,function(n,r,e){u=t(n,r,e),(a>u||1/0===u&&1/0===i)&&(i=n,a=u)});return i},h.shuffle=function(n){for(var t,r=n&&n.length===+n.length?n:h.values(n),e=r.length,u=Array(e),i=0;e>i;i++)t=h.random(0,i),t!==i&&(u[i]=u[t]),u[t]=r[i];return u},h.sample=function(n,t,r){return null==t||r?(n.length!==+n.length&&(n=h.values(n)),n[h.random(n.length-1)]):h.shuffle(n).slice(0,Math.max(0,t))},h.sortBy=function(n,t,r){return t=h.iteratee(t,r),h.pluck(h.map(n,function(n,r,e){return{value:n,index:r,criteria:t(n,r,e)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var m=func
 tion(n){return function(t,r,e){var u={};return r=h.iteratee(r,e),h.each(t,function(e,i){var a=r(e,i,t);n(u,e,a)}),u}};h.groupBy=m(function(n,t,r){h.has(n,r)?n[r].push(t):n[r]=[t]}),h.indexBy=m(function(n,t,r){n[r]=t}),h.countBy=m(function(n,t,r){h.has(n,r)?n[r]++:n[r]=1}),h.sortedIndex=function(n,t,r,e){r=h.iteratee(r,e,1);for(var u=r(t),i=0,a=n.length;a>i;){var o=i+a>>>1;r(n[o])<u?i=o+1:a=o}return i},h.toArray=function(n){return n?h.isArray(n)?a.call(n):n.length===+n.length?h.map(n,h.identity):h.values(n):[]},h.size=function(n){return null==n?0:n.length===+n.length?n.length:h.keys(n).length},h.partition=function(n,t,r){t=h.iteratee(t,r);var e=[],u=[];return h.each(n,function(n,r,i){(t(n,r,i)?e:u).push(n)}),[e,u]},h.first=h.head=h.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:0>t?[]:a.call(n,0,t)},h.initial=function(n,t,r){return a.call(n,0,Math.max(0,n.length-(null==t||r?1:t)))},h.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:a.call(n,Math.max(n.l
 ength-t,0))},h.rest=h.tail=h.drop=function(n,t,r){return a.call(n,null==t||r?1:t)},h.compact=function(n){return h.filter(n,h.identity)};var y=function(n,t,r,e){if(t&&h.every(n,h.isArray))return o.apply(e,n);for(var u=0,a=n.length;a>u;u++){var l=n[u];h.isArray(l)||h.isArguments(l)?t?i.apply(e,l):y(l,t,r,e):r||e.push(l)}return e};h.flatten=function(n,t){return y(n,t,!1,[])},h.without=function(n){return h.difference(n,a.call(arguments,1))},h.uniq=h.unique=function(n,t,r,e){if(null==n)return[];h.isBoolean(t)||(e=r,r=t,t=!1),null!=r&&(r=h.iteratee(r,e));for(var u=[],i=[],a=0,o=n.length;o>a;a++){var l=n[a];if(t)a&&i===l||u.push(l),i=l;else if(r){var c=r(l,a,n);h.indexOf(i,c)<0&&(i.push(c),u.push(l))}else h.indexOf(u,l)<0&&u.push(l)}return u},h.union=function(){return h.uniq(y(arguments,!0,!0,[]))},h.intersection=function(n){if(null==n)return[];for(var t=[],r=arguments.length,e=0,u=n.length;u>e;e++){var i=n[e];if(!h.contains(t,i)){for(var a=1;r>a&&h.contains(arguments[a],i);a++);a===r&&t.p
 ush(i)}}return t},h.difference=function(n){var t=y(a.call(arguments,1),!0,!0,[]);return h.filter(n,function(n){return!h.contains(t,n)})},h.zip=function(n){if(null==n)return[];for(var t=h.max(arguments,"length").length,r=Array(t),e=0;t>e;e++)r[e]=h.pluck(arguments,e);return r},h.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},h.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=h.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}for(;u>e;e++)if(n[e]===t)return e;return-1},h.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=n.length;for("number"==typeof r&&(e=0>r?e+r+1:Math.min(e,r+1));--e>=0;)if(n[e]===t)return e;return-1},h.range=function(n,t,r){arguments.length<=1&&(t=n||0,n=0),r=r||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=Array(e),i=0;e>i;i++,n+=r)u[i]=n;return u};var d=function(){};h.bind=function(n,t){var r,e;if(p&&n.bind===p)return p.apply(n,a.c
 all(arguments,1));if(!h.isFunction(n))throw new TypeError("Bind must be called on a function");return r=a.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(a.call(arguments)));d.prototype=n.prototype;var u=new d;d.prototype=null;var i=n.apply(u,r.concat(a.call(arguments)));return h.isObject(i)?i:u}},h.partial=function(n){var t=a.call(arguments,1);return function(){for(var r=0,e=t.slice(),u=0,i=e.length;i>u;u++)e[u]===h&&(e[u]=arguments[r++]);for(;r<arguments.length;)e.push(arguments[r++]);return n.apply(this,e)}},h.bindAll=function(n){var t,r,e=arguments.length;if(1>=e)throw new Error("bindAll must be passed function names");for(t=1;e>t;t++)r=arguments[t],n[r]=h.bind(n[r],n);return n},h.memoize=function(n,t){var r=function(e){var u=r.cache,i=t?t.apply(this,arguments):e;return h.has(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return r.cache={},r},h.delay=function(n,t){var r=a.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},h.de
 fer=function(n){return h.delay.apply(h,[n,1].concat(a.call(arguments,1)))},h.throttle=function(n,t,r){var e,u,i,a=null,o=0;r||(r={});var l=function(){o=r.leading===!1?0:h.now(),a=null,i=n.apply(e,u),a||(e=u=null)};return function(){var c=h.now();o||r.leading!==!1||(o=c);var f=t-(c-o);return e=this,u=arguments,0>=f||f>t?(clearTimeout(a),a=null,o=c,i=n.apply(e,u),a||(e=u=null)):a||r.trailing===!1||(a=setTimeout(l,f)),i}},h.debounce=function(n,t,r){var e,u,i,a,o,l=function(){var c=h.now()-a;t>c&&c>0?e=setTimeout(l,t-c):(e=null,r||(o=n.apply(i,u),e||(i=u=null)))};return function(){i=this,u=arguments,a=h.now();var c=r&&!e;return e||(e=setTimeout(l,t)),c&&(o=n.apply(i,u),i=u=null),o}},h.wrap=function(n,t){return h.partial(t,n)},h.negate=function(n){return function(){return!n.apply(this,arguments)}},h.compose=function(){var n=arguments,t=n.length-1;return function(){for(var r=t,e=n[t].apply(this,arguments);r--;)e=n[r].call(this,e);return e}},h.after=function(n,t){return function(){return--
 n<1?t.apply(this,arguments):void 0}},h.before=function(n,t){var r;return function(){return--n>0?r=t.apply(this,arguments):t=null,r}},h.once=h.partial(h.before,2),h.keys=function(n){if(!h.isObject(n))return[];if(s)return s(n);var t=[];for(var r in n)h.has(n,r)&&t.push(r);return t},h.values=function(n){for(var t=h.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},h.pairs=function(n){for(var t=h.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},h.invert=function(n){for(var t={},r=h.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},h.functions=h.methods=function(n){var t=[];for(var r in n)h.isFunction(n[r])&&t.push(r);return t.sort()},h.extend=function(n){if(!h.isObject(n))return n;for(var t,r,e=1,u=arguments.length;u>e;e++){t=arguments[e];for(r in t)c.call(t,r)&&(n[r]=t[r])}return n},h.pick=function(n,t,r){var e,u={};if(null==n)return u;if(h.isFunction(t)){t=g(t,r);for(e in n){var i=n[e];t(i,e,n)&&(u[e]=i)}}else{var l=o.apply([],a.call(argume
 nts,1));n=new Object(n);for(var c=0,f=l.length;f>c;c++)e=l[c],e in n&&(u[e]=n[e])}return u},h.omit=function(n,t,r){if(h.isFunction(t))t=h.negate(t);else{var e=h.map(o.apply([],a.call(arguments,1)),String);t=function(n,t){return!h.contains(e,t)}}return h.pick(n,t,r)},h.defaults=function(n){if(!h.isObject(n))return n;for(var t=1,r=arguments.length;r>t;t++){var e=arguments[t];for(var u in e)n[u]===void 0&&(n[u]=e[u])}return n},h.clone=function(n){return h.isObject(n)?h.isArray(n)?n.slice():h.extend({},n):n},h.tap=function(n,t){return t(n),n};var b=function(n,t,r,e){if(n===t)return 0!==n||1/n===1/t;if(null==n||null==t)return n===t;n instanceof h&&(n=n._wrapped),t instanceof h&&(t=t._wrapped);var u=l.call(n);if(u!==l.call(t))return!1;switch(u){case"[object RegExp]":case"[object String]":return""+n==""+t;case"[object Number]":return+n!==+n?+t!==+t:0===+n?1/+n===1/t:+n===+t;case"[object Date]":case"[object Boolean]":return+n===+t}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i
 =r.length;i--;)if(r[i]===n)return e[i]===t;var a=n.constructor,o=t.constructor;if(a!==o&&"constructor"in n&&"constructor"in t&&!(h.isFunction(a)&&a instanceof a&&h.isFunction(o)&&o instanceof o))return!1;r.push(n),e.push(t);var c,f;if("[object Array]"===u){if(c=n.length,f=c===t.length)for(;c--&&(f=b(n[c],t[c],r,e)););}else{var s,p=h.keys(n);if(c=p.length,f=h.keys(t).length===c)for(;c--&&(s=p[c],f=h.has(t,s)&&b(n[s],t[s],r,e)););}return r.pop(),e.pop(),f};h.isEqual=function(n,t){return b(n,t,[],[])},h.isEmpty=function(n){if(null==n)return!0;if(h.isArray(n)||h.isString(n)||h.isArguments(n))return 0===n.length;for(var t in n)if(h.has(n,t))return!1;return!0},h.isElement=function(n){return!(!n||1!==n.nodeType)},h.isArray=f||function(n){return"[object Array]"===l.call(n)},h.isObject=function(n){var t=typeof n;return"function"===t||"object"===t&&!!n},h.each(["Arguments","Function","String","Number","Date","RegExp"],function(n){h["is"+n]=function(t){return l.call(t)==="[object "+n+"]"}}),h.
 isArguments(arguments)||(h.isArguments=function(n){return h.has(n,"callee")}),"function"!=typeof/./&&(h.isFunction=function(n){return"function"==typeof n||!1}),h.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},h.isNaN=function(n){return h.isNumber(n)&&n!==+n},h.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"===l.call(n)},h.isNull=function(n){return null===n},h.isUndefined=function(n){return n===void 0},h.has=function(n,t){return null!=n&&c.call(n,t)},h.noConflict=function(){return n._=t,this},h.identity=function(n){return n},h.constant=function(n){return function(){return n}},h.noop=function(){},h.property=function(n){return function(t){return t[n]}},h.matches=function(n){var t=h.pairs(n),r=t.length;return function(n){if(null==n)return!r;n=new Object(n);for(var e=0;r>e;e++){var u=t[e],i=u[0];if(u[1]!==n[i]||!(i in n))return!1}return!0}},h.times=function(n,t,r){var e=Array(Math.max(0,n));t=g(t,r,1);for(var u=0;n>u;u++)e[u]=t(u);return e},h.random=funct
 ion(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},h.now=Date.now||function(){return(new Date).getTime()};var _={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},w=h.invert(_),j=function(n){var t=function(t){return n[t]},r="(?:"+h.keys(n).join("|")+")",e=RegExp(r),u=RegExp(r,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};h.escape=j(_),h.unescape=j(w),h.result=function(n,t){if(null==n)return void 0;var r=n[t];return h.isFunction(r)?n[t]():r};var x=0;h.uniqueId=function(n){var t=++x+"";return n?n+t:t},h.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var A=/(.)^/,k={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},O=/\\|'|\r|\n|\u2028|\u2029/g,F=function(n){return"\\"+k[n]};h.template=function(n,t,r){!t&&r&&(t=r),t=h.defaults({},t,h.templateSettings);var e=RegExp([(t.escape||A).source,(t.interpolate||A).source,(t.evaluate||A).source]
 .join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,a,o){return i+=n.slice(u,o).replace(O,F),u=o+t.length,r?i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":e?i+="'+\n((__t=("+e+"))==null?'':__t)+\n'":a&&(i+="';\n"+a+"\n__p+='"),t}),i+="';\n",t.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var a=new Function(t.variable||"obj","_",i)}catch(o){throw o.source=i,o}var l=function(n){return a.call(this,n,h)},c=t.variable||"obj";return l.source="function("+c+"){\n"+i+"}",l},h.chain=function(n){var t=h(n);return t._chain=!0,t};var E=function(n){return this._chain?h(n).chain():n};h.mixin=function(n){h.each(h.functions(n),function(t){var r=h[t]=n[t];h.prototype[t]=function(){var n=[this._wrapped];return i.apply(n,arguments),E.call(this,r.apply(h,n))}})},h.mixin(h),h.each(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=r[n];h.prototype[n]=
 function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!==n&&"splice"!==n||0!==r.length||delete r[0],E.call(this,r)}}),h.each(["concat","join","slice"],function(n){var t=r[n];h.prototype[n]=function(){return E.call(this,t.apply(this._wrapped,arguments))}}),h.prototype.value=function(){return this._wrapped},"function"==typeof define&&define.amd&&define("underscore",[],function(){return h})}).call(this);
+//# sourceMappingURL=underscore-min.map
\ No newline at end of file