Full Code of capistrano/capistrano for AI

master dfe3133012d7 cached
219 files
721.9 KB
197.8k tokens
507 symbols
1 requests
Download .txt
Showing preview only (780K chars total). Download the full file or copy to clipboard to get everything.
Repository: capistrano/capistrano
Branch: master
Commit: dfe3133012d7
Files: 219
Total size: 721.9 KB

Directory structure:
gitextract_yjpdehpd/

├── .docker/
│   ├── Dockerfile
│   ├── ssh_key_rsa
│   ├── ssh_key_rsa.pub
│   └── ubuntu_setup.sh
├── .github/
│   ├── dependabot.yml
│   ├── issue_template.md
│   ├── pull_request_template.md
│   ├── release-drafter.yml
│   └── workflows/
│       ├── ci.yml
│       └── release-drafter.yml
├── .gitignore
├── .rubocop.yml
├── .rubocop_todo.yml
├── CHANGELOG.md
├── CONTRIBUTING.md
├── DEVELOPMENT.md
├── Gemfile
├── LICENSE.txt
├── README.md
├── RELEASING.md
├── Rakefile
├── UPGRADING-3.7.md
├── bin/
│   ├── cap
│   └── capify
├── capistrano.gemspec
├── docker-compose.yml
├── docs/
│   ├── CNAME
│   ├── Gemfile
│   ├── README.md
│   ├── _config.yml
│   ├── _includes/
│   │   ├── carbon.html
│   │   ├── footer.html
│   │   ├── google_tag_manager.html
│   │   ├── header.html
│   │   ├── metrics.html
│   │   └── navigation.html
│   ├── _layouts/
│   │   ├── default.html
│   │   └── post.html
│   ├── _posts/
│   │   └── 2013-06-01-release-announcement.markdown
│   ├── assets/
│   │   ├── browserconfig.xml
│   │   ├── css/
│   │   │   ├── capistrano.css
│   │   │   ├── dreamweaver.css
│   │   │   ├── foundation.css
│   │   │   ├── github.css
│   │   │   ├── monokai.css
│   │   │   ├── normalize.css
│   │   │   ├── social_foundicons.css
│   │   │   ├── social_foundicons_ie7.css
│   │   │   └── syntax.css
│   │   ├── js/
│   │   │   ├── foundation/
│   │   │   │   ├── foundation.alerts.js
│   │   │   │   ├── foundation.clearing.js
│   │   │   │   ├── foundation.cookie.js
│   │   │   │   ├── foundation.dropdown.js
│   │   │   │   ├── foundation.forms.js
│   │   │   │   ├── foundation.interchange.js
│   │   │   │   ├── foundation.joyride.js
│   │   │   │   ├── foundation.js
│   │   │   │   ├── foundation.magellan.js
│   │   │   │   ├── foundation.orbit.js
│   │   │   │   ├── foundation.placeholder.js
│   │   │   │   ├── foundation.reveal.js
│   │   │   │   ├── foundation.section.js
│   │   │   │   ├── foundation.tooltips.js
│   │   │   │   └── foundation.topbar.js
│   │   │   └── jquery.cookie.js
│   │   └── site.webmanifest
│   ├── documentation/
│   │   ├── advanced-features/
│   │   │   ├── console/
│   │   │   │   └── index.markdown
│   │   │   ├── custom-filters/
│   │   │   │   └── index.markdown
│   │   │   ├── custom-scm/
│   │   │   │   └── index.markdown
│   │   │   ├── filtering/
│   │   │   │   └── index.markdown
│   │   │   ├── host-filtering/
│   │   │   │   └── index.markdown
│   │   │   ├── ignoring/
│   │   │   │   └── index.markdown
│   │   │   ├── overriding-capistrano-tasks/
│   │   │   │   └── index.markdown
│   │   │   ├── properties/
│   │   │   │   └── index.markdown
│   │   │   ├── property-filtering/
│   │   │   │   └── index.markdown
│   │   │   ├── ptys/
│   │   │   │   └── index.markdown
│   │   │   ├── remote-file/
│   │   │   │   └── index.markdown
│   │   │   ├── role-filtering/
│   │   │   │   └── index.markdown
│   │   │   ├── ssh-kit/
│   │   │   │   └── index.markdown
│   │   │   └── validation-of-variables/
│   │   │       └── index.markdown
│   │   ├── faq/
│   │   │   ├── how-can-i-access-stage-configuration-variables/
│   │   │   │   └── index.markdown
│   │   │   ├── how-can-i-check-for-existing-remote-file/
│   │   │   │   └── index.markdown
│   │   │   ├── how-can-i-get-capistrano-to-prompt-for-a-password/
│   │   │   │   └── index.markdown
│   │   │   ├── how-can-i-set-capistrano-configuration-paths/
│   │   │   │   └── index.markdown
│   │   │   └── why-does-something-work-in-my-ssh-session-but-not-in-capistrano/
│   │   │       └── index.markdown
│   │   ├── getting-started/
│   │   │   ├── authentication-and-authorisation/
│   │   │   │   └── index.markdown
│   │   │   ├── before-after/
│   │   │   │   └── index.markdown
│   │   │   ├── cold-start/
│   │   │   │   └── index.markdown
│   │   │   ├── configuration/
│   │   │   │   └── index.markdown
│   │   │   ├── flow/
│   │   │   │   └── index.markdown
│   │   │   ├── installation/
│   │   │   │   └── index.markdown
│   │   │   ├── local-tasks/
│   │   │   │   └── index.markdown
│   │   │   ├── preparing-your-application/
│   │   │   │   └── index.markdown
│   │   │   ├── rollbacks/
│   │   │   │   └── index.markdown
│   │   │   ├── structure/
│   │   │   │   └── index.markdown
│   │   │   ├── tasks/
│   │   │   │   └── index.markdown
│   │   │   ├── user-input/
│   │   │   │   └── index.markdown
│   │   │   └── version-locking/
│   │   │       └── index.markdown
│   │   ├── harrow/
│   │   │   └── index.markdown
│   │   ├── overview/
│   │   │   └── what-is-capistrano/
│   │   │       └── index.markdown
│   │   ├── plugins/
│   │   │   └── index.markdown
│   │   ├── tasks/
│   │   │   ├── intro/
│   │   │   │   └── index.markdown
│   │   │   └── rails/
│   │   │       └── index.markdown
│   │   ├── third-party-plugins/
│   │   │   └── index.markdown
│   │   └── upgrading/
│   │       └── index.markdown
│   └── index.markdown
├── features/
│   ├── configuration.feature
│   ├── deploy.feature
│   ├── deploy_failure.feature
│   ├── doctor.feature
│   ├── installation.feature
│   ├── sshconnect.feature
│   ├── stage_failure.feature
│   ├── step_definitions/
│   │   ├── assertions.rb
│   │   ├── cap_commands.rb
│   │   └── setup.rb
│   ├── subdirectory.feature
│   └── support/
│       ├── docker_gateway.rb
│       ├── env.rb
│       ├── remote_command_helpers.rb
│       └── remote_ssh_helpers.rb
├── gemfiles/
│   └── legacy.gemfile
├── lib/
│   ├── Capfile
│   ├── capistrano/
│   │   ├── all.rb
│   │   ├── application.rb
│   │   ├── configuration/
│   │   │   ├── empty_filter.rb
│   │   │   ├── filter.rb
│   │   │   ├── host_filter.rb
│   │   │   ├── null_filter.rb
│   │   │   ├── plugin_installer.rb
│   │   │   ├── question.rb
│   │   │   ├── role_filter.rb
│   │   │   ├── scm_resolver.rb
│   │   │   ├── server.rb
│   │   │   ├── servers.rb
│   │   │   ├── validated_variables.rb
│   │   │   └── variables.rb
│   │   ├── configuration.rb
│   │   ├── console.rb
│   │   ├── defaults.rb
│   │   ├── deploy.rb
│   │   ├── doctor/
│   │   │   ├── environment_doctor.rb
│   │   │   ├── gems_doctor.rb
│   │   │   ├── output_helpers.rb
│   │   │   ├── servers_doctor.rb
│   │   │   └── variables_doctor.rb
│   │   ├── doctor.rb
│   │   ├── dotfile.rb
│   │   ├── dsl/
│   │   │   ├── env.rb
│   │   │   ├── paths.rb
│   │   │   ├── stages.rb
│   │   │   └── task_enhancements.rb
│   │   ├── dsl.rb
│   │   ├── framework.rb
│   │   ├── i18n.rb
│   │   ├── immutable_task.rb
│   │   ├── install.rb
│   │   ├── plugin.rb
│   │   ├── proc_helpers.rb
│   │   ├── scm/
│   │   │   ├── git.rb
│   │   │   ├── hg.rb
│   │   │   ├── plugin.rb
│   │   │   ├── svn.rb
│   │   │   └── tasks/
│   │   │       ├── git.rake
│   │   │       ├── hg.rake
│   │   │       └── svn.rake
│   │   ├── scm.rb
│   │   ├── setup.rb
│   │   ├── tasks/
│   │   │   ├── console.rake
│   │   │   ├── deploy.rake
│   │   │   ├── doctor.rake
│   │   │   ├── framework.rake
│   │   │   └── install.rake
│   │   ├── templates/
│   │   │   ├── Capfile
│   │   │   ├── deploy.rb.erb
│   │   │   └── stage.rb.erb
│   │   ├── upload_task.rb
│   │   ├── version.rb
│   │   └── version_validator.rb
│   └── capistrano.rb
└── spec/
    ├── integration/
    │   └── dsl_spec.rb
    ├── integration_spec_helper.rb
    ├── lib/
    │   ├── capistrano/
    │   │   ├── application_spec.rb
    │   │   ├── configuration/
    │   │   │   ├── empty_filter_spec.rb
    │   │   │   ├── filter_spec.rb
    │   │   │   ├── host_filter_spec.rb
    │   │   │   ├── null_filter_spec.rb
    │   │   │   ├── plugin_installer_spec.rb
    │   │   │   ├── question_spec.rb
    │   │   │   ├── role_filter_spec.rb
    │   │   │   ├── scm_resolver_spec.rb
    │   │   │   ├── server_spec.rb
    │   │   │   └── servers_spec.rb
    │   │   ├── configuration_spec.rb
    │   │   ├── doctor/
    │   │   │   ├── environment_doctor_spec.rb
    │   │   │   ├── gems_doctor_spec.rb
    │   │   │   ├── output_helpers_spec.rb
    │   │   │   ├── servers_doctor_spec.rb
    │   │   │   └── variables_doctor_spec.rb
    │   │   ├── dsl/
    │   │   │   ├── paths_spec.rb
    │   │   │   └── task_enhancements_spec.rb
    │   │   ├── dsl_spec.rb
    │   │   ├── immutable_task_spec.rb
    │   │   ├── plugin_spec.rb
    │   │   ├── scm/
    │   │   │   ├── git_spec.rb
    │   │   │   ├── hg_spec.rb
    │   │   │   └── svn_spec.rb
    │   │   ├── scm_spec.rb
    │   │   ├── upload_task_spec.rb
    │   │   └── version_validator_spec.rb
    │   └── capistrano_spec.rb
    ├── spec_helper.rb
    └── support/
        ├── matchers.rb
        ├── tasks/
        │   ├── database.rake
        │   ├── fail.rake
        │   ├── failed.rake
        │   ├── plugin.rake
        │   └── root.rake
        └── test_app.rb

================================================
FILE CONTENTS
================================================

================================================
FILE: .docker/Dockerfile
================================================
FROM ubuntu:22.04
WORKDIR /provision
COPY ./ssh_key_rsa.pub /root/.ssh/authorized_keys
COPY ./ubuntu_setup.sh ./
RUN ./ubuntu_setup.sh
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]


================================================
FILE: .docker/ssh_key_rsa
================================================
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAACFwAAAAdzc2gtcn
NhAAAAAwEAAQAAAgEAusFQqAThmEuan12Roio7oe0VhMZc60NRppfGdwwwoIEhIm4dVlyV
PfqzSk6h5laBst+omqz347BlsNyG4lojDlw+3K4NwQskW5LAHa1VfzCKugYiqpxmkLzlfQ
BOUWwOluP6a5BCi/7XZ6VWlqTG7bYRKOh/yDtyIfol6Jp4uDZFAYw4yX+rK/Af7yOGiHKd
COf7lzSN8yFlYUOsgWeITkbPIzwTKXu4zKBW+c/LegFFH5iHOuiYi5i19oamBK3iAe685T
zrA7DgcgA7m8gP6982GgOZGcS2x0/rIEIrY2+EwE3aAsV+vrrcVUHkWSuGKwkdw/2ls4Zj
oJeTh8TuwK1oCAlwtfInK7w3VAAsTlikWkntFl8NJ19S9GbXirmLLxQH9LdJzT0rZ1pMc0
QOLJ8yQoqbblnI8fKe1mND4duuxEavazRYDA5krB2mDDpyQF6/FhdNMxXFYAFum9zASUpg
RLXM+OUbzA7+F4jL82Yj/9fsHviVyNX+WPC4clbZHjBOSe7ui6zVCOW7wTMg6HTJJjqJ0X
aS+IsDlF8KRE1+4vH7K+/vGBcPibV0NInj6uFdj5pjzV04ZY4ZIQqJ8FZxrH1eKn7hmhiY
DCiXyvxOoRfFvXoxB/Qb5l+5e+X8gCtMzKvp+qITq+DOMFXM/RvrPub0meSTcGE8lawLYb
cAAAdIBF9hmQRfYZkAAAAHc3NoLXJzYQAAAgEAusFQqAThmEuan12Roio7oe0VhMZc60NR
ppfGdwwwoIEhIm4dVlyVPfqzSk6h5laBst+omqz347BlsNyG4lojDlw+3K4NwQskW5LAHa
1VfzCKugYiqpxmkLzlfQBOUWwOluP6a5BCi/7XZ6VWlqTG7bYRKOh/yDtyIfol6Jp4uDZF
AYw4yX+rK/Af7yOGiHKdCOf7lzSN8yFlYUOsgWeITkbPIzwTKXu4zKBW+c/LegFFH5iHOu
iYi5i19oamBK3iAe685TzrA7DgcgA7m8gP6982GgOZGcS2x0/rIEIrY2+EwE3aAsV+vrrc
VUHkWSuGKwkdw/2ls4ZjoJeTh8TuwK1oCAlwtfInK7w3VAAsTlikWkntFl8NJ19S9GbXir
mLLxQH9LdJzT0rZ1pMc0QOLJ8yQoqbblnI8fKe1mND4duuxEavazRYDA5krB2mDDpyQF6/
FhdNMxXFYAFum9zASUpgRLXM+OUbzA7+F4jL82Yj/9fsHviVyNX+WPC4clbZHjBOSe7ui6
zVCOW7wTMg6HTJJjqJ0XaS+IsDlF8KRE1+4vH7K+/vGBcPibV0NInj6uFdj5pjzV04ZY4Z
IQqJ8FZxrH1eKn7hmhiYDCiXyvxOoRfFvXoxB/Qb5l+5e+X8gCtMzKvp+qITq+DOMFXM/R
vrPub0meSTcGE8lawLYbcAAAADAQABAAACAHJNBP+A1U4v37fwPcUh0hOeFpCIE7DOJ/gt
ZoPQSybBQbVf7cbArXscqIUvMTnX8lO3PetFOAb8HJEtt8Rr5I7SeIr6YGKpXhxJ6hl/0B
cjb5TBUpBXXxLw+ggSmtyMpTVG3SreRUyHsfC2qhNTUImG6GPAQQ0dDRKslm0RthcQ6BU1
bEAvSmV+9xyXAq0acPBVg4+c09BdvT3VfIxLAIrgHcDz8Mpv9cAP1ovY2TGX+2WGJiYw28
R8t8nlyVCN2AjUxHoNWc2NgSFk8Ra8ULpNiEBNuXOjCTddu4un1ARs6bQFMgyGMbesiFQK
GydUUy6dysD8ymDhPLK6csojBviMLZNHL9Ie0aZrfazjrMDSAVX6XAVBhmXCyvyX/S0ML9
tuqljMdy6ZMzajydVhoIx5JqEtCmTqzOdx2ZSxO9KDG/JrekDz+m7G1cM4dHfhL95Qizi+
D4Ps0Mmu+fox1MJ2I+gbDMcKjoq3y1aDKdMt2ptohGNv+q9qDhuNZlmrPfzfpeEOrskNAi
zv3BHXnIBauteGNTyEakZP6YtILhuKeH78SpLPR1MFcUfcOYGfmAo7HtMMFTX9eRWg80Is
ErOHjuFsy99IvLS9U+jnX0qnKEPH4uhzOzh+Ce6Vmel67eeDoLL1CzA6Mk2ag+/akVduVU
T5p7sZY1/aa0XBU+ShAAABAE59lZ/rH+XAkGQ/TGVo/M119xaDkupkhLxbbsUPQroCtpwE
DiZCyyjGZ/SMXJAr8pnnXj0z6VB83R3ds3fCTAcoVM/DaB2kjvlTXGLr1hAs3SqPnw9hyr
wfRWM06GGSHB6a8Bt79jxHF9tsnI6wlrV6XUmCkhFFLyPyvNMDANZpd3J+mowVeq+vWTn5
D49EAmdSCQeEzTOPIfa5PLpaoaDHLSYgfc+xrotZG947WhOQwSr+6T7Ak1A4mhAQcc1Nqu
q1bzou+BnlTNMFQ4jv1j8ZLDSYoUozvPIGU92CP7Y6x+OCAXfzgX+BlrZla5adLDzmJZSZ
zxkxWlPCUaBD14cAAAEBAOmOjI8mZrizzziMYLEqa+RFo1ZKzRiKk2c5XY5gsSnF97pora
i0OynfaOWgiWiVPi7YUPpHynYwHz696E4gEzR1YjZR32oYOd6OoEJLv9zb522yxaK6aIY0
hjooFFYBbSEEPxc7Ui2YSCXFwKdxxmfVYxX5C6d0AJVAtFSG+lSQNgIwp8J3VOs178mru/
pr1r5+XiEBHrCszPuCCayNeA8dlS8NZoV0KAtjEESM4MwI7P2tkiCROk+T/nWrpVMFdsKw
wQqTuBqrUUF3tMUnv90XaEO4V5Ug/a0C8UwuMA0/PbnteE/g4bfktf4twll3NWygQc/q/w
xEJWM8KFHInscAAAEBAMyzdCiid1BaDDYilyPGqQCz59Kk1dD7gFyNaz+QsqjDl1YdAxfZ
+b8xNwP9PE0AQSLYG0sU5WvQt7NktuVnSEzSjfvwEwQ5Os27ArWq0/C7iksPfAThtviwuh
+vZUyilag0gfP73wAILqKWQLfAFgGleT7qgRvtrLpNCVHFHcDRRSwjifsyBnM587CmC10B
8AznqByEGtanaJFTbbKmpFM8t7IvOi5M/vzvYmXSVjRdKoHIZRsOgpHh/Bo9r36H5FhGQJ
IwlQSS0XwkhTE7u+o0dxlvqfrq726iEGbjJD7cHxgnKwRFkVo9g20rgpdDjv/TmX0MKm0y
+sSkqvnj9ZEAAAAQdGVzdEBleGFtcGxlLmNvbQECAw==
-----END OPENSSH PRIVATE KEY-----


================================================
FILE: .docker/ssh_key_rsa.pub
================================================
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC6wVCoBOGYS5qfXZGiKjuh7RWExlzrQ1Gml8Z3DDCggSEibh1WXJU9+rNKTqHmVoGy36iarPfjsGWw3IbiWiMOXD7crg3BCyRbksAdrVV/MIq6BiKqnGaQvOV9AE5RbA6W4/prkEKL/tdnpVaWpMbtthEo6H/IO3Ih+iXomni4NkUBjDjJf6sr8B/vI4aIcp0I5/uXNI3zIWVhQ6yBZ4hORs8jPBMpe7jMoFb5z8t6AUUfmIc66JiLmLX2hqYEreIB7rzlPOsDsOByADubyA/r3zYaA5kZxLbHT+sgQitjb4TATdoCxX6+utxVQeRZK4YrCR3D/aWzhmOgl5OHxO7ArWgICXC18icrvDdUACxOWKRaSe0WXw0nX1L0ZteKuYsvFAf0t0nNPStnWkxzRA4snzJCiptuWcjx8p7WY0Ph267ERq9rNFgMDmSsHaYMOnJAXr8WF00zFcVgAW6b3MBJSmBEtcz45RvMDv4XiMvzZiP/1+we+JXI1f5Y8LhyVtkeME5J7u6LrNUI5bvBMyDodMkmOonRdpL4iwOUXwpETX7i8fsr7+8YFw+JtXQ0iePq4V2PmmPNXThljhkhConwVnGsfV4qfuGaGJgMKJfK/E6hF8W9ejEH9BvmX7l75fyAK0zMq+n6ohOr4M4wVcz9G+s+5vSZ5JNwYTyVrAthtw== test@example.com


================================================
FILE: .docker/ubuntu_setup.sh
================================================
#!/bin/bash

set -e

export DEBIAN_FRONTEND=noninteractive

# Create `deployer` user
adduser --disabled-password deployer < /dev/null
mkdir -p /home/deployer/.ssh
cp /root/.ssh/authorized_keys /home/deployer/.ssh
chown -R deployer:deployer /home/deployer/.ssh
chmod 600 /home/deployer/.ssh/authorized_keys

# Install and configure sshd
apt -y update
apt-get -y install openssh-server git
{
  echo "Port 22"
  echo "PasswordAuthentication no"
  echo "ChallengeResponseAuthentication no"
} >> /etc/ssh/sshd_config
mkdir /var/run/sshd
chmod 0755 /var/run/sshd


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  - package-ecosystem: bundler
    directory: "/"
    schedule:
      interval: monthly
      time: "16:00"
      timezone: America/Los_Angeles
    open-pull-requests-limit: 10
    labels:
      - "🏠 Housekeeping"
  - package-ecosystem: github-actions
    directory: "/"
    schedule:
      interval: monthly
      time: "16:00"
      timezone: America/Los_Angeles
    open-pull-requests-limit: 10
    labels:
      - "🏠 Housekeeping"


================================================
FILE: .github/issue_template.md
================================================
**Important:** GitHub issues are for feature requests or bug reports. The Capistrano team recommends you use [Stack Overflow](http://stackoverflow.com/questions/tagged/capistrano) for general questions. For more details, please see our [contribution policy](https://github.com/capistrano/capistrano/blob/master/CONTRIBUTING.md).

---

### Steps to reproduce
If reasonable, you can help by creating a Capistrano skeleton example project which reproduces the issue you are seeing. You can then upload the individual files to a GitHub Gist or a GitHub project. Others can simply modify the configuration to point at a test server/repository of their own. Often times, an issue is resolved simply by making this test case.

An example test case is here: https://gist.github.com/will-in-wi/527327e31af30b3eae2068e2965be05b

### Expected behavior
Tell us what should happen

### Actual behavior
Tell us what happens instead

### System configuration
Please link to the output of `cap <stage> doctor` in a GitHub Gist.

Thanks for helping improve Capistrano!


================================================
FILE: .github/pull_request_template.md
================================================
### Summary

(Guidelines for creating a bug report are available
here: https://github.com/capistrano/capistrano/blob/master/DEVELOPMENT.md)

Provide a general description of the code changes in your pull
request... were there any bugs you had fixed? If so, mention them. If
these bugs have open GitHub issues, be sure to tag them here as well,
to keep the conversation linked together.

### Short checklist

- [ ] Did you run `bundle exec rubocop -a` to fix linter issues?
- [ ] If relevant, did you create a test?
- [ ] Did you confirm that the RSpec tests pass?

### Other Information

If there's anything else that's important and relevant to your pull
request, mention that information here.

Thanks for helping improve Capistrano!


================================================
FILE: .github/release-drafter.yml
================================================
name-template: "$RESOLVED_VERSION"
tag-template: "v$RESOLVED_VERSION"
categories:
  - title: "⚠️ Breaking Changes"
    label: "⚠️ Breaking"
  - title: "✨ New Features"
    label: "✨ Feature"
  - title: "🐛 Bug Fixes"
    label: "🐛 Bug Fix"
  - title: "📚 Documentation"
    label: "📚 Docs"
  - title: "🏠 Housekeeping"
    label: "🏠 Housekeeping"
version-resolver:
  minor:
    labels:
      - "⚠️ Breaking"
      - "✨ Feature"
  default: patch
change-template: "- $TITLE (#$NUMBER) @$AUTHOR"
no-changes-template: "- No changes"
template: |
  $CHANGES

  **Full Changelog:** https://github.com/$OWNER/$REPOSITORY/compare/$PREVIOUS_TAG...v$RESOLVED_VERSION


================================================
FILE: .github/workflows/ci.yml
================================================
name: CI
on:
  push:
    branches: [master]
  pull_request:
jobs:
  spec:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        ruby: ["3.1", "3.2", "3.3", "3.4", "4.0", "head"]
    steps:
      - uses: actions/checkout@v6
      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: ${{ matrix.ruby }}
          bundler-cache: true
      - name: rake spec
        run: bundle exec rake spec
  spec-legacy:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        ruby: ["2.5", "2.6", "2.7", "3.0"]
    env:
      BUNDLE_GEMFILE: gemfiles/legacy.gemfile
    steps:
      - uses: actions/checkout@v6
      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: ${{ matrix.ruby }}
          bundler-cache: true
      - name: rake spec
        run: bundle exec rake spec
  spec-all:
    runs-on: ubuntu-latest
    needs: [spec, spec-legacy]
    if: always()
    steps:
      - name: All tests ok
        if: ${{ !(contains(needs.*.result, 'failure')) }}
        run: exit 0
      - name: Some tests failed
        if: ${{ contains(needs.*.result, 'failure') }}
        run: exit 1
  rubocop:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: "ruby" # latest-stable
          bundler-cache: true
      - run: bundle exec rubocop
  features:
    needs: spec-all
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: "ruby" # latest-stable
          bundler-cache: true
      - name: rake features
        run: bundle exec rake features


================================================
FILE: .github/workflows/release-drafter.yml
================================================
name: Release Drafter

on:
  push:
    branches:
      - master

permissions:
  contents: write
  pull-requests: read

jobs:
  update_release_draft:
    runs-on: ubuntu-latest
    steps:
      - uses: release-drafter/release-drafter@v6
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .gitignore
================================================
*.gem
*.rbc
*.swp
.bundle
.config
.rspec
.rspec-local
.ruby-version
.yardoc
Gemfile.lock
InstalledFiles
_site
_yardoc
coverage
doc/
lib/bundler/man
pkg
rdoc
spec/reports
tags
test/tmp
test/version_tmp
tmp
/docs/_site/
vendor/


================================================
FILE: .rubocop.yml
================================================
inherit_from: .rubocop_todo.yml

AllCops:
  DisplayCopNames: true
  DisplayStyleGuide: true
  NewCops: disable
  SuggestExtensions: false
  TargetRubyVersion: 2.5

Layout/HeredocIndentation:
  Enabled: false
Layout/SpaceAroundEqualsInParameterDefault:
  EnforcedStyle: no_space
Lint/AmbiguousBlockAssociation:
  Enabled: false
Lint/EmptyFile:
  Exclude:
    - "lib/capistrano.rb"
Metrics/BlockLength:
  Exclude:
    - "*.gemspec"
    - "spec/**/*"
    - "lib/**/*.rake"
Style/BarePercentLiterals:
  EnforcedStyle: percent_q
Style/ClassAndModuleChildren:
  Enabled: false
Style/DoubleNegation:
  Enabled: false
Style/FrozenStringLiteralComment:
  Enabled: false
Style/StringLiterals:
  EnforcedStyle: double_quotes
Style/TrivialAccessors:
  AllowPredicates: true
Style/PercentLiteralDelimiters:
  Enabled: false
Style/SingleLineBlockParams:
  Enabled: false
Style/ModuleFunction:
  Enabled: false
Style/FormatStringToken:
  EnforcedStyle: template
Style/StringLiteralsInInterpolation:
  Enabled: false
Style/StderrPuts:
  Enabled: false

# Enable someday
Style/Documentation:
  Enabled: false

# Needs refactors
Metrics/PerceivedComplexity:
  Enabled: false
Metrics/CyclomaticComplexity:
  Enabled: false
Metrics/MethodLength:
  Enabled: false
Naming/PredicatePrefix:
  Enabled: false
Layout/LineLength:
  Enabled: false
Metrics/AbcSize:
  Enabled: false
Style/PerlBackrefs:
  Enabled: false
Metrics/ClassLength:
  Enabled: false
Metrics/ModuleLength:
  Enabled: false
Naming/AccessorMethodName:
  Enabled: false


================================================
FILE: .rubocop_todo.yml
================================================
# This configuration was generated by
# `rubocop --auto-gen-config`
# on 2025-11-29 04:19:34 UTC using RuboCop version 1.81.7.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.

# Offense count: 4
# This cop supports safe autocorrection (--autocorrect).
Layout/ClosingHeredocIndentation:
  Exclude:
    - "lib/capistrano/configuration/scm_resolver.rb"
    - "lib/capistrano/immutable_task.rb"

# Offense count: 1
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: AllowBorderComment, AllowMarginComment.
Layout/EmptyComment:
  Exclude:
    - "features/step_definitions/assertions.rb"

# Offense count: 18
# This cop supports safe autocorrection (--autocorrect).
Layout/EmptyLineAfterGuardClause:
  Exclude:
    - "features/support/remote_ssh_helpers.rb"
    - "lib/capistrano/configuration/filter.rb"
    - "lib/capistrano/configuration/scm_resolver.rb"
    - "lib/capistrano/configuration/validated_variables.rb"
    - "lib/capistrano/configuration/variables.rb"
    - "lib/capistrano/doctor/gems_doctor.rb"
    - "lib/capistrano/doctor/output_helpers.rb"
    - "lib/capistrano/doctor/servers_doctor.rb"
    - "lib/capistrano/dsl/task_enhancements.rb"
    - "lib/capistrano/tasks/deploy.rake"
    - "lib/capistrano/version_validator.rb"

# Offense count: 1
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: AllowAliasSyntax, AllowedMethods.
# AllowedMethods: alias_method, public, protected, private
Layout/EmptyLinesAroundAttributeAccessor:
  Exclude:
    - "lib/capistrano/configuration.rb"

# Offense count: 2
# Configuration parameters: AllowedMethods.
# AllowedMethods: enums
Lint/ConstantDefinitionInBlock:
  Exclude:
    - "spec/lib/capistrano/plugin_spec.rb"

# Offense count: 1
# This cop supports safe autocorrection (--autocorrect).
Lint/ElseLayout:
  Exclude:
    - "lib/capistrano/configuration/filter.rb"

# Offense count: 2
# This cop supports unsafe autocorrection (--autocorrect-all).
Lint/InterpolationCheck:
  Exclude:
    - "spec/lib/capistrano/dsl/paths_spec.rb"
    - "spec/spec_helper.rb"

# Offense count: 1
# Configuration parameters: AllowedParentClasses.
Lint/MissingSuper:
  Exclude:
    - "lib/capistrano/configuration/validated_variables.rb"

# Offense count: 1
Lint/MixedRegexpCaptureTypes:
  Exclude:
    - "lib/capistrano/configuration/host_filter.rb"

# Offense count: 1
# This cop supports unsafe autocorrection (--autocorrect-all).
Lint/NonDeterministicRequireOrder:
  Exclude:
    - "spec/spec_helper.rb"

# Offense count: 1
# This cop supports safe autocorrection (--autocorrect).
Lint/ScriptPermission:
  Exclude:
    - "lib/Capfile"

# Offense count: 5
# Configuration parameters: MinNameLength, AllowNamesEndingInNumbers, AllowedNames, ForbiddenNames.
# AllowedNames: as, at, by, cc, db, id, if, in, io, ip, of, on, os, pp, to
Naming/MethodParameterName:
  Exclude:
    - "lib/capistrano/application.rb"
    - "lib/capistrano/dsl/task_enhancements.rb"
    - "lib/capistrano/proc_helpers.rb"
    - "spec/support/test_app.rb"

# Offense count: 2
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: EnforcedStyle.
# SupportedStyles: separated, grouped
Style/AccessorGrouping:
  Exclude:
    - "lib/capistrano/doctor/output_helpers.rb"

# Offense count: 1
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: Keywords, RequireColon.
# Keywords: TODO, FIXME, OPTIMIZE, HACK, REVIEW, NOTE
Style/CommentAnnotation:
  Exclude:
    - "lib/capistrano/scm/git.rb"

# Offense count: 1
# This cop supports safe autocorrection (--autocorrect).
Style/EmptyLambdaParameter:
  Exclude:
    - "lib/capistrano/dsl/paths.rb"

# Offense count: 1
# This cop supports safe autocorrection (--autocorrect).
Style/Encoding:
  Exclude:
    - "capistrano.gemspec"

# Offense count: 17
# This cop supports safe autocorrection (--autocorrect).
Style/ExpandPathArguments:
  Exclude:
    - "capistrano.gemspec"
    - "lib/capistrano/configuration/variables.rb"
    - "lib/capistrano/console.rb"
    - "lib/capistrano/deploy.rb"
    - "lib/capistrano/doctor.rb"
    - "lib/capistrano/framework.rb"
    - "lib/capistrano/scm/git.rb"
    - "lib/capistrano/scm/hg.rb"
    - "lib/capistrano/scm/svn.rb"
    - "lib/capistrano/tasks/install.rake"
    - "spec/lib/capistrano/doctor/environment_doctor_spec.rb"
    - "spec/lib/capistrano/doctor/gems_doctor_spec.rb"
    - "spec/lib/capistrano/doctor/servers_doctor_spec.rb"
    - "spec/lib/capistrano/doctor/variables_doctor_spec.rb"
    - "spec/lib/capistrano/plugin_spec.rb"

# Offense count: 1
# This cop supports safe autocorrection (--autocorrect).
Style/ExplicitBlockArgument:
  Exclude:
    - "lib/capistrano/configuration/servers.rb"

# Offense count: 1
# This cop supports unsafe autocorrection (--autocorrect-all).
Style/GlobalStdStream:
  Exclude:
    - "spec/spec_helper.rb"

# Offense count: 10
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: EnforcedStyle.
# SupportedStyles: braces, no_braces
Style/HashAsLastArrayItem:
  Exclude:
    - "spec/lib/capistrano/configuration/servers_spec.rb"

# Offense count: 2
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: AllowedReceivers.
# AllowedReceivers: Thread.current
Style/HashEachMethods:
  Exclude:
    - "lib/capistrano/configuration/servers.rb"
    - "lib/capistrano/tasks/deploy.rake"

# Offense count: 7
# This cop supports safe autocorrection (--autocorrect).
Style/IfUnlessModifier:
  Exclude:
    - "lib/capistrano/configuration.rb"
    - "lib/capistrano/configuration/scm_resolver.rb"
    - "lib/capistrano/i18n.rb"
    - "lib/capistrano/tasks/deploy.rake"

# Offense count: 4
Style/MixinUsage:
  Exclude:
    - "lib/Capfile"
    - "lib/capistrano/dsl.rb"
    - "lib/capistrano/setup.rb"
    - "spec/integration_spec_helper.rb"

# Offense count: 2
# This cop supports safe autocorrection (--autocorrect).
Style/RedundantBegin:
  Exclude:
    - "spec/lib/capistrano/application_spec.rb"
    - "spec/spec_helper.rb"

# Offense count: 2
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: SafeForConstants.
Style/RedundantFetchBlock:
  Exclude:
    - "spec/integration/dsl_spec.rb"

# Offense count: 1
# This cop supports safe autocorrection (--autocorrect).
Style/RedundantParentheses:
  Exclude:
    - "lib/capistrano/configuration/validated_variables.rb"

# Offense count: 2
# This cop supports safe autocorrection (--autocorrect).
Style/RedundantRegexpEscape:
  Exclude:
    - "lib/capistrano/defaults.rb"

# Offense count: 1
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: AllowMultipleReturnValues.
Style/RedundantReturn:
  Exclude:
    - "lib/capistrano/configuration/question.rb"

# Offense count: 2
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: EnforcedStyle.
# SupportedStyles: implicit, explicit
Style/RescueStandardError:
  Exclude:
    - "features/support/remote_command_helpers.rb"
    - "lib/capistrano/tasks/console.rake"

# Offense count: 3
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: ConvertCodeThatCanStartToReturnNil, AllowedMethods, MaxChainLength.
# AllowedMethods: present?, blank?, presence, try, try!
Style/SafeNavigation:
  Exclude:
    - "lib/capistrano/configuration.rb"
    - "lib/capistrano/doctor/variables_doctor.rb"
    - "lib/capistrano/dsl.rb"

# Offense count: 1
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: Mode.
Style/StringConcatenation:
  Exclude:
    - "spec/support/test_app.rb"

# Offense count: 1
# This cop supports safe autocorrection (--autocorrect).
Style/WhileUntilModifier:
  Exclude:
    - "lib/capistrano/configuration/variables.rb"


================================================
FILE: CHANGELOG.md
================================================
Release notes for this project are kept here: https://github.com/capistrano/capistrano/releases


================================================
FILE: CONTRIBUTING.md
================================================
**Hello and welcome!** Please look over this document before opening an issue or submitting a pull request to Capistrano.

* [If you’re looking for help or have a question](#if-youre-looking-for-help-or-have-a-question)
* [Reporting bugs](#reporting-bugs)
* [Requesting new features or improvements](#requesting-new-features-or-improvements)
* [Contributing code or documentation](#contributing-code-or-documentation)

## If you’re looking for help or have a question

**Check [Stack Overflow](http://stackoverflow.com/questions/tagged/capistrano) first if you need help using Capistrano.** You are more likely to get a quick response at Stack Overflow for common Capistrano topics. Make sure to tag your post with `capistrano` and/or `capistrano3` (not forgetting any other tags which might relate: rvm, rbenv, Ubuntu, etc.)

If you have an urgent problem you can also try [CodersClan](http://codersclan.net/?repo_id=325&source=contributing), which has a community of Capistrano experts dedicated to solve code problems for bounties.

When posting to Stack Overflow or CodersClan, be sure to include relevant information:

* Capistrano version
* Plugins and versions (capistrano-rvm, capistrano-bundler, etc.)
* Logs and backtraces

If you think you’ve found a bug in Capistrano itself, then…

## Reporting bugs

As much the Capistrano community tries to write good, well-tested code, bugs still happen. Sorry about that!

**In case you’ve run across an already-known issue, check the FAQs first on the [official Capistrano site](http://capistranorb.com).**

When opening a bug report, please include the output of the `cap <stage> doctor` task, e.g.:

```
cap production doctor
```

Also include in your report:

* Versions of Ruby, Capistrano, and any plugins you’re using (if `doctor` didn't already do this for you)
* A description of the troubleshooting steps you’ve taken
* Logs and backtraces
* Sections of your `deploy.rb` that may be relevant
* Any other unique aspects of your environment

If you are an experienced Ruby programmer, take a few minutes to get the Capistrano test suite running (see [DEVELOPMENT.md][]), and do what you can to get a test case written that fails. *This will be a huge help!*

If you think you may have discovered a security vulnerability in Capistrano, do not open a GitHub issue. Instead, please send a report to <security@capistranorb.com>.

## Requesting new features or improvements

Capistrano continues to improve thanks to people like you! Feel free to open a GitHub issue for any or all of these ideas:

* New features that would make Capistrano even better
* Areas where documentation could be improved
* Ways to improve developer happiness

Generally speaking the maintainers are very conservative about adding new features, and we can’t guarantee that the community will agree with or implement your idea. Please don’t be offended if we say no! The Capistrano team will do our best to review all suggestions and at least weigh in with a comment or suggest a workaround, if applicable.

**Your idea will have a much better chance of becoming reality if you contribute code for it (even if the code is incomplete!).**

## Contributing code or documentation

So you want to contribute to Capistrano? Awesome! We have a whole separate document just you. It explains our pull request workflow and walks you through setting up the development environment: [DEVELOPMENT.md][].


[DEVELOPMENT.md]: https://github.com/capistrano/capistrano/blob/master/DEVELOPMENT.md


================================================
FILE: DEVELOPMENT.md
================================================
Thanks for helping build Capistrano! Here are the development practices followed by our community.

* [Who can help](#who-can-help)
* [Contributing documentation](#contributing-documentation)
* [Setting up your development environment](#setting-up-your-development-environment)
* [Coding guidelines](#coding-guidelines)
* [Submitting a pull request](#submitting-a-pull-request)
* [Managing GitHub issues](#managing-github-issues)
* [Reviewing and merging pull requests](#reviewing-and-merging-pull-requests)

## Who can help

Everyone can help improve Capistrano. There are ways to contribute even if you aren’t a Ruby programmer. Here’s what you can do to help the project:

* adding to or fixing typos/quality in documentation
* adding failing tests for reported bugs
* writing code (no contribution is too small!)
* reviewing pull requests and suggesting improvements
* reporting bugs or suggesting new features (see [CONTRIBUTING.md][])

## Contributing documentation

Improvements and additions to Capistrano's documentation are very much appreciated. The official documentation is stored in the `docs/` directory as Markdown files. These files are used to automatically generate the [capistranorb.com](https://capistranorb.com/) website, which is hosted by GitHub Pages. Feel free to make changes to this documentation as you see fit. Before opening a pull request, make sure your documentation renders correctly by previewing the website in your local environment. Refer to [docs/README.md][] for instructions.

## Setting up your development environment

Capistrano is a Ruby project, so we expect you to have a functioning Ruby environment with the latest stable version of Ruby. To run Cucumber tests, you'll also need [Docker installed](https://docs.docker.com/get-docker/) and running.


### Running tests

Capistrano has two test suites: an RSpec suite and a Cucumber suite. The RSpec suite handles quick feedback unit specs. The Cucumber suite is an integration suite that uses a Docker container as an SSH server and deployment target.

```
# Ensure all dependencies are installed
$ bundle install

# Run the RSpec suite
$ bundle exec rake spec

# Run the Cucumber suite (Docker must be running)
$ bundle exec rake features
```

## Coding guidelines

This project uses [RuboCop](https://github.com/bbatsov/rubocop) to enforce standard Ruby coding guidelines.

* Test that your contributions pass with `rake rubocop`
* Rubocop is also run as part of the full test suite with `rake`
* Note the CI build will fail and your PR cannot be merged if Rubocop finds errors

## Submitting a pull request

Pull requests are awesome, and if they arrive with decent tests, and conform to the guidelines below, we'll merge them in as soon as possible, we'll let you know which release we're planning them for (we adhere to [semver](http://semver.org/) so please don't be upset if we plan your changes for a later release).

Your code should conform to these guidelines:

 * The code is MIT licensed, your code will fall under the same license if we merge it.
 * We can't merge it without a [good commit message](http://robots.thoughtbot.com/5-useful-tips-for-a-better-commit-message). If you do this right, Github will use the commit message as the body of your pull request, double win.
 * If you are making an improvement/fix for an existing issue, make sure to mention the issue number (if we have not yet merged it )
 * Add an entry to the `CHANGELOG` under the `### master` section, but please don't mess with the version.
 * If you add a new feature, please make sure to document it by modifying the appropriate Markdown files in `docs/` (see [contributing documentation](#contributing-documentation), above). If it's a simple feature, or a new variable, or something changed, it may be appropriate simply to document it in the generated `Capfile` or `deploy.rb`, or in the `README`.
 * Take care to squash your commit into one single commit with a good message, it saves us a lot of work in maintaining the CHANGELOG if we can generate it from the commit messages between the release tags!
 * Tests! It's tricky to test some parts of Capistrano, but do your best, it might just serve as a starting point for us to build a reliable test on top of, and help us understand where you are coming from.

## Managing GitHub issues

The Capistrano maintainers will do our best to review all GitHub issues. Here’s how we manage issues:

1. Issues will be acknowledged with an appropriate label (see below).
2. Issues that are duplicates, spam, or irrelevant (e.g. wrong project), or are questions better suited for Stack Overflow (see [CONTRIBUTING.md][]) will be closed.
3. Once an issue is fixed or resolved in an upcoming Capistrano release, it will be closed and assigned to a GitHub milestone for that upcoming version number.

The maintainers do not have time to fix every issue ourselves, but we will gladly accept pull requests, especially for issues labeled as "you can help" (see below).

### Issue labels

Capistrano uses these GitHub labels to categorize issues:

* **bug?** – Could be a bug (not reproducible or might be user error)
* **confirmed bug** – Definitely a bug
* **new feature** – A request for Capistrano to add a feature or work differently
* **chore** – A TODO that is neither a bug nor a feature (e.g. improve docs, CI infrastructure, etc.)

Also, the Capistrano team will sometimes add these labels to facilitate communication and encourage community feedback:

* **discuss!** – The Capistrano team wants more feedback from the community on this issue; e.g. how a new feature should work, or whether a bug is serious or not.
* **you can help!** – We want the community to help by submitting a pull request to solve a bug or add a feature. If you are looking for ways to contribute to Capistrano, start here!
* **needs more info** – We need more info from the person who opened the issue; e.g. steps to reproduce a bug, clarification on a desired feature, etc.

*These labels were inspired by Daniel Doubrovkine’s [2014 Golden Gate Ruby Conference talk](http://confreaks.tv/videos/gogaruco2014-taking-over-someone-else-s-open-source-projects).*

## Reviewing and merging pull requests

Pull requests and issues follow similar workflows. Before merging a pull request, the Capistrano maintainers will check that these requirements are met:

* All CI checks pass
* Significant changes in behavior or fixes mentioned in the CHANGELOG
* Clean commit history
* New features are documented
* Code changes/additions are tested

If any of these are missing, the **needs more info** label is assigned to the pull request to indicate the PR is incomplete.

Merging a pull request is a decision entrusted to the maintainers of the Capistrano project. Any maintainer is free to merge a pull request if they feel the PR meets the above requirements and is in the best interest of the Capistrano community.

After a pull request is merged, it is assigned to a GitHub milestone for the upcoming version number.


[CONTRIBUTING.md]: https://github.com/capistrano/capistrano/blob/master/CONTRIBUTING.md
[docs/README.md]: https://github.com/capistrano/capistrano/blob/master/docs/README.md


================================================
FILE: Gemfile
================================================
source "https://rubygems.org"

# Specify your gem's dependencies in capistrano.gemspec
gemspec

gem "cucumber", "~> 10.1"
gem "mocha", "~> 3.0"
gem "rspec", "~> 3.13"
gem "rubocop", "1.81.7"


================================================
FILE: LICENSE.txt
================================================
MIT License (MIT)

Copyright (c) 2012-2020 Tom Clements, Lee Hambley

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.


================================================
FILE: README.md
================================================

# Capistrano: A deployment automation tool built on Ruby, Rake, and SSH.

[![Gem Version](https://badge.fury.io/rb/capistrano.svg)](http://badge.fury.io/rb/capistrano) [![Build Status](https://github.com/capistrano/capistrano/actions/workflows/ci.yml/badge.svg)](https://github.com/capistrano/capistrano/actions/workflows/ci.yml) [![Code Climate](https://codeclimate.com/github/capistrano/capistrano/badges/gpa.svg)](https://codeclimate.com/github/capistrano/capistrano) [![CodersClan](https://img.shields.io/badge/get-support-blue.svg)](http://codersclan.net/?repo_id=325&source=small)

Capistrano is a framework for building automated deployment scripts. Although Capistrano itself is written in Ruby, it can easily be used to deploy projects of any language or framework, be it Rails, Java, or PHP.

Once installed, Capistrano gives you a `cap` tool to perform your deployments from the comfort of your command line.

```
$ cd my-capistrano-enabled-project
$ cap production deploy
```

When you run `cap`, Capistrano dutifully connects to your server(s) via SSH and executes the steps necessary to deploy your project. You can define those steps yourself by writing [Rake](https://github.com/ruby/rake) tasks, or by using pre-built task libraries provided by the Capistrano community.

Tasks are simple to make. Here's an example:

```ruby
task :restart_sidekiq do
  on roles(:worker) do
    execute :service, "sidekiq restart"
  end
end
after "deploy:published", "restart_sidekiq"
```

*Note: This documentation is for the current version of Capistrano (3.x). If you are looking for Capistrano 2.x documentation, you can find it in [this archive](https://github.com/capistrano/capistrano-2.x-docs).*

---

## Contents

* [Features](#features)
* [Gotchas](#gotchas)
* [Quick start](#quick-start)
* [Finding help and documentation](#finding-help-and-documentation)
* [How to contribute](#how-to-contribute)
* [License](#license)

## Features

There are many ways to automate deployments, from simple rsync bash scripts to complex containerized toolchains. Capistrano sits somewhere in the middle: it automates what you already know how to do manually with SSH, but in a repeatable, scalable fashion. There is no magic here!

Here's what makes Capistrano great:

#### Strong conventions

Capistrano defines a standard deployment process that all Capistrano-enabled projects follow by default. You don't have to decide how to structure your scripts, where deployed files should be placed on the server, or how to perform common tasks: Capistrano has done this work for you.

#### Multiple stages

Define your deployment once, and then easily parameterize it for multiple *stages* (environments), e.g. `qa`, `staging`, and `production`. No copy-and-paste necessary: you only need to specify what is different for each stage, like IP addresses.

#### Parallel execution

Deploying to a fleet of app servers? Capistrano can run each deployment task concurrently across those servers and uses connection pooling for speed.

#### Server roles

Your application may need many different types of servers: a database server, an app server, two web servers, and a job queue work server, for example. Capistrano lets you tag each server with one or more roles, so you can control what tasks are executed where.

#### Community driven

Capistrano is easily extensible using the rubygems package manager. Deploying a Rails app? Wordpress? Laravel? Chances are, someone has already written Capistrano tasks for your framework of choice and has distributed it as a gem. Many Ruby projects also come with Capistrano tasks built-in.

#### It's just SSH

Everything in Capistrano comes down to running SSH commands on remote servers. On the one hand, that makes Capistrano simple. On the other hand, if you aren't comfortable SSH-ing into a Linux box and doing stuff on the command-line, then Capistrano is probably not for you.

## Gotchas

While Capistrano ships with a strong set of conventions that are common for all types of deployments, it needs help understanding the specifics of your project, and there are some things Capistrano is not suited to do.

#### Project specifics

Out of the box, Capistrano can deploy your code to server(s), but it does not know how to *execute* your code. Does `foreman` need to be run? Does Apache need to be restarted? You'll need to tell Capistrano how to do this part by writing these deployment steps yourself, or by finding a gem in the Capistrano community that does it for you.

#### Key-based SSH

Capistrano depends on connecting to your server(s) with SSH using key-based (i.e. password-less) authentication. You'll need this working before you can use Capistrano.

#### Provisioning

Likewise, your server(s) will likely need supporting software installed before you can perform a deployment. Capistrano itself has no requirements other than SSH, but your application probably needs database software, a web server like Apache or Nginx, and a language runtime like Java, Ruby, or PHP. These *server provisioning* steps are not done by Capistrano.

#### `sudo`, etc.

Capistrano is designed to deploy using a single, non-privileged SSH user, using a *non-interactive* SSH session. If your deployment requires `sudo`, interactive prompts, authenticating as one user but running commands as another, you can probably accomplish this with Capistrano, but it may be difficult. Your automated deployments will be much smoother if you can avoid such requirements.

#### Shells

Capistrano 3 expects a POSIX shell like Bash or Sh. Shells like tcsh, csh, and such may work, but probably will not.

## Quick start

### Requirements

* Ruby version 2.5 or higher on your local machine (MRI or Rubinius)
* A project that uses source control (Git, Mercurial, and Subversion support is built-in)
* The SCM binaries (e.g. `git`, `hg`) needed to check out your project must be installed on the server(s) you are deploying to
* [Bundler](http://bundler.io), along with a Gemfile for your project, are recommended

### Install the Capistrano gem

Add Capistrano to your project's Gemfile using `require: false`:

``` ruby
group :development do
  gem "capistrano", "~> 3.17", require: false
end
```

Then run Bundler to ensure Capistrano is downloaded and installed:

``` sh
$ bundle install
```

### "Capify" your project

Make sure your project doesn't already have a "Capfile" or "capfile" present. Then run:

``` sh
$ bundle exec cap install
```

This creates all the necessary configuration files and directory structure for a Capistrano-enabled project with two stages, `staging` and `production`:

```
├── Capfile
├── config
│   ├── deploy
│   │   ├── production.rb
│   │   └── staging.rb
│   └── deploy.rb
└── lib
    └── capistrano
            └── tasks
```

To customize the stages that are created, use:

``` sh
$ bundle exec cap install STAGES=local,sandbox,qa,production
```

Note that the files that Capistrano creates are simply templates to get you started. Make sure to edit the `deploy.rb` and stage files so that they contain values appropriate for your project and your target servers.

### Command-line usage

``` sh
# list all available tasks
$ bundle exec cap -T

# deploy to the staging environment
$ bundle exec cap staging deploy

# deploy to the production environment
$ bundle exec cap production deploy

# simulate deploying to the production environment
# does not actually do anything
$ bundle exec cap production deploy --dry-run

# list task dependencies
$ bundle exec cap production deploy --prereqs

# trace through task invocations
$ bundle exec cap production deploy --trace

# lists all config variable before deployment tasks
$ bundle exec cap production deploy --print-config-variables
```

## Finding help and documentation

Capistrano is a large project encompassing multiple GitHub repositories and a community of plugins, and it can be overwhelming when you are just getting started. Here are resources that can help:

* **The [docs](docs) directory contains the official documentation**, and is used to generate the [Capistrano website](http://capistranorb.com)
* [Stack Overflow](http://stackoverflow.com/questions/tagged/capistrano) has a Capistrano tag with lots of activity
* [The Capistrano mailing list](https://groups.google.com/forum/#!forum/capistrano) is low-traffic but is monitored by Capistrano contributors
* [CodersClan](http://codersclan.net/?repo_id=325&source=link) has Capistrano experts available to solve problems for bounties

Related GitHub repositories:

* [capistrano/sshkit](https://github.com/capistrano/sshkit) provides the SSH behavior that underlies Capistrano (when you use `execute` in a Capistrano task, you are using SSHKit)
* [capistrano/rails](https://github.com/capistrano/rails) is a very popular gem that adds Ruby on Rails deployment tasks
* [mattbrictson/airbrussh](https://github.com/mattbrictson/airbrussh) provides Capistrano's default log formatting

GitHub issues are for bug reports and feature requests. Please refer to the [CONTRIBUTING](CONTRIBUTING.md) document for guidelines on submitting GitHub issues.

If you think you may have discovered a security vulnerability in Capistrano, do not open a GitHub issue. Instead, please send a report to <security@capistranorb.com>.

## How to contribute

Contributions to Capistrano, in the form of code, documentation or idea, are gladly accepted. Read the [DEVELOPMENT](DEVELOPMENT.md) document to learn how to hack on Capistrano's code, run the tests, and contribute your first pull request.

## License

MIT License (MIT)

Copyright (c) 2012-2020 Tom Clements, Lee Hambley

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.


================================================
FILE: RELEASING.md
================================================
# Releasing

## Prerequisites

* You must have commit rights to the Capistrano repository.
* You must have push rights for the capistrano gem on rubygems.org.

## How to release

1. Run `bundle install` to make sure that you have all the gems necessary for testing and releasing.
2.  **Ensure all tests are passing by running `rake spec` and `rake features`.**
3. Determine which would be the correct next version number according to [semver](http://semver.org/).
4. Update the version in `./lib/capistrano/version.rb`.
5. Update the version in the `./README.md` Gemfile example (`gem "capistrano", "~> X.Y"`).
6. Commit the `version.rb` and `README.md` changes in a single commit, the message should be "Release vX.Y.Z"
7. Run `rake release`; this will tag, push to GitHub, and publish to rubygems.org.
8. Update the draft release on the [GitHub releases page](https://github.com/capistrano/capistrano/releases) to point to the new tag and publish the release


================================================
FILE: Rakefile
================================================
require "bundler/gem_tasks"
require "rspec/core/rake_task"

begin
  require "rubocop/rake_task"
  desc "Run RuboCop checks"
  RuboCop::RakeTask.new
  task default: %i(spec rubocop)
rescue LoadError
  task default: :spec
end

RSpec::Core::RakeTask.new

begin
  require "cucumber/rake/task"
  Cucumber::Rake::Task.new(:features)
rescue LoadError # rubocop:disable Lint/SuppressedException
end

Rake::Task["release"].enhance do
  puts "Don't forget to publish the release on GitHub!"
  system "open https://github.com/capistrano/capistrano/releases"
end


================================================
FILE: UPGRADING-3.7.md
================================================
# Capistrano 3.7.0 upgrade guide

## The :scm variable is deprecated

Up until now, Capistrano's SCM was configured using the `:scm` variable:

```ruby
# This is now deprecated
set :scm, :svn
```

To avoid deprecation warnings:

1. Remove `set :scm, ...` from your Capistrano configuration.
2. Add *one* of the following SCM declarations to your `Capfile` after `require "capistrano/deploy"`:

```ruby
# To use Git
require "capistrano/scm/git"
install_plugin Capistrano::SCM::Git

# To use Mercurial
require "capistrano/scm/hg"
install_plugin Capistrano::SCM::Hg

# To use Subversion
require "capistrano/scm/svn"
install_plugin Capistrano::SCM::Svn
```

## This is the last release where Git is the automatic default

If you do not specify an SCM, Capistrano assumes Git. However this behavior is
now deprecated. Add this to your Capfile to avoid deprecation warnings:

```ruby
require "capistrano/scm/git"
install_plugin Capistrano::SCM::Git
```

## :git_strategy, :hg_strategy, and :svn_strategy are removed

Capistrano 3.7.0 has a rewritten SCM system that relies on "plugins". This
system is more flexible than the old "strategy" system that only allowed certain
parts of SCM tasks to be customized.

If your deployment relies on a custom SCM strategy, you will need to rewrite
that strategy to be a full-fledged SCM plugin instead. There is a fairly
straightforward migration path: write your plugin to be a subclass of the
built-in SCM that you want to customize. For example:

```ruby
require "capistrano/scm/git"

class MyCustomGit < Capistrano::SCM::Git
  # Override the methods you wish to customize, e.g.:
  def clone_repo
    # ...
  end
end
```

Then use your plugin in by loading it in the Capfile:

```ruby
require_relative "path/to/my_custom_git.rb"
install_plugin MyCustomGit
```

## Existing third-party SCMs are deprecated

If you are using a third-party SCM, you can continue using it without
changes, but you will see deprecation warnings. Contact the maintainer of the
third-party SCM gem and ask them about modifying the gem to work with the new
Capistrano 3.7.0 SCM plugin system.

## remote_file is removed

The `remote_file` method is no longer in Capistrano 3.7.0. You can read the
discussion that led to its removal here:
[issue 762](https://github.com/capistrano/capistrano/issues/762).

There is no direct replacement. To migrate to 3.7.0, you will need to rewrite
any parts of your deployment that use `remote_file` to use a different
mechanism for uploading files. Consider using the `upload!` method directly in
a procedural fashion instead.


================================================
FILE: bin/cap
================================================
#!/usr/bin/env ruby
require "capistrano/all"
Capistrano::Application.new.run


================================================
FILE: bin/capify
================================================
#!/usr/bin/env ruby
puts "-" * 80
puts "Capistrano 3.x is incompatible with Capistrano 2.x. "
puts
puts "This command has become `cap install` in Capistrano 3.x"
puts
puts "For more information see http://www.capistranorb.com/"
puts "-" * 80


================================================
FILE: capistrano.gemspec
================================================
# -*- encoding: utf-8 -*-

lib = File.expand_path("../lib", __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require "capistrano/version"

Gem::Specification.new do |gem|
  gem.name          = "capistrano"
  gem.version       = Capistrano::VERSION
  gem.authors       = ["Tom Clements", "Lee Hambley"]
  gem.email         = ["seenmyfate@gmail.com", "lee.hambley@gmail.com"]
  gem.description   = "Capistrano is a utility and framework for executing commands in parallel on multiple remote machines, via SSH."
  gem.summary       = "Capistrano - Welcome to easy deployment with Ruby over SSH"
  gem.homepage      = "https://capistranorb.com/"
  gem.metadata      = {
    "bug_tracker_uri" => "https://github.com/capistrano/capistrano/issues",
    "changelog_uri" => "https://github.com/capistrano/capistrano/releases",
    "source_code_uri" => "https://github.com/capistrano/capistrano",
    "homepage_uri" => "https://capistranorb.com/",
    "documentation_uri" => "https://capistranorb.com/"
  }
  gem.files         = `git ls-files -z`.split("\x0").reject { |f| f =~ /^docs/ }
  gem.executables   = %w(cap capify)
  gem.test_files    = gem.files.grep(%r{^(test|spec|features)/})
  gem.require_paths = ["lib"]

  gem.licenses      = ["MIT"]

  gem.required_ruby_version = ">= 2.5"
  gem.add_dependency "airbrussh", ">= 1.0.0"
  gem.add_dependency "i18n"
  gem.add_dependency "rake", ">= 10.0.0"
  gem.add_dependency "sshkit", ">= 1.9.0"
end


================================================
FILE: docker-compose.yml
================================================
name: capistrano

services:
  ssh_server:
    build:
      context: .docker
    ports:
      - "2022:22"


================================================
FILE: docs/CNAME
================================================
capistranorb.com


================================================
FILE: docs/Gemfile
================================================
source "https://rubygems.org"

# keep versions up-to-date with the actual GitHub Pages setup
# https://pages.github.com/versions/

# just do `bundle update` to get the latest version.

gem "github-pages"


================================================
FILE: docs/README.md
================================================
# capistranorb.com

This `docs/` directory generates the [capistranorb.com](https://capistranorb.com/) site. Feel free to send pull requests to make improvements to Capistrano's documentation!

### Quick start

This is a GitHub Pages project, which means it is built using Jekyll. To run the site locally, you'll need a functioning Ruby environment.

After checking out the capistrano repository, run:

```
cd docs
bundle install
```

Then start the Jekyll server with:

```
bundle exec jekyll serve
```

You should now be able to preview the site on `http://localhost:4000`. After making any changes to markdown or HTML files, just refresh your browser to see the results. You do not have to restart the Jekyll process.

More information: [Using Jekyll with Pages](https://help.github.com/articles/using-jekyll-with-pages/).


================================================
FILE: docs/_config.yml
================================================
name: Capistrano
kramdown:
  input: GFM
  hard_wrap: false
highlighter: rouge
safe: true
lsi: false
exclude: ["Gemfile", "Gemfile.lock", "README.md", "vendor"]


================================================
FILE: docs/_includes/carbon.html
================================================
<script async type="text/javascript" src="//cdn.carbonads.com/carbon.js?zoneid=1673&serve=C6AILKT&placement=capistranorbcom" id="_carbonads_js"></script>


================================================
FILE: docs/_includes/footer.html
================================================
<footer>
  <div class="row">
    <div class="large-4 columns">
      <ul>
        <li><a href="/documentation/overview/what-is-capistrano/">About Capistrano</a></li>
        <li><a href="https://github.com/capistrano/capistrano/blob/master/CONTRIBUTING.md">Contributing</a></li>
        <li><a href="https://rubygems.org/gems/capistrano/versions">Releases</a></li>
      </ul>
    </div>

    <div class="large-4 columns">
      <ul>
        <li><a href="https://stackoverflow.com/questions/tagged/capistrano">StackOverflow</a></li>
        <li><a href="https://groups.google.com/forum/#!forum/capistrano">Mailing List</a></li>
      </ul>
    </div>

    <div class="large-4 columns">
      <ul class="social icons">
        <li class="foundicon"><a href="//twitter.com/capistranorb"><i class="foundicon-twitter"></i></a></li>
        <li class="foundicon"><a href="//github.com/capistrano"><i class="foundicon-github"></i></a></li>
        <li class="thanks-dnsimple">
          <a href="https://dnsimple.link/resolving-capistrano" target="_blank">
            <span>DNS Services Kindly Hosted By<br></span>
            <img src="https://cdn.dnsimple.com/assets/resolving-with-us/logo-dark.png" alt="DNSimple" style="display:block;margin:0;padding:0;width:100px;">
          </a>
        </li>
      </ul>
    </div>
  </div>
</footer>


================================================
FILE: docs/_includes/google_tag_manager.html
================================================
<!-- Google Tag Manager -->
<noscript>
  <iframe src="//www.googletagmanager.com/ns.html?id=GTM-KLDBJG" height="0" width="0" style="display:none;visibility:hidden"></iframe>
</noscript>
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-KLDBJG');</script>
<!-- End Google Tag Manager -->


================================================
FILE: docs/_includes/header.html
================================================
<div class="header">
  <div class="row">
    <div class="large-12 column">
      <a href="/" class="brand">
        <img src="/assets/images/CapistranoLogo.png" alt="capistrano logo" />
      </a>
    </div>
    <!-- <div class="large&#45;4 column"> -->
    <!--   {% include carbon.html %} -->
    <!-- </div> -->
  </div>
</div>


================================================
FILE: docs/_includes/metrics.html
================================================
<script type="text/javascript">
  var _gauges = _gauges || [];
  (function() {
    var t   = document.createElement('script');
    t.type  = 'text/javascript';
    t.async = true;
    t.id    = 'gauges-tracker';
    t.setAttribute('data-site-id', '51c83c32613f5d7df70000bc');
    t.src = '//secure.gaug.es/track.js';
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(t, s);
  })();
</script>

<script type="text/javascript">
  setTimeout(function(){var a=document.createElement("script");
  var b=document.getElementsByTagName("script")[0];
  a.src=document.location.protocol+"//dnn506yrbagrg.cloudfront.net/pages/scripts/0017/6418.js?"+Math.floor(new Date().getTime()/3600000);
  a.async=true;a.type="text/javascript";b.parentNode.insertBefore(a,b)}, 1);
</script>

<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-41970098-1', 'capistranorb.com');
  ga('send', 'pageview');
</script>


================================================
FILE: docs/_includes/navigation.html
================================================
<ul class="side-nav">

  <h5>Search</h5>
  <form action="https://www.google.com/search" method="get">
    <input type="hidden" name="as_sitesearch" value="capistranorb.com">
    <input type="search" name="q" placeholder="Search terms" autocomplete="off">
  </form>
  <li class="divider"></li>

  <h5>Overview</h5>
  <li><a href="/documentation/overview/what-is-capistrano/">What is Capistrano?</a></li>
  <li class="divider"></li>

  <h5>Getting Started</h5>
  <li><a href="https://github.com/capistrano/capistrano/blob/master/README.md">The Readme, start here!</a></li>

  <li><a href="/documentation/getting-started/installation/">Installation</a></li>
  <li><a href="/documentation/getting-started/structure/">Structure</a></li>
  <li><a href="/documentation/getting-started/configuration/">Configuration</a></li>
  <li><a href="/documentation/getting-started/user-input/">User Input</a></li>
  <li><a href="/documentation/getting-started/preparing-your-application/">Preparing Your Application</a></li>
  <li><a href="/documentation/getting-started/flow/">Flow</a></li>
  <li><a href="/documentation/getting-started/rollbacks/">Rollbacks</a></li>
  <li><a href="/documentation/getting-started/cold-start/">Cold Start</a></li>
  <li><a href="/documentation/getting-started/version-locking/">Version Locking</a></li>
  <li><a href="/documentation/getting-started/tasks/">Tasks</a></li>
  <li><a href="/documentation/getting-started/local-tasks/">Local Tasks</a></li>
  <li><a href="/documentation/getting-started/before-after/">Before / After Hooks</a></li>
  <li><a href="/documentation/getting-started/authentication-and-authorisation/">Authentication &amp; Authorisation</a></li>
  <li class="divider"></li>

  <h5>Task cookbook</h5>
  <!-- Also add to intro/index.markdown  -->
  <li><a href="/documentation/tasks/intro/">Introduction</a></li>
  <li><a href="/documentation/tasks/rails/">Rails related tasks</a></li>
  <li class="divider"></li>

  <h5>Advanced Features</h5>
  <li><a href="/documentation/advanced-features/console/">Console</a></li>
  <li><a href="/documentation/advanced-features/ptys/">PTYs</a></li>
  <li><a href="/documentation/advanced-features/filtering/">Filtering</a></li>
  <li><a href="/documentation/advanced-features/properties/">Properties</a></li>
  <li><a href="/documentation/advanced-features/property-filtering/">Property Filtering</a></li>
  <li><a href="/documentation/advanced-features/host-filtering/">Host filtering</a></li>
  <li><a href="/documentation/advanced-features/role-filtering/">Role Filtering</a></li>
  <li><a href="/documentation/advanced-features/custom-filters/">Custom Filters</a></li>
  <li><a href="/documentation/advanced-features/overriding-capistrano-tasks/">Overriding Capistrano Tasks</a></li>
  <li><a href="/documentation/advanced-features/remote-file/">Remote File Task</a></li>
  <li><a href="/documentation/advanced-features/ssh-kit">Remote Commands with SSHKit</a></li>
  <li><a href="/documentation/advanced-features/ignoring">Preventing file deployment with gitattributes</a></li>
  <li><a href="/documentation/advanced-features/validation-of-variables">Validation of variables</a></li>
  <li><a href="/documentation/advanced-features/custom-scm">Custom SCM</a></li>
  <li class="divider"></li>

  <h5>Plugins</h5>
  <li><a href="/documentation/plugins/">Official Plugins</a></li>
  <li><a href="/documentation/third-party-plugins/">3<sup>rd</sup> Party Plugins</a></li>
  <li class="divider"></li>

  <h5>FAQ</h5>
  <li><a href="/documentation/faq/why-does-something-work-in-my-ssh-session-but-not-in-capistrano/">Why does something work in an SSH session, but not in Capistrano?</a></li>
  <li><a href="/documentation/faq/how-can-i-access-stage-configuration-variables/">How can I access stage configuration variables?</a></li>
  <li><a href="/documentation/faq/how-can-i-check-for-existing-remote-file/">How can I check for existing remote file?</a></li>
  <li><a href="/documentation/faq/how-can-i-get-capistrano-to-prompt-for-a-password/">How can I get Capistrano to prompt for a password?</a></li>
  <li><a href="/documentation/faq/how-can-i-set-capistrano-configuration-paths/">How can I set Capistrano configuration paths?</a></li>
  <li class="divider"></li>

  <h5>Legacy</h5>
  <li><a href="https://github.com/capistrano/capistrano-2.x-docs/">Capistrano 2 Documentation Repository</a></li>
  <li><a href="/documentation/upgrading/">Upgrading from Capistrano 2.x to 3</a></li>
  <li class="divider"></li>

  <h5>Recent Announcements</h5>
  {% for post in site.posts %}
    <li><a href="{{ post.url }}"><span class="post-date">{{ post.date | date_to_string }}</span> {{ post.title }}</a></li>
  {% endfor %}
</ul>


================================================
FILE: docs/_layouts/default.html
================================================
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{ page.title }}</title>
    <link href='https://fonts.googleapis.com/css?family=Enriqueta' rel='stylesheet' type='text/css'>
    <script type="text/javascript" src="//use.typekit.net/itm5ubu.js"></script>
    <script type="text/javascript">try{Typekit.load();}catch(e){}</script>
    <link rel="stylesheet" href="/assets/css/foundation.css" />
    <link rel="stylesheet" href="/assets/css/capistrano.css">
    <link rel="stylesheet" href="/assets/css/social_foundicons.css" />
    <link rel="stylesheet" href="/assets/css/monokai.css" />

    <link rel="apple-touch-icon" sizes="180x180" href="/assets/apple-touch-icon.png">
    <link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon-32x32.png">
    <link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon-16x16.png">
    <link rel="icon" href="/assets/favicon.ico">
    <link rel="manifest" href="/assets/site.webmanifest">
    <link rel="mask-icon" href="/assets/safari-pinned-tab.svg" color="#5bbad5">
    <meta name="msapplication-TileColor" content="#1c1b39">
    <meta name="theme-color" content="#1c1b39">
  </head>

  <body>
    {% include metrics.html %}

    {% include header.html %}

    <div class="row">
      <div class="large-4 columns">
        {% include navigation.html %}
      </div>
      <div class="large-8 column">
        <div class="content">
          <h2>{{ page.title }}</h2>
          {{ content }}
        </div>
      </div>
    </div>

  {% include footer.html %}

  <script src="/assets/js/jquery-1.7.min.js"></script>
  <script src="/assets/js/jquery.githubRepoWidget.min.js"></script>

  <a href="https://github.com/capistrano/capistrano"><img style="position: absolute; top: 0; right: 0; border: 0;" src="assets/forkme_right_white_ffffff.svg" alt="Fork me on GitHub"></a>

  {% include google_tag_manager.html %}
</body>
</html>


================================================
FILE: docs/_layouts/post.html
================================================
---
layout: default
---
<p class="meta">{{ page.date | date_to_string }}</p>

<div id="post">
{{ content }}
</div>


================================================
FILE: docs/_posts/2013-06-01-release-announcement.markdown
================================================
---
layout: post
title: "Capistrano Version 3 Release Announcement"
date:   2013-06-01
---

After what seems like years of work, the Capistrano team (that's Tom and I)
are pleased to announce the first *major* release of Capistrano in almost 5
years.

The reasons behind the length of time between the last architectural overhaul
and this one are numerous, but it can be summarised to say that Capistrano is a
widely used tool, and when working around software deployment it's really a
question of downtime. If we had changed something significant in Capistrano we
could have taken a lot of sites offline, and made a lot of people very
unhappy. Until this point we haven't felt that the time has been ripe where
the benefits of a slightly rocky upgrade path are worth the risks of downtime.

It also hasn't helped historically that we've only just gotten to grips with
Ruby 1.9, and that Bundler's near ubiquity means that now it's trivial to lock
a Gem at a specific version. With other tools in the Ruby ecosystem it's
become easier for us to make significant changes to a tool upon which many
hundreds of thousands of people rely.

### Design Goals

We had a few goals for this release, in no particular order they were:

* **Get away from our own DSL solution.** Great DSL alternatives (Rake, Sake, Thor,
  etc) are already widely used.
* **Better modularisation.** to enable people outside the Rails community to
  benefit from Capistrano's *best-practice* workflow, and to enable people in
  the Rails community to pick and choose support for components they use
  (Database Migrations, Asset Pipeline, etc)
* **Easier Debugging.** A lot of problems with Capistrano come from weirdness
  surrounding environmental issues around PTY vs non-TTY environments, login
  and non-login shells not to mention *environment managers* such as rvm,
  rbenv and nvm.
* **Speed.** We know that in a lot of environments speed of deployment is a
  huge factor, since Rails introduced the *Asset Pipeline* it's not uncommon
  for a deploy that formerly took 5 seconds now takes 5 minutes. This really
  is mostly out of our control, but with improved support for parallelism,
  rolling restarts we feel confident that things will be quicker and easier to
  keep running quickly now.
* **Applicability.** We've always maintained that Capistrano is a terrible
  tool for system provisioning, and that more often than not servers are
  better being setup with Chef, Puppet or similar, whilst we still agree with
  that, the new features in Capistrano really lend themselves to integrating
  with these kinds of tools.

### What's missing?

Before we get too carried away it's worth shortlisting the things that don't
exist in version three, ***yet***.

* **SSH Gateway Support** SSH Gateway support hasn't been implemented in
  version three yet, I hope that this will be done soon. As I have no direct
  need for it, I haven't the means to test it with a view to implementing it,
  yet.
* **Mecurial, Subversion, and CVS Support** These have been removed as we've
  been able to implement the Git SCM in an incredibly neat way that isn't
  compatible with the others. We wanted to break the cycle of always sticking
  with the lowest common denominator, so we are **actively** looking for
  people who are interested in contributing, or sharing expertise on the
  *best-practice* way of speedily deploying from your respective choice of
  source control.
* **`HOSTFILTER` ,`ROLEFILTER` and friends** These have gone away because we
  always felt they were endemic of a bad design decision about using
  Environmental Variables. These will be coming back as flags passed to `cap`
  on the CLI, and options that can be set on the `Capistrano::Application` Ruby
  class.
* **Shell** The shell has been removed temporarily pending a neater
  implementation, we've got something that we are playing with internally, but
  it needs better `readline` support, and some more controls around what to do
  when things go badly on some servers, but not others.
* **Cold Deploy** The `cap deploy:cold` is a really old legacy component,
  originally from the days of the `script/spinner` where deploying cold
  (starting workers that weren't running), and deploying a *warm* system were
  different (restarting existing worker pools, which wasn't fun!) By and large
  these things have gone away, and it's time `deploy:cold` went away. It's
  safe in every case we could find to call setup, and seed and other Rake
  tasks without things blowing up, and that should be the approach we take.
  Tasks on the server should be idempotent, and if something is called twice,
  let it be.

### What's new?

Each section here really deserves it's own sub-heading as some of the new
features are awesome.

#### Rake Integration

We have moved away from our own DSL implementation to implement Capistrano as a
*Rake* application.

Rake has always supported being sub-classed, so to speak as a
*sub-application*; it is however poorly documented. By subclassing
`Rake::Application` one can specify what the *Rakefile* should look like, where
to search for it, and how to load other *Rakefiles*.

The *Rake* DSL is widely used, well known and very powerful. As Rake is
essentially a dependency resolution system, it offers a lot of nice ways to,
for example build a tarball as a dependency of uploading it and deploying it.

This has allowed us to do away with the *copy* strategy all together, as it
can now be implemented from scratch in fewer than ten lines of code.

The guiding principle is dependency resolution, and interoperability with
other tools, for example:

{% highlight ruby %}
    # Capistrano 3.0.x
    task :notify do
      this_release_tag = sh("git describe --abbrev=0 --tags")
      last_ten_commits = sh("git log #{this_release_tag}~10..#{this_release_tag}")
      Mail.deliver do
        to      "team@example.com"
        subject "Releasing #{this_release_tag} Now!"
        body    last_ten_commits
      end
    end

    namespace :deploy
      task default: :notify
    end
{% endhighlight %}

The last three lines rely on Rake's additive task declaration, by redefining the
`deploy:default` task by adding another dependency. Rake will automatically
resolve this dependency at Runtime, mailing the recent changelog to your team,
assuming everything is setup correctly.

#### Built-In Stage Support

In former versions of Capistrano *stage* support was an after thought,
provided through the `capistrano-ext` Gem, and laterally merged into the main
codebase, people insisted in still using the `capistrano-ext` version
regardless.

In Capistrano 3.0.x there's stage support built-in, at installation time, two
stages will be created by default, *staging* and *production*; it's easy to
add more, just add a file to `config/deploy/______.rb` which follows the
conventions established in the examples we created for you.

To create different stages at installation time, simply set the `STAGES`
environmental variable to a comma separated list of stages:

{% highlight bash %}
    $ cap install STAGES=staging,production,ci,qa
{% endhighlight %}

#### Parallelism

In former versions of Capistrano there was a *parallel* option to run
different tasks differently on groups of servers, it looked something like
this:

{% highlight ruby %}
    # Capistrano 2.0.x
    task :restart do
      parallel do |session|
        session.when "in?(:app)", "/u/apps/social/script/restart-mongrel"
        session.when "in?(:web)", "/u/apps/social/script/restart-apache"
        session.else "echo nothing to do"
      end
    end
{% endhighlight %}

This always felt a little unclean, and indeed it's a hack that was originally
implemented to facilitate rolling deployments at a large German firm by a
couple of freelancers who were consulting with them. (Hint, one of those guys
went on to found Travis-CI!)

The equivalent code in under Capistrano v3 would look like this:

{% highlight ruby %}
    # Capistrano 3.0.x
    task :restart do
      on :all, in: :parallel do |host|
        if host.roles.include?(:app)
          execute "/u/apps/social/script/restart-mongrel"
        elsif host.roles.include?(:web)
          execute "/u/apps/social/script/restart-web"
        else
          info sprintf("Nothing to do for %s with roles %s", host,
          host.properties.roles)
        end
      end
    end
{% endhighlight %}

The second block of code, that representing the new Rake derived DSL and
demonstrating how to use the parallel execution mode is a little longer, but I
think it's clearer, more idiomatic Ruby code which relies less on an intimate
knowledge of how the Capistrano DSL happens to work. It also hints at the
built-in logging subsystem, keep reading to learn more.

Other modes for parallelism include:

{% highlight ruby %}
    # Capistrano 3.0.x
    on :all, in: :groups, limit: 3, wait: 5 do
      # Take all servers, in groups of three which execute in parallel
      # wait five seconds between groups of servers.
      # This is perfect for rolling restarts
    end

    on :all, in: :sequence, wait: 15 do
      # This takes all servers, in sequence and waits 15 seconds between
      # each server, this might be perfect if you are afraid about
      # overloading a shared resource, or want to defer the asset compilation
      # over your cluster owing to worries about load
    end

    on :all, in: :parallel do
      # This will simply try and execute the commands contained within
      # the block in parallel on all servers. This might be perfect for kicking
      # off something like a Git checkout or similar.
    end
{% endhighlight %}

The internal tasks, for standard deploy recipes make use of all of these as is
appropriate for the normal case, no need to be afraid of scary slow deploys
again!

#### Streaming IO

This IO streaming model means that results from commands, the commands
themselves and any other arbitrary output are sent as objects to a class with
an `IO`ish interface, the class knows what to do with these things.  There's a
*progress* formatter which prints dots for each command that is called, as
well as a *pretty* formatter which prints the full command, it's output on
standard out and standard error, as well as the final return status. It would
be trivial to implement HTML formatters, or formatters that reported to your
IRC room, or to email. I look forward to seeing more of these cropping up in
the community.

#### Host Definition Access

If you didn't skim over the *Parallism* section above, you might have noticed we
did something clever that wasn't possible in Capistrano v2; we accessed the
`host` inside the execution block.

For a lot of reasons in Capistrano v2 is wasn't possible to do this, the block
was essentially evaluated once and called verbatim on each host. This lead to
disappointing missing features such as not being able to pull the host list
out of Capistrano and examine the roles to do something like controlling Chef
solo, or similar.

In Capistrano v3 the `host` object is the same object that is created when a
server is defined, and is internally used, for example to pass to an ERB
template for rendering a last-deploy message that is dumped onto each server
after a successful deployment. The last deploy log includes everything
Capistrano knew about that server during the deployment.

> Users of Capistrano v2 may be familiar with the perenial `cap deploy:cleanup`
problem which came to light when servers differed in their old releases list,
imagine a scenario with two servers, one has been your bread-and-butter since
you launched, it has hundreds of old releases from all your wonderful deploys
over the months or years. The second server has been in the cluster for about
a month, it didn't quite slot-in cleanly, so the list of old releases looks a
bit weird, you deleted a few by hand, and anyway there might only be ten-or-so
releases there.

> Now imagine that you call `cap deploy:cleanup`, old `capture()`
implementations silently only ran on the first server that matched the
properties defined, so server one returned a list of ~95 old timestamped
release directories. Next Capistrano v2 would call `rm -rf
release1..release95` on **both** servers, causing server two to error out, and
leaving an undefined state on server one, as Capistrano would simply hang up
both connections.

This cleanup routine can now be better implemented as follows (which is
actually more or less the actual implementation in the the new Gem):

{% highlight ruby %}
    # Capistrano 3.0.x
    desc "Cleanup all old releases (keeps #{fetch(:releases_to_keep_on_cleanup)}
    old releases"
    task :cleanup do
      keep_releases     = fetch(:releases_to_keep_on_cleanup)
      releases          = capture(:ls, fetch(:releases_directory))
      releases_to_delete = releases.sort_by { |r| r.to_i }.slice(1..-(keep_releases + 1))
      releases_to_delete.each do |r|
        execute :rm, fetch(:releases_directory).join(r)
      end
    end
{% endhighlight %}

Some handy things to note here are that both server one and server two in our
contrived example will both evaluate that independently, and when both servers
are finished removing old releases the `task :cleanup` block will have
finished.

Also in Capistrano v3 most path variables are [`Pathname`] objects, so they natively
respond to things like `#basename`, `#expand_path`, `#join` and similar.

**Warning:** `#expand_path` probably won't do what you expect, it will execute
on your *workstation* machine, and not on the remote host, so it's possible
that it will return an error in the case of paths which exist remotely but not
locally.

#### Host Properties

As the `host` object is now available to the task blocks, it made sense to make
it possible to store arbitrarty values against them.

Enter `host.properties`. This is a simple
[*OpenStruct*](http://www.ruby-doc.org/stdlib-2.0/libdoc/ostruct/rdoc/OpenStruct.html)
which can be used to store any additional properties which are important for
your application.

An example of it's usage might be:

{% highlight ruby %}
    h = SSHKit::Host.new 'example.com'
    h.properties.roles ||= %i{wep app}
{% endhighlight %}

#### More Expressive Command Language

In Capistrano v2, it wasn't uncommon to find commands such as:

{% highlight ruby %}
    # Capistrano 2.0.x
    task :precompile, :roles => lambda { assets_role }, :except => { :no_release => true } do
      run <<-CMD.compact
        cd -- #{latest_release} &&
        RAILS_ENV=#{rails_env.to_s.shellescape} #{asset_env} #{rake} assets:precompile
      CMD
    end
{% endhighlight %}

In Capistrano v3 this looks more like this:

{% highlight ruby %}
    # Capistrano 3.0.x
    task :precompile do
      on :sprockets_asset_host, reject: lambda { |h| h.properties.no_release } do
        within fetch(:latest_release_directory) do
          with rails_env: fetch(:rails_env) do
            execute :rake, 'assets:precompile'
          end
        end
      end
    end
{% endhighlight %}

Again, with other examples this format is a little longer, but much more
expressive, and all the nightmare of shell escaping is handled internally for
you, environmental variables are capitalised and applied at the correct point
(i.e between the `cd` and `rake` calls in this case).

Other options here include `as :a_user` and

#### Better *magic* Variable Support

In Capistrano v2 there were certain bits of magic where if calling a variable
and `NoMethodError` would have been raised (for example the
`latest_release_directory` variable). This variable never existed on the
global namespace, as a fall-back the list of `set()` variables would be
consulted.

This magic led to times when people were not recognising that magic variables
were even being used. The magic variable system of Capistrano v2 did also
include a way to `fetch(:some_variable, 'with a default value')` in case the
variable might not be set already, but it wasn't widely used, and more often
than not people just used things like `latest_release_directory` never knowing
that behind the scenes an exception was raised, then rescued, and that
`:latest_release_directory` in the variable map was actually a continuation
that was evaluated the first time it was used, and the value then cached until
the end of the script.

The system has now 100% less magic. If you set a variable using `set()`, it
can be fetched with `fetch()`, if the value you set into the variable responds
to `#call` then it will be executed in the current context whenever it is
used, the values will not be cached, unless your continuation does some
explicit caching. *Again, we are favoring clarity over micro optimisation*.

#### SSHKit

Many of the new features in Capistrano which relate to logging, formatting,
SSH, connection management and pooling, parallelism, batch execution and more
are from a library that fell out of the Capistrano v3 development process.

[*SSHKit*](https://github.com/leehambley/sshkit) is a lower level toolkit, a level higher than *Net::SSH* still,
but lacking the roles, environments, rollbacks and other higher level features
from Capistrano.

SSHkit is ideal for use if you need to just connect to a machine and run some
arbitrary command, for example:

{% highlight ruby %}
    # Rakefile (even without Capistrano loaded)
    require 'sshkit'
    desc "Check the uptime of example.com"
    task :uptime do |h|
      execute :uptime
    end
{% endhighlight %}

There is much more than can be done with SSHKit, and we have quite an
extensive [list of
examples](https://github.com/leehambley/sshkit/blob/master/EXAMPLES.md). For
the most part with Capistrano v3, anything that happens inside of an `on()`
block is happening in SSHkit, and the documentation from that library is the
place to go to find more information.

#### Command Mapping

This is another feature from SSHKit, designed to remove a little ambiguity
from preceedings, there is a so-called command map for commands.

When executing something like:

{% highlight ruby %}
    # Capistrano 2.0.x
    execute "git clone ........ ......."
{% endhighlight %}

The command is passed through to the remote server *completely unchanged*.
This includes the options which might be set, such as user, directory, and
environmental variables. **This is by design.** This feature is designed to
allow people to write non-trivial commands in
[heredocs](https://en.wikipedia.org/wiki/Here_document) when the need arises,
for example:

{% highlight ruby %}
    # Capistrano 3.0.x
    execute <<-EOBLOCK
      # All of this block is interpreted as Bash script
      if ! [ -e /tmp/somefile ]
        then touch /tmp/somefile
        chmod 0644 /tmp/somefile
      fi
    EOBLOCK
{% endhighlight %}

**Caveat:** The SSHKit multiline command sanitizing logic will remove line feeds and add an `;` after each line to separate the commands. So make sure you are not putting a newline between `then` and the following command.

The idiomatic way to write that command in Capistrano v3 is to use the
separated variadaric method to specify the command:

{% highlight ruby %}
    # Capistrano 3.0.x
    execute :git, :clone, "........", "......."
{% endhighlight %}

... or for the larger example

{% highlight ruby %}
    # Capistrano 3.0.x
    file = '/tmp/somefile'
    unless test("-e #{file}")
      execute :touch, file
    end
{% endhighlight %}

In this way the *command map* is consulted, the command map maps all unknown
commands (which in this case is `git`, the rest of the line are *arguments* to
`git` ) are mapped to `/usr/bin/env ...`. Meaning that this command would be
expanded to `/usr/bin/env git clone ...... ......` which is what happens when
`git` is called without a full path, the `env` program is consulted (perhaps
indirectly) to determine which `git` to run.

Commands such as `rake` and `rails` are often better prefixed by `bundle
exec`, and in this case could be mapped to:

{% highlight ruby %}
    SSHKit.config.command_map[:rake]  = "bundle exec rake"
    SSHKit.config.command_map[:rails] = "bundle exec rails"
{% endhighlight %}

There can also be a `lambda` or `Proc` applied in place of the mapping like so:

{% highlight ruby %}
    SSHKit.config.command_map = Hash.new do |hash, key|
      if %i{rails rake bundle clockwork heroku}.include?(key.to_sym)
        hash[key] = "/usr/bin/env bundle exec #{key}"
      else
        hash[key] = "/usr/bin/env #{key}"
      end
    end
{% endhighlight %}

Between these two options there should be quite powerful options to map
commands in your environment without having to override internal tasks from
Capistrano just because a path is different, or a binary has a different name.

This can also be *slightly* abused in environments where *shim* executables
are used, for example `rbenv` *wrappers*:

{% highlight ruby %}
    SSHKit.config.command_map = Hash.new do |hash, key|
      if %i{rails rake bundle clockwork heroku}.include?(key.to_sym)
        hash[key] = "/usr/bin/env myproject_bundle exec myproject_#{key}"
      else
        hash[key] = "/usr/bin/env #{key}"
      end
    end
{% endhighlight %}

The above assumes that you have done something like `rbenv wrapper default
myproject` which creates wrapper binaries which correctly set up the Ruby
environment without requiring an interactive login shell.

#### Testing

The old test suite for Capistrano was purely unit tests, and didn't cover a
wide variety of problem cases, specifically nothing in the `deploy.rb` (that is
the actual *deployment* code) was tested at all; because of having our own DSL
implementation, and other slightly odd design points, it was painful to test
the actual *recipes*.

Testing has been a focus of Capistrano v3. The *integration* test suite uses
Vagrant to boot a machine, configures certain scenarios using portable shell
script, and then executes commands against them, deploying common
configurations to typical Linux systems. This is slow to execute, but offers
stronger guarantees that nothing is broken that we've ever been able to give
before.

Capistrano v3 also offers a possibility to swap out backend implementations.
This is interesting because for the purpose of testing your *own* recipes you
can use a *printer* backend, and verify that the output matched what you
expected, or use a stubbed backend upon which you can verify that calls were
made, or not made as expected.

#### Arbitrary Logging

Capistrano exposes the methods `debug()`, `info()`, `warn()`, `error()` and
`fatal()` inside of `on()` blocks which can be used to log using the existing
logging infrastructure and streaming IO formatters:

{% highlight ruby %}
    # Capistrano 3.0.x
    on hosts do |host|
      f = '/some/file'
      if test("[ -d #{f} ]")
        execute :touch, f
      else
        info "#{f} already exists on #{host}!"
      end
    end
{% endhighlight %}

### Upgrading

The best place to go here is the [upgrading documentation](/documentation/upgrading/) to get deeper
into the specifics.

The simple version is to say that there is *no **direct** upgrade path*,
versions two and three are incompatible.

This is partly by design, the old DSL was imprecise in places that would have
made doing the right thing in most cases tricky, we opted to invest in more
features and better reliability than investing in keeping a backwards
compatible API.

There are a number of *gotchas* listed below, but the main points are the new
names of the built-in roles, as well as that by default Capistrano v3 is
platform agnostic, if you need Rails support, for migrations, asset pipeline
and such like, then it's required to `require` the support files.

### Gotchas

#### Rake DSL Is Additive

In Capistrano v2 if you re-define a task then it replaces the original
implementation, this has been used by people to replace internal tasks
piecemeal with their own implementations

#### `sudo` Behaviour


================================================
FILE: docs/assets/browserconfig.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
    <msapplication>
        <tile>
            <square150x150logo src="mstile-150x150.png"/>
            <TileColor>#1c1b39</TileColor>
        </tile>
    </msapplication>
</browserconfig>


================================================
FILE: docs/assets/css/capistrano.css
================================================
body {
  font-family: "proxima-nova",sans-serif;
}

#carbonads img {
  float: left;
  margin-right: 1em;
}

#carbonads .carbon-text {
  display: block;
  font-size: 0.9em;
  color: silver;
}

#carbonads .carbon-poweredby {
  font-size: 0.75em;
  display: block;
  color: silver
}

.header {
  margin-bottom: 30px;
  padding-top: 20px;
  background-color: #1C1B39;
  min-height: 170px;
}

h1, h2, h3, h4, h5, h6 {
  font-weight: 400;
  font-family: 'Enriqueta', serif;
}

.highlighter-rouge {
  margin-bottom: 1.25em;
}

.alert-box {
  font-weight: normal;
  color: black;

  background-color: #d7ecfa;
  border: none;
  padding-left: 20px;
}

.alert-box.alert {
  background-color: #f7e4e1;
  color: black;
}

.alert-box.success {
  background-color: #e1faea;
  color: black;
}

.alert-box.secondary {
  background-color: #eaeaea;
  color: black;
}

/*p code, li code {
  padding: 3px;
  background-color: #E6E6E6;
	font-family: "droid-sans-mono", Consolas, Monaco, 'Andale Mono', monospace;
  font-size: 0.9em;
  color: #222;
  border-radius: 3px;
}*/

footer {
  padding: 1em;
  background-color: #222;
  color: #fff;
}

footer a, footer a:hover {
  color: #fff;
}


footer ul.social.icons {
  list-style-type: none;
}

li {
  margin-left: 2em;
}

footer ul.social.icons li.foundicon {
  float: left;
  margin-left: 10px;
  font-size: 5em;
}

footer ul.social.icons li.thanks-dnsimple {
  clear: left;
}

.github-widget {
  margin-bottom: 1em;
}

.github-box .github-box-download {
  height: 44px !important;
}

/*pre code {
  color: #fff;
}*/


================================================
FILE: docs/assets/css/dreamweaver.css
================================================
/**
 * Dreamweaver theme
 *
 * @author Sean Coker
 * @url http://seancoker.com
 * @version 1.0
 */

pre {
    /* original is white background with no border */
    background-color: #fff;
    word-wrap: break-word;
    margin: 0;
    padding: 10px;
    color: #000;
    font-size: 13px;
    line-height: 16px;
    margin-bottom: 20px
}

pre, code {
    font-family: monospace;
}

pre .comment {
    color: #888;
}

pre .support {
    color: #cd57d5;
}

pre .constant.numeric, pre .php.embedded {
    color: #fa0002;
    font-weight: bold;
}

pre .keyword, pre .constant.language {
    color: #000789;
    font-weight: bold;
}

pre .selector, pre .support.property, pre .entity.name.function {
    color: #000;
}

pre .storage.function, pre .variable.self, pre .support.function, pre .constant.language {
    color: #000;
    font-weight: bold;
}

pre .string {
    color: #0d43fa;
    font-weight: normal;
}

pre .css-property + span, pre .keyword.unit, pre .support.css-value {
    color: #0d43fa !important;
    font-weight: normal !important;
}

pre .entity.tag.style + .string, pre .php.embedded .constant.language, pre .php.embedded .keyword {
    color: #37a348 !important;
}

pre .support.method {
    color: #2bd5bb;
}

pre .entity.name {
    color: #fd74e0;
}

pre .support.css-property, pre .support.tag-name, pre .support.tag, pre .support.attribute, pre .support.attribute + .operator {
    color: #000789;
}

pre .storage.module, pre .storage.class {
    color: #122573;
    font-weight: bold;
}

pre .css.embedded .support.tag, pre .css.embedded .style.tag {
    color: #cd57d5;
}

pre .keyword.operator {
    color: #2852eb;
    font-weight: normal;
}

pre .php.embedded .variable, pre .php.embedded .storage.function {
     color: #0d43fa;
     font-weight: normal;
}

pre .php.embedded .string, pre .js.embedded .tag.script {
     color: #c4001e;
}

pre .php.embedded .comment {
     color: #f4b441;
     font-weight: normal;
}

pre .php.embedded .function.name {
     color: #000;
     font-weight: normal;
}


================================================
FILE: docs/assets/css/foundation.css
================================================
*,
*:before,
*:after {
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  box-sizing: border-box; }

html,
body {
  font-size: 100%; }

body {
  background: white;
  color: #1c1b39;
  padding: 0;
  margin: 0;
  font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif;
  font-weight: normal;
  font-style: normal;
  line-height: 1;
  position: relative;
  cursor: default; }

a:hover {
  cursor: pointer; }

a:focus {
  outline: none; }

img,
object,
embed {
  max-width: 100%;
  height: auto; }

object,
embed {
  height: 100%; }

img {
  -ms-interpolation-mode: bicubic; }

#map_canvas img,
#map_canvas embed,
#map_canvas object,
.map_canvas img,
.map_canvas embed,
.map_canvas object {
  max-width: none !important; }

.left {
  float: left !important; }

.right {
  float: right !important; }

.text-left {
  text-align: left !important; }

.text-right {
  text-align: right !important; }

.text-center {
  text-align: center !important; }

.text-justify {
  text-align: justify !important; }

.hide {
  display: none; }

.antialiased {
  -webkit-font-smoothing: antialiased; }

img {
  display: inline-block;
  vertical-align: middle; }

textarea {
  height: auto;
  min-height: 50px; }

select {
  width: 100%; }

/* Grid HTML Classes */
.row {
  width: 100%;
  margin-left: auto;
  margin-right: auto;
  margin-top: 0;
  margin-bottom: 0;
  max-width: 62.5em;
  *zoom: 1; }
  .row:before, .row:after {
    content: " ";
    display: table; }
  .row:after {
    clear: both; }
  .row.collapse .column,
  .row.collapse .columns {
    position: relative;
    padding-left: 0;
    padding-right: 0;
    float: left; }
  .row .row {
    width: auto;
    margin-left: -0.9375em;
    margin-right: -0.9375em;
    margin-top: 0;
    margin-bottom: 0;
    max-width: none;
    *zoom: 1; }
    .row .row:before, .row .row:after {
      content: " ";
      display: table; }
    .row .row:after {
      clear: both; }
    .row .row.collapse {
      width: auto;
      margin: 0;
      max-width: none;
      *zoom: 1; }
      .row .row.collapse:before, .row .row.collapse:after {
        content: " ";
        display: table; }
      .row .row.collapse:after {
        clear: both; }

.column,
.columns {
  position: relative;
  padding-left: 0.9375em;
  padding-right: 0.9375em;
  width: 100%;
  float: left; }

@media only screen {
  .column,
  .columns {
    position: relative;
    padding-left: 0.9375em;
    padding-right: 0.9375em;
    float: left; }

  .small-1 {
    position: relative;
    width: 8.33333%; }

  .small-2 {
    position: relative;
    width: 16.66667%; }

  .small-3 {
    position: relative;
    width: 25%; }

  .small-4 {
    position: relative;
    width: 33.33333%; }

  .small-5 {
    position: relative;
    width: 41.66667%; }

  .small-6 {
    position: relative;
    width: 50%; }

  .small-7 {
    position: relative;
    width: 58.33333%; }

  .small-8 {
    position: relative;
    width: 66.66667%; }

  .small-9 {
    position: relative;
    width: 75%; }

  .small-10 {
    position: relative;
    width: 83.33333%; }

  .small-11 {
    position: relative;
    width: 91.66667%; }

  .small-12 {
    position: relative;
    width: 100%; }

  .small-offset-0 {
    position: relative;
    margin-left: 0%; }

  .small-offset-1 {
    position: relative;
    margin-left: 8.33333%; }

  .small-offset-2 {
    position: relative;
    margin-left: 16.66667%; }

  .small-offset-3 {
    position: relative;
    margin-left: 25%; }

  .small-offset-4 {
    position: relative;
    margin-left: 33.33333%; }

  .small-offset-5 {
    position: relative;
    margin-left: 41.66667%; }

  .small-offset-6 {
    position: relative;
    margin-left: 50%; }

  .small-offset-7 {
    position: relative;
    margin-left: 58.33333%; }

  .small-offset-8 {
    position: relative;
    margin-left: 66.66667%; }

  .small-offset-9 {
    position: relative;
    margin-left: 75%; }

  .small-offset-10 {
    position: relative;
    margin-left: 83.33333%; }

  [class*="column"] + [class*="column"]:last-child {
    float: right; }

  [class*="column"] + [class*="column"].end {
    float: left; }

  .column.small-centered,
  .columns.small-centered {
    position: relative;
    margin-left: auto;
    margin-right: auto;
    float: none !important; } }
/* Styles for screens that are atleast 768px; */
@media only screen and (min-width: 768px) {
  .large-1 {
    position: relative;
    width: 8.33333%; }

  .large-2 {
    position: relative;
    width: 16.66667%; }

  .large-3 {
    position: relative;
    width: 25%; }

  .large-4 {
    position: relative;
    width: 33.33333%; }

  .large-5 {
    position: relative;
    width: 41.66667%; }

  .large-6 {
    position: relative;
    width: 50%; }

  .large-7 {
    position: relative;
    width: 58.33333%; }

  .large-8 {
    position: relative;
    width: 66.66667%; }

  .large-9 {
    position: relative;
    width: 75%; }

  .large-10 {
    position: relative;
    width: 83.33333%; }

  .large-11 {
    position: relative;
    width: 91.66667%; }

  .large-12 {
    position: relative;
    width: 100%; }

  .row .large-offset-0 {
    position: relative;
    margin-left: 0%; }

  .row .large-offset-1 {
    position: relative;
    margin-left: 8.33333%; }

  .row .large-offset-2 {
    position: relative;
    margin-left: 16.66667%; }

  .row .large-offset-3 {
    position: relative;
    margin-left: 25%; }

  .row .large-offset-4 {
    position: relative;
    margin-left: 33.33333%; }

  .row .large-offset-5 {
    position: relative;
    margin-left: 41.66667%; }

  .row .large-offset-6 {
    position: relative;
    margin-left: 50%; }

  .row .large-offset-7 {
    position: relative;
    margin-left: 58.33333%; }

  .row .large-offset-8 {
    position: relative;
    margin-left: 66.66667%; }

  .row .large-offset-9 {
    position: relative;
    margin-left: 75%; }

  .row .large-offset-10 {
    position: relative;
    margin-left: 83.33333%; }

  .row .large-offset-11 {
    position: relative;
    margin-left: 91.66667%; }

  .push-1 {
    position: relative;
    left: 8.33333%;
    right: auto; }

  .pull-1 {
    position: relative;
    right: 8.33333%;
    left: auto; }

  .push-2 {
    position: relative;
    left: 16.66667%;
    right: auto; }

  .pull-2 {
    position: relative;
    right: 16.66667%;
    left: auto; }

  .push-3 {
    position: relative;
    left: 25%;
    right: auto; }

  .pull-3 {
    position: relative;
    right: 25%;
    left: auto; }

  .push-4 {
    position: relative;
    left: 33.33333%;
    right: auto; }

  .pull-4 {
    position: relative;
    right: 33.33333%;
    left: auto; }

  .push-5 {
    position: relative;
    left: 41.66667%;
    right: auto; }

  .pull-5 {
    position: relative;
    right: 41.66667%;
    left: auto; }

  .push-6 {
    position: relative;
    left: 50%;
    right: auto; }

  .pull-6 {
    position: relative;
    right: 50%;
    left: auto; }

  .push-7 {
    position: relative;
    left: 58.33333%;
    right: auto; }

  .pull-7 {
    position: relative;
    right: 58.33333%;
    left: auto; }

  .push-8 {
    position: relative;
    left: 66.66667%;
    right: auto; }

  .pull-8 {
    position: relative;
    right: 66.66667%;
    left: auto; }

  .push-9 {
    position: relative;
    left: 75%;
    right: auto; }

  .pull-9 {
    position: relative;
    right: 75%;
    left: auto; }

  .push-10 {
    position: relative;
    left: 83.33333%;
    right: auto; }

  .pull-10 {
    position: relative;
    right: 83.33333%;
    left: auto; }

  .push-11 {
    position: relative;
    left: 91.66667%;
    right: auto; }

  .pull-11 {
    position: relative;
    right: 91.66667%;
    left: auto; }

  .column.large-centered,
  .columns.large-centered {
    position: relative;
    margin-left: auto;
    margin-right: auto;
    float: none !important; }

  .column.large-uncentered,
  .columns.large-uncentered {
    margin-left: 0;
    margin-right: 0;
    float: left !important; }

  .column.large-uncentered.opposite,
  .columns.large-uncentered.opposite {
    float: right !important; } }
/* Foundation Visibility HTML Classes */
.show-for-small,
.show-for-medium-down,
.show-for-large-down {
  display: inherit !important; }

.show-for-medium,
.show-for-medium-up,
.show-for-large,
.show-for-large-up,
.show-for-xlarge {
  display: none !important; }

.hide-for-medium,
.hide-for-medium-up,
.hide-for-large,
.hide-for-large-up,
.hide-for-xlarge {
  display: inherit !important; }

.hide-for-small,
.hide-for-medium-down,
.hide-for-large-down {
  display: none !important; }

/* Specific visilbity for tables */
table.show-for-small, table.show-for-medium-down, table.show-for-large-down, table.hide-for-medium, table.hide-for-medium-up, table.hide-for-large, table.hide-for-large-up, table.hide-for-xlarge {
  display: table; }

thead.show-for-small, thead.show-for-medium-down, thead.show-for-large-down, thead.hide-for-medium, thead.hide-for-medium-up, thead.hide-for-large, thead.hide-for-large-up, thead.hide-for-xlarge {
  display: table-header-group !important; }

tbody.show-for-small, tbody.show-for-medium-down, tbody.show-for-large-down, tbody.hide-for-medium, tbody.hide-for-medium-up, tbody.hide-for-large, tbody.hide-for-large-up, tbody.hide-for-xlarge {
  display: table-row-group !important; }

tr.show-for-small, tr.show-for-medium-down, tr.show-for-large-down, tr.hide-for-medium, tr.hide-for-medium-up, tr.hide-for-large, tr.hide-for-large-up, tr.hide-for-xlarge {
  display: table-row !important; }

td.show-for-small, td.show-for-medium-down, td.show-for-large-down, td.hide-for-medium, td.hide-for-medium-up, td.hide-for-large, td.hide-for-large-up, td.hide-for-xlarge,
th.show-for-small,
th.show-for-medium-down,
th.show-for-large-down,
th.hide-for-medium,
th.hide-for-medium-up,
th.hide-for-large,
th.hide-for-large-up,
th.hide-for-xlarge {
  display: table-cell !important; }

/* Medium Displays: 768px - 1279px */
@media only screen and (min-width: 768px) {
  .show-for-medium,
  .show-for-medium-up {
    display: inherit !important; }

  .show-for-small {
    display: none !important; }

  .hide-for-small {
    display: inherit !important; }

  .hide-for-medium,
  .hide-for-medium-up {
    display: none !important; }

  /* Specific visilbity for tables */
  table.show-for-medium, table.show-for-medium-up, table.hide-for-small {
    display: table; }

  thead.show-for-medium, thead.show-for-medium-up, thead.hide-for-small {
    display: table-header-group !important; }

  tbody.show-for-medium, tbody.show-for-medium-up, tbody.hide-for-small {
    display: table-row-group !important; }

  tr.show-for-medium, tr.show-for-medium-up, tr.hide-for-small {
    display: table-row !important; }

  td.show-for-medium, td.show-for-medium-up, td.hide-for-small,
  th.show-for-medium,
  th.show-for-medium-up,
  th.hide-for-small {
    display: table-cell !important; } }
/* Large Displays: 1280px - 1440px */
@media only screen and (min-width: 1280px) {
  .show-for-large,
  .show-for-large-up {
    display: inherit !important; }

  .show-for-medium,
  .show-for-medium-down {
    display: none !important; }

  .hide-for-medium,
  .hide-for-medium-down {
    display: inherit !important; }

  .hide-for-large,
  .hide-for-large-up {
    display: none !important; }

  /* Specific visilbity for tables */
  table.show-for-large, table.show-for-large-up, table.hide-for-medium, table.hide-for-medium-down {
    display: table; }

  thead.show-for-large, thead.show-for-large-up, thead.hide-for-medium, thead.hide-for-medium-down {
    display: table-header-group !important; }

  tbody.show-for-large, tbody.show-for-large-up, tbody.hide-for-medium, tbody.hide-for-medium-down {
    display: table-row-group !important; }

  tr.show-for-large, tr.show-for-large-up, tr.hide-for-medium, tr.hide-for-medium-down {
    display: table-row !important; }

  td.show-for-large, td.show-for-large-up, td.hide-for-medium, td.hide-for-medium-down,
  th.show-for-large,
  th.show-for-large-up,
  th.hide-for-medium,
  th.hide-for-medium-down {
    display: table-cell !important; } }
/* X-Large Displays: 1400px and up */
@media only screen and (min-width: 1440px) {
  .show-for-xlarge {
    display: inherit !important; }

  .show-for-large,
  .show-for-large-down {
    display: none !important; }

  .hide-for-large,
  .hide-for-large-down {
    display: inherit !important; }

  .hide-for-xlarge {
    display: none !important; }

  /* Specific visilbity for tables */
  table.show-for-xlarge, table.hide-for-large, table.hide-for-large-down {
    display: table; }

  thead.show-for-xlarge, thead.hide-for-large, thead.hide-for-large-down {
    display: table-header-group !important; }

  tbody.show-for-xlarge, tbody.hide-for-large, tbody.hide-for-large-down {
    display: table-row-group !important; }

  tr.show-for-xlarge, tr.hide-for-large, tr.hide-for-large-down {
    display: table-row !important; }

  td.show-for-xlarge, td.hide-for-large, td.hide-for-large-down,
  th.show-for-xlarge,
  th.hide-for-large,
  th.hide-for-large-down {
    display: table-cell !important; } }
/* Orientation targeting */
.show-for-landscape,
.hide-for-portrait {
  display: inherit !important; }

.hide-for-landscape,
.show-for-portrait {
  display: none !important; }

/* Specific visilbity for tables */
table.hide-for-landscape, table.show-for-portrait {
  display: table; }

thead.hide-for-landscape, thead.show-for-portrait {
  display: table-header-group !important; }

tbody.hide-for-landscape, tbody.show-for-portrait {
  display: table-row-group !important; }

tr.hide-for-landscape, tr.show-for-portrait {
  display: table-row !important; }

td.hide-for-landscape, td.show-for-portrait,
th.hide-for-landscape,
th.show-for-portrait {
  display: table-cell !important; }

@media only screen and (orientation: landscape) {
  .show-for-landscape,
  .hide-for-portrait {
    display: inherit !important; }

  .hide-for-landscape,
  .show-for-portrait {
    display: none !important; }

  /* Specific visilbity for tables */
  table.show-for-landscape, table.hide-for-portrait {
    display: table; }

  thead.show-for-landscape, thead.hide-for-portrait {
    display: table-header-group !important; }

  tbody.show-for-landscape, tbody.hide-for-portrait {
    display: table-row-group !important; }

  tr.show-for-landscape, tr.hide-for-portrait {
    display: table-row !important; }

  td.show-for-landscape, td.hide-for-portrait,
  th.show-for-landscape,
  th.hide-for-portrait {
    display: table-cell !important; } }
@media only screen and (orientation: portrait) {
  .show-for-portrait,
  .hide-for-landscape {
    display: inherit !important; }

  .hide-for-portrait,
  .show-for-landscape {
    display: none !important; }

  /* Specific visilbity for tables */
  table.show-for-portrait, table.hide-for-landscape {
    display: table; }

  thead.show-for-portrait, thead.hide-for-landscape {
    display: table-header-group !important; }

  tbody.show-for-portrait, tbody.hide-for-landscape {
    display: table-row-group !important; }

  tr.show-for-portrait, tr.hide-for-landscape {
    display: table-row !important; }

  td.show-for-portrait, td.hide-for-landscape,
  th.show-for-portrait,
  th.hide-for-landscape {
    display: table-cell !important; } }
/* Touch-enabled device targeting */
.show-for-touch {
  display: none !important; }

.hide-for-touch {
  display: inherit !important; }

.touch .show-for-touch {
  display: inherit !important; }

.touch .hide-for-touch {
  display: none !important; }

/* Specific visilbity for tables */
table.hide-for-touch {
  display: table; }

.touch table.show-for-touch {
  display: table; }

thead.hide-for-touch {
  display: table-header-group !important; }

.touch thead.show-for-touch {
  display: table-header-group !important; }

tbody.hide-for-touch {
  display: table-row-group !important; }

.touch tbody.show-for-touch {
  display: table-row-group !important; }

tr.hide-for-touch {
  display: table-row !important; }

.touch tr.show-for-touch {
  display: table-row !important; }

td.hide-for-touch {
  display: table-cell !important; }

.touch td.show-for-touch {
  display: table-cell !important; }

th.hide-for-touch {
  display: table-cell !important; }

.touch th.show-for-touch {
  display: table-cell !important; }

/* Foundation Block Grids for below small breakpoint */
@media only screen {
  [class*="block-grid-"] {
    display: block;
    padding: 0;
    margin: 0 -0.625em;
    *zoom: 1; }
    [class*="block-grid-"]:before, [class*="block-grid-"]:after {
      content: " ";
      display: table; }
    [class*="block-grid-"]:after {
      clear: both; }
    [class*="block-grid-"] > li {
      display: inline;
      height: auto;
      float: left;
      padding: 0 0.625em 1.25em; }

  .small-block-grid-1 > li {
    width: 100%;
    padding: 0 0.625em 1.25em; }
    .small-block-grid-1 > li:nth-of-type(n) {
      clear: none; }
    .small-block-grid-1 > li:nth-of-type(1n+1) {
      clear: both; }

  .small-block-grid-2 > li {
    width: 50%;
    padding: 0 0.625em 1.25em; }
    .small-block-grid-2 > li:nth-of-type(n) {
      clear: none; }
    .small-block-grid-2 > li:nth-of-type(2n+1) {
      clear: both; }

  .small-block-grid-3 > li {
    width: 33.33333%;
    padding: 0 0.625em 1.25em; }
    .small-block-grid-3 > li:nth-of-type(n) {
      clear: none; }
    .small-block-grid-3 > li:nth-of-type(3n+1) {
      clear: both; }

  .small-block-grid-4 > li {
    width: 25%;
    padding: 0 0.625em 1.25em; }
    .small-block-grid-4 > li:nth-of-type(n) {
      clear: none; }
    .small-block-grid-4 > li:nth-of-type(4n+1) {
      clear: both; }

  .small-block-grid-5 > li {
    width: 20%;
    padding: 0 0.625em 1.25em; }
    .small-block-grid-5 > li:nth-of-type(n) {
      clear: none; }
    .small-block-grid-5 > li:nth-of-type(5n+1) {
      clear: both; }

  .small-block-grid-6 > li {
    width: 16.66667%;
    padding: 0 0.625em 1.25em; }
    .small-block-grid-6 > li:nth-of-type(n) {
      clear: none; }
    .small-block-grid-6 > li:nth-of-type(6n+1) {
      clear: both; }

  .small-block-grid-7 > li {
    width: 14.28571%;
    padding: 0 0.625em 1.25em; }
    .small-block-grid-7 > li:nth-of-type(n) {
      clear: none; }
    .small-block-grid-7 > li:nth-of-type(7n+1) {
      clear: both; }

  .small-block-grid-8 > li {
    width: 12.5%;
    padding: 0 0.625em 1.25em; }
    .small-block-grid-8 > li:nth-of-type(n) {
      clear: none; }
    .small-block-grid-8 > li:nth-of-type(8n+1) {
      clear: both; }

  .small-block-grid-9 > li {
    width: 11.11111%;
    padding: 0 0.625em 1.25em; }
    .small-block-grid-9 > li:nth-of-type(n) {
      clear: none; }
    .small-block-grid-9 > li:nth-of-type(9n+1) {
      clear: both; }

  .small-block-grid-10 > li {
    width: 10%;
    padding: 0 0.625em 1.25em; }
    .small-block-grid-10 > li:nth-of-type(n) {
      clear: none; }
    .small-block-grid-10 > li:nth-of-type(10n+1) {
      clear: both; }

  .small-block-grid-11 > li {
    width: 9.09091%;
    padding: 0 0.625em 1.25em; }
    .small-block-grid-11 > li:nth-of-type(n) {
      clear: none; }
    .small-block-grid-11 > li:nth-of-type(11n+1) {
      clear: both; }

  .small-block-grid-12 > li {
    width: 8.33333%;
    padding: 0 0.625em 1.25em; }
    .small-block-grid-12 > li:nth-of-type(n) {
      clear: none; }
    .small-block-grid-12 > li:nth-of-type(12n+1) {
      clear: both; } }
/* Foundation Block Grids for above small breakpoint */
@media only screen and (min-width: 768px) {
  /* Remove small grid clearing */
  .small-block-grid-1 > li:nth-of-type(1n+1) {
    clear: none; }

  .small-block-grid-2 > li:nth-of-type(2n+1) {
    clear: none; }

  .small-block-grid-3 > li:nth-of-type(3n+1) {
    clear: none; }

  .small-block-grid-4 > li:nth-of-type(4n+1) {
    clear: none; }

  .small-block-grid-5 > li:nth-of-type(5n+1) {
    clear: none; }

  .small-block-grid-6 > li:nth-of-type(6n+1) {
    clear: none; }

  .small-block-grid-7 > li:nth-of-type(7n+1) {
    clear: none; }

  .small-block-grid-8 > li:nth-of-type(8n+1) {
    clear: none; }

  .small-block-grid-9 > li:nth-of-type(9n+1) {
    clear: none; }

  .small-block-grid-10 > li:nth-of-type(10n+1) {
    clear: none; }

  .small-block-grid-11 > li:nth-of-type(11n+1) {
    clear: none; }

  .small-block-grid-12 > li:nth-of-type(12n+1) {
    clear: none; }

  .large-block-grid-1 > li {
    width: 100%;
    padding: 0 0.625em 1.25em; }
    .large-block-grid-1 > li:nth-of-type(n) {
      clear: none; }
    .large-block-grid-1 > li:nth-of-type(1n+1) {
      clear: both; }

  .large-block-grid-2 > li {
    width: 50%;
    padding: 0 0.625em 1.25em; }
    .large-block-grid-2 > li:nth-of-type(n) {
      clear: none; }
    .large-block-grid-2 > li:nth-of-type(2n+1) {
      clear: both; }

  .large-block-grid-3 > li {
    width: 33.33333%;
    padding: 0 0.625em 1.25em; }
    .large-block-grid-3 > li:nth-of-type(n) {
      clear: none; }
    .large-block-grid-3 > li:nth-of-type(3n+1) {
      clear: both; }

  .large-block-grid-4 > li {
    width: 25%;
    padding: 0 0.625em 1.25em; }
    .large-block-grid-4 > li:nth-of-type(n) {
      clear: none; }
    .large-block-grid-4 > li:nth-of-type(4n+1) {
      clear: both; }

  .large-block-grid-5 > li {
    width: 20%;
    padding: 0 0.625em 1.25em; }
    .large-block-grid-5 > li:nth-of-type(n) {
      clear: none; }
    .large-block-grid-5 > li:nth-of-type(5n+1) {
      clear: both; }

  .large-block-grid-6 > li {
    width: 16.66667%;
    padding: 0 0.625em 1.25em; }
    .large-block-grid-6 > li:nth-of-type(n) {
      clear: none; }
    .large-block-grid-6 > li:nth-of-type(6n+1) {
      clear: both; }

  .large-block-grid-7 > li {
    width: 14.28571%;
    padding: 0 0.625em 1.25em; }
    .large-block-grid-7 > li:nth-of-type(n) {
      clear: none; }
    .large-block-grid-7 > li:nth-of-type(7n+1) {
      clear: both; }

  .large-block-grid-8 > li {
    width: 12.5%;
    padding: 0 0.625em 1.25em; }
    .large-block-grid-8 > li:nth-of-type(n) {
      clear: none; }
    .large-block-grid-8 > li:nth-of-type(8n+1) {
      clear: both; }

  .large-block-grid-9 > li {
    width: 11.11111%;
    padding: 0 0.625em 1.25em; }
    .large-block-grid-9 > li:nth-of-type(n) {
      clear: none; }
    .large-block-grid-9 > li:nth-of-type(9n+1) {
      clear: both; }

  .large-block-grid-10 > li {
    width: 10%;
    padding: 0 0.625em 1.25em; }
    .large-block-grid-10 > li:nth-of-type(n) {
      clear: none; }
    .large-block-grid-10 > li:nth-of-type(10n+1) {
      clear: both; }

  .large-block-grid-11 > li {
    width: 9.09091%;
    padding: 0 0.625em 1.25em; }
    .large-block-grid-11 > li:nth-of-type(n) {
      clear: none; }
    .large-block-grid-11 > li:nth-of-type(11n+1) {
      clear: both; }

  .large-block-grid-12 > li {
    width: 8.33333%;
    padding: 0 0.625em 1.25em; }
    .large-block-grid-12 > li:nth-of-type(n) {
      clear: none; }
    .large-block-grid-12 > li:nth-of-type(12n+1) {
      clear: both; } }
p.lead {
  font-size: 1.21875em;
  line-height: 1.6; }

.subheader {
  line-height: 1.4;
  color: #8fa2cf;
  font-weight: 300;
  margin-top: 0.2em;
  margin-bottom: 0.5em; }

/* Typography resets */
div,
dl,
dt,
dd,
ul,
ol,
li,
h1,
h2,
h3,
h4,
h5,
h6,
pre,
form,
p,
blockquote,
th,
td {
  margin: 0;
  padding: 0;
  direction: ltr; }

/* Default Link Styles */
a {
  color: #2ba6cb;
  text-decoration: none;
  line-height: inherit; }
  a:hover, a:focus {
    color: #2795b6; }
  a img {
    border: none; }

/* Default paragraph styles */
p {
  font-family: inherit;
  font-weight: normal;
  font-size: 1em;
  line-height: 1.6;
  margin-bottom: 1.25em;
  text-rendering: optimizeLegibility; }
  p aside {
    font-size: 0.875em;
    line-height: 1.35;
    font-style: italic; }

/* Default header styles */
h1, h2, h3, h4, h5, h6 {
  font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif;
  font-weight: bold;
  font-style: normal;
  color: #3b528a;
  text-rendering: optimizeLegibility;
  margin-top: 0.2em;
  margin-bottom: 0.5em;
  line-height: 1.2125em; }
  h1 small, h2 small, h3 small, h4 small, h5 small, h6 small {
    font-size: 60%;
    color: #8fa2cf;
    line-height: 0; }

h1 {
  font-size: 2.125em; }

h2 {
  font-size: 1.6875em; }

h3 {
  font-size: 1.375em; }

h4 {
  font-size: 1.125em; }

h5 {
  font-size: 1.125em; }

h6 {
  font-size: 1em; }

hr {
  border: solid #dddddd;
  border-width: 1px 0 0;
  clear: both;
  margin: 1.25em 0 1.1875em;
  height: 0; }

/* Helpful Typography Defaults */
em,
i {
  font-style: italic;
  line-height: inherit; }

strong,
b {
  font-weight: bold;
  line-height: inherit; }

small {
  font-size: 60%;
  line-height: inherit; }

code {
  font-family: Consolas, "Liberation Mono", Courier, monospace;
  font-weight: bold;
  color: #7f0a0c; }

/* Lists */
ul,
ol,
dl {
  font-size: 1em;
  line-height: 1.6;
  margin-bottom: 1.25em;
  list-style-position: outside;
  font-family: inherit; }

ul, ol {
  margin-left: 0; }

/* Unordered Lists */
ul li ul,
ul li ol {
  margin-left: 1.25em;
  margin-bottom: 0;
  font-size: 1em;
  /* Override nested font-size change */ }
ul.square li ul, ul.circle li ul, ul.disc li ul {
  list-style: inherit; }
ul.square {
  list-style-type: square; }
ul.circle {
  list-style-type: circle; }
ul.disc {
  list-style-type: disc; }
ul.no-bullet {
  list-style: none; }

/* Ordered Lists */
ol li ul,
ol li ol {
  margin-left: 1.25em;
  margin-bottom: 0; }

/* Definition Lists */
dl dt {
  margin-bottom: 0.3em;
  font-weight: bold; }
dl dd {
  margin-bottom: 0.75em; }

/* Abbreviations */
abbr,
acronym {
  text-transform: uppercase;
  font-size: 90%;
  color: #1c1b39;
  border-bottom: 1px dotted #dddddd;
  cursor: help; }

abbr {
  text-transform: none; }

/* Blockquotes */
blockquote {
  margin: 0 0 1.25em;
  padding: 0.5625em 1.25em 0 1.1875em;
  border-left: 1px solid #dddddd; }
  blockquote cite {
    display: block;
    font-size: 0.8125em;
    color: #6b84c0; }
    blockquote cite:before {
      content: "\2014 \0020"; }
    blockquote cite a,
    blockquote cite a:visited {
      color: #6b84c0; }

blockquote,
blockquote p {
  line-height: 1.6;
  color: #8fa2cf; }

/* Microformats */
.vcard {
  display: inline-block;
  margin: 0 0 1.25em 0;
  border: 1px solid #dddddd;
  padding: 0.625em 0.75em; }
  .vcard li {
    margin: 0;
    display: block; }
  .vcard .fn {
    font-weight: bold;
    font-size: 0.9375em; }

.vevent .summary {
  font-weight: bold; }
.vevent abbr {
  cursor: default;
  text-decoration: none;
  font-weight: bold;
  border: none;
  padding: 0 0.0625em; }

@media only screen and (min-width: 768px) {
  h1, h2, h3, h4, h5, h6 {
    line-height: 1.4; }

  h1 {
    font-size: 2.75em; }

  h2 {
    font-size: 2.3125em; }

  h3 {
    font-size: 1.6875em; }

  h4 {
    font-size: 1.4375em; } }
/*
 * Print styles.
 *
 * Inlined to avoid required HTTP connection: www.phpied.com/delay-loading-your-print-css/
 * Credit to Paul Irish and HTML5 Boilerplate (html5boilerplate.com)
*/
.print-only {
  display: none !important; }

@media print {
  * {
    background: transparent !important;
    color: black !important;
    /* Black prints faster: h5bp.com/s */
    box-shadow: none !important;
    text-shadow: none !important; }

  a,
  a:visited {
    text-decoration: underline; }

  a[href]:after {
    content: " (" attr(href) ")"; }

  abbr[title]:after {
    content: " (" attr(title) ")"; }

  .ir a:after,
  a[href^="javascript:"]:after,
  a[href^="#"]:after {
    content: ""; }

  pre,
  blockquote {
    border: 1px solid #999999;
    page-break-inside: avoid; }

  thead {
    display: table-header-group;
    /* h5bp.com/t */ }

  tr,
  img {
    page-break-inside: avoid; }

  img {
    max-width: 100% !important; }

  @page {
    margin: 0.5cm; }

  p,
  h2,
  h3 {
    orphans: 3;
    widows: 3; }

  h2,
  h3 {
    page-break-after: avoid; }

  .hide-on-print {
    display: none !important; }

  .print-only {
    display: block !important; }

  .hide-for-print {
    display: none !important; }

  .show-for-print {
    display: inherit !important; } }
button, .button {
  border-style: solid;
  border-width: 1px;
  cursor: pointer;
  font-family: inherit;
  font-weight: bold;
  line-height: 1;
  margin: 0 0 1.25em;
  position: relative;
  text-decoration: none;
  text-align: center;
  display: inline-block;
  padding-top: 0.75em;
  padding-right: 1.5em;
  padding-bottom: 0.8125em;
  padding-left: 1.5em;
  font-size: 1em;
  background-color: #2ba6cb;
  border-color: #2284a1;
  color: white; }
  button:hover, button:focus, .button:hover, .button:focus {
    background-color: #2284a1; }
  button:hover, button:focus, .button:hover, .button:focus {
    color: white; }
  button.secondary, .button.secondary {
    background-color: #e9e9e9;
    border-color: #d0d0d0;
    color: #333333; }
    button.secondary:hover, button.secondary:focus, .button.secondary:hover, .button.secondary:focus {
      background-color: #d0d0d0; }
    button.secondary:hover, button.secondary:focus, .button.secondary:hover, .button.secondary:focus {
      color: #333333; }
  button.success, .button.success {
    background-color: #5da423;
    border-color: #457a1a;
    color: white; }
    button.success:hover, button.success:focus, .button.success:hover, .button.success:focus {
      background-color: #457a1a; }
    button.success:hover, button.success:focus, .button.success:hover, .button.success:focus {
      color: white; }
  button.alert, .button.alert {
    background-color: #c60f13;
    border-color: #970b0e;
    color: white; }
    button.alert:hover, button.alert:focus, .button.alert:hover, .button.alert:focus {
      background-color: #970b0e; }
    button.alert:hover, button.alert:focus, .button.alert:hover, .button.alert:focus {
      color: white; }
  button.large, .button.large {
    padding-top: 1em;
    padding-right: 2em;
    padding-bottom: 1.0625em;
    padding-left: 2em;
    font-size: 1.25em; }
  button.small, .button.small {
    padding-top: 0.5625em;
    padding-right: 1.125em;
    padding-bottom: 0.625em;
    padding-left: 1.125em;
    font-size: 0.8125em; }
  button.tiny, .button.tiny {
    padding-top: 0.4375em;
    padding-right: 0.875em;
    padding-bottom: 0.5em;
    padding-left: 0.875em;
    font-size: 0.6875em; }
  button.expand, .button.expand {
    padding-right: 0px;
    padding-left: 0px;
    width: 100%; }
  button.left-align, .button.left-align {
    text-align: left;
    text-indent: 0.75em; }
  button.right-align, .button.right-align {
    text-align: right;
    padding-right: 0.75em; }
  button.disabled, button[disabled], .button.disabled, .button[disabled] {
    background-color: #2ba6cb;
    border-color: #2284a1;
    color: white;
    cursor: default;
    opacity: 0.6;
    -webkit-box-shadow: none;
    box-shadow: none; }
    button.disabled:hover, button.disabled:focus, button[disabled]:hover, button[disabled]:focus, .button.disabled:hover, .button.disabled:focus, .button[disabled]:hover, .button[disabled]:focus {
      background-color: #2284a1; }
    button.disabled:hover, button.disabled:focus, button[disabled]:hover, button[disabled]:focus, .button.disabled:hover, .button.disabled:focus, .button[disabled]:hover, .button[disabled]:focus {
      color: white; }
    button.disabled:hover, button.disabled:focus, button[disabled]:hover, button[disabled]:focus, .button.disabled:hover, .button.disabled:focus, .button[disabled]:hover, .button[disabled]:focus {
      background-color: #2ba6cb; }
    button.disabled.secondary, button[disabled].secondary, .button.disabled.secondary, .button[disabled].secondary {
      background-color: #e9e9e9;
      border-color: #d0d0d0;
      color: #333333;
      cursor: default;
      opacity: 0.6;
      -webkit-box-shadow: none;
      box-shadow: none; }
      button.disabled.secondary:hover, button.disabled.secondary:focus, button[disabled].secondary:hover, button[disabled].secondary:focus, .button.disabled.secondary:hover, .button.disabled.secondary:focus, .button[disabled].secondary:hover, .button[disabled].secondary:focus {
        background-color: #d0d0d0; }
      button.disabled.secondary:hover, button.disabled.secondary:focus, button[disabled].secondary:hover, button[disabled].secondary:focus, .button.disabled.secondary:hover, .button.disabled.secondary:focus, .button[disabled].secondary:hover, .button[disabled].secondary:focus {
        color: #333333; }
      button.disabled.secondary:hover, button.disabled.secondary:focus, button[disabled].secondary:hover, button[disabled].secondary:focus, .button.disabled.secondary:hover, .button.disabled.secondary:focus, .button[disabled].secondary:hover, .button[disabled].secondary:focus {
        background-color: #e9e9e9; }
    button.disabled.success, button[disabled].success, .button.disabled.success, .button[disabled].success {
      background-color: #5da423;
      border-color: #457a1a;
      color: white;
      cursor: default;
      opacity: 0.6;
      -webkit-box-shadow: none;
      box-shadow: none; }
      button.disabled.success:hover, button.disabled.success:focus, button[disabled].success:hover, button[disabled].success:focus, .button.disabled.success:hover, .button.disabled.success:focus, .button[disabled].success:hover, .button[disabled].success:focus {
        background-color: #457a1a; }
      button.disabled.success:hover, button.disabled.success:focus, button[disabled].success:hover, button[disabled].success:focus, .button.disabled.success:hover, .button.disabled.success:focus, .button[disabled].success:hover, .button[disabled].success:focus {
        color: white; }
      button.disabled.success:hover, button.disabled.success:focus, button[disabled].success:hover, button[disabled].success:focus, .button.disabled.success:hover, .button.disabled.success:focus, .button[disabled].success:hover, .button[disabled].success:focus {
        background-color: #5da423; }
    button.disabled.alert, button[disabled].alert, .button.disabled.alert, .button[disabled].alert {
      background-color: #c60f13;
      border-color: #970b0e;
      color: white;
      cursor: default;
      opacity: 0.6;
      -webkit-box-shadow: none;
      box-shadow: none; }
      button.disabled.alert:hover, button.disabled.alert:focus, button[disabled].alert:hover, button[disabled].alert:focus, .button.disabled.alert:hover, .button.disabled.alert:focus, .button[disabled].alert:hover, .button[disabled].alert:focus {
        background-color: #970b0e; }
      button.disabled.alert:hover, button.disabled.alert:focus, button[disabled].alert:hover, button[disabled].alert:focus, .button.disabled.alert:hover, .button.disabled.alert:focus, .button[disabled].alert:hover, .button[disabled].alert:focus {
        color: white; }
      button.disabled.alert:hover, button.disabled.alert:focus, button[disabled].alert:hover, button[disabled].alert:focus, .button.disabled.alert:hover, .button.disabled.alert:focus, .button[disabled].alert:hover, .button[disabled].alert:focus {
        background-color: #c60f13; }

button, .button {
  padding-top: 0.8125em;
  padding-bottom: 0.75em;
  -webkit-appearance: none; }
  button.tiny, .button.tiny {
    padding-top: 0.5em;
    padding-bottom: 0.4375em;
    -webkit-appearance: none; }
  button.small, .button.small {
    padding-top: 0.625em;
    padding-bottom: 0.5625em;
    -webkit-appearance: none; }
  button.large, .button.large {
    padding-top: 1.03125em;
    padding-bottom: 1.03125em;
    -webkit-appearance: none; }

@media only screen {
  button, .button {
    -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) inset;
    box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) inset;
    -webkit-transition: background-color 300ms ease-out;
    -moz-transition: background-color 300ms ease-out;
    transition: background-color 300ms ease-out; }
    button:active, .button:active {
      -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2) inset;
      box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2) inset; }
    button.radius, .button.radius {
      -webkit-border-radius: 3px;
      border-radius: 3px; }
    button.round, .button.round {
      -webkit-border-radius: 1000px;
      border-radius: 1000px; } }
@media only screen and (min-width: 768px) {
  button, .button {
    display: inline-block; } }
/* Standard Forms */
form {
  margin: 0 0 1em; }

/* Using forms within rows, we need to set some defaults */
form .row .row {
  margin: 0 -0.5em; }
  form .row .row .column,
  form .row .row .columns {
    padding: 0 0.5em; }
  form .row .row.collapse {
    margin: 0; }
    form .row .row.collapse .column,
    form .row .row.collapse .columns {
      padding: 0; }
form .row input.column,
form .row input.columns,
form .row textarea.column,
form .row textarea.columns {
  padding-left: 0.5em; }

/* Label Styles */
label {
  font-size: 0.875em;
  color: #4d4d4d;
  cursor: pointer;
  display: block;
  font-weight: 500;
  margin-bottom: 0.1875em; }
  label.right {
    float: none;
    text-align: right; }
  label.inline {
    margin: 0 0 1em 0;
    padding: 0.625em 0; }

/* Attach elements to the beginning or end of an input */
.prefix,
.postfix {
  display: block;
  position: relative;
  z-index: 2;
  text-align: center;
  width: 100%;
  padding-top: 0;
  padding-bottom: 0;
  border-style: solid;
  border-width: 1px;
  overflow: hidden;
  font-size: 0.875em;
  height: 2.3125em;
  line-height: 2.3125em; }

/* Adjust padding, alignment and radius if pre/post element is a button */
.postfix.button {
  padding-left: 0;
  padding-right: 0;
  padding-top: 0;
  padding-bottom: 0;
  text-align: center;
  line-height: 2.125em; }

.prefix.button {
  padding-left: 0;
  padding-right: 0;
  padding-top: 0;
  padding-bottom: 0;
  text-align: center;
  line-height: 2.125em; }

.prefix.button.radius {
  -webkit-border-radius: 0;
  border-radius: 0;
  -moz-border-radius-bottomleft: 3px;
  -moz-border-radius-topleft: 3px;
  -webkit-border-bottom-left-radius: 3px;
  -webkit-border-top-left-radius: 3px;
  border-bottom-left-radius: 3px;
  border-top-left-radius: 3px; }

.postfix.button.radius {
  -webkit-border-radius: 0;
  border-radius: 0;
  -moz-border-radius-topright: 3px;
  -moz-border-radius-bottomright: 3px;
  -webkit-border-top-right-radius: 3px;
  -webkit-border-bottom-right-radius: 3px;
  border-top-right-radius: 3px;
  border-bottom-right-radius: 3px; }

.prefix.button.round {
  -webkit-border-radius: 0;
  border-radius: 0;
  -moz-border-radius-bottomleft: 1000px;
  -moz-border-radius-topleft: 1000px;
  -webkit-border-bottom-left-radius: 1000px;
  -webkit-border-top-left-radius: 1000px;
  border-bottom-left-radius: 1000px;
  border-top-left-radius: 1000px; }

.postfix.button.round {
  -webkit-border-radius: 0;
  border-radius: 0;
  -moz-border-radius-topright: 1000px;
  -moz-border-radius-bottomright: 1000px;
  -webkit-border-top-right-radius: 1000px;
  -webkit-border-bottom-right-radius: 1000px;
  border-top-right-radius: 1000px;
  border-bottom-right-radius: 1000px; }

/* Separate prefix and postfix styles when on span so buttons keep their own */
span.prefix {
  background: #f2f2f2;
  border-color: #d9d9d9;
  border-right: none;
  color: #333333; }
  span.prefix.radius {
    -webkit-border-radius: 0;
    border-radius: 0;
    -moz-border-radius-bottomleft: 3px;
    -moz-border-radius-topleft: 3px;
    -webkit-border-bottom-left-radius: 3px;
    -webkit-border-top-left-radius: 3px;
    border-bottom-left-radius: 3px;
    border-top-left-radius: 3px; }

span.postfix {
  background: #f2f2f2;
  border-color: #cccccc;
  border-left: none;
  color: #333333; }
  span.postfix.radius {
    -webkit-border-radius: 0;
    border-radius: 0;
    -moz-border-radius-topright: 3px;
    -moz-border-radius-bottomright: 3px;
    -webkit-border-top-right-radius: 3px;
    -webkit-border-bottom-right-radius: 3px;
    border-top-right-radius: 3px;
    border-bottom-right-radius: 3px; }

/* Input groups will automatically style first and last elements of the group */
.input-group.radius > *:first-child, .input-group.radius > *:first-child * {
  -moz-border-radius-bottomleft: 3px;
  -moz-border-radius-topleft: 3px;
  -webkit-border-bottom-left-radius: 3px;
  -webkit-border-top-left-radius: 3px;
  border-bottom-left-radius: 3px;
  border-top-left-radius: 3px; }
.input-group.radius > *:last-child, .input-group.radius > *:last-child * {
  -moz-border-radius-topright: 3px;
  -moz-border-radius-bottomright: 3px;
  -webkit-border-top-right-radius: 3px;
  -webkit-border-bottom-right-radius: 3px;
  border-top-right-radius: 3px;
  border-bottom-right-radius: 3px; }
.input-group.round > *:first-child, .input-group.round > *:first-child * {
  -moz-border-radius-bottomleft: 1000px;
  -moz-border-radius-topleft: 1000px;
  -webkit-border-bottom-left-radius: 1000px;
  -webkit-border-top-left-radius: 1000px;
  border-bottom-left-radius: 1000px;
  border-top-left-radius: 1000px; }
.input-group.round > *:last-child, .input-group.round > *:last-child * {
  -moz-border-radius-topright: 1000px;
  -moz-border-radius-bottomright: 1000px;
  -webkit-border-top-right-radius: 1000px;
  -webkit-border-bottom-right-radius: 1000px;
  border-top-right-radius: 1000px;
  border-bottom-right-radius: 1000px; }

/* We use this to get basic styling on all basic form elements */
input[type="text"],
input[type="password"],
input[type="date"],
input[type="datetime"],
input[type="datetime-local"],
input[type="month"],
input[type="week"],
input[type="email"],
input[type="number"],
input[type="search"],
input[type="tel"],
input[type="time"],
input[type="url"],
textarea {
  background-color: white;
  font-family: inherit;
  border: 1px solid #cccccc;
  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
  color: rgba(0, 0, 0, 0.75);
  display: block;
  font-size: 0.875em;
  margin: 0 0 1em 0;
  padding: 0.5em;
  height: 2.3125em;
  width: 100%;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
  -webkit-transition: -webkit-box-shadow 0.45s, border-color 0.45s ease-in-out;
  -moz-transition: -moz-box-shadow 0.45s, border-color 0.45s ease-in-out;
  transition: box-shadow 0.45s, border-color 0.45s ease-in-out; }
  input[type="text"]:focus,
  input[type="password"]:focus,
  input[type="date"]:focus,
  input[type="datetime"]:focus,
  input[type="datetime-local"]:focus,
  input[type="month"]:focus,
  input[type="week"]:focus,
  input[type="email"]:focus,
  input[type="number"]:focus,
  input[type="search"]:focus,
  input[type="tel"]:focus,
  input[type="time"]:focus,
  input[type="url"]:focus,
  textarea:focus {
    -webkit-box-shadow: 0 0 5px #999999;
    -moz-box-shadow: 0 0 5px #999999;
    box-shadow: 0 0 5px #999999;
    border-color: #999999; }
  input[type="text"]:focus,
  input[type="password"]:focus,
  input[type="date"]:focus,
  input[type="datetime"]:focus,
  input[type="datetime-local"]:focus,
  input[type="month"]:focus,
  input[type="week"]:focus,
  input[type="email"]:focus,
  input[type="number"]:focus,
  input[type="search"]:focus,
  input[type="tel"]:focus,
  input[type="time"]:focus,
  input[type="url"]:focus,
  textarea:focus {
    background: #fafafa;
    border-color: #999999;
    outline: none; }
  input[type="text"][disabled],
  input[type="password"][disabled],
  input[type="date"][disabled],
  input[type="datetime"][disabled],
  input[type="datetime-local"][disabled],
  input[type="month"][disabled],
  input[type="week"][disabled],
  input[type="email"][disabled],
  input[type="number"][disabled],
  input[type="search"][disabled],
  input[type="tel"][disabled],
  input[type="time"][disabled],
  input[type="url"][disabled],
  textarea[disabled] {
    background-color: #dddddd; }

/* Adjust margin for form elements below */
input[type="file"],
input[type="checkbox"],
input[type="radio"],
select {
  margin: 0 0 1em 0; }

/* Normalize file input width */
input[type="file"] {
  width: 100%; }

/* We add basic fieldset styling */
fieldset {
  border: solid 1px #dddddd;
  padding: 1.25em;
  margin: 1.125em 0; }
  fieldset legend {
    font-weight: bold;
    background: white;
    padding: 0 0.1875em;
    margin: 0;
    margin-left: -0.1875em; }

/* Error Handling */
.error input,
input.error,
.error textarea,
textarea.error {
  border-color: #c60f13;
  background-color: rgba(198, 15, 19, 0.1); }
  .error input:focus,
  input.error:focus,
  .error textarea:focus,
  textarea.error:focus {
    background: #fafafa;
    border-color: #999999; }

.error label,
label.error {
  color: #c60f13; }

.error small,
small.error {
  display: block;
  padding: 0.375em 0.25em;
  margin-top: -1.3125em;
  margin-bottom: 1em;
  font-size: 0.75em;
  font-weight: bold;
  background: #c60f13;
  color: white; }

/* Custom Checkbox and Radio Inputs */
form.custom .hidden-field {
  margin-left: -99999px;
  position: absolute;
  visibility: hidden; }
form.custom .custom {
  display: inline-block;
  width: 16px;
  height: 16px;
  position: relative;
  vertical-align: middle;
  border: solid 1px #cccccc;
  background: white; }
  form.custom .custom.checkbox {
    -webkit-border-radius: 0px;
    border-radius: 0px;
    padding: -1px; }
  form.custom .custom.radio {
    -webkit-border-radius: 1000px;
    border-radius: 1000px;
    padding: 3px; }
  form.custom .custom.checkbox:before {
    content: "";
    display: block;
    font-size: 16px;
    color: white; }
  form.custom .custom.radio.checked:before {
    content: "";
    display: block;
    width: 8px;
    height: 8px;
    -webkit-border-radius: 1000px;
    border-radius: 1000px;
    background: #222222;
    position: relative; }
  form.custom .custom.checkbox.checked:before {
    content: "\00d7";
    color: #222222;
    position: absolute;
    top: -50%;
    left: 50%;
    margin-top: 4px;
    margin-left: -5px; }

/* Custom Select Options and Dropdowns */
form.custom {
  /* Custom input, disabled */ }
  form.custom .custom.dropdown {
    display: block;
    position: relative;
    top: 0;
    height: 2.3125em;
    margin-bottom: 1.25em;
    margin-top: 0px;
    padding: 0px;
    width: 100%;
    background: white;
    background: -moz-linear-gradient(top, white 0%, #f3f3f3 100%);
    background: -webkit-linear-gradient(top, white 0%, #f3f3f3 100%);
    -webkit-box-shadow: none;
    background: linear-gradient(to bottom, white 0%, #f3f3f3 100%);
    box-shadow: none;
    font-size: 0.875em;
    vertical-align: top; }
    form.custom .custom.dropdown ul {
      overflow-y: auto;
      max-height: 200px; }
    form.custom .custom.dropdown .current {
      cursor: default;
      white-space: nowrap;
      line-height: 2.25em;
      color: rgba(0, 0, 0, 0.75);
      text-decoration: none;
      overflow: hidden;
      display: block;
      margin-left: 0.5em;
      margin-right: 2.3125em; }
    form.custom .custom.dropdown .selector {
      cursor: default;
      position: absolute;
      width: 2.5em;
      height: 2.3125em;
      display: block;
      right: 0;
      top: 0; }
      form.custom .custom.dropdown .selector:after {
        content: "";
        display: block;
        content: "";
        display: block;
        width: 0;
        height: 0;
        border: inset 5px;
        border-color: #aaaaaa transparent transparent transparent;
        border-top-style: solid;
        position: absolute;
        left: 0.9375em;
        top: 50%;
        margin-top: -3px; }
    form.custom .custom.dropdown:hover a.selector:after, form.custom .custom.dropdown.open a.selector:after {
      content: "";
      display: block;
      width: 0;
      height: 0;
      border: inset 5px;
      border-color: #222222 transparent transparent transparent;
      border-top-style: solid; }
    form.custom .custom.dropdown .disabled {
      color: #888888; }
      form.custom .custom.dropdown .disabled:hover {
        background: transparent;
        color: #888888; }
        form.custom .custom.dropdown .disabled:hover:after {
          display: none; }
    form.custom .custom.dropdown.open ul {
      display: block;
      z-index: 10;
      min-width: 100%;
      -moz-box-sizing: content-box;
      -webkit-box-sizing: content-box;
      box-sizing: content-box; }
    form.custom .custom.dropdown.small {
      max-width: 134px; }
    form.custom .custom.dropdown.medium {
      max-width: 254px; }
    form.custom .custom.dropdown.large {
      max-width: 434px; }
    form.custom .custom.dropdown.expand {
      width: 100% !important; }
    form.custom .custom.dropdown.open.small ul {
      min-width: 134px;
      -moz-box-sizing: border-box;
      -webkit-box-sizing: border-box;
      box-sizing: border-box; }
    form.custom .custom.dropdown.open.medium ul {
      min-width: 254px;
      -moz-box-sizing: border-box;
      -webkit-box-sizing: border-box;
      box-sizing: border-box; }
    form.custom .custom.dropdown.open.large ul {
      min-width: 434px;
      -moz-box-sizing: border-box;
      -webkit-box-sizing: border-box;
      box-sizing: border-box; }
  form.custom .custom.dropdown ul {
    position: absolute;
    width: auto;
    display: none;
    margin: 0;
    left: -1px;
    top: auto;
    -webkit-box-shadow: 0 2px 2px 0px rgba(0, 0, 0, 0.1);
    box-shadow: 0 2px 2px 0px rgba(0, 0, 0, 0.1);
    margin: 0;
    padding: 0;
    background: white;
    border: solid 1px #cccccc;
    font-size: 16px; }
    form.custom .custom.dropdown ul li {
      color: #555555;
      font-size: 0.875em;
      cursor: default;
      padding-top: 0.25em;
      padding-bottom: 0.25em;
      padding-left: 0.375em;
      padding-right: 2.375em;
      min-height: 1.5em;
      line-height: 1.5em;
      margin: 0;
      white-space: nowrap;
      list-style: none; }
      form.custom .custom.dropdown ul li.selected {
        background: #eeeeee;
        color: black; }
      form.custom .custom.dropdown ul li:hover {
        background-color: #e4e4e4;
        color: black; }
      form.custom .custom.dropdown ul li.selected:hover {
        background: #eeeeee;
        cursor: default;
        color: black; }
    form.custom .custom.dropdown ul.show {
      display: block; }
  form.custom .custom.disabled {
    background: #dddddd; }

/* Button Groups */
.button-group {
  list-style: none;
  margin: 0;
  *zoom: 1; }
  .button-group:before, .button-group:after {
    content: " ";
    display: table; }
  .button-group:after {
    clear: both; }
  .button-group > * {
    margin: 0 0 0 -1px;
    float: left; }
    .button-group > *:first-child {
      margin-left: 0; }
  .button-group.radius > *:first-child, .button-group.radius > *:first-child > a, .button-group.radius > *:first-child > button, .button-group.radius > *:first-child > .button {
    -moz-border-radius-bottomleft: 3px;
    -moz-border-radius-topleft: 3px;
    -webkit-border-bottom-left-radius: 3px;
    -webkit-border-top-left-radius: 3px;
    border-bottom-left-radius: 3px;
    border-top-left-radius: 3px; }
  .button-group.radius > *:last-child, .button-group.radius > *:last-child > a, .button-group.radius > *:last-child > button, .button-group.radius > *:last-child > .button {
    -moz-border-radius-topright: 3px;
    -moz-border-radius-bottomright: 3px;
    -webkit-border-top-right-radius: 3px;
    -webkit-border-bottom-right-radius: 3px;
    border-top-right-radius: 3px;
    border-bottom-right-radius: 3px; }
  .button-group.round > *:first-child, .button-group.round > *:first-child > a, .button-group.round > *:first-child > button, .button-group.round > *:first-child > .button {
    -moz-border-radius-bottomleft: 1000px;
    -moz-border-radius-topleft: 1000px;
    -webkit-border-bottom-left-radius: 1000px;
    -webkit-border-top-left-radius: 1000px;
    border-bottom-left-radius: 1000px;
    border-top-left-radius: 1000px; }
  .button-group.round > *:last-child, .button-group.round > *:last-child > a, .button-group.round > *:last-child > button, .button-group.round > *:last-child > .button {
    -moz-border-radius-topright: 1000px;
    -moz-border-radius-bottomright: 1000px;
    -webkit-border-top-right-radius: 1000px;
    -webkit-border-bottom-right-radius: 1000px;
    border-top-right-radius: 1000px;
    border-bottom-right-radius: 1000px; }
  .button-group.even-2 li {
    width: 50%; }
    .button-group.even-2 li button, .button-group.even-2 li .button {
      width: 100%; }
  .button-group.even-3 li {
    width: 33.33333%; }
    .button-group.even-3 li button, .button-group.even-3 li .button {
      width: 100%; }
  .button-group.even-4 li {
    width: 25%; }
    .button-group.even-4 li button, .button-group.even-4 li .button {
      width: 100%; }
  .button-group.even-5 li {
    width: 20%; }
    .button-group.even-5 li button, .button-group.even-5 li .button {
      width: 100%; }
  .button-group.even-6 li {
    width: 16.66667%; }
    .button-group.even-6 li button, .button-group.even-6 li .button {
      width: 100%; }
  .button-group.even-7 li {
    width: 14.28571%; }
    .button-group.even-7 li button, .button-group.even-7 li .button {
      width: 100%; }
  .button-group.even-8 li {
    width: 12.5%; }
    .button-group.even-8 li button, .button-group.even-8 li .button {
      width: 100%; }

.button-bar {
  *zoom: 1; }
  .button-bar:before, .button-bar:after {
    content: " ";
    display: table; }
  .button-bar:after {
    clear: both; }
  .button-bar .button-group {
    float: left;
    margin-right: 0.625em; }
    .button-bar .button-group div {
      overflow: hidden; }

/* Dropdown Button */
.dropdown.button {
  position: relative;
  padding-right: 3.1875em; }
  .dropdown.button:before {
    position: absolute;
    content: "";
    width: 0;
    height: 0;
    display: block;
    border-style: solid;
    border-color: white transparent transparent transparent;
    top: 50%; }
  .dropdown.button:before {
    border-width: 0.5625em;
    right: 1.5em;
    margin-top: -0.25em; }
  .dropdown.button:before {
    border-color: white transparent transparent transparent; }
  .dropdown.button.tiny {
    padding-right: 2.1875em; }
    .dropdown.button.tiny:before {
      border-width: 0.4375em;
      right: 0.875em;
      margin-top: -0.15625em; }
    .dropdown.button.tiny:before {
      border-color: white transparent transparent transparent; }
  .dropdown.button.small {
    padding-right: 2.8125em; }
    .dropdown.button.small:before {
      border-width: 0.5625em;
      right: 1.125em;
      margin-top: -0.21875em; }
    .dropdown.button.small:before {
      border-color: white transparent transparent transparent; }
  .dropdown.button.large {
    padding-right: 4em; }
    .dropdown.button.large:before {
      border-width: 0.625em;
      right: 1.75em;
      margin-top: -0.3125em; }
    .dropdown.button.large:before {
      border-color: white transparent transparent transparent; }
  .dropdown.button.secondary:before {
    border-color: #333333 transparent transparent transparent; }

/* Split Buttons */
.split.button {
  position: relative;
  padding-right: 4.8em; }
  .split.button span {
    display: block;
    height: 100%;
    position: absolute;
    right: 0;
    top: 0;
    border-left: solid 1px; }
    .split.button span:before {
      position: absolute;
      content: "";
      width: 0;
      height: 0;
      display: block;
      border-style: inset;
      left: 50%; }
    .split.button span:active {
      background-color: rgba(0, 0, 0, 0.1); }
  .split.button span {
    border-left-color: #1e728c; }
  .split.button span {
    width: 3em; }
    .split.button span:before {
      border-top-style: solid;
      border-width: 0.5625em;
      top: 1.125em;
      margin-left: -0.5625em; }
  .split.button span:before {
    border-color: white transparent transparent transparent; }
  .split.button.secondary span {
    border-left-color: #c3c3c3; }
  .split.button.secondary span:before {
    border-color: white transparent transparent transparent; }
  .split.button.alert span {
    border-left-color: #7f0a0c; }
  .split.button.success span {
    border-left-color: #396516; }
  .split.button.tiny {
    padding-right: 3.9375em; }
    .split.button.tiny span {
      width: 2.84375em; }
      .split.button.tiny span:before {
        border-top-style: solid;
        border-width: 0.4375em;
        top: 0.875em;
        margin-left: -0.3125em; }
  .split.button.small {
    padding-right: 3.9375em; }
    .split.button.small span {
      width: 2.8125em; }
      .split.button.small span:before {
        border-top-style: solid;
        border-width: 0.5625em;
        top: 0.84375em;
        margin-left: -0.5625em; }
  .split.button.large {
    padding-right: 6em; }
    .split.button.large span {
      width: 3.75em; }
      .split.button.large span:before {
        border-top-style: solid;
        border-width: 0.625em;
        top: 1.3125em;
        margin-left: -0.5625em; }
  .split.button.expand {
    padding-left: 2em; }
  .split.button.secondary span:before {
    border-color: #333333 transparent transparent transparent; }
  .split.button.radius span {
    -moz-border-radius-topright: 3px;
    -moz-border-radius-bottomright: 3px;
    -webkit-border-top-right-radius: 3px;
    -webkit-border-bottom-right-radius: 3px;
    border-top-right-radius: 3px;
    border-bottom-right-radius: 3px; }
  .split.button.round span {
    -moz-border-radius-topright: 1000px;
    -moz-border-radius-bottomright: 1000px;
    -webkit-border-top-right-radius: 1000px;
    -webkit-border-bottom-right-radius: 1000px;
    border-top-right-radius: 1000px;
    border-bottom-right-radius: 1000px; }

/* Flex Video */
.flex-video {
  position: relative;
  padding-top: 1.5625em;
  padding-bottom: 67.5%;
  height: 0;
  margin-bottom: 1em;
  overflow: hidden; }
  .flex-video.widescreen {
    padding-bottom: 57.25%; }
  .flex-video.vimeo {
    padding-top: 0; }
  .flex-video iframe,
  .flex-video object,
  .flex-video embed,
  .flex-video video {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%; }

/* Sections */
.section-container, .section-container.auto {
  width: 100%;
  display: block;
  margin-bottom: 1.25em;
  border: 1px solid #cccccc;
  border-top: none; }
  .section-container > section, .section-container > .section, .section-container.auto > section, .section-container.auto > .section {
    position: relative; }
    .section-container > section > .title, .section-container > .section > .title, .section-container.auto > section > .title, .section-container.auto > .section > .title {
      background-color: #efefef;
      cursor: pointer;
      margin-bottom: 0; }
      .section-container > section > .title a, .section-container > .section > .title a, .section-container.auto > section > .title a, .section-container.auto > .section > .title a {
        padding: 0.9375em;
        display: inline-block;
        color: #333333;
        font-size: 0.875em;
        white-space: nowrap; }
      .section-container > section > .title:hover, .section-container > .section > .title:hover, .section-container.auto > section > .title:hover, .section-container.auto > .section > .title:hover {
        background-color: #e2e2e2; }
    .section-container > section .content, .section-container > .section .content, .section-container.auto > section .content, .section-container.auto > .section .content {
      display: none;
      padding: 0.9375em;
      background-color: white; }
      .section-container > section .content > *:last-child, .section-container > .section .content > *:last-child, .section-container.auto > section .content > *:last-child, .section-container.auto > .section .content > *:last-child {
        margin-bottom: 0; }
      .section-container > section .content > *:first-child, .section-container > .section .content > *:first-child, .section-container.auto > section .content > *:first-child, .section-container.auto > .section .content > *:first-child {
        padding-top: 0; }
      .section-container > section .content > *:last-child:not(.flex-video), .section-container > .section .content > *:last-child:not(.flex-video), .section-container.auto > section .content > *:last-child:not(.flex-video), .section-container.auto > .section .content > *:last-child:not(.flex-video) {
        padding-bottom: 0; }
    .section-container > section.active > .content, .section-container > .section.active > .content, .section-container.auto > section.active > .content, .section-container.auto > .section.active > .content {
      display: block; }
    .section-container > section.active > .title, .section-container > .section.active > .title, .section-container.auto > section.active > .title, .section-container.auto > .section.active > .title {
      background: #d5d5d5; }
      .section-container > section.active > .title a, .section-container > .section.active > .title a, .section-container.auto > section.active > .title a, .section-container.auto > .section.active > .title a {
        color: #333333; }
    .section-container > section > .title, .section-container > .section > .title, .section-container.auto > section > .title, .section-container.auto > .section > .title {
      top: 0;
      width: 100%;
      margin: 0;
      border-top: solid 1px #cccccc; }
      .section-container > section > .title a, .section-container > .section > .title a, .section-container.auto > section > .title a, .section-container.auto > .section > .title a {
        width: 100%; }

.section-container.tabs {
  border: 0;
  position: relative; }
  .section-container.tabs > section, .section-container.tabs > .section {
    border: 0;
    position: static; }
    .section-container.tabs > section > .title, .section-container.tabs > .section > .title {
      background-color: #efefef;
      cursor: pointer;
      margin-bottom: 0; }
      .section-container.tabs > section > .title a, .section-container.tabs > .section > .title a {
        padding: 0.9375em;
        display: inline-block;
        color: #333333;
        font-size: 0.875em;
        white-space: nowrap; }
      .section-container.tabs > section > .title:hover, .section-container.tabs > .section > .title:hover {
        background-color: #e2e2e2; }
    .section-container.tabs > section .content, .section-container.tabs > .section .content {
      display: none;
      padding: 0.9375em;
      background-color: white; }
      .section-container.tabs > section .content > *:last-child, .section-container.tabs > .section .content > *:last-child {
        margin-bottom: 0; }
      .section-container.tabs > section .content > *:first-child, .section-container.tabs > .section .content > *:first-child {
        padding-top: 0; }
      .section-container.tabs > section .content > *:last-child:not(.flex-video), .section-container.tabs > .section .content > *:last-child:not(.flex-video) {
        padding-bottom: 0; }
    .section-container.tabs > section.active > .content, .section-container.tabs > .section.active > .content {
      display: block; }
    .section-container.tabs > section.active > .title, .section-container.tabs > .section.active > .title {
      background: white; }
      .section-container.tabs > section.active > .title a, .section-container.tabs > .section.active > .title a {
        color: #333333; }
    .section-container.tabs > section > .title, .section-container.tabs > .section > .title {
      width: auto;
      border: solid 1px #cccccc;
      border-right: 0;
      border-bottom: 0;
      position: absolute;
      top: 0;
      z-index: 1; }
      .section-container.tabs > section > .title a, .section-container.tabs > .section > .title a {
        width: 100%; }
    .section-container.tabs > section:last-child .title, .section-container.tabs > .section:last-child .title {
      border-right: solid 1px #cccccc; }
    .section-container.tabs > section .content, .section-container.tabs > .section .content {
      border: solid 1px #cccccc;
      position: absolute;
      z-index: 10;
      display: none;
      top: -1px; }
    .section-container.tabs > section.active > .title, .section-container.tabs > .section.active > .title {
      z-index: 11;
      border-bottom: 0;
      background-color: white; }
    .section-container.tabs > section.active > .content, .section-container.tabs > .section.active > .content {
      position: relative; }

@media only screen and (min-width: 768px) {
  .section-container.auto {
    border: 0;
    position: relative; }
    .section-container.auto > section, .section-container.auto > .section {
      border: 0;
      position: static; }
      .section-container.auto > section > .title, .section-container.auto > .section > .title {
        background-color: #efefef;
        cursor: pointer;
        margin-bottom: 0; }
        .section-container.auto > section > .title a, .section-container.auto > .section > .title a {
          padding: 0.9375em;
          display: inline-block;
          color: #333333;
          font-size: 0.875em;
          white-space: nowrap; }
        .section-container.auto > section > .title:hover, .section-container.auto > .section > .title:hover {
          background-color: #e2e2e2; }
      .section-container.auto > section .content, .section-container.auto > .section .content {
        display: none;
        padding: 0.9375em;
        background-color: white; }
        .section-container.auto > section .content > *:last-child, .section-container.auto > .section .content > *:last-child {
          margin-bottom: 0; }
        .section-container.auto > section .content > *:first-child, .section-container.auto > .section .content > *:first-child {
          padding-top: 0; }
        .section-container.auto > section .content > *:last-child:not(.flex-video), .section-container.auto > .section .content > *:last-child:not(.flex-video) {
          padding-bottom: 0; }
      .section-container.auto > section.active > .content, .section-container.auto > .section.active > .content {
        display: block; }
      .section-container.auto > section.active > .title, .section-container.auto > .section.active > .title {
        background: white; }
        .section-container.auto > section.active > .title a, .section-container.auto > .section.active > .title a {
          color: #333333; }
      .section-container.auto > section > .title, .section-container.auto > .section > .title {
        width: auto;
        border: solid 1px #cccccc;
        border-right: 0;
        border-bottom: 0;
        position: absolute;
        top: 0;
        z-index: 1; }
        .section-container.auto > section > .title a, .section-container.auto > .section > .title a {
          width: 100%; }
      .section-container.auto > section:last-child .title, .section-container.auto > .section:last-child .title {
        border-right: solid 1px #cccccc; }
      .section-container.auto > section .content, .section-container.auto > .section .content {
        border: solid 1px #cccccc;
        position: absolute;
        z-index: 10;
        display: none;
        top: -1px; }
      .section-container.auto > section.active > .title, .section-container.auto > .section.active > .title {
        z-index: 11;
        border-bottom: 0;
        background-color: white; }
      .section-container.auto > section.active > .content, .section-container.auto > .section.active > .content {
        position: relative; }

  .section-container.accordion .section {
    padding-top: 0 !important; }

  .section-container.vertical-tabs {
    border: 1px solid #cccccc;
    position: relative; }
    .section-container.vertical-tabs section,
    .section-container.vertical-tabs .section {
      padding-top: 0 !important;
      border: 0;
      position: static; }
      .section-container.vertical-tabs section > .title,
      .section-container.vertical-tabs .section > .title {
        background-color: #efefef;
        cursor: pointer;
        margin-bottom: 0; }
        .section-container.vertical-tabs section > .title a,
        .section-container.vertical-tabs .section > .title a {
          padding: 0.9375em;
          display: inline-block;
          color: #333333;
          font-size: 0.875em;
          white-space: nowrap; }
        .section-container.vertical-tabs section > .title:hover,
        .section-container.vertical-tabs .section > .title:hover {
          background-color: #e2e2e2; }
      .section-container.vertical-tabs section .content,
      .section-container.vertical-tabs .section .content {
        display: none;
        padding: 0.9375em;
        background-color: white; }
        .section-container.vertical-tabs section .content > *:last-child,
        .section-container.vertical-tabs .section .content > *:last-child {
          margin-bottom: 0; }
        .section-container.vertical-tabs section .content > *:first-child,
        .section-container.vertical-tabs .section .content > *:first-child {
          padding-top: 0; }
        .section-container.vertical-tabs section .content > *:last-child:not(.flex-video),
        .section-container.vertical-tabs .section .content > *:last-child:not(.flex-video) {
          padding-bottom: 0; }
      .section-container.vertical-tabs section.active > .content,
      .section-container.vertical-tabs .section.active > .content {
        display: block; }
      .section-container.vertical-tabs section.active > .title,
      .section-container.vertical-tabs .section.active > .title {
        background: #d5d5d5; }
        .section-container.vertical-tabs section.active > .title a,
        .section-container.vertical-tabs .section.active > .title a {
          color: #333333; }
      .section-container.vertical-tabs section > .title,
      .section-container.vertical-tabs .section > .title {
        position: absolute;
        border-top: solid 1px #cccccc;
        width: 12.5em; }
      .section-container.vertical-tabs section:first-child .title,
      .section-container.vertical-tabs .section:first-child .title {
        border-top: 0; }
      .section-container.vertical-tabs section .content,
      .section-container.vertical-tabs .section .content {
        display: block;
        position: relative;
        left: 12.5em;
        border-left: solid 1px #cccccc;
        z-index: 10; }
      .section-container.vertical-tabs section.active > .title,
      .section-container.vertical-tabs .section.active > .title {
        background-color: #d5d5d5;
        width: 12.5625em;
        border-right: solid 0 transparent;
        z-index: 11; }
      .section-container.vertical-tabs section.active:last-child .title,
      .section-container.vertical-tabs .section.active:last-child .title {
        border-bottom: 0; }

  .section-container.vertical-nav {
    border: 0;
    position: relative; }
    .section-container.vertical-nav > section, .section-container.vertical-nav > .section {
      padding-top: 0 !important;
      position: relative; }
      .section-container.vertical-nav > section > .title, .section-container.vertical-nav > .section > .title {
        background-color: #efefef;
        cursor: pointer;
        margin-bottom: 0; }
        .section-container.vertical-nav > section > .title a, .section-container.vertical-nav > .section > .title a {
          padding: 0.9375em;
          display: inline-block;
          color: #333333;
          font-size: 0.875em;
          white-space: nowrap; }
        .section-container.vertical-nav > section > .title:hover, .section-container.vertical-nav > .section > .title:hover {
          background-color: #e2e2e2; }
      .section-container.vertical-nav > section .content, .section-container.vertical-nav > .section .content {
        display: none;
        padding: 0.9375em;
        background-color: white; }
        .section-container.vertical-nav > section .content > *:last-child, .section-container.vertical-nav > .section .content > *:last-child {
          margin-bottom: 0; }
        .section-container.vertical-nav > section .content > *:first-child, .section-container.vertical-nav > .section .content > *:first-child {
          padding-top: 0; }
        .section-container.vertical-nav > section .content > *:last-child:not(.flex-video), .section-container.vertical-nav > .section .content > *:last-child:not(.flex-video) {
          padding-bottom: 0; }
      .section-container.vertical-nav > section.active > .content, .section-container.vertical-nav > .section.active > .content {
        display: block; }
      .section-container.vertical-nav > section.active > .title, .section-container.vertical-nav > .section.active > .title {
        background: #d5d5d5; }
        .section-container.vertical-nav > section.active > .title a, .section-container.vertical-nav > .section.active > .title a {
          color: #333333; }
      .section-container.vertical-nav > section > .title, .section-container.vertical-nav > .section > .title {
        border-top: none;
        border: solid 1px #cccccc; }
        .section-container.vertical-nav > section > .title a, .section-container.vertical-nav > .section > .title a {
          display: block;
          width: 100%; }
      .section-container.vertical-nav > section .content, .section-container.vertical-nav > .section .content {
        display: none; }
      .section-container.vertical-nav > section:first-child .title, .section-container.vertical-nav > .section:first-child .title {
        border-bottom: none; }
      .section-container.vertical-nav > section.active > .content, .section-container.vertical-nav > .section.active > .content {
        display: block;
        position: absolute;
        left: 100%;
        top: 0px;
        z-index: 999;
        min-width: 12.5em;
        border: solid 1px #cccccc; }

  .section-container.horizontal-nav {
    position: relative;
    background: #efefef;
    border: 1px solid #cccccc; }
    .section-container.horizontal-nav > section, .section-container.horizontal-nav > .section {
      padding-top: 0;
      border: 0;
      position: static; }
      .section-container.horizontal-nav > section > .title, .section-container.horizontal-nav > .section > .title {
        background-color: #efefef;
        cursor: pointer;
        margin-bottom: 0; }
        .section-container.horizontal-nav > section > .title a, .section-container.horizontal-nav > .section > .title a {
          padding: 0.9375em;
          display: inline-block;
          color: #333333;
          font-size: 0.875em;
          white-space: nowrap; }
        .section-container.horizontal-nav > section > .title:hover, .section-container.horizontal-nav > .section > .title:hover {
          background-color: #e2e2e2; }
      .section-container.horizontal-nav > section .content, .section-container.horizontal-nav > .section .content {
        display: none;
        padding: 0.9375em;
        background-color: white; }
        .section-container.horizontal-nav > section .content > *:last-child, .section-container.horizontal-nav > .section .content > *:last-child {
          margin-bottom: 0; }
        .section-container.horizontal-nav > section .content > *:first-child, .section-container.horizontal-nav > .section .content > *:first-child {
          padding-top: 0; }
        .section-container.horizontal-nav > section .content > *:last-child:not(.flex-video), .section-container.horizontal-nav > .section .content > *:last-child:not(.flex-video) {
          padding-bottom: 0; }
      .section-container.horizontal-nav > section.active > .content, .section-container.horizontal-nav > .section.active > .content {
        display: block; }
      .section-container.horizontal-nav > section.active > .title, .section-container.horizontal-nav > .section.active > .title {
        background: #d5d5d5; }
        .section-container.horizontal-nav > section.active > .title a, .section-container.horizontal-nav > .section.active > .title a {
          color: #333333; }
      .section-container.horizontal-nav > section > .title, .section-container.horizontal-nav > .section > .title {
        width: auto;
        border: solid 1px #cccccc;
        border-left: 0;
        top: -1px;
        position: absolute;
        z-index: 1; }
        .section-container.horizontal-nav > section > .title a, .section-container.horizontal-nav > .section > .title a {
          width: 100%; }
      .section-container.horizontal-nav > section .content, .section-container.horizontal-nav > .section .content {
        display: none; }
      .section-container.horizontal-nav > section.active > .content, .section-container.horizontal-nav > .section.active > .content {
        display: block;
        position: absolute;
        z-index: 999;
        left: 0;
        top: -2px;
        min-width: 12.5em;
        border: solid 1px #cccccc; } }
.no-js .section-container.auto, .no-js .section-container.accordion, .no-js .section-container.tabs, .no-js .section-container.vertical-tabs, .no-js .section-container.vertical-nav, .no-js .section-container.horizontal-nav {
  width: 100%;
  display: block;
  margin-bottom: 1.25em;
  border: 1px solid #cccccc;
  border-top: none; }
  .no-js .section-container.auto > section, .no-js .section-container.auto > .section, .no-js .section-container.accordion > section, .no-js .section-container.accordion > .section, .no-js .section-container.tabs > section, .no-js .section-container.tabs > .section, .no-js .section-container.vertical-tabs > section, .no-js .section-container.vertical-tabs > .section, .no-js .section-container.vertical-nav > section, .no-js .section-container.vertical-nav > .section, .no-js .section-container.horizontal-nav > section, .no-js .section-container.horizontal-nav > .section {
    position: relative; }
    .no-js .section-container.auto > section > .title, .no-js .section-container.auto > .section > .title, .no-js .section-container.accordion > section > .title, .no-js .section-container.accordion > .section > .title, .no-js .section-container.tabs > section > .title, .no-js .section-container.tabs > .section > .title, .no-js .section-container.vertical-tabs > section > .title, .no-js .section-container.vertical-tabs > .section > .title, .no-js .section-container.vertical-nav > section > .title, .no-js .section-container.vertical-nav > .section > .title, .no-js .section-container.horizontal-nav > section > .title, .no-js .section-container.horizontal-nav > .section > .title {
      background-color: #efefef;
      cursor: pointer;
      margin-bottom: 0; }
      .no-js .section-container.auto > section > .title a, .no-js .section-container.auto > .section > .title a, .no-js .section-container.accordion > section > .title a, .no-js .section-container.accordion > .section > .title a, .no-js .section-container.tabs > section > .title a, .no-js .section-container.tabs > .section > .title a, .no-js .section-container.vertical-tabs > section > .title a, .no-js .section-container.vertical-tabs > .section > .title a, .no-js .section-container.vertical-nav > section > .title a, .no-js .section-container.vertical-nav > .section > .title a, .no-js .section-container.horizontal-nav > section > .title a, .no-js .section-container.horizontal-nav > .section > .title a {
        padding: 0.9375em;
        display: inline-block;
        color: #333333;
        font-size: 0.875em;
        white-space: nowrap; }
      .no-js .section-container.auto > section > .title:hover, .no-js .section-container.auto > .section > .title:hover, .no-js .section-container.accordion > section > .title:hover, .no-js .section-container.accordion > .section > .title:hover, .no-js .section-container.tabs > section > .title:hover, .no-js .section-container.tabs > .section > .title:hover, .no-js .section-container.vertical-tabs > section > .title:hover, .no-js .section-container.vertical-tabs > .section > .title:hover, .no-js .section-container.vertical-nav > section > .title:hover, .no-js .section-container.vertical-nav > .section > .title:hover, .no-js .section-container.horizontal-nav > section > .title:hover, .no-js .section-container.horizontal-nav > .section > .title:hover {
        background-color: #e2e2e2; }
    .no-js .section-container.auto > section .content, .no-js .section-container.auto > .section .content, .no-js .section-container.accordion > section .content, .no-js .section-container.accordion > .section .content, .no-js .section-container.tabs > section .content, .no-js .section-container.tabs > .section .content, .no-js .section-container.vertical-tabs > section .content, .no-js .section-container.vertical-tabs > .section .content, .no-js .section-container.vertical-nav > section .content, .no-js .section-container.vertical-nav > .section .content, .no-js .section-container.horizontal-nav > section .content, .no-js .section-container.horizontal-nav > .section .content {
      display: none;
      padding: 0.9375em;
      background-color: white; }
      .no-js .section-container.auto > section .content > *:last-child, .no-js .section-container.auto > .section .content > *:last-child, .no-js .section-container.accordion > section .content > *:last-child, .no-js .section-container.accordion > .section .content > *:last-child, .no-js .section-container.tabs > section .content > *:last-child, .no-js .section-container.tabs > .section .content > *:last-child, .no-js .section-container.vertical-tabs > section .content > *:last-child, .no-js .section-container.vertical-tabs > .section .content > *:last-child, .no-js .section-container.vertical-nav > section .content > *:last-child, .no-js .section-container.vertical-nav > .section .content > *:last-child, .no-js .section-container.horizontal-nav > section .content > *:last-child, .no-js .section-container.horizontal-nav > .section .content > *:last-child {
        margin-bottom: 0; }
      .no-js .section-container.auto > section .content > *:first-child, .no-js .section-container.auto > .section .content > *:first-child, .no-js .section-container.accordion > section .content > *:first-child, .no-js .section-container.accordion > .section .content > *:first-child, .no-js .section-container.tabs > section .content > *:first-child, .no-js .section-container.tabs > .section .content > *:first-child, .no-js .section-container.vertical-tabs > section .content > *:first-child, .no-js .section-container.vertical-tabs > .section .content > *:first-child, .no-js .section-container.vertical-nav > section .content > *:first-child, .no-js .section-container.vertical-nav > .section .content > *:first-child, .no-js .section-container.horizontal-nav > section .content > *:first-child, .no-js .section-container.horizontal-nav > .section .content > *:first-child {
        padding-top: 0; }
      .no-js .section-container.auto > section .content > *:last-child:not(.flex-video), .no-js .section-container.auto > .section .content > *:last-child:not(.flex-video), .no-js .section-container.accordion > section .content > *:last-child:not(.flex-video), .no-js .section-container.accordion > .section .content > *:last-child:not(.flex-video), .no-js .section-container.tabs > section .content > *:last-child:not(.flex-video), .no-js .section-container.tabs > .section .content > *:last-child:not(.flex-video), .no-js .section-container.vertical-tabs > section .content > *:last-child:not(.flex-video), .no-js .section-container.vertical-tabs > .section .content > *:last-child:not(.flex-video), .no-js .section-container.vertical-nav > section .content > *:last-child:not(.flex-video), .no-js .section-container.vertical-nav > .section .content > *:last-child:not(.flex-video), .no-js .section-container.horizontal-nav > section .content > *:last-child:not(.flex-video), .no-js .section-container.horizontal-nav > .section .content > *:last-child:not(.flex-video) {
        padding-bottom: 0; }
    .no-js .section-container.auto > section.active > .content, .no-js .section-container.auto > .section.active > .content, .no-js .section-container.accordion > section.active > .content, .no-js .section-container.accordion > .section.active > .content, .no-js .section-container.tabs > section.active > .content, .no-js .section-container.tabs > .section.active > .content, .no-js .section-container.vertical-tabs > section.active > .content, .no-js .section-container.vertical-tabs > .section.active > .content, .no-js .section-container.vertical-nav > section.active > .content, .no-js .section-container.vertical-nav > .section.active > .content, .no-js .section-container.horizontal-nav > section.active > .content, .no-js .section-container.horizontal-nav > .section.active > .content {
      display: block; }
    .no-js .section-container.auto > section.active > .title, .no-js .section-container.auto > .section.active > .title, .no-js .section-container.accordion > section.active > .title, .no-js .section-container.accordion > .section.active > .title, .no-js .section-container.tabs > section.active > .title, .no-js .section-container.tabs > .section.active > .title, .no-js .section-container.vertical-tabs > section.active > .title, .no-js .section-container.vertical-tabs > .section.active > .title, .no-js .section-container.vertical-nav > section.active > .title, .no-js .section-container.vertical-nav > .section.active > .title, .no-js .section-container.horizontal-nav > section.active > .title, .no-js .section-container.horizontal-nav > .section.active > .title {
      background: #d5d5d5; }
      .no-js .section-container.auto > section.active > .title a, .no-js .section-container.auto > .section.active > .title a, .no-js .section-container.accordion > section.active > .title a, .no-js .section-container.accordion > .section.active > .title a, .no-js .section-container.tabs > section.active > .title a, .no-js .section-container.tabs > .section.active > .title a, .no-js .section-container.vertical-tabs > section.active > .title a, .no-js .section-container.vertical-tabs > .section.active > .title a, .no-js .section-container.vertical-nav > section.active > .title a, .no-js .section-container.vertical-nav > .section.active > .title a, .no-js .section-container.horizontal-nav > section.active > .title a, .no-js .section-container.horizontal-nav > .section.active > .title a {
        color: #333333; }
    .no-js .section-container.auto > section > .title, .no-js .section-container.auto > .section > .title, .no-js .section-container.accordion > section > .title, .no-js .section-container.accordion > .section > .title, .no-js .section-container.tabs > section > .title, .no-js .section-container.tabs > .section > .title, .no-js .section-container.vertical-tabs > section > .title, .no-js .section-container.vertical-tabs > .section > .title, .no-js .section-container.vertical-nav > section > .title, .no-js .section-container.vertical-nav > .section > .title, .no-js .section-container.horizontal-nav > section > .title, .no-js .section-container.horizontal-nav > .section > .title {
      top: 0;
      width: 100%;
      margin: 0;
      border-top: solid 1px #cccccc; }
      .no-js .section-container.auto > section > .title a, .no-js .section-container.auto > .section > .title a, .no-js .section-container.accordion > section > .title a, .no-js .section-container.accordion > .section > .title a, .no-js .section-container.tabs > section > .title a, .no-js .section-container.tabs > .section > .title a, .no-js .section-container.vertical-tabs > section > .title a, .no-js .section-container.vertical-tabs > .section > .title a, .no-js .section-container.vertical-nav > section > .title a, .no-js .section-container.vertical-nav > .section > .title a, .no-js .section-container.horizontal-nav > section > .title a, .no-js .section-container.horizontal-nav > .section > .title a {
        width: 100%; }
    .no-js .section-container.auto > section .title, .no-js .section-container.auto > .section .title, .no-js .section-container.accordion > section .title, .no-js .section-container.accordion > .section .title, .no-js .section-container.tabs > section .title, .no-js .section-container.tabs > .section .title, .no-js .section-container.vertical-tabs > section .title, .no-js .section-container.vertical-tabs > .section .title, .no-js .section-container.vertical-nav > section .title, .no-js .section-container.vertical-nav > .section .title, .no-js .section-container.horizontal-nav > section .title, .no-js .section-container.horizontal-nav > .section .title {
      position: static;
      width: 100%;
      border-left: 0;
      border-right: 0; }
    .no-js .section-container.auto > section .content, .no-js .section-container.auto > .section .content, .no-js .section-container.accordion > section .content, .no-js .section-container.accordion > .section .content, .no-js .section-container.tabs > section .content, .no-js .section-container.tabs > .section .content, .no-js .section-container.vertical-tabs > section .content, .no-js .section-container.vertical-tabs > .section .content, .no-js .section-container.vertical-nav > section .content, .no-js .section-container.vertical-nav > .section .content, .no-js .section-container.horizontal-nav > section .content, .no-js .section-container.horizontal-nav > .section .content {
      position: static;
      display: block;
      width: 100%;
      border-left: 0;
      border-right: 0;
      border-bottom: 0; }

/* Wrapped around .top-bar to contain to grid width */
.contain-to-grid {
  width: 100%;
  background: #111111; }
  .contain-to-grid .top-bar {
    margin-bottom: 0; }

.fixed {
  width: 100%;
  left: 0;
  position: fixed;
  top: 0;
  z-index: 99; }

.top-bar {
  overflow: hidden;
  height: 45px;
  line-height: 45px;
  position: relative;
  background: #111111;
  margin-bottom: 1.875em; }
  .top-bar ul {
    margin-bottom: 0;
    list-style: none; }
  .top-bar .row {
    max-width: none; }
  .top-bar form,
  .top-bar input {
    margin-bottom: 0; }
  .top-bar input {
    height: 2.45em; }
  .top-bar .button {
    padding-top: .5em;
    padding-bottom: .5em;
    margin-bottom: 0; }
  .top-bar .title-area {
    position: relative;
    margin: 0; }
  .top-bar .name {
    height: 45px;
    margin: 0;
    font-size: 16px; }
    .top-bar .name h1 {
      line-height: 45px;
      font-size: 1.0625em;
      margin: 0; }
      .top-bar .name h1 a {
        font-weight: bold;
        color: white;
        width: 50%;
        display: block;
        padding: 0 15px; }
  .top-bar .toggle-topbar {
    position: absolute;
    right: 0;
    top: 0; }
    .top-bar .toggle-topbar a {
      color: white;
      text-transform: uppercase;
      font-size: 0.8125em;
      font-weight: bold;
      position: relative;
      display: block;
      padding: 0 15px;
      height: 45px;
      line-height: 45px; }
    .top-bar .toggle-topbar.menu-icon {
      right: 15px;
      top: 50%;
      margin-top: -16px;
      padding-left: 40px; }
      .top-bar .toggle-topbar.menu-icon a {
        text-indent: -48px;
        width: 34px;
        height: 34px;
        line-height: 33px;
        padding: 0;
        color: white; }
        .top-bar .toggle-topbar.menu-icon a span {
          position: absolute;
          right: 0;
          display: block;
          width: 16px;
          height: 0;
          -webkit-box-shadow: 0 10px 0 1px white, 0 16px 0 1px white, 0 22px 0 1px white;
          box-shadow: 0 10px 0 1px white, 0 16px 0 1px white, 0 22px 0 1px white; }
  .top-bar.expanded {
    height: auto;
    background: transparent; }
    .top-bar.expanded .title-area {
      background: #111111; }
    .top-bar.expanded .toggle-topbar a {
      color: #888888; }
      .top-bar.expanded .toggle-topbar a span {
        -webkit-box-shadow: 0 10px 0 1px #888888, 0 16px 0 1px #888888, 0 22px 0 1px #888888;
        box-shadow: 0 10px 0 1px #888888, 0 16px 0 1px #888888, 0 22px 0 1px #888888; }

.top-bar-section {
  left: 0;
  position: relative;
  width: auto;
  -webkit-transition: left 300ms ease-out;
  -moz-transition: left 300ms ease-out;
  transition: left 300ms ease-out; }
  .top-bar-section ul {
    width: 100%;
    height: auto;
    display: block;
    background: #222222;
    font-size: 16px;
    margin: 0; }
  .top-bar-section .divider,
  .top-bar-section [role="separator"] {
    border-bottom: solid 1px #2b2b2b;
    border-top: solid 1px black;
    clear: both;
    height: 1px;
    width: 100%; }
  .top-bar-section ul li > a {
    display: block;
    width: 100%;
    color: white;
    padding: 12px 0 12px 0;
    padding-left: 15px;
    font-size: 0.8125em;
    font-weight: bold;
    background: #222222; }
    .top-bar-section ul li > a.hover {
      background: #090909;
      color: white; }
    .top-bar-section ul li > a.button {
      background: #2ba6cb;
      font-size: 0.8125em; }
      .top-bar-section ul li > a.button.hover {
        background: #2284a1; }
    .top-bar-section ul li > a.button.secondary {
      background: #e9e9e9; }
      .top-bar-section ul li > a.button.secondary.hover {
        background: #d0d0d0; }
    .top-bar-section ul li > a.button.success {
      background: #5da423; }
      .top-bar-section ul li > a.button.success.hover {
        background: #457a1a; }
    .top-bar-section ul li > a.button.alert {
      background: #c60f13; }
      .top-bar-section ul li > a.button.alert.hover {
        background: #970b0e; }
  .top-bar-section ul li.active > a {
    background: #090909;
    color: white; }
  .top-bar-section .has-form {
    padding: 15px; }
  .top-bar-section .has-dropdown {
    position: relative; }
    .top-bar-section .has-dropdown > a:after {
      content: "";
      display: block;
      width: 0;
      height: 0;
      border: inset 5px;
      border-color: transparent transparent transparent rgba(255, 255, 255, 0.5);
      border-left-style: solid;
      margin-right: 15px;
      margin-top: -4.5px;
      position: absolute;
      top: 50%;
      right: 0; }
    .top-bar-section .has-dropdown.moved {
      position: static; }
      .top-bar-section .has-dropdown.moved > .dropdown {
        visibility: visible; }
  .top-bar-section .dropdown {
    position: absolute;
    left: 100%;
    top: 0;
    visibility: hidden;
    z-index: 99; }
    .top-bar-section .dropdown li {
      width: 100%;
      height: auto; }
      .top-bar-section .dropdown li a {
        font-weight: normal;
        padding: 8px 15px; }
      .top-bar-section .dropdown li.title h5 {
        margin-bottom: 0; }
        .top-bar-section .dropdown li.title h5 a {
          color: white;
          line-height: 22.5px;
          display: block; }
    .top-bar-section .dropdown label {
      padding: 8px 15px 2px;
      margin-bottom: 0;
      text-transform: uppercase;
      color: #555555;
      font-weight: bold;
      font-size: 0.625em; }

.top-bar-js-breakpoint {
  width: 58.75em !important;
  visibility: hidden; }

.js-generated {
  display: block; }

@media only screen and (min-width: 58.75em) {
  .top-bar {
    background: #111111;
    *zoom: 1;
    overflow: visible; }
    .top-bar:before, .top-bar:after {
      content: " ";
      display: table; }
    .top-bar:after {
      clear: both; }
    .top-bar .toggle-topbar {
      display: none; }
    .top-bar .title-area {
      float: left; }
    .top-bar .name h1 a {
      width: auto; }
    .top-bar input,
    .top-bar .button {
      line-height: 2em;
      font-size: 0.875em;
      height: 2em;
      padding: 0 10px;
      position: relative;
      top: 8px; }
    .top-bar.expanded {
      background: #111111; }

  .contain-to-grid .top-bar {
    max-width: 62.5em;
    margin: 0 auto; }

  .top-bar-section {
    -webkit-transition: none 0 0;
    -moz-transition: none 0 0;
    transition: none 0 0;
    left: 0 !important; }
    .top-bar-section ul {
      width: auto;
      height: auto !important;
      display: inline; }
      .top-bar-section ul li {
        float: left; }
        .top-bar-section ul li .js-generated {
          display: none; }
    .top-bar-section li a:not(.button) {
      padding: 0 15px;
      line-height: 45px;
      background: #111111; }
      .top-bar-section li a:not(.button).hover {
        background: black; }
    .top-bar-section .has-dropdown > a {
      padding-right: 35px !important; }
      .top-bar-section .has-dropdown > a:after {
        content: "";
        display: block;
        width: 0;
        height: 0;
        border: inset 5px;
        border-color: rgba(255, 255, 255, 0.5) transparent transparent transparent;
        border-top-style: solid;
        margin-top: -2.5px;
        top: 22.5px; }
    .top-bar-section .has-dropdown.moved {
      position: relative; }
      .top-bar-section .has-dropdown.moved > .dropdown {
        visibility: hidden; }
    .top-bar-section .has-dropdown.hover > .dropdown {
      visibility: visible; }
    .top-bar-section .has-dropdown .dropdown li.has-dropdown > a:after {
      border: none;
      content: "\00bb";
      margin-top: -16px;
      right: 5px; }
    .top-bar-section .dropdown {
      left: 0;
      top: auto;
      background: transparent;
      min-width: 100%; }
      .top-bar-section .dropdown li a {
        color: white;
        line-height: 1;
        white-space: nowrap;
        padding: 7px 15px;
        background: #1e1e1e; }
      .top-bar-section .dropdown li label {
        white-space: nowrap;
        background: #1e1e1e; }
      .top-bar-section .dropdown li .dropdown {
        left: 100%;
        top: 0; }
    .top-bar-section > ul > .divider, .top-bar-section > ul > [role="separator"] {
      border-bottom: none;
      border-top: none;
      border-right: solid 1px #2b2b2b;
      border-left: solid 1px black;
      clear: none;
      height: 45px;
      width: 0px; }
    .top-bar-section .has-form {
      background: #111111;
      padding: 0 15px;
      height: 45px; }
    .top-bar-section ul.right li .dropdown {
      left: auto;
      right: 0; }
      .top-bar-section ul.right li .dropdown li .dropdown {
        right: 100%; } }
@-webkit-keyframes rotate {
  from {
    -webkit-transform: rotate(0deg); }

  to {
    -webkit-transform: rotate(360deg); } }

@-moz-keyframes rotate {
  from {
    -webkit-transform: rotate(0deg); }

  to {
    -webkit-transform: rotate(360deg); } }

@-o-keyframes rotate {
  from {
    -webkit-transform: rotate(0deg); }

  to {
    -webkit-transform: rotate(360deg); } }

@keyframes rotate {
  from {
    -webkit-transform: rotate(0deg); }

  to {
    -webkit-transform: rotate(360deg); } }

/* Orbit Graceful Loading */
.slideshow-wrapper {
  position: relative; }
  .slideshow-wrapper ul {
    list-style-type: none;
    margin: 0; }
    .slideshow-wrapper ul li,
    .slideshow-wrapper ul li .orbit-caption {
      display: none; }
    .slideshow-wrapper ul li:first-child {
      display: block; }
  .slideshow-wrapper .orbit-container {
    background-color: transparent; }
    .slideshow-wrapper .orbit-container li {
      display: block; }
      .slideshow-wrapper .orbit-container li .orbit-caption {
        display: block; }

.preloader {
  display: block;
  width: 40px;
  height: 40px;
  position: absolute;
  top: 50%;
  left: 50%;
  margin-top: -20px;
  margin-left: -20px;
  border: solid 3px;
  border-color: #555555 white;
  -webkit-border-radius: 1000px;
  border-radius: 1000px;
  -webkit-animation-name: rotate;
  -webkit-animation-duration: 1.5s;
  -webkit-animation-iteration-count: infinite;
  -webkit-animation-timing-function: linear;
  -moz-animation-name: rotate;
  -moz-animation-duration: 1.5s;
  -moz-animation-iteration-count: infinite;
  -moz-animation-timing-function: linear;
  -o-animation-name: rotate;
  -o-animation-duration: 1.5s;
  -o-animation-iteration-count: infinite;
  -o-animation-timing-function: linear;
  animation-name: rotate;
  animation-duration: 1.5s;
  animation-iteration-count: infinite;
  animation-timing-function: linear; }

.orbit-container {
  overflow: hidden;
  width: 100%;
  position: relative;
  background: whitesmoke; }
  .orbit-container .orbit-slides-container {
    list-style: none;
    margin: 0;
    padding: 0;
    position: relative; }
    .orbit-container .orbit-slides-container img {
      display: block; }
    .orbit-container .orbit-slides-container > * {
      position: relative;
      float: left;
      height: auto; }
      .orbit-container .orbit-slides-container > * .orbit-caption {
        position: absolute;
        bottom: 0;
        background-color: black;
        background-color: rgba(0, 0, 0, 0.6);
        color: white;
        width: 100%;
        padding: 10px 14px;
        font-size: 0.875em; }
  .orbit-container .orbit-slide-number {
    position: absolute;
    top: 10px;
    left: 10px;
    font-size: 12px;
    color: white;
    background: rgba(0, 0, 0, 0); }
    .orbit-container .orbit-slide-number span {
      font-weight: 700;
      padding: 0.3125em; }
  .orbit-container .orbit-timer {
    position: absolute;
    top: 10px;
    right: 10px;
    height: 6px;
    width: 100px; }
    .orbit-container .orbit-timer .orbit-progress {
      height: 100%;
      background-color: black;
      background-color: rgba(0, 0, 0, 0.6);
      display: block;
      width: 0%; }
    .orbit-container .orbit-timer > span {
      display: none;
      position: absolute;
      top: 10px;
      right: 0px;
      width: 11px;
      height: 14px;
      border: solid 4px black;
      border-top: none;
      border-bottom: none; }
    .orbit-container .orbit-timer.paused > span {
      right: -6px;
      top: 9px;
      width: 11px;
      height: 14px;
      border: inset 8px;
      border-right-style: solid;
      border-color: transparent transparent transparent black; }
  .orbit-container:hover .orbit-timer > span {
    display: block; }
  .orbit-container .orbit-prev,
  .orbit-container .orbit-next {
    position: absolute;
    top: 50%;
    margin-top: -25px;
    background-color: black;
    background-color: rgba(0, 0, 0, 0.6);
    width: 50px;
    height: 60px;
    line-height: 50px;
    color: white;
    text-indent: -9999px !important; }
    .orbit-container .orbit-prev > span,
    .orbit-container .orbit-next > span {
      position: absolute;
      top: 50%;
      margin-top: -16px;
      display: block;
      width: 0;
      height: 0;
      border: inset 16px; }
  .orbit-container .orbit-prev {
    left: 0; }
    .orbit-container .orbit-prev > span {
      border-right-style: solid;
      border-color: transparent;
      border-right-color: #fff; }
    .orbit-container .orbit-prev:hover > span {
      border-right-color: #ccc; }
  .orbit-container .orbit-next {
    right: 0; }
    .orbit-container .orbit-next > span {
      border-color: transparent;
      border-left-style: solid;
      border-left-color: #fff;
      left: 50%;
      margin-left: -8px; }
    .orbit-container .orbit-next:hover > span {
      border-left-color: #ccc; }

.orbit-bullets {
  margin: 0 auto 30px auto;
  overflow: hidden;
  position: relative;
  top: 10px; }
  .orbit-bullets li {
    display: block;
    width: 18px;
    height: 18px;
    background: #999999;
    float: left;
    margin-right: 6px;
    border: solid 2px #222222;
    -webkit-border-radius: 1000px;
    border-radius: 1000px; }
    .orbit-bullets li.active {
      background: #222222; }
    .orbit-bullets li:last-child {
      margin-right: 0; }

.touch .orbit-container .orbit-prev,
.touch .orbit-container .orbit-next {
  display: none; }
.touch .orbit-bullets {
  display: none; }

@media only screen and (min-width: 768px) {
  .touch .orbit-container .orbit-prev,
  .touch .orbit-container .orbit-next {
    display: inherit; }
  .touch .orbit-bullets {
    display: block; } }
.reveal-modal-bg {
  position: fixed;
  height: 100%;
  width: 100%;
  background: black;
  background: rgba(0, 0, 0, 0.45);
  z-index: 98;
  display: none;
  top: 0;
  left: 0; }

.reveal-modal {
  visibility: hidden;
  display: none;
  position: absolute;
  left: 50%;
  z-index: 99;
  height: auto;
  margin-left: -40%;
  width: 80%;
  background-color: white;
  padding: 1.25em;
  border: solid 1px #666666;
  -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.4);
  box-shadow: 0 0 10px rgba(0, 0, 0, 0.4);
  top: 50px; }
  .reveal-modal .column,
  .reveal-modal .columns {
    min-width: 0; }
  .reveal-modal > :first-child {
    margin-top: 0; }
  .reveal-modal > :last-child {
    margin-bottom: 0; }
  .reveal-modal .close-reveal-modal {
    font-size: 1.375em;
    line-height: 1;
    position: absolute;
    top: 0.5em;
    right: 0.6875em;
    color: #aaaaaa;
    font-weight: bold;
    cursor: pointer; }

@media only screen and (min-width: 768px) {
  .reveal-modal {
    padding: 1.875em;
    top: 6.25em; }
    .reveal-modal.tiny {
      margin-left: -15%;
      width: 30%; }
    .reveal-modal.small {
      margin-left: -20%;
      width: 40%; }
    .reveal-modal.medium {
      margin-left: -30%;
      width: 60%; }
    .reveal-modal.large {
      margin-left: -35%;
      width: 70%; }
    .reveal-modal.xlarge {
      margin-left: -47.5%;
      width: 95%; } }
@media print {
  .reveal-modal {
    background: white !important; } }
/* Foundation Joyride */
.joyride-list {
  display: none; }

/* Default styles for the container */
.joyride-tip-guide {
  display: none;
  position: absolute;
  background: black;
  color: white;
  z-index: 101;
  top: 0;
  left: 2.5%;
  font-family: inherit;
  font-weight: normal;
  width: 95%; }

.lt-ie9 .joyride-tip-guide {
  max-width: 800px;
  left: 50%;
  margin-left: -400px; }

.joyride-content-wrapper {
  width: 100%;
  padding: 1.125em 1.25em 1.5em; }
  .joyride-content-wrapper .button {
    margin-bottom: 0 !important; }

/* Add a little css triangle pip, older browser just miss out on the fanciness of it */
.joyride-tip-guide .joyride-nub {
  display: block;
  position: absolute;
  left: 22px;
  width: 0;
  height: 0;
  border: inset 14px; }
  .joyride-tip-guide .joyride-nub.top {
    border-top-style: solid;
    border-color: black;
    border-top-color: transparent !important;
    border-left-color: transparent !important;
    border-right-color: transparent !important;
    top: -28px; }
  .joyride-tip-guide .joyride-nub.bottom {
    border-bottom-style: solid;
    border-color: black !important;
    border-bottom-color: transparent !important;
    border-left-color: transparent !important;
    border-right-color: transparent !important;
    bottom: -28px; }
  .joyride-tip-guide .joyride-nub.right {
    right: -28px; }
  .joyride-tip-guide .joyride-nub.left {
    left: -28px; }

/* Typography */
.joyride-tip-guide h1,
.joyride-tip-guide h2,
.joyride-tip-guide h3,
.joyride-tip-guide h4,
.joyride-tip-guide h5,
.joyride-tip-guide h6 {
  line-height: 1.25;
  margin: 0;
  
Download .txt
gitextract_yjpdehpd/

├── .docker/
│   ├── Dockerfile
│   ├── ssh_key_rsa
│   ├── ssh_key_rsa.pub
│   └── ubuntu_setup.sh
├── .github/
│   ├── dependabot.yml
│   ├── issue_template.md
│   ├── pull_request_template.md
│   ├── release-drafter.yml
│   └── workflows/
│       ├── ci.yml
│       └── release-drafter.yml
├── .gitignore
├── .rubocop.yml
├── .rubocop_todo.yml
├── CHANGELOG.md
├── CONTRIBUTING.md
├── DEVELOPMENT.md
├── Gemfile
├── LICENSE.txt
├── README.md
├── RELEASING.md
├── Rakefile
├── UPGRADING-3.7.md
├── bin/
│   ├── cap
│   └── capify
├── capistrano.gemspec
├── docker-compose.yml
├── docs/
│   ├── CNAME
│   ├── Gemfile
│   ├── README.md
│   ├── _config.yml
│   ├── _includes/
│   │   ├── carbon.html
│   │   ├── footer.html
│   │   ├── google_tag_manager.html
│   │   ├── header.html
│   │   ├── metrics.html
│   │   └── navigation.html
│   ├── _layouts/
│   │   ├── default.html
│   │   └── post.html
│   ├── _posts/
│   │   └── 2013-06-01-release-announcement.markdown
│   ├── assets/
│   │   ├── browserconfig.xml
│   │   ├── css/
│   │   │   ├── capistrano.css
│   │   │   ├── dreamweaver.css
│   │   │   ├── foundation.css
│   │   │   ├── github.css
│   │   │   ├── monokai.css
│   │   │   ├── normalize.css
│   │   │   ├── social_foundicons.css
│   │   │   ├── social_foundicons_ie7.css
│   │   │   └── syntax.css
│   │   ├── js/
│   │   │   ├── foundation/
│   │   │   │   ├── foundation.alerts.js
│   │   │   │   ├── foundation.clearing.js
│   │   │   │   ├── foundation.cookie.js
│   │   │   │   ├── foundation.dropdown.js
│   │   │   │   ├── foundation.forms.js
│   │   │   │   ├── foundation.interchange.js
│   │   │   │   ├── foundation.joyride.js
│   │   │   │   ├── foundation.js
│   │   │   │   ├── foundation.magellan.js
│   │   │   │   ├── foundation.orbit.js
│   │   │   │   ├── foundation.placeholder.js
│   │   │   │   ├── foundation.reveal.js
│   │   │   │   ├── foundation.section.js
│   │   │   │   ├── foundation.tooltips.js
│   │   │   │   └── foundation.topbar.js
│   │   │   └── jquery.cookie.js
│   │   └── site.webmanifest
│   ├── documentation/
│   │   ├── advanced-features/
│   │   │   ├── console/
│   │   │   │   └── index.markdown
│   │   │   ├── custom-filters/
│   │   │   │   └── index.markdown
│   │   │   ├── custom-scm/
│   │   │   │   └── index.markdown
│   │   │   ├── filtering/
│   │   │   │   └── index.markdown
│   │   │   ├── host-filtering/
│   │   │   │   └── index.markdown
│   │   │   ├── ignoring/
│   │   │   │   └── index.markdown
│   │   │   ├── overriding-capistrano-tasks/
│   │   │   │   └── index.markdown
│   │   │   ├── properties/
│   │   │   │   └── index.markdown
│   │   │   ├── property-filtering/
│   │   │   │   └── index.markdown
│   │   │   ├── ptys/
│   │   │   │   └── index.markdown
│   │   │   ├── remote-file/
│   │   │   │   └── index.markdown
│   │   │   ├── role-filtering/
│   │   │   │   └── index.markdown
│   │   │   ├── ssh-kit/
│   │   │   │   └── index.markdown
│   │   │   └── validation-of-variables/
│   │   │       └── index.markdown
│   │   ├── faq/
│   │   │   ├── how-can-i-access-stage-configuration-variables/
│   │   │   │   └── index.markdown
│   │   │   ├── how-can-i-check-for-existing-remote-file/
│   │   │   │   └── index.markdown
│   │   │   ├── how-can-i-get-capistrano-to-prompt-for-a-password/
│   │   │   │   └── index.markdown
│   │   │   ├── how-can-i-set-capistrano-configuration-paths/
│   │   │   │   └── index.markdown
│   │   │   └── why-does-something-work-in-my-ssh-session-but-not-in-capistrano/
│   │   │       └── index.markdown
│   │   ├── getting-started/
│   │   │   ├── authentication-and-authorisation/
│   │   │   │   └── index.markdown
│   │   │   ├── before-after/
│   │   │   │   └── index.markdown
│   │   │   ├── cold-start/
│   │   │   │   └── index.markdown
│   │   │   ├── configuration/
│   │   │   │   └── index.markdown
│   │   │   ├── flow/
│   │   │   │   └── index.markdown
│   │   │   ├── installation/
│   │   │   │   └── index.markdown
│   │   │   ├── local-tasks/
│   │   │   │   └── index.markdown
│   │   │   ├── preparing-your-application/
│   │   │   │   └── index.markdown
│   │   │   ├── rollbacks/
│   │   │   │   └── index.markdown
│   │   │   ├── structure/
│   │   │   │   └── index.markdown
│   │   │   ├── tasks/
│   │   │   │   └── index.markdown
│   │   │   ├── user-input/
│   │   │   │   └── index.markdown
│   │   │   └── version-locking/
│   │   │       └── index.markdown
│   │   ├── harrow/
│   │   │   └── index.markdown
│   │   ├── overview/
│   │   │   └── what-is-capistrano/
│   │   │       └── index.markdown
│   │   ├── plugins/
│   │   │   └── index.markdown
│   │   ├── tasks/
│   │   │   ├── intro/
│   │   │   │   └── index.markdown
│   │   │   └── rails/
│   │   │       └── index.markdown
│   │   ├── third-party-plugins/
│   │   │   └── index.markdown
│   │   └── upgrading/
│   │       └── index.markdown
│   └── index.markdown
├── features/
│   ├── configuration.feature
│   ├── deploy.feature
│   ├── deploy_failure.feature
│   ├── doctor.feature
│   ├── installation.feature
│   ├── sshconnect.feature
│   ├── stage_failure.feature
│   ├── step_definitions/
│   │   ├── assertions.rb
│   │   ├── cap_commands.rb
│   │   └── setup.rb
│   ├── subdirectory.feature
│   └── support/
│       ├── docker_gateway.rb
│       ├── env.rb
│       ├── remote_command_helpers.rb
│       └── remote_ssh_helpers.rb
├── gemfiles/
│   └── legacy.gemfile
├── lib/
│   ├── Capfile
│   ├── capistrano/
│   │   ├── all.rb
│   │   ├── application.rb
│   │   ├── configuration/
│   │   │   ├── empty_filter.rb
│   │   │   ├── filter.rb
│   │   │   ├── host_filter.rb
│   │   │   ├── null_filter.rb
│   │   │   ├── plugin_installer.rb
│   │   │   ├── question.rb
│   │   │   ├── role_filter.rb
│   │   │   ├── scm_resolver.rb
│   │   │   ├── server.rb
│   │   │   ├── servers.rb
│   │   │   ├── validated_variables.rb
│   │   │   └── variables.rb
│   │   ├── configuration.rb
│   │   ├── console.rb
│   │   ├── defaults.rb
│   │   ├── deploy.rb
│   │   ├── doctor/
│   │   │   ├── environment_doctor.rb
│   │   │   ├── gems_doctor.rb
│   │   │   ├── output_helpers.rb
│   │   │   ├── servers_doctor.rb
│   │   │   └── variables_doctor.rb
│   │   ├── doctor.rb
│   │   ├── dotfile.rb
│   │   ├── dsl/
│   │   │   ├── env.rb
│   │   │   ├── paths.rb
│   │   │   ├── stages.rb
│   │   │   └── task_enhancements.rb
│   │   ├── dsl.rb
│   │   ├── framework.rb
│   │   ├── i18n.rb
│   │   ├── immutable_task.rb
│   │   ├── install.rb
│   │   ├── plugin.rb
│   │   ├── proc_helpers.rb
│   │   ├── scm/
│   │   │   ├── git.rb
│   │   │   ├── hg.rb
│   │   │   ├── plugin.rb
│   │   │   ├── svn.rb
│   │   │   └── tasks/
│   │   │       ├── git.rake
│   │   │       ├── hg.rake
│   │   │       └── svn.rake
│   │   ├── scm.rb
│   │   ├── setup.rb
│   │   ├── tasks/
│   │   │   ├── console.rake
│   │   │   ├── deploy.rake
│   │   │   ├── doctor.rake
│   │   │   ├── framework.rake
│   │   │   └── install.rake
│   │   ├── templates/
│   │   │   ├── Capfile
│   │   │   ├── deploy.rb.erb
│   │   │   └── stage.rb.erb
│   │   ├── upload_task.rb
│   │   ├── version.rb
│   │   └── version_validator.rb
│   └── capistrano.rb
└── spec/
    ├── integration/
    │   └── dsl_spec.rb
    ├── integration_spec_helper.rb
    ├── lib/
    │   ├── capistrano/
    │   │   ├── application_spec.rb
    │   │   ├── configuration/
    │   │   │   ├── empty_filter_spec.rb
    │   │   │   ├── filter_spec.rb
    │   │   │   ├── host_filter_spec.rb
    │   │   │   ├── null_filter_spec.rb
    │   │   │   ├── plugin_installer_spec.rb
    │   │   │   ├── question_spec.rb
    │   │   │   ├── role_filter_spec.rb
    │   │   │   ├── scm_resolver_spec.rb
    │   │   │   ├── server_spec.rb
    │   │   │   └── servers_spec.rb
    │   │   ├── configuration_spec.rb
    │   │   ├── doctor/
    │   │   │   ├── environment_doctor_spec.rb
    │   │   │   ├── gems_doctor_spec.rb
    │   │   │   ├── output_helpers_spec.rb
    │   │   │   ├── servers_doctor_spec.rb
    │   │   │   └── variables_doctor_spec.rb
    │   │   ├── dsl/
    │   │   │   ├── paths_spec.rb
    │   │   │   └── task_enhancements_spec.rb
    │   │   ├── dsl_spec.rb
    │   │   ├── immutable_task_spec.rb
    │   │   ├── plugin_spec.rb
    │   │   ├── scm/
    │   │   │   ├── git_spec.rb
    │   │   │   ├── hg_spec.rb
    │   │   │   └── svn_spec.rb
    │   │   ├── scm_spec.rb
    │   │   ├── upload_task_spec.rb
    │   │   └── version_validator_spec.rb
    │   └── capistrano_spec.rb
    ├── spec_helper.rb
    └── support/
        ├── matchers.rb
        ├── tasks/
        │   ├── database.rake
        │   ├── fail.rake
        │   ├── failed.rake
        │   ├── plugin.rake
        │   └── root.rake
        └── test_app.rb
Download .txt
SYMBOL INDEX (507 symbols across 73 files)

FILE: docs/assets/js/foundation/foundation.clearing.js
  function loaded (line 342) | function loaded () {
  function bindLoad (line 346) | function bindLoad () {

FILE: docs/assets/js/foundation/foundation.cookie.js
  function raw (line 16) | function raw(s) {
  function decoded (line 20) | function decoded(s) {

FILE: docs/assets/js/foundation/foundation.interchange.js
  function loaded (line 149) | function loaded () {
  function bindLoad (line 153) | function bindLoad () {
  function S4 (line 225) | function S4() {

FILE: docs/assets/js/foundation/foundation.js
  function isNumber (line 330) | function isNumber (o) {
  function trim (line 334) | function trim(str) {

FILE: docs/assets/js/foundation/foundation.placeholder.js
  function args (line 90) | function args(elem) {
  function clearPlaceholder (line 102) | function clearPlaceholder(event, value) {
  function setPlaceholder (line 121) | function setPlaceholder() {

FILE: docs/assets/js/jquery.cookie.js
  function encode (line 23) | function encode(s) {
  function decode (line 27) | function decode(s) {
  function stringifyCookieValue (line 31) | function stringifyCookieValue(value) {
  function parseCookieValue (line 35) | function parseCookieValue(s) {
  function read (line 50) | function read(s, converter) {

FILE: features/support/docker_gateway.rb
  class DockerGateway (line 7) | class DockerGateway
    method initialize (line 8) | def initialize(log_proc=$stderr.method(:puts))
    method start (line 12) | def start
    method stop (line 16) | def stop
    method run_shell_command (line 20) | def run_shell_command(command)
    method run_compose_command (line 26) | def run_compose_command(command)
    method read_lines (line 41) | def read_lines(io)
    method log (line 50) | def log(message)

FILE: features/support/remote_command_helpers.rb
  type RemoteCommandHelpers (line 1) | module RemoteCommandHelpers
    function test_dir_exists (line 2) | def test_dir_exists(path)
    function test_symlink_exists (line 6) | def test_symlink_exists(path)
    function test_file_exists (line 10) | def test_file_exists(path)
    function exists? (line 14) | def exists?(type, path)
    function symlinked? (line 18) | def symlinked?(symlink_path, target_path)
    function safely_remove_file (line 22) | def safely_remove_file(_path)

FILE: features/support/remote_ssh_helpers.rb
  type RemoteSSHHelpers (line 5) | module RemoteSSHHelpers
    class RemoteSSHCommandError (line 8) | class RemoteSSHCommandError < RuntimeError; end
    function start_ssh_server (line 10) | def start_ssh_server
    function wait_for_ssh_server (line 14) | def wait_for_ssh_server(retries=3)
    function run_remote_ssh_command (line 22) | def run_remote_ssh_command(command)
    function docker_gateway (line 28) | def docker_gateway

FILE: lib/capistrano/all.rb
  type Capistrano (line 16) | module Capistrano

FILE: lib/capistrano/application.rb
  type Capistrano (line 1) | module Capistrano
    class Application (line 2) | class Application < Rake::Application
      method initialize (line 3) | def initialize
      method name (line 8) | def name
      method run (line 12) | def run
      method sort_options (line 17) | def sort_options(options)
      method handle_options (line 26) | def handle_options
      method top_level_tasks (line 54) | def top_level_tasks
      method display_error_message (line 62) | def display_error_message(ex)
      method exit_because_of_exception (line 71) | def exit_because_of_exception(ex)
      method find_rakefile_location (line 80) | def find_rakefile_location
      method backtrace_pattern (line 90) | def backtrace_pattern
      method load_imports (line 98) | def load_imports
      method capfile (line 108) | def capfile
      method version (line 112) | def version
      method dry_run (line 121) | def dry_run
      method roles (line 129) | def roles
      method hostfilter (line 137) | def hostfilter
      method print_config_variables (line 145) | def print_config_variables

FILE: lib/capistrano/configuration.rb
  type Capistrano (line 9) | module Capistrano
    class ValidationError (line 10) | class ValidationError < RuntimeError; end
    class Configuration (line 12) | class Configuration
      method env (line 13) | def self.env
      method reset! (line 17) | def self.reset!
      method initialize (line 26) | def initialize(values={})
      method ask (line 30) | def ask(key, default=nil, options={})
      method set_if_empty (line 35) | def set_if_empty(key, value=nil, &block)
      method append (line 39) | def append(key, *values)
      method remove (line 43) | def remove(key, *values)
      method any? (line 47) | def any?(key)
      method is_question? (line 60) | def is_question?(key)
      method role (line 65) | def role(name, hosts, options={})
      method server (line 73) | def server(name, properties={})
      method roles_for (line 77) | def roles_for(names)
      method role_properties_for (line 81) | def role_properties_for(names, &block)
      method primary (line 85) | def primary(role)
      method backend (line 89) | def backend
      method configure_backend (line 95) | def configure_backend
      method configure_scm (line 109) | def configure_scm
      method timestamp (line 113) | def timestamp
      method add_filter (line 117) | def add_filter(filter=nil, &block)
      method setup_filters (line 133) | def setup_filters
      method add_cmdline_filter (line 145) | def add_cmdline_filter(type, values)
      method filter (line 149) | def filter(list)
      method dry_run? (line 154) | def dry_run?
      method install_plugin (line 158) | def install_plugin(plugin, load_hooks: true, load_immediately: false)
      method scm_plugin_installed? (line 164) | def scm_plugin_installed?
      method servers (line 168) | def servers
      method cmdline_filters (line 174) | def cmdline_filters
      method installer (line 178) | def installer
      method configure_sshkit_output (line 182) | def configure_sshkit_output(sshkit)

FILE: lib/capistrano/configuration/empty_filter.rb
  type Capistrano (line 1) | module Capistrano
    class Configuration (line 2) | class Configuration
      class EmptyFilter (line 3) | class EmptyFilter
        method filter (line 4) | def filter(_servers)

FILE: lib/capistrano/configuration/filter.rb
  type Capistrano (line 7) | module Capistrano
    class Configuration (line 8) | class Configuration
      class Filter (line 9) | class Filter
        method initialize (line 10) | def initialize(type, values=nil)
        method filter (line 21) | def filter(servers)

FILE: lib/capistrano/configuration/host_filter.rb
  type Capistrano (line 1) | module Capistrano
    class Configuration (line 2) | class Configuration
      class HostFilter (line 3) | class HostFilter
        method initialize (line 4) | def initialize(values)
        method filter (line 10) | def filter(servers)
        method regex_matcher (line 16) | def regex_matcher(values)

FILE: lib/capistrano/configuration/null_filter.rb
  type Capistrano (line 1) | module Capistrano
    class Configuration (line 2) | class Configuration
      class NullFilter (line 3) | class NullFilter
        method filter (line 4) | def filter(servers)

FILE: lib/capistrano/configuration/plugin_installer.rb
  type Capistrano (line 8) | module Capistrano
    class Configuration (line 9) | class Configuration
      class PluginInstaller (line 10) | class PluginInstaller
        method install (line 24) | def install(plugin, load_hooks: true, load_immediately: false)
        method scm_installed? (line 40) | def scm_installed?
        method provides_scm? (line 46) | def provides_scm?(plugin)

FILE: lib/capistrano/configuration/question.rb
  type Capistrano (line 1) | module Capistrano
    class Configuration (line 2) | class Configuration
      class Question (line 3) | class Question
        method initialize (line 4) | def initialize(key, default, options={})
        method call (line 10) | def call
        method ask_question (line 19) | def ask_question
        method value_or_default (line 24) | def value_or_default
        method response (line 32) | def response
        method gets (line 38) | def gets
        method question (line 51) | def question
        method echo? (line 63) | def echo?
        method stdin (line 67) | def stdin
        method prompt (line 71) | def prompt

FILE: lib/capistrano/configuration/role_filter.rb
  type Capistrano (line 1) | module Capistrano
    class Configuration (line 2) | class Configuration
      class RoleFilter (line 3) | class RoleFilter
        method initialize (line 4) | def initialize(values)
        method filter (line 10) | def filter(servers)
        method regex_matcher (line 16) | def regex_matcher(values)

FILE: lib/capistrano/configuration/scm_resolver.rb
  type Capistrano (line 1) | module Capistrano
    class Configuration (line 2) | class Configuration
      class SCMResolver (line 22) | class SCMResolver
        method resolve (line 27) | def resolve
        method using_default_scm? (line 50) | def using_default_scm?
        method scm_name (line 55) | def scm_name
        method load_built_in_scm (line 59) | def load_built_in_scm
        method load_legacy_scm_by_name (line 68) | def load_legacy_scm_by_name
        method third_party_scm_name? (line 72) | def third_party_scm_name?
        method built_in_scm_name? (line 76) | def built_in_scm_name?
        method built_in_scm_plugin_class_name (line 80) | def built_in_scm_plugin_class_name
        method register_legacy_scm_hooks (line 85) | def register_legacy_scm_hooks
        method print_deprecation_warnings_if_applicable (line 101) | def print_deprecation_warnings_if_applicable
        method warn_set_scm_is_deprecated (line 111) | def warn_set_scm_is_deprecated
        method warn_add_git_to_capfile (line 124) | def warn_add_git_to_capfile
        method warn_third_party_scm_must_be_upgraded (line 136) | def warn_third_party_scm_must_be_upgraded

FILE: lib/capistrano/configuration/server.rb
  type Capistrano (line 2) | module Capistrano
    class Configuration (line 3) | class Configuration
      class Server (line 4) | class Server < SSHKit::Host
        method [] (line 8) | def self.[](host)
        method add_roles (line 12) | def add_roles(roles)
        method add_role (line 18) | def add_role(role)
        method has_role? (line 23) | def has_role?(role)
        method select? (line 27) | def select?(options)
        method primary (line 45) | def primary
        method with (line 49) | def with(properties)
        method properties (line 54) | def properties
        method netssh_options (line 58) | def netssh_options
        method roles_array (line 62) | def roles_array
        method matches? (line 66) | def matches?(other)
        method add_property (line 73) | def add_property(key, value)
        class Properties (line 81) | class Properties
          method initialize (line 82) | def initialize
          method set (line 86) | def set(key, value)
          method fetch (line 99) | def fetch(key)
          method respond_to_missing? (line 103) | def respond_to_missing?(method, _include_all=false)
          method roles (line 107) | def roles
          method keys (line 111) | def keys
          method method_missing (line 115) | def method_missing(key, value=nil)
          method to_h (line 123) | def to_h
          method lvalue (line 129) | def lvalue(key)

FILE: lib/capistrano/configuration/servers.rb
  type Capistrano (line 5) | module Capistrano
    class Configuration (line 6) | class Configuration
      class Servers (line 7) | class Servers
        method add_host (line 10) | def add_host(host, properties={})
        method add_role (line 25) | def add_role(role, hosts, options={})
        method roles_for (line 31) | def roles_for(names)
        method role_properties_for (line 37) | def role_properties_for(rolenames)
        method fetch_primary (line 54) | def fetch_primary(role)
        method each (line 59) | def each
        method servers_by_key (line 67) | def servers_by_key
        method extract_options (line 71) | def extract_options(array)

FILE: lib/capistrano/configuration/validated_variables.rb
  type Capistrano (line 4) | module Capistrano
    class Configuration (line 5) | class Configuration
      class ValidatedVariables (line 24) | class ValidatedVariables < SimpleDelegator
        method initialize (line 27) | def initialize(variables)
        method set (line 33) | def set(key, value=nil, &block)
        method validate (line 50) | def validate(key, &validator)
        method assert_valid_later (line 70) | def assert_valid_later(key, callable)
        method assert_valid_now (line 87) | def assert_valid_now(key, value)
        method assert_value_or_block_not_both (line 93) | def assert_value_or_block_not_both(value, block)
        class ValidatedQuestion (line 99) | class ValidatedQuestion < Question
          method initialize (line 100) | def initialize(validator)
          method call (line 104) | def call

FILE: lib/capistrano/configuration/variables.rb
  type Capistrano (line 3) | module Capistrano
    class Configuration (line 4) | class Configuration
      class Variables (line 9) | class Variables
        method initialize (line 22) | def initialize(values={})
        method untrusted! (line 30) | def untrusted!
        method set (line 37) | def set(key, value=nil, &block)
        method fetch (line 45) | def fetch(key, default=nil, &block)
        method peek (line 51) | def peek(key, default=nil, &block)
        method fetch_for (line 59) | def fetch_for(key, default, &block)
        method delete (line 63) | def delete(key)
        method trusted_keys (line 67) | def trusted_keys
        method untrusted_keys (line 71) | def untrusted_keys
        method keys (line 75) | def keys
        method unused_keys (line 80) | def unused_keys
        method source_locations (line 87) | def source_locations(key)
        method trusted? (line 95) | def trusted?
        method remember_location (line 99) | def remember_location(key)
        method trace_set (line 106) | def trace_set(key)

FILE: lib/capistrano/doctor/environment_doctor.rb
  type Capistrano (line 3) | module Capistrano
    type Doctor (line 4) | module Doctor
      class EnvironmentDoctor (line 5) | class EnvironmentDoctor
        method call (line 8) | def call

FILE: lib/capistrano/doctor/gems_doctor.rb
  type Capistrano (line 3) | module Capistrano
    type Doctor (line 4) | module Doctor
      class GemsDoctor (line 7) | class GemsDoctor
        method call (line 10) | def call
        method installed_gem_version (line 22) | def installed_gem_version(gem_name)
        method update_available? (line 26) | def update_available?(gem_name)
        method all_gem_names (line 32) | def all_gem_names
        method core_gem_names (line 36) | def core_gem_names
        method plugin_gem_names (line 40) | def plugin_gem_names

FILE: lib/capistrano/doctor/output_helpers.rb
  type Capistrano (line 1) | module Capistrano
    type Doctor (line 2) | module Doctor
      type OutputHelpers (line 7) | module OutputHelpers
        class Row (line 8) | class Row
          method initialize (line 12) | def initialize
          method << (line 16) | def <<(value)
          method yellow (line 20) | def yellow
        function table (line 29) | def table(records, &block)
        function title (line 44) | def title(text)
        function warning (line 50) | def warning(text)
        function puts (line 55) | def puts(string=nil)
        function collect_rows (line 61) | def collect_rows(records)
        function calculate_column_widths (line 67) | def calculate_column_widths(rows)
        function color (line 74) | def color

FILE: lib/capistrano/doctor/servers_doctor.rb
  type Capistrano (line 3) | module Capistrano
    type Doctor (line 4) | module Doctor
      class ServersDoctor (line 5) | class ServersDoctor
        method initialize (line 8) | def initialize(env=Capistrano::Configuration.env)
        method call (line 12) | def call
        class RoleWhitespaceChecker (line 36) | class RoleWhitespaceChecker
          method initialize (line 39) | def initialize(servers)
          method any_has_whitespace? (line 44) | def any_has_whitespace?(roles)
          method include_whitespace? (line 48) | def include_whitespace?(role)
          method whitespace_roles_decorated (line 52) | def whitespace_roles_decorated
          method find_whitespace_roles (line 58) | def find_whitespace_roles
        class ServerDecorator (line 64) | class ServerDecorator
          method initialize (line 65) | def initialize(server)
          method uri_form (line 69) | def uri_form
          method roles (line 79) | def roles
          method properties (line 83) | def properties
          method pretty_inspect (line 93) | def pretty_inspect(element)

FILE: lib/capistrano/doctor/variables_doctor.rb
  type Capistrano (line 3) | module Capistrano
    type Doctor (line 4) | module Doctor
      class VariablesDoctor (line 7) | class VariablesDoctor
        method initialize (line 24) | def initialize(env=Capistrano::Configuration.env)
        method call (line 28) | def call
        method variables (line 50) | def variables
        method inspect_all_values (line 54) | def inspect_all_values
        method suspicious_keys (line 64) | def suspicious_keys
        method location (line 68) | def location(key)

FILE: lib/capistrano/dsl.rb
  type Capistrano (line 7) | module Capistrano
    type DSL (line 8) | module DSL
      function invoke (line 14) | def invoke(task_name, *args)
      function invoke! (line 29) | def invoke!(task_name, *args)
      function t (line 35) | def t(key, options={})
      function scm (line 39) | def scm
      function sudo (line 43) | def sudo(*args)
      function revision_log_message (line 47) | def revision_log_message
      function rollback_log_message (line 56) | def rollback_log_message
      function local_user (line 60) | def local_user
      function lock (line 64) | def lock(locked_version)
      function on (line 69) | def on(hosts, options={}, &block)
      function run_locally (line 75) | def run_locally(&block)
      function execute (line 80) | def execute(*)

FILE: lib/capistrano/dsl/env.rb
  type Capistrano (line 3) | module Capistrano
    type DSL (line 4) | module DSL
      type Env (line 5) | module Env
        function roles (line 13) | def roles(*names)
        function role_properties (line 17) | def role_properties(*names, &block)
        function release_roles (line 21) | def release_roles(*names)
        function env (line 30) | def env
        function release_timestamp (line 34) | def release_timestamp
        function asset_timestamp (line 38) | def asset_timestamp

FILE: lib/capistrano/dsl/paths.rb
  type Capistrano (line 2) | module Capistrano
    type DSL (line 3) | module DSL
      type Paths (line 4) | module Paths
        function deploy_to (line 5) | def deploy_to
        function deploy_path (line 9) | def deploy_path
        function current_path (line 13) | def current_path
        function releases_path (line 17) | def releases_path
        function release_path (line 21) | def release_path
        function set_release_path (line 25) | def set_release_path(timestamp=now)
        function stage_config_path (line 30) | def stage_config_path
        function deploy_config_path (line 34) | def deploy_config_path
        function repo_url (line 38) | def repo_url
        function repo_path (line 42) | def repo_path
        function shared_path (line 46) | def shared_path
        function revision_log (line 50) | def revision_log
        function now (line 54) | def now
        function asset_timestamp (line 58) | def asset_timestamp
        function linked_dirs (line 62) | def linked_dirs(parent)
        function linked_files (line 67) | def linked_files(parent)
        function linked_file_dirs (line 72) | def linked_file_dirs(parent)
        function linked_dir_parents (line 76) | def linked_dir_parents(parent)
        function join_paths (line 80) | def join_paths(parent, paths)
        function map_dirnames (line 84) | def map_dirnames(paths)

FILE: lib/capistrano/dsl/stages.rb
  type Capistrano (line 1) | module Capistrano
    type DSL (line 2) | module DSL
      type Stages (line 3) | module Stages
        function stages (line 7) | def stages
        function stage_definitions (line 13) | def stage_definitions
        function stage_set? (line 17) | def stage_set?
        function assert_valid_stage_names (line 23) | def assert_valid_stage_names(names)

FILE: lib/capistrano/dsl/task_enhancements.rb
  type Capistrano (line 3) | module Capistrano
    type TaskEnhancements (line 4) | module TaskEnhancements
      function before (line 5) | def before(task, prerequisite, *args, &block)
      function after (line 10) | def after(task, post_task, *args, &block)
      function define_remote_file_task (line 20) | def define_remote_file_task(task, target_roles)
      function ensure_stage (line 34) | def ensure_stage
      function tasks_without_stage_dependency (line 43) | def tasks_without_stage_dependency
      function default_tasks (line 47) | def default_tasks
      function exit_deploy_because_of_exception (line 51) | def exit_deploy_because_of_exception(ex)
      function deploying? (line 57) | def deploying?

FILE: lib/capistrano/immutable_task.rb
  type Capistrano (line 1) | module Capistrano
    type ImmutableTask (line 13) | module ImmutableTask
      function extended (line 14) | def self.extended(task)
      function enhance (line 18) | def enhance(*args, &block)

FILE: lib/capistrano/plugin.rb
  class Capistrano::Plugin (line 35) | class Capistrano::Plugin < Rake::TaskLib
    method set_defaults (line 47) | def set_defaults; end
    method register_hooks (line 59) | def register_hooks; end
    method define_tasks (line 79) | def define_tasks; end
    method eval_rakefile (line 86) | def eval_rakefile(path)
    method backend (line 92) | def backend

FILE: lib/capistrano/proc_helpers.rb
  type Capistrano (line 1) | module Capistrano
    type ProcHelpers (line 2) | module ProcHelpers
      function callable_without_parameters? (line 9) | def callable_without_parameters?(x)

FILE: lib/capistrano/scm.rb
  type Capistrano (line 1) | module Capistrano
    class SCM (line 10) | class SCM
      method initialize (line 19) | def initialize(context, strategy)
      method test! (line 26) | def test!(*args)
      method repo_url (line 31) | def repo_url
      method repo_path (line 36) | def repo_path
      method release_path (line 41) | def release_path
      method fetch (line 49) | def fetch(*args)
      method test (line 60) | def test
      method check (line 71) | def check
      method clone (line 81) | def clone
      method update (line 91) | def update
      method release (line 101) | def release
      method fetch_revision (line 111) | def fetch_revision

FILE: lib/capistrano/scm/git.rb
  class Capistrano::SCM::Git (line 8) | class Capistrano::SCM::Git < Capistrano::SCM::Plugin
    method set_defaults (line 9) | def set_defaults
    method register_hooks (line 26) | def register_hooks
    method define_tasks (line 33) | def define_tasks
    method repo_mirror_exists? (line 37) | def repo_mirror_exists?
    method check_repo_is_reachable (line 41) | def check_repo_is_reachable
    method clone_repo (line 45) | def clone_repo
    method update_mirror (line 53) | def update_mirror
    method verify_commit (line 65) | def verify_commit
    method archive_to_release_path (line 69) | def archive_to_release_path
    method fetch_revision (line 79) | def fetch_revision
    method fetch_revision_time (line 83) | def fetch_revision_time
    method git (line 87) | def git(*args)
    method git_repo_url (line 92) | def git_repo_url

FILE: lib/capistrano/scm/hg.rb
  class Capistrano::SCM::Hg (line 4) | class Capistrano::SCM::Hg < Capistrano::SCM::Plugin
    method register_hooks (line 5) | def register_hooks
    method define_tasks (line 11) | def define_tasks
    method hg (line 15) | def hg(*args)
    method repo_mirror_exists? (line 20) | def repo_mirror_exists?
    method check_repo_is_reachable (line 24) | def check_repo_is_reachable
    method clone_repo (line 28) | def clone_repo
    method update_mirror (line 32) | def update_mirror
    method archive_to_release_path (line 36) | def archive_to_release_path
    method fetch_revision (line 52) | def fetch_revision

FILE: lib/capistrano/scm/plugin.rb
  class Capistrano::SCM::Plugin (line 9) | class Capistrano::SCM::Plugin < Capistrano::Plugin
    method scm? (line 10) | def scm?

FILE: lib/capistrano/scm/svn.rb
  class Capistrano::SCM::Svn (line 3) | class Capistrano::SCM::Svn < Capistrano::SCM::Plugin
    method register_hooks (line 4) | def register_hooks
    method define_tasks (line 10) | def define_tasks
    method svn (line 14) | def svn(*args)
    method repo_mirror_exists? (line 22) | def repo_mirror_exists?
    method check_repo_is_reachable (line 26) | def check_repo_is_reachable
    method clone_repo (line 32) | def clone_repo
    method update_mirror (line 36) | def update_mirror
    method archive_to_release_path (line 43) | def archive_to_release_path
    method fetch_revision (line 47) | def fetch_revision
    method fetch_repo_mirror_url (line 51) | def fetch_repo_mirror_url

FILE: lib/capistrano/upload_task.rb
  type Capistrano (line 3) | module Capistrano
    class UploadTask (line 4) | class UploadTask < Rake::FileCreationTask
      method needed? (line 5) | def needed?

FILE: lib/capistrano/version.rb
  type Capistrano (line 1) | module Capistrano

FILE: lib/capistrano/version_validator.rb
  type Capistrano (line 1) | module Capistrano
    class VersionValidator (line 2) | class VersionValidator
      method initialize (line 3) | def initialize(version)
      method verify (line 7) | def verify
      method match? (line 16) | def match?
      method current_version (line 20) | def current_version
      method available (line 24) | def available
      method requested (line 28) | def requested

FILE: spec/lib/capistrano/application_spec.rb
  function flags (line 44) | def flags(*sets)
  function command_line (line 52) | def command_line(*options)

FILE: spec/lib/capistrano/configuration/empty_filter_spec.rb
  type Capistrano (line 3) | module Capistrano
    class Configuration (line 4) | class Configuration

FILE: spec/lib/capistrano/configuration/filter_spec.rb
  type Capistrano (line 3) | module Capistrano
    class Configuration (line 4) | class Configuration

FILE: spec/lib/capistrano/configuration/host_filter_spec.rb
  type Capistrano (line 3) | module Capistrano
    class Configuration (line 4) | class Configuration

FILE: spec/lib/capistrano/configuration/null_filter_spec.rb
  type Capistrano (line 3) | module Capistrano
    class Configuration (line 4) | class Configuration

FILE: spec/lib/capistrano/configuration/plugin_installer_spec.rb
  type Capistrano (line 5) | module Capistrano
    class Configuration (line 6) | class Configuration
      class ExamplePlugin (line 7) | class ExamplePlugin < Capistrano::Plugin
        method set_defaults (line 8) | def set_defaults
        method define_tasks (line 12) | def define_tasks
        method register_hooks (line 17) | def register_hooks
      class ExampleSCMPlugin (line 22) | class ExampleSCMPlugin < Capistrano::SCM::Plugin

FILE: spec/lib/capistrano/configuration/question_spec.rb
  type Capistrano (line 3) | module Capistrano
    class Configuration (line 4) | class Configuration

FILE: spec/lib/capistrano/configuration/role_filter_spec.rb
  type Capistrano (line 3) | module Capistrano
    class Configuration (line 4) | class Configuration

FILE: spec/lib/capistrano/configuration/scm_resolver_spec.rb
  type Capistrano (line 4) | module Capistrano
    class Configuration (line 5) | class Configuration

FILE: spec/lib/capistrano/configuration/server_spec.rb
  type Capistrano (line 3) | module Capistrano
    class Configuration (line 4) | class Configuration

FILE: spec/lib/capistrano/configuration/servers_spec.rb
  type Capistrano (line 3) | module Capistrano
    class Configuration (line 4) | class Configuration

FILE: spec/lib/capistrano/configuration_spec.rb
  type Capistrano (line 3) | module Capistrano
    function filter (line 311) | def filter.filter(servers)
    function filter (line 323) | def filter.filter(servers)

FILE: spec/lib/capistrano/doctor/environment_doctor_spec.rb
  type Capistrano (line 4) | module Capistrano
    type Doctor (line 5) | module Doctor

FILE: spec/lib/capistrano/doctor/gems_doctor_spec.rb
  type Capistrano (line 7) | module Capistrano
    type Doctor (line 8) | module Doctor

FILE: spec/lib/capistrano/doctor/output_helpers_spec.rb
  type Capistrano (line 4) | module Capistrano
    type Doctor (line 5) | module Doctor

FILE: spec/lib/capistrano/doctor/servers_doctor_spec.rb
  type Capistrano (line 4) | module Capistrano
    type Doctor (line 5) | module Doctor

FILE: spec/lib/capistrano/doctor/variables_doctor_spec.rb
  type Capistrano (line 4) | module Capistrano
    type Doctor (line 5) | module Doctor

FILE: spec/lib/capistrano/dsl/task_enhancements_spec.rb
  type Capistrano (line 3) | module Capistrano
    class DummyTaskEnhancements (line 4) | class DummyTaskEnhancements

FILE: spec/lib/capistrano/dsl_spec.rb
  type Capistrano (line 3) | module Capistrano
    class DummyDSL (line 4) | class DummyDSL

FILE: spec/lib/capistrano/immutable_task_spec.rb
  type Capistrano (line 5) | module Capistrano

FILE: spec/lib/capistrano/plugin_spec.rb
  type Capistrano (line 4) | module Capistrano
    class DummyPlugin (line 9) | class DummyPlugin < Capistrano::Plugin
      method define_tasks (line 10) | def define_tasks
      method register_hooks (line 15) | def register_hooks
    class ExternalTasksPlugin (line 20) | class ExternalTasksPlugin < Capistrano::Plugin
      method define_tasks (line 21) | def define_tasks
      method hello (line 28) | def hello

FILE: spec/lib/capistrano/scm/git_spec.rb
  type Capistrano (line 5) | module Capistrano

FILE: spec/lib/capistrano/scm/hg_spec.rb
  type Capistrano (line 5) | module Capistrano

FILE: spec/lib/capistrano/scm/svn_spec.rb
  type Capistrano (line 5) | module Capistrano

FILE: spec/lib/capistrano/scm_spec.rb
  type RaiseNotImplementedMacro (line 5) | module RaiseNotImplementedMacro
    function raise_not_implemented_on (line 6) | def raise_not_implemented_on(method)
  type DummyStrategy (line 19) | module DummyStrategy
    function test (line 20) | def test
  type BlindStrategy (line 25) | module BlindStrategy; end
  type Capistrano (line 27) | module Capistrano

FILE: spec/lib/capistrano/version_validator_spec.rb
  type Capistrano (line 3) | module Capistrano

FILE: spec/lib/capistrano_spec.rb
  type Capistrano (line 3) | module Capistrano

FILE: spec/support/test_app.rb
  type TestApp (line 6) | module TestApp
    function install (line 9) | def install
    function default_config (line 13) | def default_config
    function linked_files (line 27) | def linked_files
    function linked_file (line 31) | def linked_file
    function linked_dirs (line 35) | def linked_dirs
    function create_test_app (line 39) | def create_test_app
    function install_test_app_with (line 56) | def install_test_app_with(config)
    function write_local_deploy_file (line 64) | def write_local_deploy_file(config)
    function write_local_stage_file (line 70) | def write_local_stage_file(filename, config=nil)
    function append_to_deploy_file (line 76) | def append_to_deploy_file(config)
    function prepend_to_capfile (line 82) | def prepend_to_capfile(config)
    function create_shared_directory (line 90) | def create_shared_directory(path)
    function create_shared_file (line 94) | def create_shared_file(path)
    function cap (line 98) | def cap(task, subdirectory=nil)
    function run (line 102) | def run(command, subdirectory=nil)
    function stage (line 111) | def stage
    function test_stage_path (line 115) | def test_stage_path
    function test_app_path (line 119) | def test_app_path
    function deploy_to (line 123) | def deploy_to
    function shared_path (line 127) | def shared_path
    function current_path (line 131) | def current_path
    function releases_path (line 135) | def releases_path
    function release_path (line 139) | def release_path(t=timestamp)
    function timestamp (line 143) | def timestamp(offset=0)
    function repo_path (line 147) | def repo_path
    function path_to_cap (line 151) | def path_to_cap
    function gemfile (line 155) | def gemfile
    function capfile (line 159) | def capfile
    function current_user (line 163) | def current_user
    function task_dir (line 167) | def task_dir
    function copy_task_to_test_app (line 171) | def copy_task_to_test_app(source)
    function config_path (line 175) | def config_path
    function move_configuration_to_custom_location (line 179) | def move_configuration_to_custom_location(location)
    function git_wrapper_path_glob (line 192) | def git_wrapper_path_glob
    function with_clean_bundler_env (line 196) | def with_clean_bundler_env(&block)
Condensed preview — 219 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (784K chars).
[
  {
    "path": ".docker/Dockerfile",
    "chars": 174,
    "preview": "FROM ubuntu:22.04\nWORKDIR /provision\nCOPY ./ssh_key_rsa.pub /root/.ssh/authorized_keys\nCOPY ./ubuntu_setup.sh ./\nRUN ./u"
  },
  {
    "path": ".docker/ssh_key_rsa",
    "chars": 3381,
    "preview": "-----BEGIN OPENSSH PRIVATE KEY-----\nb3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAACFwAAAAdzc2gtcn\nNhAAAAAwEAAQA"
  },
  {
    "path": ".docker/ssh_key_rsa.pub",
    "chars": 742,
    "preview": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC6wVCoBOGYS5qfXZGiKjuh7RWExlzrQ1Gml8Z3DDCggSEibh1WXJU9+rNKTqHmVoGy36iarPfjsGWw3Ibi"
  },
  {
    "path": ".docker/ubuntu_setup.sh",
    "chars": 557,
    "preview": "#!/bin/bash\n\nset -e\n\nexport DEBIAN_FRONTEND=noninteractive\n\n# Create `deployer` user\nadduser --disabled-password deploye"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 455,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: bundler\n    directory: \"/\"\n    schedule:\n      interval: monthly\n      time: "
  },
  {
    "path": ".github/issue_template.md",
    "chars": 1052,
    "preview": "**Important:** GitHub issues are for feature requests or bug reports. The Capistrano team recommends you use [Stack Over"
  },
  {
    "path": ".github/pull_request_template.md",
    "chars": 736,
    "preview": "### Summary\n\n(Guidelines for creating a bug report are available\nhere: https://github.com/capistrano/capistrano/blob/mas"
  },
  {
    "path": ".github/release-drafter.yml",
    "chars": 653,
    "preview": "name-template: \"$RESOLVED_VERSION\"\ntag-template: \"v$RESOLVED_VERSION\"\ncategories:\n  - title: \"⚠️ Breaking Changes\"\n    l"
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 1752,
    "preview": "name: CI\non:\n  push:\n    branches: [master]\n  pull_request:\njobs:\n  spec:\n    runs-on: ubuntu-latest\n    strategy:\n     "
  },
  {
    "path": ".github/workflows/release-drafter.yml",
    "chars": 301,
    "preview": "name: Release Drafter\n\non:\n  push:\n    branches:\n      - master\n\npermissions:\n  contents: write\n  pull-requests: read\n\nj"
  },
  {
    "path": ".gitignore",
    "chars": 226,
    "preview": "*.gem\n*.rbc\n*.swp\n.bundle\n.config\n.rspec\n.rspec-local\n.ruby-version\n.yardoc\nGemfile.lock\nInstalledFiles\n_site\n_yardoc\nco"
  },
  {
    "path": ".rubocop.yml",
    "chars": 1512,
    "preview": "inherit_from: .rubocop_todo.yml\n\nAllCops:\n  DisplayCopNames: true\n  DisplayStyleGuide: true\n  NewCops: disable\n  Suggest"
  },
  {
    "path": ".rubocop_todo.yml",
    "chars": 8034,
    "preview": "# This configuration was generated by\n# `rubocop --auto-gen-config`\n# on 2025-11-29 04:19:34 UTC using RuboCop version 1"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 96,
    "preview": "Release notes for this project are kept here: https://github.com/capistrano/capistrano/releases\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 3511,
    "preview": "**Hello and welcome!** Please look over this document before opening an issue or submitting a pull request to Capistrano"
  },
  {
    "path": "DEVELOPMENT.md",
    "chars": 7199,
    "preview": "Thanks for helping build Capistrano! Here are the development practices followed by our community.\n\n* [Who can help](#wh"
  },
  {
    "path": "Gemfile",
    "chars": 191,
    "preview": "source \"https://rubygems.org\"\n\n# Specify your gem's dependencies in capistrano.gemspec\ngemspec\n\ngem \"cucumber\", \"~> 10.1"
  },
  {
    "path": "LICENSE.txt",
    "chars": 1093,
    "preview": "MIT License (MIT)\n\nCopyright (c) 2012-2020 Tom Clements, Lee Hambley\n\nPermission is hereby granted, free of charge, to a"
  },
  {
    "path": "README.md",
    "chars": 10657,
    "preview": "\n# Capistrano: A deployment automation tool built on Ruby, Rake, and SSH.\n\n[![Gem Version](https://badge.fury.io/rb/capi"
  },
  {
    "path": "RELEASING.md",
    "chars": 961,
    "preview": "# Releasing\n\n## Prerequisites\n\n* You must have commit rights to the Capistrano repository.\n* You must have push rights f"
  },
  {
    "path": "Rakefile",
    "chars": 551,
    "preview": "require \"bundler/gem_tasks\"\nrequire \"rspec/core/rake_task\"\n\nbegin\n  require \"rubocop/rake_task\"\n  desc \"Run RuboCop chec"
  },
  {
    "path": "UPGRADING-3.7.md",
    "chars": 2575,
    "preview": "# Capistrano 3.7.0 upgrade guide\n\n## The :scm variable is deprecated\n\nUp until now, Capistrano's SCM was configured usin"
  },
  {
    "path": "bin/cap",
    "chars": 77,
    "preview": "#!/usr/bin/env ruby\nrequire \"capistrano/all\"\nCapistrano::Application.new.run\n"
  },
  {
    "path": "bin/capify",
    "chars": 242,
    "preview": "#!/usr/bin/env ruby\nputs \"-\" * 80\nputs \"Capistrano 3.x is incompatible with Capistrano 2.x. \"\nputs\nputs \"This command ha"
  },
  {
    "path": "capistrano.gemspec",
    "chars": 1458,
    "preview": "# -*- encoding: utf-8 -*-\n\nlib = File.expand_path(\"../lib\", __FILE__)\n$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?"
  },
  {
    "path": "docker-compose.yml",
    "chars": 105,
    "preview": "name: capistrano\n\nservices:\n  ssh_server:\n    build:\n      context: .docker\n    ports:\n      - \"2022:22\"\n"
  },
  {
    "path": "docs/CNAME",
    "chars": 17,
    "preview": "capistranorb.com\n"
  },
  {
    "path": "docs/Gemfile",
    "chars": 204,
    "preview": "source \"https://rubygems.org\"\n\n# keep versions up-to-date with the actual GitHub Pages setup\n# https://pages.github.com/"
  },
  {
    "path": "docs/README.md",
    "chars": 826,
    "preview": "# capistranorb.com\n\nThis `docs/` directory generates the [capistranorb.com](https://capistranorb.com/) site. Feel free t"
  },
  {
    "path": "docs/_config.yml",
    "chars": 160,
    "preview": "name: Capistrano\nkramdown:\n  input: GFM\n  hard_wrap: false\nhighlighter: rouge\nsafe: true\nlsi: false\nexclude: [\"Gemfile\","
  },
  {
    "path": "docs/_includes/carbon.html",
    "chars": 154,
    "preview": "<script async type=\"text/javascript\" src=\"//cdn.carbonads.com/carbon.js?zoneid=1673&serve=C6AILKT&placement=capistranorb"
  },
  {
    "path": "docs/_includes/footer.html",
    "chars": 1338,
    "preview": "<footer>\n  <div class=\"row\">\n    <div class=\"large-4 columns\">\n      <ul>\n        <li><a href=\"/documentation/overview/w"
  },
  {
    "path": "docs/_includes/google_tag_manager.html",
    "chars": 570,
    "preview": "<!-- Google Tag Manager -->\n<noscript>\n  <iframe src=\"//www.googletagmanager.com/ns.html?id=GTM-KLDBJG\" height=\"0\" width"
  },
  {
    "path": "docs/_includes/header.html",
    "chars": 331,
    "preview": "<div class=\"header\">\n  <div class=\"row\">\n    <div class=\"large-12 column\">\n      <a href=\"/\" class=\"brand\">\n        <img"
  },
  {
    "path": "docs/_includes/metrics.html",
    "chars": 1223,
    "preview": "<script type=\"text/javascript\">\n  var _gauges = _gauges || [];\n  (function() {\n    var t   = document.createElement('scr"
  },
  {
    "path": "docs/_includes/navigation.html",
    "chars": 4701,
    "preview": "<ul class=\"side-nav\">\n\n  <h5>Search</h5>\n  <form action=\"https://www.google.com/search\" method=\"get\">\n    <input type=\"h"
  },
  {
    "path": "docs/_layouts/default.html",
    "chars": 2059,
    "preview": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrom"
  },
  {
    "path": "docs/_layouts/post.html",
    "chars": 115,
    "preview": "---\nlayout: default\n---\n<p class=\"meta\">{{ page.date | date_to_string }}</p>\n\n<div id=\"post\">\n{{ content }}\n</div>\n"
  },
  {
    "path": "docs/_posts/2013-06-01-release-announcement.markdown",
    "chars": 23948,
    "preview": "---\nlayout: post\ntitle: \"Capistrano Version 3 Release Announcement\"\ndate:   2013-06-01\n---\n\nAfter what seems like years "
  },
  {
    "path": "docs/assets/browserconfig.xml",
    "chars": 245,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<browserconfig>\n    <msapplication>\n        <tile>\n            <square150x150logo"
  },
  {
    "path": "docs/assets/css/capistrano.css",
    "chars": 1546,
    "preview": "body {\n  font-family: \"proxima-nova\",sans-serif;\n}\n\n#carbonads img {\n  float: left;\n  margin-right: 1em;\n}\n\n#carbonads ."
  },
  {
    "path": "docs/assets/css/dreamweaver.css",
    "chars": 2027,
    "preview": "/**\n * Dreamweaver theme\n *\n * @author Sean Coker\n * @url http://seancoker.com\n * @version 1.0\n */\n\npre {\n    /* origina"
  },
  {
    "path": "docs/assets/css/foundation.css",
    "chars": 132698,
    "preview": "*,\n*:before,\n*:after {\n  -moz-box-sizing: border-box;\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box; }\n\nhtm"
  },
  {
    "path": "docs/assets/css/github.css",
    "chars": 1473,
    "preview": "/**\n * GitHub theme\n *\n * @author Craig Campbell\n * @version 1.0.4\n */\npre {\n    border: 1px solid #ccc;\n    word-wrap: "
  },
  {
    "path": "docs/assets/css/monokai.css",
    "chars": 4075,
    "preview": "// A modified version of https://raw.githubusercontent.com/richleland/pygments-css/master/monokai.css\n\n.highlighter-roug"
  },
  {
    "path": "docs/assets/css/normalize.css",
    "chars": 7589,
    "preview": "/*! normalize.css v2.1.1 | MIT License | git.io/normalize */\n\n/* ======================================================="
  },
  {
    "path": "docs/assets/css/social_foundicons.css",
    "chars": 2355,
    "preview": "/* font-face */\n@font-face {\n  font-family: \"SocialFoundicons\";\n  src: url(\"../fonts/social_foundicons.eot\");\n  src: url"
  },
  {
    "path": "docs/assets/css/social_foundicons_ie7.css",
    "chars": 3352,
    "preview": "/* general icons for IE7 */\n[class*=\"foundicon-\"] {\n  font-family: \"SocialFoundicons\";\n  font-weight: normal;\n  font-sty"
  },
  {
    "path": "docs/assets/css/syntax.css",
    "chars": 3753,
    "preview": ".highlight  { background: #ffffff; padding: 10px; }\n.highlight .c { color: #999988; font-style: italic } /* Comment */\n."
  },
  {
    "path": "docs/assets/js/foundation/foundation.alerts.js",
    "chars": 1186,
    "preview": "/*jslint unparam: true, browser: true, indent: 2 */\n\n;(function ($, window, document, undefined) {\n  'use strict';\n\n  Fo"
  },
  {
    "path": "docs/assets/js/foundation/foundation.clearing.js",
    "chars": 14871,
    "preview": "/*jslint unparam: true, browser: true, indent: 2 */\n\n;(function ($, window, document, undefined) {\n  'use strict';\n\n  Fo"
  },
  {
    "path": "docs/assets/js/foundation/foundation.cookie.js",
    "chars": 2008,
    "preview": "/*!\n * jQuery Cookie Plugin v1.3\n * https://github.com/carhartl/jquery-cookie\n *\n * Copyright 2011, Klaus Hartl\n * Dual "
  },
  {
    "path": "docs/assets/js/foundation/foundation.dropdown.js",
    "chars": 5407,
    "preview": "/*jslint unparam: true, browser: true, indent: 2 */\n\n;(function ($, window, document, undefined) {\n  'use strict';\n\n  Fo"
  },
  {
    "path": "docs/assets/js/foundation/foundation.forms.js",
    "chars": 17678,
    "preview": "(function ($, window, document, undefined) {\n  'use strict';\n\n  Foundation.libs.forms = {\n    name: 'forms',\n\n    versio"
  },
  {
    "path": "docs/assets/js/foundation/foundation.interchange.js",
    "chars": 6810,
    "preview": "/*jslint unparam: true, browser: true, indent: 2 */\n\n;(function ($, window, document, undefined) {\n  'use strict';\n\n  Fo"
  },
  {
    "path": "docs/assets/js/foundation/foundation.joyride.js",
    "chars": 26523,
    "preview": "/*jslint unparam: true, browser: true, indent: 2 */\n\n(function ($, window, document, undefined) {\n  'use strict';\n\n  Fou"
  },
  {
    "path": "docs/assets/js/foundation/foundation.js",
    "chars": 11897,
    "preview": "/*\n * Foundation Responsive Library\n * http://foundation.zurb.com\n * Copyright 2013, ZURB\n * Free to use under the MIT l"
  },
  {
    "path": "docs/assets/js/foundation/foundation.magellan.js",
    "chars": 4842,
    "preview": "/*jslint unparam: true, browser: true, indent: 2 */\n\n;(function ($, window, document, undefined) {\n  'use strict';\n\n  Fo"
  },
  {
    "path": "docs/assets/js/foundation/foundation.orbit.js",
    "chars": 15454,
    "preview": ";(function ($, window, document, undefined) {\n  'use strict';\n\n  Foundation.libs = Foundation.libs || {};\n\n  Foundation."
  },
  {
    "path": "docs/assets/js/foundation/foundation.placeholder.js",
    "chars": 4993,
    "preview": "/*! http://mths.be/placeholder v2.0.7 by @mathias \n\tModified to work with Zepto.js by ZURB\n*/\n;(function(window, documen"
  },
  {
    "path": "docs/assets/js/foundation/foundation.reveal.js",
    "chars": 9638,
    "preview": "/*jslint unparam: true, browser: true, indent: 2 */\n\n;(function ($, window, document, undefined) {\n  'use strict';\n\n  Fo"
  },
  {
    "path": "docs/assets/js/foundation/foundation.section.js",
    "chars": 13237,
    "preview": "/*jslint unparam: true, browser: true, indent: 2 */\n\n;(function ($, window, document, undefined) {\n  'use strict';\n\n  Fo"
  },
  {
    "path": "docs/assets/js/foundation/foundation.tooltips.js",
    "chars": 7180,
    "preview": "/*jslint unparam: true, browser: true, indent: 2 */\n\n;(function ($, window, document, undefined) {\n  'use strict';\n\n  Fo"
  },
  {
    "path": "docs/assets/js/foundation/foundation.topbar.js",
    "chars": 9619,
    "preview": "/*jslint unparam: true, browser: true, indent: 2 */\n\n;(function ($, window, document, undefined) {\n  'use strict';\n\n  Fo"
  },
  {
    "path": "docs/assets/js/jquery.cookie.js",
    "chars": 3140,
    "preview": "/*!\n * jQuery Cookie Plugin v1.4.1\n * https://github.com/carhartl/jquery-cookie\n *\n * Copyright 2006, 2014 Klaus Hartl\n "
  },
  {
    "path": "docs/assets/site.webmanifest",
    "chars": 444,
    "preview": "{\n    \"name\": \"Capistrano\",\n    \"short_name\": \"Capistrano\",\n    \"icons\": [\n        {\n            \"src\": \"android-chrome-"
  },
  {
    "path": "docs/documentation/advanced-features/console/index.markdown",
    "chars": 1156,
    "preview": "---\ntitle: Console\nlayout: default\n---\n\n**Note:** Here be dragons. The console is very immature, but it's much more\nclea"
  },
  {
    "path": "docs/documentation/advanced-features/custom-filters/index.markdown",
    "chars": 2985,
    "preview": "---\ntitle: Custom Filters\nlayout: default\n---\n\nCustom filters (specifically, Custom On-Filters) limit the hosts that are"
  },
  {
    "path": "docs/documentation/advanced-features/custom-scm/index.markdown",
    "chars": 4317,
    "preview": "---\ntitle: Custom SCM\nlayout: default\n---\n\nCapistrano uses what it calls \"SCM plugins\" (Source Code Management), to depl"
  },
  {
    "path": "docs/documentation/advanced-features/filtering/index.markdown",
    "chars": 3097,
    "preview": "---\ntitle: Filtering\nlayout: default\n---\n\nFiltering is the term given to reducing the entire set of servers declared in "
  },
  {
    "path": "docs/documentation/advanced-features/host-filtering/index.markdown",
    "chars": 2231,
    "preview": "---\ntitle: Host filtering\nlayout: default\n---\n\nYou may encounter situations where you only want to deploy to a subset of"
  },
  {
    "path": "docs/documentation/advanced-features/ignoring/index.markdown",
    "chars": 967,
    "preview": "---\ntitle: Ignoring\nlayout: default\n---\n\nFiles committed to version control (i.e. not in .gitignore) can still be ignore"
  },
  {
    "path": "docs/documentation/advanced-features/overriding-capistrano-tasks/index.markdown",
    "chars": 1462,
    "preview": "---\ntitle: Overriding Capistrano tasks\nlayout: default\n---\n\nWhen re-defining a task in Capistrano v2, the original task "
  },
  {
    "path": "docs/documentation/advanced-features/properties/index.markdown",
    "chars": 8508,
    "preview": "---\ntitle: Properties\nlayout: default\n---\n\nServer objects in Capistrano essentially consist of a name and a hash: The na"
  },
  {
    "path": "docs/documentation/advanced-features/property-filtering/index.markdown",
    "chars": 1937,
    "preview": "---\ntitle: Property Filtering\nlayout: default\n---\n\nOptions may be passed to the `roles()` method (and implicitly in meth"
  },
  {
    "path": "docs/documentation/advanced-features/ptys/index.markdown",
    "chars": 1227,
    "preview": "---\ntitle: PTYs\nlayout: default\n---\n\nThere is a configuration option which asks the backend driver to ask the\nremote hos"
  },
  {
    "path": "docs/documentation/advanced-features/remote-file/index.markdown",
    "chars": 795,
    "preview": "---\ntitle: Remote file task\nlayout: default\n---\n\n**Warning: `remote_file` is deprecated and was removed in Capistrano 3."
  },
  {
    "path": "docs/documentation/advanced-features/role-filtering/index.markdown",
    "chars": 2110,
    "preview": "---\ntitle: Role filtering\nlayout: default\n---\n\nYou may have situations where you only want to deploy to servers matching"
  },
  {
    "path": "docs/documentation/advanced-features/ssh-kit/index.markdown",
    "chars": 966,
    "preview": "---\ntitle: Remote commands with SSH Kit\nlayout: default\n---\n\nCapistrano executes commands on remote servers using [**SSH"
  },
  {
    "path": "docs/documentation/advanced-features/validation-of-variables/index.markdown",
    "chars": 395,
    "preview": "---\nlayout: default\ntitle: Validation of variables\n---\n\nTo validate a variable, each time before it is set, define a val"
  },
  {
    "path": "docs/documentation/faq/how-can-i-access-stage-configuration-variables/index.markdown",
    "chars": 1964,
    "preview": "---\ntitle: How can I access stage configuration variables?\nlayout: default\n---\n\nConfiguration variables are accessed wit"
  },
  {
    "path": "docs/documentation/faq/how-can-i-check-for-existing-remote-file/index.markdown",
    "chars": 230,
    "preview": "---\ntitle: How can I check for existing remote file?\nlayout: default\n---\n\nThe `test` method is best used for file checki"
  },
  {
    "path": "docs/documentation/faq/how-can-i-get-capistrano-to-prompt-for-a-password/index.markdown",
    "chars": 410,
    "preview": "---\ntitle: How can I get Capistrano to prompt for a password?\nlayout: default\n---\n\nPassword authentication can be done v"
  },
  {
    "path": "docs/documentation/faq/how-can-i-set-capistrano-configuration-paths/index.markdown",
    "chars": 1142,
    "preview": "---\ntitle: How can I set Capistrano configuration paths?\nlayout: default\n---\n\nCapistrano `config` and `tasks` paths can "
  },
  {
    "path": "docs/documentation/faq/why-does-something-work-in-my-ssh-session-but-not-in-capistrano/index.markdown",
    "chars": 4669,
    "preview": "---\ntitle: Why does something work in my SSH session, but not in Capistrano?\nlayout: default\n---\n\nThis is possibly one o"
  },
  {
    "path": "docs/documentation/getting-started/authentication-and-authorisation/index.markdown",
    "chars": 16043,
    "preview": "---\ntitle: Authentication & Authorisation\nlayout: default\n---\n\n**Note:** In the documentation we simply recommend creati"
  },
  {
    "path": "docs/documentation/getting-started/before-after/index.markdown",
    "chars": 991,
    "preview": "---\ntitle: Before / After Hooks\nlayout: default\n---\n\nWhere calling on the same task name, executed in order of inclusion"
  },
  {
    "path": "docs/documentation/getting-started/cold-start/index.markdown",
    "chars": 8386,
    "preview": "---\ntitle: Cold Start\nlayout: default\n---\n\nAt this point we should have a deploy user on all the servers we intend to\nde"
  },
  {
    "path": "docs/documentation/getting-started/configuration/index.markdown",
    "chars": 6244,
    "preview": "---\ntitle: Configuration\nlayout: default\n---\n\n## Location\n\nConfiguration variables can be either global or specific to y"
  },
  {
    "path": "docs/documentation/getting-started/flow/index.markdown",
    "chars": 2629,
    "preview": "---\ntitle: Flow\nlayout: default\n---\n\nCapistrano v3 provides a default **deploy flow** and a **rollback flow**:\n\n### Depl"
  },
  {
    "path": "docs/documentation/getting-started/installation/index.markdown",
    "chars": 3735,
    "preview": "---\ntitle: Installation\nlayout: default\n---\n\nCapistrano is bundled as a Ruby Gem. **It requires Ruby 2.0 or newer.**\n\nCa"
  },
  {
    "path": "docs/documentation/getting-started/local-tasks/index.markdown",
    "chars": 659,
    "preview": "---\ntitle: Local Tasks\nlayout: default\n---\n\nLocal tasks can be run by replacing `on` with `run_locally`:\n\n```ruby\ndesc '"
  },
  {
    "path": "docs/documentation/getting-started/preparing-your-application/index.markdown",
    "chars": 7664,
    "preview": "---\ntitle: Preparing Your Application\nlayout: default\n---\n\n<p class=\"alert-box\">\n  This will focus on preparing a Rails "
  },
  {
    "path": "docs/documentation/getting-started/rollbacks/index.markdown",
    "chars": 3427,
    "preview": "---\ntitle: Rollbacks\nlayout: default\n---\n\nIn the majority of failed deployment situations, it probably makes more sense "
  },
  {
    "path": "docs/documentation/getting-started/structure/index.markdown",
    "chars": 1984,
    "preview": "---\ntitle: Structure\nlayout: default\n---\n\nCapistrano uses a strictly defined directory hierarchy on each remote server t"
  },
  {
    "path": "docs/documentation/getting-started/tasks/index.markdown",
    "chars": 1341,
    "preview": "---\ntitle: Tasks\nlayout: default\n---\n\n```ruby\nserver 'example.com', roles: [:web, :app]\nserver 'example.org', roles: [:d"
  },
  {
    "path": "docs/documentation/getting-started/user-input/index.markdown",
    "chars": 1620,
    "preview": "---\ntitle: User Input\nlayout: default\n---\n\nUser input can be required in a task or during configuration:\n\n```ruby\n# used"
  },
  {
    "path": "docs/documentation/getting-started/version-locking/index.markdown",
    "chars": 1942,
    "preview": "---\ntitle: Version Locking\nlayout: default\n---\n\nCapistrano will, by default, include a `lock` command at the top of `dep"
  },
  {
    "path": "docs/documentation/harrow/index.markdown",
    "chars": 2020,
    "preview": "---\ntitle: What is Harrow?\nlayout: default\n---\n\n### Harrow is a web-based platform for continuous integration and deploy"
  },
  {
    "path": "docs/documentation/overview/what-is-capistrano/index.markdown",
    "chars": 2794,
    "preview": "---\ntitle: What is Capistrano?\nlayout: default\n---\n\n### Capistrano is a remote server automation tool.\n\nIt supports the "
  },
  {
    "path": "docs/documentation/plugins/index.markdown",
    "chars": 903,
    "preview": "---\ntitle: Official Plugins\nlayout: default\n---\n\nThis is the list of official Capistrano Plugins.\n\n<ul>\n  <li><a href=\"h"
  },
  {
    "path": "docs/documentation/tasks/intro/index.markdown",
    "chars": 545,
    "preview": "---\ntitle: Task Cookbook\nlayout: default\n---\n\nThese pages document common custom tasks for specific use cases. It is hop"
  },
  {
    "path": "docs/documentation/tasks/rails/index.markdown",
    "chars": 1421,
    "preview": "---\ntitle: Custom Rails Tasks\nlayout: default\n---\n\nMany of these tasks probably require [Capistrano::Rails](https://gith"
  },
  {
    "path": "docs/documentation/third-party-plugins/index.markdown",
    "chars": 2328,
    "preview": "---\ntitle: 3rd Party Plugins\nlayout: default\n---\n\nHere are some Capistrano plugins you might find useful.\nThis list is n"
  },
  {
    "path": "docs/documentation/upgrading/index.markdown",
    "chars": 4435,
    "preview": "---\ntitle: \"Upgrading from v2.x.x\"\nlayout: default\n---\n\n1.\nUpdate your Gemfile: `gem 'capistrano', '~> 3.0', require: fa"
  },
  {
    "path": "docs/index.markdown",
    "chars": 727,
    "preview": "---\nlayout: default\ntitle: A remote server automation and deployment tool written in Ruby.\n---\n\n### A Simple Task\n\n```ru"
  },
  {
    "path": "features/configuration.feature",
    "chars": 1031,
    "preview": "Feature: The path to the configuration can be changed, removing the need to\n  follow Ruby/Rails conventions\n\n  Backgroun"
  },
  {
    "path": "features/deploy.feature",
    "chars": 3383,
    "preview": "Feature: Deploy\n\n  Background:\n    Given a test app with the default configuration\n    And servers with the roles app an"
  },
  {
    "path": "features/deploy_failure.feature",
    "chars": 513,
    "preview": "Feature: Deploy failure\n\n  Background:\n    Given a test app with the default configuration\n    And a custom task that wi"
  },
  {
    "path": "features/doctor.feature",
    "chars": 306,
    "preview": "Feature: Doctor\n\n  Background:\n    Given a test app with the default configuration\n\n  Scenario: Running the doctor task\n"
  },
  {
    "path": "features/installation.feature",
    "chars": 632,
    "preview": "Feature: Installation\n\n  Background:\n    Given a test app without any configuration\n\n  Scenario: The \"install\" task docu"
  },
  {
    "path": "features/sshconnect.feature",
    "chars": 386,
    "preview": "Feature: SSH Connection\n\n  Background:\n    Given a test app with the default configuration\n    And servers with the role"
  },
  {
    "path": "features/stage_failure.feature",
    "chars": 207,
    "preview": "Feature: Stage failure\n\n  Background:\n    Given a test app with the default configuration\n    And a stage file named dep"
  },
  {
    "path": "features/step_definitions/assertions.rb",
    "chars": 5058,
    "preview": "require \"shellwords\"\n\nThen(/^references in the remote repo are listed$/) do\n  expect(@output).to include(\"refs/heads/mas"
  },
  {
    "path": "features/step_definitions/cap_commands.rb",
    "chars": 602,
    "preview": "When(/^I run cap \"(.*?)\"$/) do |task|\n  @success, @output = TestApp.cap(task)\nend\n\nWhen(/^I run cap \"(.*?)\" within the \""
  },
  {
    "path": "features/step_definitions/setup.rb",
    "chars": 2696,
    "preview": "Given(/^a test app with the default configuration$/) do\n  TestApp.install\nend\n\nGiven(/^a test app without any configurat"
  },
  {
    "path": "features/subdirectory.feature",
    "chars": 325,
    "preview": "Feature: cap can be run from a subdirectory, and will still find the Capfile\n\n  Background:\n    Given a test app with th"
  },
  {
    "path": "features/support/docker_gateway.rb",
    "chars": 1208,
    "preview": "# Ensure Docker container is completely stopped when Ruby exits.\nat_exit do\n  DockerGateway.new.stop\nend\n\n# Manages the "
  },
  {
    "path": "features/support/env.rb",
    "chars": 47,
    "preview": "require_relative \"../../spec/support/test_app\"\n"
  },
  {
    "path": "features/support/remote_command_helpers.rb",
    "chars": 539,
    "preview": "module RemoteCommandHelpers\n  def test_dir_exists(path)\n    exists?(\"d\", path)\n  end\n\n  def test_symlink_exists(path)\n  "
  },
  {
    "path": "features/support/remote_ssh_helpers.rb",
    "chars": 749,
    "preview": "require \"open3\"\nrequire \"socket\"\nrequire_relative \"docker_gateway\"\n\nmodule RemoteSSHHelpers\n  extend self\n\n  class Remot"
  },
  {
    "path": "gemfiles/legacy.gemfile",
    "chars": 152,
    "preview": "source \"https://rubygems.org\"\n\n# Specify your gem's dependencies in capistrano.gemspec\ngemspec path: \"..\"\n\ngem \"mocha\", "
  },
  {
    "path": "lib/Capfile",
    "chars": 72,
    "preview": "#!/usr/bin/env cap\ninclude Capistrano::DSL\nrequire \"capistrano/install\"\n"
  },
  {
    "path": "lib/capistrano/all.rb",
    "chars": 352,
    "preview": "require \"rake\"\nrequire \"sshkit\"\n\nrequire \"io/console\"\n\nRake.application.options.trace = true\n\nrequire \"capistrano/versio"
  },
  {
    "path": "lib/capistrano/application.rb",
    "chars": 4112,
    "preview": "module Capistrano\n  class Application < Rake::Application\n    def initialize\n      super\n      @rakefiles = %w{capfile C"
  },
  {
    "path": "lib/capistrano/configuration/empty_filter.rb",
    "chars": 128,
    "preview": "module Capistrano\n  class Configuration\n    class EmptyFilter\n      def filter(_servers)\n        []\n      end\n    end\n  "
  },
  {
    "path": "lib/capistrano/configuration/filter.rb",
    "chars": 865,
    "preview": "require \"capistrano/configuration\"\nrequire \"capistrano/configuration/empty_filter\"\nrequire \"capistrano/configuration/hos"
  },
  {
    "path": "lib/capistrano/configuration/host_filter.rb",
    "chars": 695,
    "preview": "module Capistrano\n  class Configuration\n    class HostFilter\n      def initialize(values)\n        av = Array(values).dup"
  },
  {
    "path": "lib/capistrano/configuration/null_filter.rb",
    "chars": 131,
    "preview": "module Capistrano\n  class Configuration\n    class NullFilter\n      def filter(servers)\n        servers\n      end\n    end"
  },
  {
    "path": "lib/capistrano/configuration/plugin_installer.rb",
    "chars": 1612,
    "preview": "# Encapsulates the logic for installing plugins into Capistrano. Plugins must\n# simply conform to a basic API; the Plugi"
  },
  {
    "path": "lib/capistrano/configuration/question.rb",
    "chars": 1590,
    "preview": "module Capistrano\n  class Configuration\n    class Question\n      def initialize(key, default, options={})\n        @key ="
  },
  {
    "path": "lib/capistrano/configuration/role_filter.rb",
    "chars": 683,
    "preview": "module Capistrano\n  class Configuration\n    class RoleFilter\n      def initialize(values)\n        av = Array(values).dup"
  },
  {
    "path": "lib/capistrano/configuration/scm_resolver.rb",
    "chars": 4727,
    "preview": "module Capistrano\n  class Configuration\n    # In earlier versions of Capistrano, users would specify the desired SCM\n   "
  },
  {
    "path": "lib/capistrano/configuration/server.rb",
    "chars": 2829,
    "preview": "require \"set\"\nmodule Capistrano\n  class Configuration\n    class Server < SSHKit::Host\n      extend Forwardable\n      def"
  },
  {
    "path": "lib/capistrano/configuration/servers.rb",
    "chars": 2198,
    "preview": "require \"set\"\nrequire \"capistrano/configuration\"\nrequire \"capistrano/configuration/filter\"\n\nmodule Capistrano\n  class Co"
  },
  {
    "path": "lib/capistrano/configuration/validated_variables.rb",
    "chars": 3526,
    "preview": "require \"capistrano/proc_helpers\"\nrequire \"delegate\"\n\nmodule Capistrano\n  class Configuration\n    # Decorates a Variable"
  },
  {
    "path": "lib/capistrano/configuration/variables.rb",
    "chars": 2912,
    "preview": "require \"capistrano/proc_helpers\"\n\nmodule Capistrano\n  class Configuration\n    # Holds the variables assigned at Capistr"
  },
  {
    "path": "lib/capistrano/configuration.rb",
    "chars": 4918,
    "preview": "require_relative \"configuration/filter\"\nrequire_relative \"configuration/question\"\nrequire_relative \"configuration/plugin"
  },
  {
    "path": "lib/capistrano/console.rb",
    "chars": 57,
    "preview": "load File.expand_path(\"../tasks/console.rake\", __FILE__)\n"
  },
  {
    "path": "lib/capistrano/defaults.rb",
    "chars": 1235,
    "preview": "validate :application do |_key, value|\n  changed_value = value.gsub(/[^A-Z0-9\\.\\-]/i, \"_\")\n  if value != changed_value\n "
  },
  {
    "path": "lib/capistrano/deploy.rb",
    "chars": 88,
    "preview": "require \"capistrano/framework\"\n\nload File.expand_path(\"../tasks/deploy.rake\", __FILE__)\n"
  },
  {
    "path": "lib/capistrano/doctor/environment_doctor.rb",
    "chars": 480,
    "preview": "require \"capistrano/doctor/output_helpers\"\n\nmodule Capistrano\n  module Doctor\n    class EnvironmentDoctor\n      include "
  },
  {
    "path": "lib/capistrano/doctor/gems_doctor.rb",
    "chars": 1193,
    "preview": "require \"capistrano/doctor/output_helpers\"\n\nmodule Capistrano\n  module Doctor\n    # Prints table of all Capistrano-relat"
  },
  {
    "path": "lib/capistrano/doctor/output_helpers.rb",
    "chars": 2266,
    "preview": "module Capistrano\n  module Doctor\n    # Helper methods for pretty-printing doctor output to stdout. All output\n    # (ot"
  },
  {
    "path": "lib/capistrano/doctor/servers_doctor.rb",
    "chars": 2507,
    "preview": "require \"capistrano/doctor/output_helpers\"\n\nmodule Capistrano\n  module Doctor\n    class ServersDoctor\n      include Capi"
  },
  {
    "path": "lib/capistrano/doctor/variables_doctor.rb",
    "chars": 1930,
    "preview": "require \"capistrano/doctor/output_helpers\"\n\nmodule Capistrano\n  module Doctor\n    # Prints a table of all Capistrano var"
  },
  {
    "path": "lib/capistrano/doctor.rb",
    "chars": 232,
    "preview": "require \"capistrano/doctor/environment_doctor\"\nrequire \"capistrano/doctor/gems_doctor\"\nrequire \"capistrano/doctor/variab"
  },
  {
    "path": "lib/capistrano/dotfile.rb",
    "chars": 86,
    "preview": "dotfile = Pathname.new(File.join(Dir.home, \".capfile\"))\nload dotfile if dotfile.file?\n"
  },
  {
    "path": "lib/capistrano/dsl/env.rb",
    "chars": 1037,
    "preview": "require \"forwardable\"\n\nmodule Capistrano\n  module DSL\n    module Env\n      extend Forwardable\n      def_delegators :env,"
  },
  {
    "path": "lib/capistrano/dsl/paths.rb",
    "chars": 1908,
    "preview": "require \"pathname\"\nmodule Capistrano\n  module DSL\n    module Paths\n      def deploy_to\n        fetch(:deploy_to)\n      e"
  },
  {
    "path": "lib/capistrano/dsl/stages.rb",
    "chars": 730,
    "preview": "module Capistrano\n  module DSL\n    module Stages\n      RESERVED_NAMES = %w(deploy doctor install).freeze\n      private_c"
  },
  {
    "path": "lib/capistrano/dsl/task_enhancements.rb",
    "chars": 1584,
    "preview": "require \"capistrano/upload_task\"\n\nmodule Capistrano\n  module TaskEnhancements\n    def before(task, prerequisite, *args, "
  },
  {
    "path": "lib/capistrano/dsl.rb",
    "chars": 3218,
    "preview": "require \"capistrano/dsl/task_enhancements\"\nrequire \"capistrano/dsl/paths\"\nrequire \"capistrano/dsl/stages\"\nrequire \"capis"
  },
  {
    "path": "lib/capistrano/framework.rb",
    "chars": 88,
    "preview": "load File.expand_path(\"../tasks/framework.rake\", __FILE__)\nrequire \"capistrano/install\"\n"
  },
  {
    "path": "lib/capistrano/i18n.rb",
    "chars": 2069,
    "preview": "require \"i18n\"\n\nen = {\n  starting: \"Starting\",\n  capified: \"Capified\",\n  start: \"Start\",\n  update: \"Update\",\n  finalize:"
  },
  {
    "path": "lib/capistrano/immutable_task.rb",
    "chars": 964,
    "preview": "module Capistrano\n  # This module extends a Rake::Task to freeze it to prevent it from being\n  # enhanced. This is used "
  },
  {
    "path": "lib/capistrano/install.rb",
    "chars": 79,
    "preview": "load File.expand_path(File.join(File.dirname(__FILE__), \"tasks/install.rake\"))\n"
  },
  {
    "path": "lib/capistrano/plugin.rb",
    "chars": 2925,
    "preview": "require \"capistrano/all\"\nrequire \"rake/tasklib\"\n\n# IMPORTANT: The Capistrano::Plugin system is not yet considered a stab"
  },
  {
    "path": "lib/capistrano/proc_helpers.rb",
    "chars": 449,
    "preview": "module Capistrano\n  module ProcHelpers\n    module_function\n\n    # Tests whether the given object appears to respond to `"
  },
  {
    "path": "lib/capistrano/scm/git.rb",
    "chars": 3066,
    "preview": "require \"capistrano/scm/plugin\"\nrequire \"cgi\"\nrequire \"securerandom\"\nrequire \"shellwords\"\nrequire \"stringio\"\nrequire \"ur"
  },
  {
    "path": "lib/capistrano/scm/hg.rb",
    "chars": 1379,
    "preview": "require \"capistrano/scm/plugin\"\nrequire \"securerandom\"\n\nclass Capistrano::SCM::Hg < Capistrano::SCM::Plugin\n  def regist"
  },
  {
    "path": "lib/capistrano/scm/plugin.rb",
    "chars": 423,
    "preview": "require \"capistrano/plugin\"\nrequire \"capistrano/scm\"\n\n# Base class for all built-in and third-party SCM plugins. Notice "
  },
  {
    "path": "lib/capistrano/scm/svn.rb",
    "chars": 1604,
    "preview": "require \"capistrano/scm/plugin\"\n\nclass Capistrano::SCM::Svn < Capistrano::SCM::Plugin\n  def register_hooks\n    after \"de"
  },
  {
    "path": "lib/capistrano/scm/tasks/git.rake",
    "chars": 3129,
    "preview": "# This trick lets us access the Git plugin within `on` blocks.\ngit_plugin = self\n\nnamespace :git do\n  desc \"Upload the g"
  },
  {
    "path": "lib/capistrano/scm/tasks/hg.rake",
    "chars": 1174,
    "preview": "# TODO: this is nearly identical to git.rake. DRY up?\n\n# This trick lets us access the Hg plugin within `on` blocks.\nhg_"
  },
  {
    "path": "lib/capistrano/scm/tasks/svn.rake",
    "chars": 1185,
    "preview": "# TODO: this is nearly identical to git.rake. DRY up?\n\n# This trick lets us access the Svn plugin within `on` blocks.\nsv"
  },
  {
    "path": "lib/capistrano/scm.rb",
    "chars": 2810,
    "preview": "module Capistrano\n  # Base class for SCM strategy providers.\n  #\n  # @abstract\n  #\n  # @attr_reader [Rake] context\n  #\n "
  },
  {
    "path": "lib/capistrano/setup.rb",
    "chars": 951,
    "preview": "require \"capistrano/doctor\"\nrequire \"capistrano/immutable_task\"\ninclude Capistrano::DSL\n\nnamespace :load do\n  task :defa"
  },
  {
    "path": "lib/capistrano/tasks/console.rake",
    "chars": 486,
    "preview": "desc \"Execute remote commands\"\ntask :console do\n  stage = fetch(:stage)\n  puts I18n.t(\"console.welcome\", scope: :capistr"
  },
  {
    "path": "lib/capistrano/tasks/deploy.rake",
    "chars": 8275,
    "preview": "namespace :deploy do\n  task :starting do\n    invoke \"deploy:print_config_variables\" if fetch(:print_config_variables, fa"
  },
  {
    "path": "lib/capistrano/tasks/doctor.rake",
    "chars": 675,
    "preview": "desc \"Display a Capistrano troubleshooting report (all doctor: tasks)\"\ntask doctor: [\"doctor:environment\", \"doctor:gems\""
  },
  {
    "path": "lib/capistrano/tasks/framework.rake",
    "chars": 1196,
    "preview": "namespace :deploy do\n  desc \"Start a deployment, make sure server(s) ready.\"\n  task :starting do\n  end\n\n  desc \"Started\""
  },
  {
    "path": "lib/capistrano/tasks/install.rake",
    "chars": 1299,
    "preview": "require \"erb\"\nrequire \"pathname\"\ndesc \"Install Capistrano, cap install STAGES=staging,production\"\ntask :install do\n  env"
  },
  {
    "path": "lib/capistrano/templates/Capfile",
    "chars": 1102,
    "preview": "# Load DSL and set up stages\nrequire \"capistrano/setup\"\n\n# Include default deployment tasks\nrequire \"capistrano/deploy\"\n"
  },
  {
    "path": "lib/capistrano/templates/deploy.rb.erb",
    "chars": 1333,
    "preview": "# config valid for current version and patch releases of Capistrano\nlock \"~> <%= Capistrano::VERSION %>\"\n\nset :applicati"
  },
  {
    "path": "lib/capistrano/templates/stage.rb.erb",
    "chars": 2088,
    "preview": "# server-based syntax\n# ======================\n# Defines a single server with a list of roles and multiple properties.\n#"
  },
  {
    "path": "lib/capistrano/upload_task.rb",
    "chars": 194,
    "preview": "require \"rake/file_creation_task\"\n\nmodule Capistrano\n  class UploadTask < Rake::FileCreationTask\n    def needed?\n      t"
  },
  {
    "path": "lib/capistrano/version.rb",
    "chars": 50,
    "preview": "module Capistrano\n  VERSION = \"3.20.0\".freeze\nend\n"
  },
  {
    "path": "lib/capistrano/version_validator.rb",
    "chars": 528,
    "preview": "module Capistrano\n  class VersionValidator\n    def initialize(version)\n      @version = version\n    end\n\n    def verify\n"
  },
  {
    "path": "lib/capistrano.rb",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "spec/integration/dsl_spec.rb",
    "chars": 20919,
    "preview": "require \"spec_helper\"\n\ndescribe Capistrano::DSL do\n  let(:dsl) { Class.new.extend Capistrano::DSL }\n\n  before do\n    Cap"
  },
  {
    "path": "spec/integration_spec_helper.rb",
    "chars": 93,
    "preview": "require \"spec_helper\"\nrequire \"support/test_app\"\nrequire \"support/matchers\"\n\ninclude TestApp\n"
  },
  {
    "path": "spec/lib/capistrano/application_spec.rb",
    "chars": 1900,
    "preview": "require \"spec_helper\"\n\ndescribe Capistrano::Application do\n  it \"provides a --trace option which enables SSHKit/NetSSH t"
  },
  {
    "path": "spec/lib/capistrano/configuration/empty_filter_spec.rb",
    "chars": 348,
    "preview": "require \"spec_helper\"\n\nmodule Capistrano\n  class Configuration\n    describe EmptyFilter do\n      subject(:empty_filter) "
  },
  {
    "path": "spec/lib/capistrano/configuration/filter_spec.rb",
    "chars": 3506,
    "preview": "require \"spec_helper\"\n\nmodule Capistrano\n  class Configuration\n    describe Filter do\n      let(:available) do\n        ["
  },
  {
    "path": "spec/lib/capistrano/configuration/host_filter_spec.rb",
    "chars": 2268,
    "preview": "require \"spec_helper\"\n\nmodule Capistrano\n  class Configuration\n    describe HostFilter do\n      subject(:host_filter) { "
  },
  {
    "path": "spec/lib/capistrano/configuration/null_filter_spec.rb",
    "chars": 369,
    "preview": "require \"spec_helper\"\n\nmodule Capistrano\n  class Configuration\n    describe NullFilter do\n      subject(:null_filter) { "
  },
  {
    "path": "spec/lib/capistrano/configuration/plugin_installer_spec.rb",
    "chars": 2508,
    "preview": "require \"spec_helper\"\nrequire \"capistrano/plugin\"\nrequire \"capistrano/scm/plugin\"\n\nmodule Capistrano\n  class Configurati"
  },
  {
    "path": "spec/lib/capistrano/configuration/question_spec.rb",
    "chars": 3081,
    "preview": "require \"spec_helper\"\n\nmodule Capistrano\n  class Configuration\n    describe Question do\n      let(:question) { Question."
  },
  {
    "path": "spec/lib/capistrano/configuration/role_filter_spec.rb",
    "chars": 2567,
    "preview": "require \"spec_helper\"\n\nmodule Capistrano\n  class Configuration\n    describe RoleFilter do\n      subject(:role_filter) { "
  },
  {
    "path": "spec/lib/capistrano/configuration/scm_resolver_spec.rb",
    "chars": 1442,
    "preview": "require \"spec_helper\"\nrequire \"capistrano/scm\"\n\nmodule Capistrano\n  class Configuration\n    describe SCMResolver do\n    "
  },
  {
    "path": "spec/lib/capistrano/configuration/server_spec.rb",
    "chars": 8955,
    "preview": "require \"spec_helper\"\n\nmodule Capistrano\n  class Configuration\n    describe Server do\n      let(:server) { Server.new(\"r"
  },
  {
    "path": "spec/lib/capistrano/configuration/servers_spec.rb",
    "chars": 12434,
    "preview": "require \"spec_helper\"\n\nmodule Capistrano\n  class Configuration\n    describe Servers do\n      let(:servers) { Servers.new"
  },
  {
    "path": "spec/lib/capistrano/configuration_spec.rb",
    "chars": 10122,
    "preview": "require \"spec_helper\"\n\nmodule Capistrano\n  describe Configuration do\n    let(:config) { Configuration.new }\n    let(:ser"
  },
  {
    "path": "spec/lib/capistrano/doctor/environment_doctor_spec.rb",
    "chars": 1227,
    "preview": "require \"spec_helper\"\nrequire \"capistrano/doctor/environment_doctor\"\n\nmodule Capistrano\n  module Doctor\n    describe Env"
  },
  {
    "path": "spec/lib/capistrano/doctor/gems_doctor_spec.rb",
    "chars": 1960,
    "preview": "require \"spec_helper\"\nrequire \"capistrano/doctor/gems_doctor\"\nrequire \"airbrussh/version\"\nrequire \"sshkit/version\"\nrequi"
  },
  {
    "path": "spec/lib/capistrano/doctor/output_helpers_spec.rb",
    "chars": 1366,
    "preview": "require \"spec_helper\"\nrequire \"capistrano/doctor/output_helpers\"\n\nmodule Capistrano\n  module Doctor\n    describe OutputH"
  },
  {
    "path": "spec/lib/capistrano/doctor/servers_doctor_spec.rb",
    "chars": 2629,
    "preview": "require \"spec_helper\"\nrequire \"capistrano/doctor/servers_doctor\"\n\nmodule Capistrano\n  module Doctor\n    describe Servers"
  },
  {
    "path": "spec/lib/capistrano/doctor/variables_doctor_spec.rb",
    "chars": 2817,
    "preview": "require \"spec_helper\"\nrequire \"capistrano/doctor/variables_doctor\"\n\nmodule Capistrano\n  module Doctor\n    describe Varia"
  },
  {
    "path": "spec/lib/capistrano/dsl/paths_spec.rb",
    "chars": 5648,
    "preview": "require \"spec_helper\"\n\ndescribe Capistrano::DSL::Paths do\n  let(:dsl) { Class.new.extend Capistrano::DSL }\n  let(:parent"
  }
]

// ... and 19 more files (download for full content)

About this extraction

This page contains the full source code of the capistrano/capistrano GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 219 files (721.9 KB), approximately 197.8k tokens, and a symbol index with 507 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!