pax_global_header00006660000000000000000000000064152021721510014506gustar00rootroot0000000000000052 comment=f40817b449c113a4fce039a318b92e63e1d10c85 capistrano-capistrano-603c346/000077500000000000000000000000001520217215100162645ustar00rootroot00000000000000capistrano-capistrano-603c346/.docker/000077500000000000000000000000001520217215100176115ustar00rootroot00000000000000capistrano-capistrano-603c346/.docker/Dockerfile000066400000000000000000000002561520217215100216060ustar00rootroot00000000000000FROM 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"] capistrano-capistrano-603c346/.docker/ssh_key_rsa000066400000000000000000000064651520217215100220610ustar00rootroot00000000000000-----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----- capistrano-capistrano-603c346/.docker/ssh_key_rsa.pub000066400000000000000000000013461520217215100226370ustar00rootroot00000000000000ssh-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 capistrano-capistrano-603c346/.docker/ubuntu_setup.sh000077500000000000000000000010551520217215100227130ustar00rootroot00000000000000#!/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 capistrano-capistrano-603c346/.github/000077500000000000000000000000001520217215100176245ustar00rootroot00000000000000capistrano-capistrano-603c346/.github/dependabot.yml000066400000000000000000000007151520217215100224570ustar00rootroot00000000000000version: 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" capistrano-capistrano-603c346/.github/issue_template.md000066400000000000000000000020341520217215100231700ustar00rootroot00000000000000**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 doctor` in a GitHub Gist. Thanks for helping improve Capistrano! capistrano-capistrano-603c346/.github/pull_request_template.md000066400000000000000000000013401520217215100245630ustar00rootroot00000000000000### 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! capistrano-capistrano-603c346/.github/release-drafter.yml000066400000000000000000000012611520217215100234140ustar00rootroot00000000000000name-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 capistrano-capistrano-603c346/.github/workflows/000077500000000000000000000000001520217215100216615ustar00rootroot00000000000000capistrano-capistrano-603c346/.github/workflows/ci.yml000066400000000000000000000033301520217215100227760ustar00rootroot00000000000000name: CI on: push: branches: [master] pull_request: jobs: spec: runs-on: ubuntu-latest strategy: matrix: ruby: ["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", "3.1"] 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 capistrano-capistrano-603c346/.github/workflows/release-drafter.yml000066400000000000000000000004471520217215100254560ustar00rootroot00000000000000name: 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@v7 with: token: ${{ secrets.GITHUB_TOKEN }} capistrano-capistrano-603c346/.gitignore000066400000000000000000000003421520217215100202530ustar00rootroot00000000000000*.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/ capistrano-capistrano-603c346/.rubocop.yml000066400000000000000000000027501520217215100205420ustar00rootroot00000000000000inherit_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 capistrano-capistrano-603c346/.rubocop_todo.yml000066400000000000000000000175421520217215100215740ustar00rootroot00000000000000# 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" capistrano-capistrano-603c346/CHANGELOG.md000066400000000000000000000001401520217215100200700ustar00rootroot00000000000000Release notes for this project are kept here: https://github.com/capistrano/capistrano/releases capistrano-capistrano-603c346/CONTRIBUTING.md000066400000000000000000000067111520217215100205220ustar00rootroot00000000000000**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 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 . ## 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 capistrano-capistrano-603c346/DEVELOPMENT.md000066400000000000000000000160651520217215100204000ustar00rootroot00000000000000Thanks 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 capistrano-capistrano-603c346/Gemfile000066400000000000000000000002771520217215100175650ustar00rootroot00000000000000source "https://rubygems.org" # Specify your gem's dependencies in capistrano.gemspec gemspec gem "cucumber", "~> 11.0" gem "mocha", "~> 3.0" gem "rspec", "~> 3.13" gem "rubocop", "1.81.7" capistrano-capistrano-603c346/LICENSE.txt000066400000000000000000000021051520217215100201050ustar00rootroot00000000000000MIT 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. capistrano-capistrano-603c346/README.md000066400000000000000000000247431520217215100175550ustar00rootroot00000000000000 # 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 . ## 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. capistrano-capistrano-603c346/RELEASING.md000066400000000000000000000017011520217215100201160ustar00rootroot00000000000000# 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 capistrano-capistrano-603c346/Rakefile000066400000000000000000000010471520217215100177330ustar00rootroot00000000000000require "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 capistrano-capistrano-603c346/UPGRADING-3.7.md000066400000000000000000000050171520217215100204360ustar00rootroot00000000000000# 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. capistrano-capistrano-603c346/bin/000077500000000000000000000000001520217215100170345ustar00rootroot00000000000000capistrano-capistrano-603c346/bin/cap000077500000000000000000000001151520217215100175220ustar00rootroot00000000000000#!/usr/bin/env ruby require "capistrano/all" Capistrano::Application.new.run capistrano-capistrano-603c346/bin/capify000077500000000000000000000003621520217215100202360ustar00rootroot00000000000000#!/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 capistrano-capistrano-603c346/capistrano.gemspec000066400000000000000000000026621520217215100220020ustar00rootroot00000000000000# -*- 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 capistrano-capistrano-603c346/docker-compose.yml000066400000000000000000000001511520217215100217160ustar00rootroot00000000000000name: capistrano services: ssh_server: build: context: .docker ports: - "2022:22" capistrano-capistrano-603c346/docs/000077500000000000000000000000001520217215100172145ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/CNAME000066400000000000000000000000211520217215100177530ustar00rootroot00000000000000capistranorb.com capistrano-capistrano-603c346/docs/Gemfile000066400000000000000000000003141520217215100205050ustar00rootroot00000000000000source "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" capistrano-capistrano-603c346/docs/Gemfile.lock000066400000000000000000000151131520217215100214370ustar00rootroot00000000000000GEM remote: https://rubygems.org/ specs: activesupport (4.2.10) i18n (~> 0.7) minitest (~> 5.1) thread_safe (~> 0.3, >= 0.3.4) tzinfo (~> 1.1) addressable (2.5.2) public_suffix (>= 2.0.2, < 4.0) coffee-script (2.4.1) coffee-script-source execjs coffee-script-source (1.11.1) colorator (1.1.0) commonmarker (0.17.13) ruby-enum (~> 0.5) concurrent-ruby (1.0.5) dnsruby (1.61.2) addressable (~> 2.5) em-websocket (0.5.1) eventmachine (>= 0.12.9) http_parser.rb (~> 0.6.0) ethon (0.11.0) ffi (>= 1.3.0) eventmachine (1.2.7) execjs (2.7.0) faraday (0.15.3) multipart-post (>= 1.2, < 3) ffi (1.9.25) forwardable-extended (2.6.0) gemoji (3.0.0) github-pages (192) activesupport (= 4.2.10) github-pages-health-check (= 1.8.1) jekyll (= 3.7.4) jekyll-avatar (= 0.6.0) jekyll-coffeescript (= 1.1.1) jekyll-commonmark-ghpages (= 0.1.5) jekyll-default-layout (= 0.1.4) jekyll-feed (= 0.10.0) jekyll-gist (= 1.5.0) jekyll-github-metadata (= 2.9.4) jekyll-mentions (= 1.4.1) jekyll-optional-front-matter (= 0.3.0) jekyll-paginate (= 1.1.0) jekyll-readme-index (= 0.2.0) jekyll-redirect-from (= 0.14.0) jekyll-relative-links (= 0.5.3) jekyll-remote-theme (= 0.3.1) jekyll-sass-converter (= 1.5.2) jekyll-seo-tag (= 2.5.0) jekyll-sitemap (= 1.2.0) jekyll-swiss (= 0.4.0) jekyll-theme-architect (= 0.1.1) jekyll-theme-cayman (= 0.1.1) jekyll-theme-dinky (= 0.1.1) jekyll-theme-hacker (= 0.1.1) jekyll-theme-leap-day (= 0.1.1) jekyll-theme-merlot (= 0.1.1) jekyll-theme-midnight (= 0.1.1) jekyll-theme-minimal (= 0.1.1) jekyll-theme-modernist (= 0.1.1) jekyll-theme-primer (= 0.5.3) jekyll-theme-slate (= 0.1.1) jekyll-theme-tactile (= 0.1.1) jekyll-theme-time-machine (= 0.1.1) jekyll-titles-from-headings (= 0.5.1) jemoji (= 0.10.1) kramdown (= 1.17.0) liquid (= 4.0.0) listen (= 3.1.5) mercenary (~> 0.3) minima (= 2.5.0) nokogiri (>= 1.8.2, < 2.0) rouge (= 2.2.1) terminal-table (~> 1.4) github-pages-health-check (1.8.1) addressable (~> 2.3) dnsruby (~> 1.60) octokit (~> 4.0) public_suffix (~> 2.0) typhoeus (~> 1.3) html-pipeline (2.8.4) activesupport (>= 2) nokogiri (>= 1.4) http_parser.rb (0.6.0) i18n (0.9.5) concurrent-ruby (~> 1.0) jekyll (3.7.4) addressable (~> 2.4) colorator (~> 1.0) em-websocket (~> 0.5) i18n (~> 0.7) jekyll-sass-converter (~> 1.0) jekyll-watch (~> 2.0) kramdown (~> 1.14) liquid (~> 4.0) mercenary (~> 0.3.3) pathutil (~> 0.9) rouge (>= 1.7, < 4) safe_yaml (~> 1.0) jekyll-avatar (0.6.0) jekyll (~> 3.0) jekyll-coffeescript (1.1.1) coffee-script (~> 2.2) coffee-script-source (~> 1.11.1) jekyll-commonmark (1.2.0) commonmarker (~> 0.14) jekyll (>= 3.0, < 4.0) jekyll-commonmark-ghpages (0.1.5) commonmarker (~> 0.17.6) jekyll-commonmark (~> 1) rouge (~> 2) jekyll-default-layout (0.1.4) jekyll (~> 3.0) jekyll-feed (0.10.0) jekyll (~> 3.3) jekyll-gist (1.5.0) octokit (~> 4.2) jekyll-github-metadata (2.9.4) jekyll (~> 3.1) octokit (~> 4.0, != 4.4.0) jekyll-mentions (1.4.1) html-pipeline (~> 2.3) jekyll (~> 3.0) jekyll-optional-front-matter (0.3.0) jekyll (~> 3.0) jekyll-paginate (1.1.0) jekyll-readme-index (0.2.0) jekyll (~> 3.0) jekyll-redirect-from (0.14.0) jekyll (~> 3.3) jekyll-relative-links (0.5.3) jekyll (~> 3.3) jekyll-remote-theme (0.3.1) jekyll (~> 3.5) rubyzip (>= 1.2.1, < 3.0) jekyll-sass-converter (1.5.2) sass (~> 3.4) jekyll-seo-tag (2.5.0) jekyll (~> 3.3) jekyll-sitemap (1.2.0) jekyll (~> 3.3) jekyll-swiss (0.4.0) jekyll-theme-architect (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) jekyll-theme-cayman (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) jekyll-theme-dinky (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) jekyll-theme-hacker (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) jekyll-theme-leap-day (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) jekyll-theme-merlot (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) jekyll-theme-midnight (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) jekyll-theme-minimal (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) jekyll-theme-modernist (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) jekyll-theme-primer (0.5.3) jekyll (~> 3.5) jekyll-github-metadata (~> 2.9) jekyll-seo-tag (~> 2.0) jekyll-theme-slate (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) jekyll-theme-tactile (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) jekyll-theme-time-machine (0.1.1) jekyll (~> 3.5) jekyll-seo-tag (~> 2.0) jekyll-titles-from-headings (0.5.1) jekyll (~> 3.3) jekyll-watch (2.0.0) listen (~> 3.0) jemoji (0.10.1) gemoji (~> 3.0) html-pipeline (~> 2.2) jekyll (~> 3.0) kramdown (1.17.0) liquid (4.0.0) listen (3.1.5) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) ruby_dep (~> 1.2) mercenary (0.3.6) mini_portile2 (2.4.0) minima (2.5.0) jekyll (~> 3.5) jekyll-feed (~> 0.9) jekyll-seo-tag (~> 2.1) minitest (5.11.3) multipart-post (2.0.0) nokogiri (1.10.8) mini_portile2 (~> 2.4.0) octokit (4.12.0) sawyer (~> 0.8.0, >= 0.5.3) pathutil (0.16.1) forwardable-extended (~> 2.6) public_suffix (2.0.5) rb-fsevent (0.10.3) rb-inotify (0.9.10) ffi (>= 0.5.0, < 2) rouge (2.2.1) ruby-enum (0.7.2) i18n ruby_dep (1.5.0) rubyzip (2.2.0) safe_yaml (1.0.4) sass (3.6.0) sass-listen (~> 4.0.0) sass-listen (4.0.0) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) sawyer (0.8.1) addressable (>= 2.3.5, < 2.6) faraday (~> 0.8, < 1.0) terminal-table (1.8.0) unicode-display_width (~> 1.1, >= 1.1.1) thread_safe (0.3.6) typhoeus (1.3.0) ethon (>= 0.9.0) tzinfo (1.2.5) thread_safe (~> 0.1) unicode-display_width (1.4.0) PLATFORMS ruby DEPENDENCIES github-pages BUNDLED WITH 1.17.3 capistrano-capistrano-603c346/docs/README.md000066400000000000000000000014721520217215100204770ustar00rootroot00000000000000# 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/). capistrano-capistrano-603c346/docs/_config.yml000066400000000000000000000002401520217215100213370ustar00rootroot00000000000000name: Capistrano kramdown: input: GFM hard_wrap: false highlighter: rouge safe: true lsi: false exclude: ["Gemfile", "Gemfile.lock", "README.md", "vendor"] capistrano-capistrano-603c346/docs/_includes/000077500000000000000000000000001520217215100211615ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/_includes/carbon.html000066400000000000000000000002321520217215100233100ustar00rootroot00000000000000 capistrano-capistrano-603c346/docs/_includes/footer.html000066400000000000000000000024721520217215100233520ustar00rootroot00000000000000 capistrano-capistrano-603c346/docs/_includes/google_tag_manager.html000066400000000000000000000010721520217215100256500ustar00rootroot00000000000000 capistrano-capistrano-603c346/docs/_includes/header.html000066400000000000000000000005131520217215100232760ustar00rootroot00000000000000 capistrano-capistrano-603c346/docs/_includes/metrics.html000066400000000000000000000023071520217215100235170ustar00rootroot00000000000000 capistrano-capistrano-603c346/docs/_includes/navigation.html000066400000000000000000000111351520217215100242070ustar00rootroot00000000000000 capistrano-capistrano-603c346/docs/_layouts/000077500000000000000000000000001520217215100210535ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/_layouts/default.html000066400000000000000000000040131520217215100233630ustar00rootroot00000000000000 {{ page.title }} {% include metrics.html %} {% include header.html %}
{% include navigation.html %}

{{ page.title }}

{{ content }}
{% include footer.html %} Fork me on GitHub {% include google_tag_manager.html %} capistrano-capistrano-603c346/docs/_layouts/post.html000066400000000000000000000001631520217215100227260ustar00rootroot00000000000000--- layout: default ---

{{ page.date | date_to_string }}

{{ content }}
capistrano-capistrano-603c346/docs/_posts/000077500000000000000000000000001520217215100205235ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/_posts/2013-06-01-release-announcement.markdown000066400000000000000000000566151520217215100274400ustar00rootroot00000000000000--- 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 capistrano-capistrano-603c346/docs/assets/000077500000000000000000000000001520217215100205165ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/assets/android-chrome-192x192.png000066400000000000000000000164211520217215100250600ustar00rootroot00000000000000PNG  IHDRe5gAMA asRGBPLTEGpLfffffffffffffffffffffffffffffffffffffffffffffefgfffffffffffffffefgeffffffffefgefgefgfffefgffffffeghfggdehfffPfffefgefhdfh;R8Q9QF=S9\-a`ot>W{7;i.SC%m\X_rW^bmVyIS^v}T?HOzT ^CVFW[v-CJRVv@B~Y7AQ\xVE?at{D wCUBI \DM KZ|MMZ{<_ PwA=SI|^@T\lwWPP;|=Q8Q8PQ<==58U6WO<7R :b@ M(L@FBF<tRNS !*6$2'>:d JN/_,iStVBZnE{G~AX‡9чhMΈ2bϨ[掎ow۳ohzL꾏οee؂ H@IDATx]W~F$$ * ;8긍q~B'P?w;I;IP朩sޛ1ϗ|_ߥ?w;Acڵ+X?ȇw]n9uժ5Աj*X>z@ 8XN$X<`䅅JV|Ri4,|s_M=q_m 髃t|h7k*"J,9У''v73Á QD E( (ɈF#57zjM!vfBC>(5Z Pl=|@#hMvb 5p0X7Lʗ6JR|_K9<p4PPh=f:BI* ` g|Х D r4P?H~ Ϻj(ߚG@k(X e%a+xӺXP~dPkV-żGv0c4s-sܦ`#,Sav ~m#䰏_t`#2/B ЅE@+SF(ʞU6[%GC#dTFY>}_l ~I:u܈=}ގGguDF,0 sB TKK"->eC`z8bTe! \S-sscc0aLL5v.Lź!̈́ _rON-cc## Ì?<>16׸8,(P4@Ȅ_e9'}m#@,͜'/k2zthH0sG{gSR0kŭ}"S7Bw#p8[?B sZ boůZƘH3H{R4ڑ6?1. sa榄c|3!i"WG&xS$4>AzD`SP"/b@ ?1Lͱ?J?7aȘ q30=S+5V5@d"/Dg@(jOZ=xk 9jnk\D}cP5Pt"ց $_hc˯74K?튥w< 퓈EkR;QJϙ ?o(/))+.[(..++))ly4%G0DP26eR*hynn=>R\VR8$QE#p" Maj.E7A~*&٬#l6y6HWϞnҏ"&!'c6o+X^CIMflѨu9t:A_W*Ub7 .N8FIY2ը4ܐa0*>gqI3_6 } q]Q` rDV -ݷWt^Mjl(e1 f "Aa/}eh"[/ܖlp\ďUl5Q!ppL¯JJ8Q b*I"tk \΄ 丱-*[Q]@,k0BGifN]`~pvT,x˜ AV uLlm_q@zkYJS F=2r=~N'5cp|XEaeݨzI"WPݧd gYfwNfD@(:Wܰ{٠#hKA79CӭIF̉ZPFSX;6 ':>1,9Z34!l&j9&9YV[ċF7L'U1'^Q'AYsbzmi&kBUb_VҖY~q5)R~hͶDxt~^jS3ONKN'p[f϶ҡTA}L8hQCʜKQegO,>#R`m^èؠQ$D?K/+>͍m7^}ޱ 7a''?TMafvL;`y^B˔|J6i$ 1iGO6S߲rH§=-2 4bRPhwZ&` o]jIQ# Ӹ47bנDp c(`"QCm0NAC3B5GMK]y·J_ DA9`#KaEݬd>yUzM.9Gb3> CqH\xI(>ŧ#/vM5[)]A0*„AhtN 9co(~7Sty,nA㱂+PhzM.@KxDQLa$:8U'IĝHAw͔^&Q/R3l ԔM32~LkJb,oRC *0#A(:0G-72&eY`bJBr-J.2țI1lˌ%+T[lFzdKyLS3_JsNAQZy1IJ0;#R/fcs9OoK7oRcVâ!RaPkLf;!(ϛ061l-)X۰iWqL&P LBc$D+DT*}؉O"WYޤ&B Kpe =HPwG4}z(nmʶ 2&=ܴW`̇F&nz-Z (Fs:, ^bv'rѭvV9.~) Z/w<':~t^F܊CKNjGGO33N AsM^H1DpN菊I @"[vYC}qz#]'sze4 E P!bh2 W > u!.WHKJ($>VSvs.03)W:ؼn5ވX&T1&&"q' Zk<0DozWYBeqMc GjY.H{[];#lEQBegc"0S\zzOWr#ֵ6;/6U} O. mvx=^5)M|CLhCH9|ZwwLx) . -?r;c-w ?G.PsŀwM Lt' -Bv k wQ D[zo'L۩>(][9 !VO׃p,FQk҂Mt/MN 3sL dN.O&E$S='C!SkV$QD%]8Q\ uME# ='qa)0mN6A-S&I:&#I#N֔{la9,?ǿ➛|bao4@+J n2hOZ CHτyo!DTDҶ ]> F2]wd6A JJ @1227:OJ( GIk8`%\&)BH3:#2%'ͼY ?sίX6q5wqHVHaE@xH]wr86wL\$?+2Ҧ_PɳZ7Ahv%r0 ǁ MP6J^GT]|QB1axfDa5/ zR瘧OJ`QIQ'E6~ O eRݶ˨P4+ש0h8 Y1TMɏ3,7&x/Pd.ad:Ca$P4߳ !{gR2-3œ@h8yi\aʪ {7DR#"SX0.!_/8߀ӽH  ZD/؁IA"PꍅE׳{ G[ Yo^ wtoSQ jѳR -⒂BCL34<==S7nf:*c 3rYng3](w!!v>$¯^7PHe* `;˞PaaA@8|-_v.c;LT]u40G7D^84K,n?/&M3rAІZ7̲fE͕*{1˰ jAYܿMhVj86"0<|aflzʵ;-HAIgJ8t g7#9ńW>?taco::{7#G.2K \١9*@ *z݁$9ARUKna#MxαWj3@2汔5*𑠫)Z_z_$Uw "*%yqF@HSQ>RDe5KwG41!Uj#==;WfcVD[ztڻ+i?>Qwq :rp;(<{@W.xll~zZ#3 {v$Gg\]߀+9:Z088'{v让 >wގ#H_eD`+C Ey`@l̢xMyva/yq+fE\\'M kpp[sJG() xrՈxW] ᭰[sN%aG>mx$Җ 7K a: _An t#P@7tL*S 9tKs ]0t]5e~rI5,Э9j}€\ qkbW|nX5tiNWgGUiZ\Ek%>S崲IENDB`capistrano-capistrano-603c346/docs/assets/android-chrome-512x512.png000066400000000000000000000461171520217215100250550ustar00rootroot00000000000000PNG  IHDRæ$gAMA asRGBPLTEGpLfffffffffffffffffffffffffffffffffffffffffffffffffffeghffffffefgefgefgefgfffffffffeggeffffffffeffefgfffefgefg=ffgfffefgffgfffeegfffPehi9QQcfiN7D;f`rx:R=p@Hy/;_N|>TTy:@ v=D(.>/_ >GX_)hSR\tIX~L>EV [x\anV_tE\P\y]/>|Ç>|t Ÿ~ExD񗆠?7W']]]&TT ۹WGҟ# )8RA W}c= @$y(@w uS)@h4 pw? EHTHT)h*p zRQD;?sttxpppfã/"E ||\z<ǯm!ڏϳ(,_G/A̧ӫ'btx@/ HC5 h 6yZFؘ*aħVA  PFC PGZ\2 >^tY8Fm!DU@@md~pl^ C>@TYZ}Z PP  TJC, QbO}T"S%?_`#0hװ=AEfJ-a4Fxke7q -j g8!&:qW(/ 𣀾5aL#RQ/ @0&`(rgّq|0H`g{Yϲ/ UpÓ=,6Bnj?p2,#f:2ٿ?xC de $N̂O T-3BL,; zA#zwHMc$1$EȿRA\.KṼ8ע (7hd\Ӊ`H*"c|eΝMاCZ߱g9z獁t)251ih#9h93 ɭ\n:`,ڂ"yZ(ƿ$8~bLHP ""{d't;!($wl ?oM6KWW) ~9)`Vg߽_Ed,4G6yrfN0I}~>À ǿXkU/H6I}(+!*@~8i⏕b] /U%VB.VK߬O=i5n@y|Brc_ RХ V (,9SgnU$[{{2|k;k=9םՍmmԷ_v)zN+J\ x"oF`ƳM9؂@a$peqp9#?[vMfAlN Ji- @?wfۿ25e0'9H`0*`o_F{+@N&]ժ4 ] o jъx m{G73^& 7n)`Ir$ -\`T1`}[ /m5}f!"DϖlE|?:)@qiBpM*&\"T֤U|C PFC}sotOwHf}_- p8=B?z*n,vw&A`.rO)9h\OA  =]%)=ydt;VLS mLKsٕwcSI-ZY܆0WQ:?d Y]') CAB.{V H n&'xx W'ZgPOfs(XҜF@xe: \_V&ڧb}a."Yc6?vf43ri# ?fœ^g[/e`8I@@7ҏw7" ׿3.$AP?|gm焛~>i(@0<I7<׌^04[(?z?, VUK %P-!5fBf찎Nu a]8FV\iYZ9{_+о#NJ2;WNH#X?PUs35cP*&ju!Վ9T*o3 A:>W{wLofƌmhQQ6H59w3'rގ2w#X":ZGF#P~=j!C?MS`{ll k[|VN6@5Ɔ#l+qT,-p6"P4Ƭ ( xi[0T+4Pl^RJG? [)^0g ZKTp0)ql};h(`_UwC@"`qѷ=~[T8?fp|50o*@s0S"TqL &öc:Z% +.N6;FwҨPL+U1~F.dFpZ | & UIJL&Km!;{/i.1@fOa3.|J!2o>dTDnMl+,l]Ѯz+W.(3ɀDmYxS* 0_~$i#<`wvvv5(g7@* j6X;ژTC[jgi]gĿӁAld|D#h4{`Wh$t@"@P @ >)b%vnw3&x=HY@$ ng6 !W30q8 A#^@"vѸp%^` XZ$Gr%`\`iS :Q]B>l|gq}sĢ_ $@/ւb)1- 0_N@G=z^xV롅/ d (ЁTd@Hatr'|r o@Xq {ha [Z.:-" h,$BM:GAFm?Snof'u[w4Ll HBC@ vwmy''Eӯڅ^8sՖl} 3,>ܰ$  T$,̷O/E|E=@t: }[yX@$JF? J}`h6*} =@~\ [~=>nVވr7[BIfe  afq 0;B~ GD~؎C蔛\D~eA@@Y`;T4a E&_@"HNm-?F/7ok,Є9@" t"2+I5n(<";3'WG~~[ 'L4J ([Kc(D(&g}F P%@ LlY<`pa+G֏ϋT HD%  0au#( {@㞜@ߥo9@) ,ցQU#8$@;6nW=lI/n~Fd%8{)jvHՎ`zA  "`W'k?iT)Ѐ@D{3χda ׮z+n5P%@ t :)6@UtPm|/ʀNQPhXHeM`/6Gw7%.5_g%K ;V  PDdJ&xy6ӧ|]nR(~B(u@_X>@K=k"2+nT֖c_3 &"W Ypidu(&C/WH)kӴD@VͫxA2PP̂!7@+gWE`a?mY]L)]Pr\i`X, b 2GI>Ծ&'yzR/ bA 2ĀZH% M@_/JM5,T( nSǼP @e e@zEhS)F XsBnq:%&"l`/=|Jq`&AH뚕@X@G5'.w/ ο`i [=4ɕh5{>*'v_ȿs'^15S;Bi/,n  nW C|pxj9E?ʿ.ᯋ(dqPL`Ifp]b*>}k qX;k*d-xB0}B5~^.8 ~p_O{aR]_ld8P]cw?krk_'E]`: t)P} ͠/K|b@WG< _U/'w\.@(uӣ-'ΩF5t xQf?Ǔr o&`E.p?rދS3tRf?H𴃪㏟.KX_K(0֟sBU@|n{o+LgFUFAtX5LRʀ*6?{ ;UB~d;#hy_Y-LZ TL`?sπ =s,120a ^wtT xd".c& IǏs۠*VtҴw+"f_sŷ4߯%˝+W.'W8' =1 /MW@f߈+ - 7p-$B X9;@x'gY_7H@O@hnTngoTƿ;LGJO`m80YDm1bK<>' n׿Q}O8p ڀ0~)_ًx&ݧY,MT\HJ?5rB0R<3[7ۦt*|4Ҕ|:VEyIm}z5ˀ {>GF`yf;uNxwVc NLX m>}d9 @6`riӗ,?bH3$p Hsho }uhP% pdC.W9ltaY} @zF u_ p'WAOhK}GAOkUF` _o,ZƐw!>-8l}4\`˗^| `+>MpKa{u=b hОG6 }Z`h9m6*)LҠ - U9ϳ>N7%,,|t%t ^ X9x7WɨEL.@J 5+qM~9nct0jE!nŏ %cMMg(צLOzp+%\d TMz ' bZlc(T`v7}:.8i#$-V}DbvS±nB.\~%y$ n۽'}}u]/5_H  < 9J[ CNۙ9YÇWF8hrVbe4e <+q{jg5WiֵA?0Lԁ`6C u AQ+~یZ&XIͷuLw*ݧc;AiQS0O[#&un[YC"?(!6X.o3o\{@h@?GQAOHP6`GUԉ@"DޜH~M - @|v++8(@ ldNira@WLd JG1 <Wq? on0FҀ!h>ˀ2GQ[+wtdC\5Xȹg [t>H%pHvKUOn~Bݧ&…"R}0jTAc>ҙ ~bq@hz UL:0!iANDGJ/0wx$U!*@sOKLXi}P|x[%"`{6辫>=~ 3pz P[\瑭W?źOOzMt毹9<_~^ |c,>N$D,B`H_!]Oat  /G x;^'t$M@#4z-QtꤲXH* Br@$4F@edpp g!*K Oζ~ly ^FE`-. ?OOz^8 f(+g_W~Ivb`W|=W.=ga~*)(,9UD*.t]"}=lz [ ]ݗJײh/.y !ABW >S?#6u}DI6@  Ba@3#[V\춂5!| y1=)h߀I&Z><8Fձ }%Db}4!< `0!}>Ȩ磼/?D!=9);2 @lN2 q{?DuyY@@,V p :N0 l\ SD@78<"#P[$E m0 !P` `X;\H@J@8 P'x`>,Vn w@\R %"p+d1f; J7Xq2x<`njp'@ 6@ )N6>32@Pv07 p+. feXȩeN@]#a@ 5x5ŇB)ˡ6>x\C(^ 3@_ e0{|9"`Gz8-PN; [ G V ?CnBD8+CA/NQPdCte}0bo@Z ? kBH:e&lXvCT<:p@9c/yCf/.B2"ՀwV.)ҁ@P @?\Zl'B!-Z²kedG⏂9{NCk-:sJGRi%E?}W L).pQϠ_>)\4m%h;NaH \rx-H9 B;ER k;LS^`4!$/()4Y3$bDtu@>}}Wr4ZF `ܭ<PAcmj@5_JmGߑ)tU@2s:;8ßR`" ( (\/-eJ5OXAP IBd{%p0 ր\TP=0KD Kݗk$&\"YM<PC5(l#xR>~^-$: 5 > |<,w8L%q6JJ`'Eұ=]\ IFt0P?{WFFxc.EY3mE%6EIFDF iD"?h4ӢC ! J?$ܭeuk&sRӢz0*Aފx&-qJ@:kXs6Hda ]dWÏPr;Hc #xZd LeC`#Aa0*g60@ HF"A@5v@4Ϛ&p$q>4芠0cDy*_ $oGCLht4x;,/Fva"pAѓjh@ 1>3І}='  EKmIދ }G0zxQyNq2څ I҇/X _)5 :/^͔Ky{M$ F Hs_AṪ$=bK$Q>sX OC8xG x6 b zz,/I+MP @ $|I`n?SY.Hdؤ  쐤H$r u wqI6 2X ,YR] W( |!H?j4S$VUI'ZP_g'$ p( Ma>҂, (+6ȇu.6BP5TzY6Ђ,"Bm0 '])@<!"yp@ @Y, \bn}nKvAaT u =^D>} X8H 412"Br.(y4]xئqS!U\ XvQ;QmA)v{((`}8XηTI~28q䯺2Ғ& 3XL 5qH1( Q ,V+"pSB@R m@Vm 2';/vQI4B ( SFO !??K7yH ,4;ivۺ$t@?#!{)NbXAH ΐ?Bzwd' |O3: $rֿL1}` FЧ$dBBzv{Cdz0)F@zä h_ L _ t8waH u(@4y3haqmA!l #'H0 ~hٿRkXBṐ)a/( ! *PG_| !qEaP~dS26?Pjɟ+8Ϩ 3pZK2FCoY; 48 !>B H8(9S]P- 59vG ! п#Bb91uQuc2eO*GPL}+(̚$|Bau_п=1amL(@@6]ZsU^!T`D?Q~k6+UB aO˯,qηh/dPɃQ_a(jPhLaXFo4:4,,!@ ܏E?ZiVw~7P-b/:Z8wL1.~IS}o &!$t - 2@|+cPiA T V/L9oc.Ŧ0LS(- jsyg@5+fB]`pww?Pzs?bR^@\3Z YA2SUh (.n17xBw~jg2mc(J4 =a~hMk^ֹ,g( zhb­[ճ:ha@ [>ئHOT\3%`l}C:gz=A+sQukm nR{R|ڏGA7>X57J_v*3&}@*h>"PQEaU1V<Рy`{@F '5 J 0 qX@^)>hZynj>&aܔ;YAUuFLVϛ;L@P`DK",~/Kk_+Pmo+ZA+BՁGCL/ ӭqԨ@? K)ɷou:-x,"~=#h V'&`NYB*54DzY@ Q )z=SsX֫3Nr*ڳ9hnбes[[Y[[[ͣFZT*F x*.jj~>Ϸ X\CܛvVjoMXuK$07{ M0h?5k0ֽˎe0N:|֫葍%C.XaǷf8ByFgdSQCP7HWs8?i,HVXtM! ;ߤ; JyΓWL21;w퀃q%~s0ݧ,~C+D͟ewn8经S7\o\^ 4/\ta 6>r?r}*d'ԅ3-owܛet&C 9˫dl _q"  Qh)@[[`kx)7K ~(1117Cgi{Lgs:93S:ewKw0uj.2&DޛM<)YMM;equy; VTA|x[GwM_RfPqS` Tf3 y: 0[BXO*3 )l- T~(L`dT vT߻@| *I@_V<eo,f U`ndW 4Y /@a0],௩XW?g,[BZhԵ/Pm*\H\5{ > Zl/~UNGlA* ZRe OO-!@&qKP$d?xƷh X;FҖe_zX;l)8n <8`I `y !+N`꿼 }[ 0ֆ){j!v 36Fdc@2pлCl ; `Ł ,gLܢb; ;)9ݤf3 dDcD Yc@?X̀binM38p*=}X-(M6sO:cKWf@g$6p<'tQw(j@}կL /sb;r0d@&#jh< 7e|Y.T=&m]Ŀùk{#3/2,hpoϛdFydTzɼ ?1|m4MTKǃ S +*~K0K__<6ϩ/>94=:ǿ > ?R1{`MQQ3'E^5*n\u80 -O!`R-@ X l)^S׿ՙQS!c?WfRH8xx+ʈQ#D7+o HH$3ct%Q/UAMs20O wl /\0UHPQ?+߅kʀ `#u,B$ƌ6s'jRs!2@ Ff|Ǎl>vԑa+1Nyrv/ gυkHx|V ݅|Odb9! Tq~y˿T]p"6 gb/ۍ#ϒCap~łewi6@Nx>OA}%J񇏒Q/ do6@B j9#؈Sp)uG9u$ Ȃ7"*."̖4b_rQ-mPeA*uj1R g?l gAS(?.qOKɿhTPop+;`O2II{.R,Ņǘi&}'//ܼz𫳠F VqotGK_r]%YDLD/,_fZpw`O@>p+ÿԿdb:`, -,`~&/) B)HO`7Z4(?ٟ@Wa@g4 >@th$OԟDL2Zd(@*#*n|!w\E"@|M|_W y0(WV2PK &?5+@owN__,OP_E \`ƇNf䟆_u, ROO؇& ~~_`@Ntju۽;mA#d'p Dnïj tv N@d8Rҏ?I~= % XO?j? }ioïR)0N@d?)?H?u~Igv؇&6:(:HPr'OZߣ)o{%F i90xjsYk{?~7B `/+8^ !X$_A_~Q HN ( (&(Nl/;!#Q7w T=//"`C}4ů6F)@jab ) oeVEahĪ1UhjLBp@]?{-Q4^/rA[ko jbI \͚"Xx"k%> =; NXM4 RWzUpK.|?}W?(,8X[pܯK^Oct΂oCui4l!6ʱwHw>G[_C_[08F fZ6a5[5>#f|L}Dp9à;io6 RazO{>sOו˹_'.04'Qk`B]x,w`wMQ=8Aa'Bh~P/~|:7IG _ş;ߣYQ`.(}s?t;#" g~~d- 8Ax@`l:O\ekνA-AcTΫ 2LsoR|+&{$8X @"p6>3w?S=~? dAh` M {t>Bp%=RAtlj+ozW[ I gQ3;|- D T> aBZĽIENDB`capistrano-capistrano-603c346/docs/assets/apple-touch-icon.png000066400000000000000000000104721520217215100243770ustar00rootroot00000000000000PNG  IHDR gAMA asRGBPLTEGpL6666666666666666666568Q=Q548PR8R=>9>R= DQ=)L6WP6:c5L"+V$M)6e;9;{0Bv2G}$OK,P (MnMN8Q9vKD'H!D%1^(L1WI u>;30];jDA,ԩ#nzm5T!V&5 PY}CM)w PY;%4y]UU~#k ƿeQS UUHJz:٤*ބW>t}?.=jemAh)ѽ[>r Hnזruy8l Z ~y7XjEǫ,Mr3k-L-&+[d-Pn+oz7_7EzzF11vBvE72{ԣ&)@=KO$ z!9.R7#hڸkd{ciHh}P _#Z~hg}e?;h Hd x4r _=rXGVh+I9`l. eAو6X4y[>5۽ll(]O1Eڢ53 ^o#!/n9g}GE&<&kd܍ ܚXde: 7aS2/.`cj@#B Rk6J#LJ2|N-l3`C@eEm6^l h?I9OF/&Zm XjHbbE}|~:gjOq}>DŽMRQ{-_ײ2fSGmKKI7"jbӣs$0zv)zl`z[PX_8#HGl 49`hq? ORR1UBo>pM7p:?|ƨw%VRn[0WapNg \HxXܶ&O̺pų۟sSSSs?o6rK窠D#, qO[?pܢ ƺ42)ǟ ?/>yum퇸ѦFT98EqC ٕټ]/)zG!$ "pf&,uf4-Ch~-HYFN±KB#~>7߂{]i`)ZhΰAQ*y9;|jKIG еyεlP^$ kTڥ,:*jEwRaN'JG Ԗ(Fy*Ċ%7JyZNf1fr˙Yd_`Ӵwz3|K:Efcc31KAxWp :{DBo! saM;:6O?u>>+3O;LȖ`:/:o +suUECb4+nsؕ,-l$] K.R6s5% Y𘝴PkN8eO=EHaf!xÐ8{ î/蕠BwޚE5> nrJ@RZD6boǨ="FqyG8=ȊOZҁd9o;<S*$IKm~Li9@ڂ_\S6걮}S}4DR̽_:u;ם|C}Y0;oq#&\jC\]۽IjY0hx`[!YGA>;<6A!Jm9<ywBwۡGuZ 4=-rkd"~v= I2BQ8Lm8U=DyΘ\աӿ:!- %#'MZ)eʧ-ZUE^~$ڟ m7G{Q`J3g, 59)80Hd0 [n joj_)i4܉烱B,6D |Wߺ"ߗUVɁhBhb]N> )GUW,$syM,ޚɬC&B&,T\uC{Vl(@yZ2η._=8Bay ٤r vH\/uRR5㌛fUuTyj۬ jfɂ\lbwr~JoׂʐMAܐAڑҀX&>:T^*2\Pk"KMjҫ̽JEZ1_=/5p;"9woFWW"p6L_r>rZfQ-Nw"y肟}F;Մ(;l_;mtp#ϭr+ [2ƖFԌ$2yH ]i0د׋*]tp~; n)uxh>M}'^.6ŽCgw5Dى\Sw~?P*?q=e^DvYgA%2wەWNQ' OZϑԞ+ZZƱ˘<}Q+CO#HSԝ+zwuA]e4]cO T׸>fed0EhyM J #1c1b39 capistrano-capistrano-603c346/docs/assets/css/000077500000000000000000000000001520217215100213065ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/assets/css/capistrano.css000066400000000000000000000030121520217215100241570ustar00rootroot00000000000000body { 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; }*/ capistrano-capistrano-603c346/docs/assets/css/dreamweaver.css000066400000000000000000000037531520217215100243320ustar00rootroot00000000000000/** * 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; } capistrano-capistrano-603c346/docs/assets/css/foundation.css000066400000000000000000004031321520217215100241710ustar00rootroot00000000000000*, *: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; font-weight: bold; color: white; } .joyride-tip-guide p { margin: 0 0 1.125em 0; font-size: 0.875em; line-height: 1.3; } .joyride-timer-indicator-wrap { width: 50px; height: 3px; border: solid 1px #555555; position: absolute; right: 1.0625em; bottom: 1em; } .joyride-timer-indicator { display: block; width: 0; height: inherit; background: #666666; } .joyride-close-tip { position: absolute; right: 12px; top: 10px; color: #777777 !important; text-decoration: none; font-size: 30px; font-weight: normal; line-height: 0.5 !important; } .joyride-close-tip:hover, .joyride-close-tip:focus { color: #eeeeee !important; } .joyride-modal-bg { position: fixed; height: 100%; width: 100%; background: transparent; background: rgba(0, 0, 0, 0.5); z-index: 100; display: none; top: 0; left: 0; cursor: pointer; } .joyride-expose-wrapper { background-color: #ffffff; position: absolute; border-radius: 3px; z-index: 102; -moz-box-shadow: 0px 0px 30px white; -webkit-box-shadow: 0px 0px 15px white; box-shadow: 0px 0px 15px white; } .joyride-expose-cover { background: transparent; border-radius: 3px; position: absolute; z-index: 9999; top: 0px; left: 0px; } /* Styles for screens that are atleast 768px; */ @media only screen and (min-width: 768px) { .joyride-tip-guide { width: 300px; left: inherit; } .joyride-tip-guide .joyride-nub.bottom { 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 { border-color: black !important; border-top-color: transparent !important; border-right-color: transparent !important; border-bottom-color: transparent !important; top: 22px; left: auto; right: -28px; } .joyride-tip-guide .joyride-nub.left { border-color: black !important; border-top-color: transparent !important; border-left-color: transparent !important; border-bottom-color: transparent !important; top: 22px; left: -28px; right: auto; } } /* Clearing Styles */ [data-clearing] { *zoom: 1; margin-bottom: 0; margin-left: 0; list-style: none; } [data-clearing]:before, [data-clearing]:after { content: " "; display: table; } [data-clearing]:after { clear: both; } [data-clearing] li { float: left; margin-right: 10px; } .clearing-blackout { background: #111111; position: fixed; width: 100%; height: 100%; top: 0; left: 0; z-index: 998; } .clearing-blackout .clearing-close { display: block; } .clearing-container { position: relative; z-index: 998; height: 100%; overflow: hidden; margin: 0; } .visible-img { height: 95%; position: relative; } .visible-img img { position: absolute; left: 50%; top: 50%; margin-left: -50%; max-height: 100%; max-width: 100%; } .clearing-caption { color: white; line-height: 1.3; margin-bottom: 0; text-align: center; bottom: 0; background: #111111; width: 100%; padding: 10px 30px; position: absolute; left: 0; } .clearing-close { z-index: 999; padding-left: 20px; padding-top: 10px; font-size: 40px; line-height: 1; color: white; display: none; } .clearing-close:hover, .clearing-close:focus { color: #ccc; } .clearing-assembled .clearing-container { height: 100%; } .clearing-assembled .clearing-container .carousel > ul { display: none; } .clearing-feature li { display: none; } .clearing-feature li.clearing-featured-img { display: block; } @media only screen and (min-width: 768px) { .clearing-main-prev, .clearing-main-next { position: absolute; height: 100%; width: 40px; top: 0; } .clearing-main-prev > span, .clearing-main-next > span { position: absolute; top: 50%; display: block; width: 0; height: 0; border: solid 16px; } .clearing-main-prev { left: 0; } .clearing-main-prev > span { left: 5px; border-color: transparent; border-right-color: white; } .clearing-main-next { right: 0; } .clearing-main-next > span { border-color: transparent; border-left-color: white; } .clearing-main-prev.disabled, .clearing-main-next.disabled { opacity: 0.5; } .clearing-assembled .clearing-container .carousel { background: #111111; height: 150px; margin-top: 5px; } .clearing-assembled .clearing-container .carousel > ul { display: block; z-index: 999; width: 200%; height: 100%; margin-left: 0; position: relative; left: 0; } .clearing-assembled .clearing-container .carousel > ul li { display: block; width: 175px; height: inherit; padding: 0; float: left; overflow: hidden; margin-right: 1px; position: relative; cursor: pointer; opacity: 0.4; } .clearing-assembled .clearing-container .carousel > ul li.fix-height img { min-height: 100%; height: 100%; max-width: none; } .clearing-assembled .clearing-container .carousel > ul li a.th { border: none; -webkit-box-shadow: none; box-shadow: none; display: block; } .clearing-assembled .clearing-container .carousel > ul li img { cursor: pointer !important; min-width: 100% !important; } .clearing-assembled .clearing-container .carousel > ul li.visible { opacity: 1; } .clearing-assembled .clearing-container .visible-img { background: #111111; overflow: hidden; height: 75%; } .clearing-close { position: absolute; top: 10px; right: 20px; padding-left: 0; padding-top: 0; } } /* Foundation Alerts */ .alert-box { border-style: solid; border-width: 1px; display: block; font-weight: bold; margin-bottom: 1.25em; position: relative; padding: 0.6875em 1.3125em 0.75em 0.6875em; font-size: 0.875em; background-color: #2ba6cb; border-color: #2284a1; color: white; } .alert-box .close { font-size: 1.375em; padding: 5px 4px 4px; line-height: 0; position: absolute; top: 0.4375em; right: 0.3125em; color: #333333; opacity: 0.3; } .alert-box .close:hover, .alert-box .close:focus { opacity: 0.5; } .alert-box.radius { -webkit-border-radius: 3px; border-radius: 3px; } .alert-box.round { -webkit-border-radius: 1000px; border-radius: 1000px; } .alert-box.success { background-color: #5da423; border-color: #457a1a; color: white; } .alert-box.alert { background-color: #c60f13; border-color: #970b0e; color: white; } .alert-box.secondary { background-color: #e9e9e9; border-color: #d0d0d0; color: #505050; } /* Breadcrumbs */ .breadcrumbs { display: block; padding: 0.5625em 0.875em 0.5625em; overflow: hidden; margin-left: 0; list-style: none; border-style: solid; border-width: 1px; background-color: #f6f6f6; border-color: gainsboro; -webkit-border-radius: 3px; border-radius: 3px; } .breadcrumbs > * { margin: 0; float: left; font-size: 0.6875em; text-transform: uppercase; color: #2ba6cb; } .breadcrumbs > *:hover a, .breadcrumbs > *:focus a { text-decoration: underline; } .breadcrumbs > * a, .breadcrumbs > * span { text-transform: uppercase; color: #2ba6cb; } .breadcrumbs > *.current { cursor: default; color: #333333; } .breadcrumbs > *.current a { cursor: default; color: #333333; } .breadcrumbs > *.current:hover, .breadcrumbs > *.current:hover a, .breadcrumbs > *.current:focus, .breadcrumbs > *.current:focus a { text-decoration: none; } .breadcrumbs > *.unavailable { color: #999999; } .breadcrumbs > *.unavailable a { color: #999999; } .breadcrumbs > *.unavailable:hover, .breadcrumbs > *.unavailable:hover a, .breadcrumbs > *.unavailable:focus, .breadcrumbs > *.unavailable a:focus { text-decoration: none; color: #999999; cursor: default; } .breadcrumbs > *:before { content: "/"; color: #aaaaaa; margin: 0 0.75em; position: relative; top: 1px; } .breadcrumbs > *:first-child:before { content: " "; margin: 0; } /* Keystroke Characters */ .keystroke, kbd { background-color: #ededed; border-color: #dbdbdb; color: #222222; border-style: solid; border-width: 1px; margin: 0; font-family: "Consolas", "Menlo", "Courier", monospace; font-size: 0.875em; padding: 0.125em 0.25em 0em; -webkit-border-radius: 3px; border-radius: 3px; } /* Labels */ .label { font-weight: bold; text-align: center; text-decoration: none; line-height: 1; white-space: nowrap; display: inline-block; position: relative; padding: 0.1875em 0.625em 0.25em; font-size: 0.875em; background-color: #2ba6cb; color: white; } .label.radius { -webkit-border-radius: 3px; border-radius: 3px; } .label.round { -webkit-border-radius: 1000px; border-radius: 1000px; } .label.alert { background-color: #c60f13; color: white; } .label.success { background-color: #5da423; color: white; } .label.secondary { background-color: #e9e9e9; color: #333333; } /* Inline Lists */ .inline-list { margin: 0 auto 1.0625em auto; margin-left: -1.375em; margin-right: 0; padding: 0; list-style: none; overflow: hidden; } .inline-list > li { list-style: none; float: left; margin-left: 1.375em; display: block; } .inline-list > li > * { display: block; } /* Pagination */ .pagination { display: block; height: 1.5em; margin-left: -0.3125em; } .pagination li { display: block; float: left; height: 1.5em; color: #222222; font-size: 0.875em; margin-left: 0.3125em; } .pagination li a { display: block; padding: 0.0625em 0.4375em 0.0625em; color: #999999; } .pagination li:hover a, .pagination li a:focus { background: #e6e6e6; } .pagination li.unavailable a { cursor: default; color: #999999; } .pagination li.unavailable:hover a, .pagination li.unavailable a:focus { background: transparent; } .pagination li.current a { background: #2ba6cb; color: white; font-weight: bold; cursor: default; } .pagination li.current a:hover, .pagination li.current a:focus { background: #2ba6cb; } .pagination-centered { text-align: center; } .pagination-centered ul > li { float: none; display: inline-block; } /* Panels */ .panel { border-style: solid; border-width: 1px; border-color: #d9d9d9; margin-bottom: 1.25em; padding: 1.25em; background: #f2f2f2; } .panel > :first-child { margin-top: 0; } .panel > :last-child { margin-bottom: 0; } .panel h1, .panel h2, .panel h3, .panel h4, .panel h5, .panel h6, .panel p { color: #333333; } .panel h1, .panel h2, .panel h3, .panel h4, .panel h5, .panel h6 { line-height: 1; margin-bottom: 0.625em; } .panel h1.subheader, .panel h2.subheader, .panel h3.subheader, .panel h4.subheader, .panel h5.subheader, .panel h6.subheader { line-height: 1.4; } .panel.callout { border-style: solid; border-width: 1px; border-color: #2284a1; margin-bottom: 1.25em; padding: 1.25em; background: #2ba6cb; -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; } .panel.callout > :first-child { margin-top: 0; } .panel.callout > :last-child { margin-bottom: 0; } .panel.callout h1, .panel.callout h2, .panel.callout h3, .panel.callout h4, .panel.callout h5, .panel.callout h6, .panel.callout p { color: white; } .panel.callout h1, .panel.callout h2, .panel.callout h3, .panel.callout h4, .panel.callout h5, .panel.callout h6 { line-height: 1; margin-bottom: 0.625em; } .panel.callout h1.subheader, .panel.callout h2.subheader, .panel.callout h3.subheader, .panel.callout h4.subheader, .panel.callout h5.subheader, .panel.callout h6.subheader { line-height: 1.4; } .panel.radius { -webkit-border-radius: 3px; border-radius: 3px; } /* Pricing Tables */ .pricing-table { border: solid 1px #dddddd; margin-left: 0; margin-bottom: 1.25em; } .pricing-table * { list-style: none; line-height: 1; } .pricing-table .title { background-color: #dddddd; padding: 0.9375em 1.25em; text-align: center; color: #333333; font-weight: bold; font-size: 1em; } .pricing-table .price { background-color: #eeeeee; padding: 0.9375em 1.25em; text-align: center; color: #333333; font-weight: normal; font-size: 1.25em; } .pricing-table .description { background-color: white; padding: 0.9375em; text-align: center; color: #777777; font-size: 0.75em; font-weight: normal; line-height: 1.4; border-bottom: dotted 1px #dddddd; } .pricing-table .bullet-item { background-color: white; padding: 0.9375em; text-align: center; color: #333333; font-size: 0.875em; font-weight: normal; border-bottom: dotted 1px #dddddd; } .pricing-table .cta-button { background-color: whitesmoke; text-align: center; padding: 1.25em 1.25em 0; } /* Progress Bar */ .progress { background-color: transparent; height: 1.5625em; border: 1px solid #cccccc; padding: 0.125em; margin-bottom: 0.625em; } .progress .meter { background: #2ba6cb; height: 100%; display: block; } .progress.secondary .meter { background: #e9e9e9; height: 100%; display: block; } .progress.success .meter { background: #5da423; height: 100%; display: block; } .progress.alert .meter { background: #c60f13; height: 100%; display: block; } .progress.radius { -webkit-border-radius: 3px; border-radius: 3px; } .progress.radius .meter { -webkit-border-radius: 2px; border-radius: 2px; } .progress.round { -webkit-border-radius: 1000px; border-radius: 1000px; } .progress.round .meter { -webkit-border-radius: 999px; border-radius: 999px; } /* Side Nav */ .side-nav { display: block; margin: 0; padding: 0.875em 0; list-style-type: none; list-style-position: inside; } .side-nav li { margin: 0 0 0.4375em 0; font-size: 0.875em; } .side-nav li a { display: block; color: #2ba6cb; } .side-nav li.active > a:first-child { color: #4d4d4d; font-weight: bold; } .side-nav li.divider { border-top: 1px solid; height: 0; padding: 0; list-style: none; border-top-color: #e6e6e6; } /* Side Nav */ .sub-nav { display: block; width: auto; overflow: hidden; margin: -0.25em 0 1.125em; padding-top: 0.25em; margin-right: 0; margin-left: -0.5625em; } .sub-nav dt, .sub-nav dd { float: left; display: inline; margin-left: 0.5625em; margin-bottom: 0.625em; font-weight: normal; font-size: 0.875em; } .sub-nav dt a, .sub-nav dd a { color: #999999; text-decoration: none; } .sub-nav dt.active a, .sub-nav dd.active a { -webkit-border-radius: 1000px; border-radius: 1000px; font-weight: bold; background: #2ba6cb; padding: 0.1875em 0.5625em; cursor: default; color: white; } /* Foundation Switches */ @media only screen { div.switch { position: relative; width: 100%; padding: 0; display: block; overflow: hidden; border-style: solid; border-width: 1px; margin-bottom: 1.25em; -webkit-animation: webkitSiblingBugfix infinite 1s; height: 36px; background: white; border-color: #cccccc; } div.switch label { position: relative; left: 0; z-index: 2; float: left; width: 50%; height: 100%; margin: 0; font-weight: bold; text-align: left; -webkit-transition: all 0.1s ease-out; -moz-transition: all 0.1s ease-out; transition: all 0.1s ease-out; } div.switch input { position: absolute; z-index: 3; opacity: 0; width: 100%; height: 100%; -moz-appearance: none; } div.switch input:hover, div.switch input:focus { cursor: pointer; } div.switch > span { position: absolute; top: -1px; left: -1px; z-index: 1; display: block; padding: 0; border-width: 1px; border-style: solid; -webkit-transition: all 0.1s ease-out; -moz-transition: all 0.1s ease-out; transition: all 0.1s ease-out; } div.switch input:not(:checked) + label { opacity: 0; } div.switch input:checked { display: none !important; } div.switch input { left: 0; display: block !important; } div.switch input:first-of-type + label, div.switch input:first-of-type + span + label { left: -50%; } div.switch input:first-of-type:checked + label, div.switch input:first-of-type:checked + span + label { left: 0%; } div.switch input:last-of-type + label, div.switch input:last-of-type + span + label { right: -50%; left: auto; text-align: right; } div.switch input:last-of-type:checked + label, div.switch input:last-of-type:checked + span + label { right: 0%; left: auto; } div.switch span.custom { display: none !important; } div.switch label { padding: 0 0.375em; line-height: 2.3em; font-size: 0.875em; } div.switch input:first-of-type:checked ~ span { left: 100%; margin-left: -2.1875em; } div.switch > span { width: 2.25em; height: 2.25em; } div.switch > span { border-color: #b3b3b3; background: white; background: -moz-linear-gradient(top, white 0%, #f2f2f2 100%); background: -webkit-linear-gradient(top, white 0%, #f2f2f2 100%); background: linear-gradient(to bottom, white 0%, #f2f2f2 100%); -webkit-box-shadow: 2px 0 10px 0 rgba(0, 0, 0, 0.07), 1000px 0 0 1000px #e1f5d1, -2px 0 10px 0 rgba(0, 0, 0, 0.07), -1000px 0 0 1000px whitesmoke; box-shadow: 2px 0 10px 0 rgba(0, 0, 0, 0.07), 1000px 0 0 980px #e1f5d1, -2px 0 10px 0 rgba(0, 0, 0, 0.07), -1000px 0 0 1000px whitesmoke; } div.switch:hover > span, div.switch:focus > span { background: white; background: -moz-linear-gradient(top, white 0%, #e6e6e6 100%); background: -webkit-linear-gradient(top, white 0%, #e6e6e6 100%); background: linear-gradient(to bottom, white 0%, #e6e6e6 100%); } div.switch:active { background: transparent; } div.switch.large { height: 44px; } div.switch.large label { padding: 0 0.375em; line-height: 2.3em; font-size: 1.0625em; } div.switch.large input:first-of-type:checked ~ span { left: 100%; margin-left: -2.6875em; } div.switch.large > span { width: 2.75em; height: 2.75em; } div.switch.small { height: 28px; } div.switch.small label { padding: 0 0.375em; line-height: 2.1em; font-size: 0.75em; } div.switch.small input:first-of-type:checked ~ span { left: 100%; margin-left: -1.6875em; } div.switch.small > span { width: 1.75em; height: 1.75em; } div.switch.tiny { height: 22px; } div.switch.tiny label { padding: 0 0.375em; line-height: 1.9em; font-size: 0.6875em; } div.switch.tiny input:first-of-type:checked ~ span { left: 100%; margin-left: -1.3125em; } div.switch.tiny > span { width: 1.375em; height: 1.375em; } div.switch.radius { -webkit-border-radius: 4px; border-radius: 4px; } div.switch.radius > span { -webkit-border-radius: 3px; border-radius: 3px; } div.switch.round { -webkit-border-radius: 1000px; border-radius: 1000px; } div.switch.round > span { -webkit-border-radius: 999px; border-radius: 999px; } div.switch.round label { padding: 0 0.5625em; } @-webkit-keyframes webkitSiblingBugfix { from { position: relative; } to { position: relative; } } } [data-magellan-expedition] { background: white; z-index: 50; min-width: 100%; padding: 10px; } [data-magellan-expedition] .sub-nav { margin-bottom: 0; } [data-magellan-expedition] .sub-nav dd { margin-bottom: 0; } /* Tables */ table { background: white; margin-bottom: 1.25em; border: solid 1px #dddddd; } table thead, table tfoot { background: whitesmoke; font-weight: bold; } table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td { padding: 0.5em 0.625em 0.625em; font-size: 0.875em; color: #222222; text-align: left; } table tr th, table tr td { padding: 0.5625em 0.625em; font-size: 0.875em; color: #222222; } table tr.even, table tr.alt, table tr:nth-of-type(even) { background: #f9f9f9; } table thead tr th, table tfoot tr th, table tbody tr td, table tr td, table tfoot tr td { display: table-cell; line-height: 1.125em; } /* Image Thumbnails */ .th { line-height: 0; display: inline-block; border: solid 4px white; -webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2); box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.2); -webkit-transition: all 200ms ease-out; -moz-transition: all 200ms ease-out; transition: all 200ms ease-out; } .th:hover, .th:focus { -webkit-box-shadow: 0 0 6px 1px rgba(43, 166, 203, 0.5); box-shadow: 0 0 6px 1px rgba(43, 166, 203, 0.5); } .th.radius { -webkit-border-radius: 3px; border-radius: 3px; } a.th { display: inline-block; } /* Tooltips */ .has-tip { border-bottom: dotted 1px #cccccc; cursor: help; font-weight: bold; color: #333333; } .has-tip:hover, .has-tip:focus { border-bottom: dotted 1px #196177; color: #2ba6cb; } .has-tip.tip-left, .has-tip.tip-right { float: none !important; } .tooltip { display: none; position: absolute; z-index: 999; font-weight: bold; font-size: 0.9375em; line-height: 1.3; padding: 0.5em; max-width: 85%; left: 50%; width: 100%; color: white; background: black; -webkit-border-radius: 3px; border-radius: 3px; } .tooltip > .nub { display: block; left: 5px; position: absolute; width: 0; height: 0; border: solid 5px; border-color: transparent transparent black transparent; top: -10px; } .tooltip.opened { color: #2ba6cb !important; border-bottom: dotted 1px #196177 !important; } .tap-to-close { display: block; font-size: 0.625em; color: #888888; font-weight: normal; } @media only screen and (min-width: 768px) { .tooltip > .nub { border-color: transparent transparent black transparent; top: -10px; } .tooltip.tip-top > .nub { border-color: black transparent transparent transparent; top: auto; bottom: -10px; } .tooltip.tip-left, .tooltip.tip-right { float: none !important; } .tooltip.tip-left > .nub { border-color: transparent transparent transparent black; right: -10px; left: auto; top: 50%; margin-top: -5px; } .tooltip.tip-right > .nub { border-color: transparent black transparent transparent; right: auto; left: -10px; top: 50%; margin-top: -5px; } } @media only screen and (max-width: 767px) { .f-dropdown { max-width: 100%; left: 0; } } /* Foundation Dropdowns */ .f-dropdown { position: absolute; top: -9999px; list-style: none; margin-left: 0; width: 100%; max-height: none; height: auto; background: white; border: solid 1px #cccccc; font-size: 16px; z-index: 99; margin-top: 2px; max-width: 200px; } .f-dropdown > *:first-child { margin-top: 0; } .f-dropdown > *:last-child { margin-bottom: 0; } .f-dropdown:before { content: ""; display: block; width: 0; height: 0; border: inset 6px; border-color: transparent transparent white transparent; border-bottom-style: solid; position: absolute; top: -12px; left: 10px; z-index: 99; } .f-dropdown:after { content: ""; display: block; width: 0; height: 0; border: inset 7px; border-color: transparent transparent #cccccc transparent; border-bottom-style: solid; position: absolute; top: -14px; left: 9px; z-index: 98; } .f-dropdown.right:before { left: auto; right: 10px; } .f-dropdown.right:after { left: auto; right: 9px; } .f-dropdown li { font-size: 0.875em; cursor: pointer; line-height: 1.125em; margin: 0; } .f-dropdown li:hover, .f-dropdown li:focus { background: #eeeeee; } .f-dropdown li a { display: block; padding: 0.3125em 0.625em; color: #555555; } .f-dropdown.content { position: absolute; top: -9999px; list-style: none; margin-left: 0; padding: 1.25em; width: 100%; height: auto; max-height: none; background: white; border: solid 1px #cccccc; font-size: 16px; z-index: 99; max-width: 200px; } .f-dropdown.content > *:first-child { margin-top: 0; } .f-dropdown.content > *:last-child { margin-bottom: 0; } .f-dropdown.tiny { max-width: 200px; } .f-dropdown.small { max-width: 300px; } .f-dropdown.medium { max-width: 500px; } .f-dropdown.large { max-width: 800px; } capistrano-capistrano-603c346/docs/assets/css/foundation.min.css000066400000000000000000003100101520217215100247430ustar00rootroot00000000000000*,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}html,body{font-size:100%}body{background:#fff;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%}.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}}@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}}.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}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}@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}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}}@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}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}}@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}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}}.show-for-landscape,.hide-for-portrait{display:inherit !important}.hide-for-landscape,.show-for-portrait{display:none !important}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}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}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}}.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}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}@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}}@media only screen and (min-width: 768px){.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}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}a{color:#2ba6cb;text-decoration:none;line-height:inherit}a:hover,a:focus{color:#2795b6}a img{border:none}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}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 #ddd;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}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}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}ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}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}ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}dl dt{margin-bottom:0.3em;font-weight:bold}dl dd{margin-bottom:0.75em}abbr,acronym{text-transform:uppercase;font-size:90%;color:#1c1b39;border-bottom:1px dotted #ddd;cursor:help}abbr{text-transform:none}blockquote{margin:0 0 1.25em;padding:0.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}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}.vcard{display:inline-block;margin:0 0 1.25em 0;border:1px solid #ddd;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-only{display:none !important}@media print{*{background:transparent !important;color:#000 !important;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 #999;page-break-inside:avoid}thead{display:table-header-group}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:#fff}button:hover,button:focus,.button:hover,.button:focus{background-color:#2284a1}button:hover,button:focus,.button:hover,.button:focus{color:#fff}button.secondary,.button.secondary{background-color:#e9e9e9;border-color:#d0d0d0;color:#333}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:#333}button.success,.button.success{background-color:#5da423;border-color:#457a1a;color:#fff}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:#fff}button.alert,.button.alert{background-color:#c60f13;border-color:#970b0e;color:#fff}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:#fff}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:#fff;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:#fff}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:#333;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:#333}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:#fff;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:#fff}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:#fff;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:#fff}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}}form{margin:0 0 1em}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{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}.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}.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}span.prefix{background:#f2f2f2;border-color:#d9d9d9;border-right:none;color:#333}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:#ccc;border-left:none;color:#333}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-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}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:#fff;font-family:inherit;border:1px solid #ccc;-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 #999;-moz-box-shadow:0 0 5px #999;box-shadow:0 0 5px #999;border-color:#999}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:#999;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:#ddd}input[type="file"],input[type="checkbox"],input[type="radio"],select{margin:0 0 1em 0}input[type="file"]{width:100%}fieldset{border:solid 1px #ddd;padding:1.25em;margin:1.125em 0}fieldset legend{font-weight:bold;background:#fff;padding:0 0.1875em;margin:0;margin-left:-0.1875em}.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:#999}.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:#fff}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 #ccc;background:#fff}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:#fff}form.custom .custom.radio.checked:before{content:"";display:block;width:8px;height:8px;-webkit-border-radius:1000px;border-radius:1000px;background:#222;position:relative}form.custom .custom.checkbox.checked:before{content:"\00d7";color:#222;position:absolute;top:-50%;left:50%;margin-top:4px;margin-left:-5px}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:#fff;background:-moz-linear-gradient(top, #fff 0%, #f3f3f3 100%);background:-webkit-linear-gradient(top, #fff 0%, #f3f3f3 100%);-webkit-box-shadow:none;background:linear-gradient(to bottom, #fff 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:#aaa 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:#222 transparent transparent transparent;border-top-style:solid}form.custom .custom.dropdown .disabled{color:#888}form.custom .custom.dropdown .disabled:hover{background:transparent;color:#888}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:#fff;border:solid 1px #ccc;font-size:16px}form.custom .custom.dropdown ul li{color:#555;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:#eee;color:#000}form.custom .custom.dropdown ul li:hover{background-color:#e4e4e4;color:#000}form.custom .custom.dropdown ul li.selected:hover{background:#eee;cursor:default;color:#000}form.custom .custom.dropdown ul.show{display:block}form.custom .custom.disabled{background:#ddd}.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{position:relative;padding-right:3.1875em}.dropdown.button:before{position:absolute;content:"";width:0;height:0;display:block;border-style:solid;border-color:#fff transparent transparent transparent;top:50%}.dropdown.button:before{border-width:0.5625em;right:1.5em;margin-top:-0.25em}.dropdown.button:before{border-color:#fff 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:#fff 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:#fff 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:#fff transparent transparent transparent}.dropdown.button.secondary:before{border-color:#333 transparent transparent transparent}.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:#fff transparent transparent transparent}.split.button.secondary span{border-left-color:#c3c3c3}.split.button.secondary span:before{border-color:#fff 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:#333 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{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%}.section-container,.section-container.auto{width:100%;display:block;margin-bottom:1.25em;border:1px solid #ccc;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:#333;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:#fff}.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:#333}.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 #ccc}.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:#333;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:#fff}.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:#fff}.section-container.tabs>section.active>.title a,.section-container.tabs>.section.active>.title a{color:#333}.section-container.tabs>section>.title,.section-container.tabs>.section>.title{width:auto;border:solid 1px #ccc;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 #ccc}.section-container.tabs>section .content,.section-container.tabs>.section .content{border:solid 1px #ccc;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:#fff}.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:#333;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:#fff}.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:#fff}.section-container.auto>section.active>.title a,.section-container.auto>.section.active>.title a{color:#333}.section-container.auto>section>.title,.section-container.auto>.section>.title{width:auto;border:solid 1px #ccc;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 #ccc}.section-container.auto>section .content,.section-container.auto>.section .content{border:solid 1px #ccc;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:#fff}.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 #ccc;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:#333;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:#fff}.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:#333}.section-container.vertical-tabs section>.title,.section-container.vertical-tabs .section>.title{position:absolute;border-top:solid 1px #ccc;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 #ccc;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:#333;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:#fff}.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:#333}.section-container.vertical-nav>section>.title,.section-container.vertical-nav>.section>.title{border-top:none;border:solid 1px #ccc}.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 #ccc}.section-container.horizontal-nav{position:relative;background:#efefef;border:1px solid #ccc}.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:#333;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:#fff}.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:#333}.section-container.horizontal-nav>section>.title,.section-container.horizontal-nav>.section>.title{width:auto;border:solid 1px #ccc;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 #ccc}}.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 #ccc;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:#333;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:#fff}.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:#333}.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 #ccc}.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}.contain-to-grid{width:100%;background:#111}.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:#111;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:#fff;width:50%;display:block;padding:0 15px}.top-bar .toggle-topbar{position:absolute;right:0;top:0}.top-bar .toggle-topbar a{color:#fff;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:#fff}.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 #fff,0 16px 0 1px #fff,0 22px 0 1px #fff;box-shadow:0 10px 0 1px #fff,0 16px 0 1px #fff,0 22px 0 1px #fff}.top-bar.expanded{height:auto;background:transparent}.top-bar.expanded .title-area{background:#111}.top-bar.expanded .toggle-topbar a{color:#888}.top-bar.expanded .toggle-topbar a span{-webkit-box-shadow:0 10px 0 1px #888,0 16px 0 1px #888,0 22px 0 1px #888;box-shadow:0 10px 0 1px #888,0 16px 0 1px #888,0 22px 0 1px #888}.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:#222;font-size:16px;margin:0}.top-bar-section .divider,.top-bar-section [role="separator"]{border-bottom:solid 1px #2b2b2b;border-top:solid 1px #000;clear:both;height:1px;width:100%}.top-bar-section ul li>a{display:block;width:100%;color:#fff;padding:12px 0 12px 0;padding-left:15px;font-size:0.8125em;font-weight:bold;background:#222}.top-bar-section ul li>a.hover{background:#090909;color:#fff}.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:#fff}.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:#fff;line-height:22.5px;display:block}.top-bar-section .dropdown label{padding:8px 15px 2px;margin-bottom:0;text-transform:uppercase;color:#555;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:#111;*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:#111}.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:#111}.top-bar-section li a:not(.button).hover{background:#000}.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:#fff;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 #000;clear:none;height:45px;width:0px}.top-bar-section .has-form{background:#111;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)}}.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:#555 #fff;-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:#f5f5f5}.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:#000;background-color:rgba(0,0,0,0.6);color:#fff;width:100%;padding:10px 14px;font-size:0.875em}.orbit-container .orbit-slide-number{position:absolute;top:10px;left:10px;font-size:12px;color:#fff;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:#000;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 #000;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 #000}.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:#000;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:#999;float:left;margin-right:6px;border:solid 2px #222;-webkit-border-radius:1000px;border-radius:1000px}.orbit-bullets li.active{background:#222}.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:#000;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:#fff;padding:1.25em;border:solid 1px #666;-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:#aaa;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:#fff !important}}.joyride-list{display:none}.joyride-tip-guide{display:none;position:absolute;background:#000;color:#fff;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}.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:#000;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:#000 !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}.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;font-weight:bold;color:#fff}.joyride-tip-guide p{margin:0 0 1.125em 0;font-size:0.875em;line-height:1.3}.joyride-timer-indicator-wrap{width:50px;height:3px;border:solid 1px #555;position:absolute;right:1.0625em;bottom:1em}.joyride-timer-indicator{display:block;width:0;height:inherit;background:#666}.joyride-close-tip{position:absolute;right:12px;top:10px;color:#777 !important;text-decoration:none;font-size:30px;font-weight:normal;line-height:0.5 !important}.joyride-close-tip:hover,.joyride-close-tip:focus{color:#eee !important}.joyride-modal-bg{position:fixed;height:100%;width:100%;background:transparent;background:rgba(0,0,0,0.5);z-index:100;display:none;top:0;left:0;cursor:pointer}.joyride-expose-wrapper{background-color:#ffffff;position:absolute;border-radius:3px;z-index:102;-moz-box-shadow:0px 0px 30px #fff;-webkit-box-shadow:0px 0px 15px #fff;box-shadow:0px 0px 15px #fff}.joyride-expose-cover{background:transparent;border-radius:3px;position:absolute;z-index:9999;top:0px;left:0px}@media only screen and (min-width: 768px){.joyride-tip-guide{width:300px;left:inherit}.joyride-tip-guide .joyride-nub.bottom{border-color:#000 !important;border-bottom-color:transparent !important;border-left-color:transparent !important;border-right-color:transparent !important;bottom:-28px}.joyride-tip-guide .joyride-nub.right{border-color:#000 !important;border-top-color:transparent !important;border-right-color:transparent !important;border-bottom-color:transparent !important;top:22px;left:auto;right:-28px}.joyride-tip-guide .joyride-nub.left{border-color:#000 !important;border-top-color:transparent !important;border-left-color:transparent !important;border-bottom-color:transparent !important;top:22px;left:-28px;right:auto}}[data-clearing]{*zoom:1;margin-bottom:0;margin-left:0;list-style:none}[data-clearing]:before,[data-clearing]:after{content:" ";display:table}[data-clearing]:after{clear:both}[data-clearing] li{float:left;margin-right:10px}.clearing-blackout{background:#111;position:fixed;width:100%;height:100%;top:0;left:0;z-index:998}.clearing-blackout .clearing-close{display:block}.clearing-container{position:relative;z-index:998;height:100%;overflow:hidden;margin:0}.visible-img{height:95%;position:relative}.visible-img img{position:absolute;left:50%;top:50%;margin-left:-50%;max-height:100%;max-width:100%}.clearing-caption{color:#fff;line-height:1.3;margin-bottom:0;text-align:center;bottom:0;background:#111;width:100%;padding:10px 30px;position:absolute;left:0}.clearing-close{z-index:999;padding-left:20px;padding-top:10px;font-size:40px;line-height:1;color:#fff;display:none}.clearing-close:hover,.clearing-close:focus{color:#ccc}.clearing-assembled .clearing-container{height:100%}.clearing-assembled .clearing-container .carousel>ul{display:none}.clearing-feature li{display:none}.clearing-feature li.clearing-featured-img{display:block}@media only screen and (min-width: 768px){.clearing-main-prev,.clearing-main-next{position:absolute;height:100%;width:40px;top:0}.clearing-main-prev>span,.clearing-main-next>span{position:absolute;top:50%;display:block;width:0;height:0;border:solid 16px}.clearing-main-prev{left:0}.clearing-main-prev>span{left:5px;border-color:transparent;border-right-color:#fff}.clearing-main-next{right:0}.clearing-main-next>span{border-color:transparent;border-left-color:#fff}.clearing-main-prev.disabled,.clearing-main-next.disabled{opacity:0.5}.clearing-assembled .clearing-container .carousel{background:#111;height:150px;margin-top:5px}.clearing-assembled .clearing-container .carousel>ul{display:block;z-index:999;width:200%;height:100%;margin-left:0;position:relative;left:0}.clearing-assembled .clearing-container .carousel>ul li{display:block;width:175px;height:inherit;padding:0;float:left;overflow:hidden;margin-right:1px;position:relative;cursor:pointer;opacity:0.4}.clearing-assembled .clearing-container .carousel>ul li.fix-height img{min-height:100%;height:100%;max-width:none}.clearing-assembled .clearing-container .carousel>ul li a.th{border:none;-webkit-box-shadow:none;box-shadow:none;display:block}.clearing-assembled .clearing-container .carousel>ul li img{cursor:pointer !important;min-width:100% !important}.clearing-assembled .clearing-container .carousel>ul li.visible{opacity:1}.clearing-assembled .clearing-container .visible-img{background:#111;overflow:hidden;height:75%}.clearing-close{position:absolute;top:10px;right:20px;padding-left:0;padding-top:0}}.alert-box{border-style:solid;border-width:1px;display:block;font-weight:bold;margin-bottom:1.25em;position:relative;padding:0.6875em 1.3125em 0.75em 0.6875em;font-size:0.875em;background-color:#2ba6cb;border-color:#2284a1;color:#fff}.alert-box .close{font-size:1.375em;padding:5px 4px 4px;line-height:0;position:absolute;top:0.4375em;right:0.3125em;color:#333;opacity:0.3}.alert-box .close:hover,.alert-box .close:focus{opacity:0.5}.alert-box.radius{-webkit-border-radius:3px;border-radius:3px}.alert-box.round{-webkit-border-radius:1000px;border-radius:1000px}.alert-box.success{background-color:#5da423;border-color:#457a1a;color:#fff}.alert-box.alert{background-color:#c60f13;border-color:#970b0e;color:#fff}.alert-box.secondary{background-color:#e9e9e9;border-color:#d0d0d0;color:#505050}.breadcrumbs{display:block;padding:0.5625em 0.875em 0.5625em;overflow:hidden;margin-left:0;list-style:none;border-style:solid;border-width:1px;background-color:#f6f6f6;border-color:#dcdcdc;-webkit-border-radius:3px;border-radius:3px}.breadcrumbs>*{margin:0;float:left;font-size:0.6875em;text-transform:uppercase;color:#2ba6cb}.breadcrumbs>*:hover a,.breadcrumbs>*:focus a{text-decoration:underline}.breadcrumbs>* a,.breadcrumbs>* span{text-transform:uppercase;color:#2ba6cb}.breadcrumbs>*.current{cursor:default;color:#333}.breadcrumbs>*.current a{cursor:default;color:#333}.breadcrumbs>*.current:hover,.breadcrumbs>*.current:hover a,.breadcrumbs>*.current:focus,.breadcrumbs>*.current:focus a{text-decoration:none}.breadcrumbs>*.unavailable{color:#999}.breadcrumbs>*.unavailable a{color:#999}.breadcrumbs>*.unavailable:hover,.breadcrumbs>*.unavailable:hover a,.breadcrumbs>*.unavailable:focus,.breadcrumbs>*.unavailable a:focus{text-decoration:none;color:#999;cursor:default}.breadcrumbs>*:before{content:"/";color:#aaa;margin:0 0.75em;position:relative;top:1px}.breadcrumbs>*:first-child:before{content:" ";margin:0}.keystroke,kbd{background-color:#ededed;border-color:#dbdbdb;color:#222;border-style:solid;border-width:1px;margin:0;font-family:"Consolas","Menlo","Courier",monospace;font-size:0.875em;padding:0.125em 0.25em 0em;-webkit-border-radius:3px;border-radius:3px}.label{font-weight:bold;text-align:center;text-decoration:none;line-height:1;white-space:nowrap;display:inline-block;position:relative;padding:0.1875em 0.625em 0.25em;font-size:0.875em;background-color:#2ba6cb;color:#fff}.label.radius{-webkit-border-radius:3px;border-radius:3px}.label.round{-webkit-border-radius:1000px;border-radius:1000px}.label.alert{background-color:#c60f13;color:#fff}.label.success{background-color:#5da423;color:#fff}.label.secondary{background-color:#e9e9e9;color:#333}.inline-list{margin:0 auto 1.0625em auto;margin-left:-1.375em;margin-right:0;padding:0;list-style:none;overflow:hidden}.inline-list>li{list-style:none;float:left;margin-left:1.375em;display:block}.inline-list>li>*{display:block}.pagination{display:block;height:1.5em;margin-left:-0.3125em}.pagination li{display:block;float:left;height:1.5em;color:#222;font-size:0.875em;margin-left:0.3125em}.pagination li a{display:block;padding:0.0625em 0.4375em 0.0625em;color:#999}.pagination li:hover a,.pagination li a:focus{background:#e6e6e6}.pagination li.unavailable a{cursor:default;color:#999}.pagination li.unavailable:hover a,.pagination li.unavailable a:focus{background:transparent}.pagination li.current a{background:#2ba6cb;color:#fff;font-weight:bold;cursor:default}.pagination li.current a:hover,.pagination li.current a:focus{background:#2ba6cb}.pagination-centered{text-align:center}.pagination-centered ul>li{float:none;display:inline-block}.panel{border-style:solid;border-width:1px;border-color:#d9d9d9;margin-bottom:1.25em;padding:1.25em;background:#f2f2f2}.panel>:first-child{margin-top:0}.panel>:last-child{margin-bottom:0}.panel h1,.panel h2,.panel h3,.panel h4,.panel h5,.panel h6,.panel p{color:#333}.panel h1,.panel h2,.panel h3,.panel h4,.panel h5,.panel h6{line-height:1;margin-bottom:0.625em}.panel h1.subheader,.panel h2.subheader,.panel h3.subheader,.panel h4.subheader,.panel h5.subheader,.panel h6.subheader{line-height:1.4}.panel.callout{border-style:solid;border-width:1px;border-color:#2284a1;margin-bottom:1.25em;padding:1.25em;background:#2ba6cb;-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}.panel.callout>:first-child{margin-top:0}.panel.callout>:last-child{margin-bottom:0}.panel.callout h1,.panel.callout h2,.panel.callout h3,.panel.callout h4,.panel.callout h5,.panel.callout h6,.panel.callout p{color:#fff}.panel.callout h1,.panel.callout h2,.panel.callout h3,.panel.callout h4,.panel.callout h5,.panel.callout h6{line-height:1;margin-bottom:0.625em}.panel.callout h1.subheader,.panel.callout h2.subheader,.panel.callout h3.subheader,.panel.callout h4.subheader,.panel.callout h5.subheader,.panel.callout h6.subheader{line-height:1.4}.panel.radius{-webkit-border-radius:3px;border-radius:3px}.pricing-table{border:solid 1px #ddd;margin-left:0;margin-bottom:1.25em}.pricing-table *{list-style:none;line-height:1}.pricing-table .title{background-color:#ddd;padding:0.9375em 1.25em;text-align:center;color:#333;font-weight:bold;font-size:1em}.pricing-table .price{background-color:#eee;padding:0.9375em 1.25em;text-align:center;color:#333;font-weight:normal;font-size:1.25em}.pricing-table .description{background-color:#fff;padding:0.9375em;text-align:center;color:#777;font-size:0.75em;font-weight:normal;line-height:1.4;border-bottom:dotted 1px #ddd}.pricing-table .bullet-item{background-color:#fff;padding:0.9375em;text-align:center;color:#333;font-size:0.875em;font-weight:normal;border-bottom:dotted 1px #ddd}.pricing-table .cta-button{background-color:#f5f5f5;text-align:center;padding:1.25em 1.25em 0}.progress{background-color:transparent;height:1.5625em;border:1px solid #ccc;padding:0.125em;margin-bottom:0.625em}.progress .meter{background:#2ba6cb;height:100%;display:block}.progress.secondary .meter{background:#e9e9e9;height:100%;display:block}.progress.success .meter{background:#5da423;height:100%;display:block}.progress.alert .meter{background:#c60f13;height:100%;display:block}.progress.radius{-webkit-border-radius:3px;border-radius:3px}.progress.radius .meter{-webkit-border-radius:2px;border-radius:2px}.progress.round{-webkit-border-radius:1000px;border-radius:1000px}.progress.round .meter{-webkit-border-radius:999px;border-radius:999px}.side-nav{display:block;margin:0;padding:0.875em 0;list-style-type:none;list-style-position:inside}.side-nav li{margin:0 0 0.4375em 0;font-size:0.875em}.side-nav li a{display:block;color:#2ba6cb}.side-nav li.active>a:first-child{color:#4d4d4d;font-weight:bold}.side-nav li.divider{border-top:1px solid;height:0;padding:0;list-style:none;border-top-color:#e6e6e6}.sub-nav{display:block;width:auto;overflow:hidden;margin:-0.25em 0 1.125em;padding-top:0.25em;margin-right:0;margin-left:-0.5625em}.sub-nav dt,.sub-nav dd{float:left;display:inline;margin-left:0.5625em;margin-bottom:0.625em;font-weight:normal;font-size:0.875em}.sub-nav dt a,.sub-nav dd a{color:#999;text-decoration:none}.sub-nav dt.active a,.sub-nav dd.active a{-webkit-border-radius:1000px;border-radius:1000px;font-weight:bold;background:#2ba6cb;padding:0.1875em 0.5625em;cursor:default;color:#fff}@media only screen{div.switch{position:relative;width:100%;padding:0;display:block;overflow:hidden;border-style:solid;border-width:1px;margin-bottom:1.25em;-webkit-animation:webkitSiblingBugfix infinite 1s;height:36px;background:#fff;border-color:#ccc}div.switch label{position:relative;left:0;z-index:2;float:left;width:50%;height:100%;margin:0;font-weight:bold;text-align:left;-webkit-transition:all 0.1s ease-out;-moz-transition:all 0.1s ease-out;transition:all 0.1s ease-out}div.switch input{position:absolute;z-index:3;opacity:0;width:100%;height:100%;-moz-appearance:none}div.switch input:hover,div.switch input:focus{cursor:pointer}div.switch>span{position:absolute;top:-1px;left:-1px;z-index:1;display:block;padding:0;border-width:1px;border-style:solid;-webkit-transition:all 0.1s ease-out;-moz-transition:all 0.1s ease-out;transition:all 0.1s ease-out}div.switch input:not(:checked)+label{opacity:0}div.switch input:checked{display:none !important}div.switch input{left:0;display:block !important}div.switch input:first-of-type+label,div.switch input:first-of-type+span+label{left:-50%}div.switch input:first-of-type:checked+label,div.switch input:first-of-type:checked+span+label{left:0%}div.switch input:last-of-type+label,div.switch input:last-of-type+span+label{right:-50%;left:auto;text-align:right}div.switch input:last-of-type:checked+label,div.switch input:last-of-type:checked+span+label{right:0%;left:auto}div.switch span.custom{display:none !important}div.switch label{padding:0 0.375em;line-height:2.3em;font-size:0.875em}div.switch input:first-of-type:checked ~ span{left:100%;margin-left:-2.1875em}div.switch>span{width:2.25em;height:2.25em}div.switch>span{border-color:#b3b3b3;background:#fff;background:-moz-linear-gradient(top, #fff 0%, #f2f2f2 100%);background:-webkit-linear-gradient(top, #fff 0%, #f2f2f2 100%);background:linear-gradient(to bottom, #fff 0%, #f2f2f2 100%);-webkit-box-shadow:2px 0 10px 0 rgba(0,0,0,0.07),1000px 0 0 1000px #e1f5d1,-2px 0 10px 0 rgba(0,0,0,0.07),-1000px 0 0 1000px #f5f5f5;box-shadow:2px 0 10px 0 rgba(0,0,0,0.07),1000px 0 0 980px #e1f5d1,-2px 0 10px 0 rgba(0,0,0,0.07),-1000px 0 0 1000px #f5f5f5}div.switch:hover>span,div.switch:focus>span{background:#fff;background:-moz-linear-gradient(top, #fff 0%, #e6e6e6 100%);background:-webkit-linear-gradient(top, #fff 0%, #e6e6e6 100%);background:linear-gradient(to bottom, #fff 0%, #e6e6e6 100%)}div.switch:active{background:transparent}div.switch.large{height:44px}div.switch.large label{padding:0 0.375em;line-height:2.3em;font-size:1.0625em}div.switch.large input:first-of-type:checked ~ span{left:100%;margin-left:-2.6875em}div.switch.large>span{width:2.75em;height:2.75em}div.switch.small{height:28px}div.switch.small label{padding:0 0.375em;line-height:2.1em;font-size:0.75em}div.switch.small input:first-of-type:checked ~ span{left:100%;margin-left:-1.6875em}div.switch.small>span{width:1.75em;height:1.75em}div.switch.tiny{height:22px}div.switch.tiny label{padding:0 0.375em;line-height:1.9em;font-size:0.6875em}div.switch.tiny input:first-of-type:checked ~ span{left:100%;margin-left:-1.3125em}div.switch.tiny>span{width:1.375em;height:1.375em}div.switch.radius{-webkit-border-radius:4px;border-radius:4px}div.switch.radius>span{-webkit-border-radius:3px;border-radius:3px}div.switch.round{-webkit-border-radius:1000px;border-radius:1000px}div.switch.round>span{-webkit-border-radius:999px;border-radius:999px}div.switch.round label{padding:0 0.5625em}@-webkit-keyframes webkitSiblingBugfix{from{position:relative}to{position:relative}}}[data-magellan-expedition]{background:#fff;z-index:50;min-width:100%;padding:10px}[data-magellan-expedition] .sub-nav{margin-bottom:0}[data-magellan-expedition] .sub-nav dd{margin-bottom:0}table{background:#fff;margin-bottom:1.25em;border:solid 1px #ddd}table thead,table tfoot{background:#f5f5f5;font-weight:bold}table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:0.5em 0.625em 0.625em;font-size:0.875em;color:#222;text-align:left}table tr th,table tr td{padding:0.5625em 0.625em;font-size:0.875em;color:#222}table tr.even,table tr.alt,table tr:nth-of-type(even){background:#f9f9f9}table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.125em}.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px rgba(0,0,0,0.2);box-shadow:0 0 0 1px rgba(0,0,0,0.2);-webkit-transition:all 200ms ease-out;-moz-transition:all 200ms ease-out;transition:all 200ms ease-out}.th:hover,.th:focus{-webkit-box-shadow:0 0 6px 1px rgba(43,166,203,0.5);box-shadow:0 0 6px 1px rgba(43,166,203,0.5)}.th.radius{-webkit-border-radius:3px;border-radius:3px}a.th{display:inline-block}.has-tip{border-bottom:dotted 1px #ccc;cursor:help;font-weight:bold;color:#333}.has-tip:hover,.has-tip:focus{border-bottom:dotted 1px #196177;color:#2ba6cb}.has-tip.tip-left,.has-tip.tip-right{float:none !important}.tooltip{display:none;position:absolute;z-index:999;font-weight:bold;font-size:0.9375em;line-height:1.3;padding:0.5em;max-width:85%;left:50%;width:100%;color:#fff;background:#000;-webkit-border-radius:3px;border-radius:3px}.tooltip>.nub{display:block;left:5px;position:absolute;width:0;height:0;border:solid 5px;border-color:transparent transparent #000 transparent;top:-10px}.tooltip.opened{color:#2ba6cb !important;border-bottom:dotted 1px #196177 !important}.tap-to-close{display:block;font-size:0.625em;color:#888;font-weight:normal}@media only screen and (min-width: 768px){.tooltip>.nub{border-color:transparent transparent #000 transparent;top:-10px}.tooltip.tip-top>.nub{border-color:#000 transparent transparent transparent;top:auto;bottom:-10px}.tooltip.tip-left,.tooltip.tip-right{float:none !important}.tooltip.tip-left>.nub{border-color:transparent transparent transparent #000;right:-10px;left:auto;top:50%;margin-top:-5px}.tooltip.tip-right>.nub{border-color:transparent #000 transparent transparent;right:auto;left:-10px;top:50%;margin-top:-5px}}@media only screen and (max-width: 767px){.f-dropdown{max-width:100%;left:0}}.f-dropdown{position:absolute;top:-9999px;list-style:none;margin-left:0;width:100%;max-height:none;height:auto;background:#fff;border:solid 1px #ccc;font-size:16px;z-index:99;margin-top:2px;max-width:200px}.f-dropdown>*:first-child{margin-top:0}.f-dropdown>*:last-child{margin-bottom:0}.f-dropdown:before{content:"";display:block;width:0;height:0;border:inset 6px;border-color:transparent transparent #fff transparent;border-bottom-style:solid;position:absolute;top:-12px;left:10px;z-index:99}.f-dropdown:after{content:"";display:block;width:0;height:0;border:inset 7px;border-color:transparent transparent #ccc transparent;border-bottom-style:solid;position:absolute;top:-14px;left:9px;z-index:98}.f-dropdown.right:before{left:auto;right:10px}.f-dropdown.right:after{left:auto;right:9px}.f-dropdown li{font-size:0.875em;cursor:pointer;line-height:1.125em;margin:0}.f-dropdown li:hover,.f-dropdown li:focus{background:#eee}.f-dropdown li a{display:block;padding:0.3125em 0.625em;color:#555}.f-dropdown.content{position:absolute;top:-9999px;list-style:none;margin-left:0;padding:1.25em;width:100%;height:auto;max-height:none;background:#fff;border:solid 1px #ccc;font-size:16px;z-index:99;max-width:200px}.f-dropdown.content>*:first-child{margin-top:0}.f-dropdown.content>*:last-child{margin-bottom:0}.f-dropdown.tiny{max-width:200px}.f-dropdown.small{max-width:300px}.f-dropdown.medium{max-width:500px}.f-dropdown.large{max-width:800px} capistrano-capistrano-603c346/docs/assets/css/github.css000066400000000000000000000027011520217215100233020ustar00rootroot00000000000000/** * GitHub theme * * @author Craig Campbell * @version 1.0.4 */ pre { border: 1px solid #ccc; word-wrap: break-word; padding: 6px 10px; line-height: 19px; margin-bottom: 20px; } code { border: 1px solid #eaeaea; margin: 0px 2px; padding: 0px 5px; font-size: 12px; } pre code { border: 0px; padding: 0px; margin: 0px; -moz-border-radius: 0px; -webkit-border-radius: 0px; border-radius: 0px; } pre, code { font-family: Consolas, 'Liberation Mono', Courier, monospace; color: #333; background: #f8f8f8; -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; } pre, pre code { font-size: 13px; } pre .comment { color: #998; } pre .support { color: #0086B3; } pre .tag, pre .tag-name { color: navy; } pre .keyword, pre .css-property, pre .vendor-prefix, pre .sass, pre .class, pre .id, pre .css-value, pre .entity.function, pre .storage.function { font-weight: bold; } pre .css-property, pre .css-value, pre .vendor-prefix, pre .support.namespace { color: #333; } pre .constant.numeric, pre .keyword.unit, pre .hex-color { font-weight: normal; color: #099; } pre .entity.class { color: #458; } pre .entity.id, pre .entity.function { color: #900; } pre .attribute, pre .variable { color: teal; } pre .string, pre .support.value { font-weight: normal; color: #d14; } pre .regexp { color: #009926; } capistrano-capistrano-603c346/docs/assets/css/monokai.css000066400000000000000000000077531520217215100234710ustar00rootroot00000000000000// A modified version of https://raw.githubusercontent.com/richleland/pygments-css/master/monokai.css .highlighter-rouge { background-color: #272822; } .highlight { background: #272822; padding: 1em; font-size: 0.9em; overflow: auto; line-height: 150%; overflow-y: auto; overflow-x: scroll; } .highlight code { font-family: Consolas, "Liberation Mono", Courier, monospace; font-weight: bold; color: #FFFFFF; } .highlight .hll { background-color: #49483e } .highlight .c { color: #75715e } /* Comment */ .highlight .err { color: #960050; background-color: #1e0010 } /* Error */ .highlight .k { color: #66d9ef } /* Keyword */ .highlight .l { color: #ae81ff } /* Literal */ .highlight .n { color: #f8f8f2 } /* Name */ .highlight .o { color: #f92672 } /* Operator */ .highlight .p { color: #f8f8f2 } /* Punctuation */ .highlight .cm { color: #75715e } /* Comment.Multiline */ .highlight .cp { color: #75715e } /* Comment.Preproc */ .highlight .c1 { color: #75715e } /* Comment.Single */ .highlight .cs { color: #75715e } /* Comment.Special */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .kc { color: #66d9ef } /* Keyword.Constant */ .highlight .kd { color: #66d9ef } /* Keyword.Declaration */ .highlight .kn { color: #f92672 } /* Keyword.Namespace */ .highlight .kp { color: #66d9ef } /* Keyword.Pseudo */ .highlight .kr { color: #66d9ef } /* Keyword.Reserved */ .highlight .kt { color: #66d9ef } /* Keyword.Type */ .highlight .ld { color: #e6db74 } /* Literal.Date */ .highlight .m { color: #ae81ff } /* Literal.Number */ .highlight .s { color: #e6db74 } /* Literal.String */ .highlight .na { color: #a6e22e } /* Name.Attribute */ .highlight .nb { color: #f8f8f2 } /* Name.Builtin */ .highlight .nc { color: #a6e22e } /* Name.Class */ .highlight .no { color: #66d9ef } /* Name.Constant */ .highlight .nd { color: #a6e22e } /* Name.Decorator */ .highlight .ni { color: #f8f8f2 } /* Name.Entity */ .highlight .ne { color: #a6e22e } /* Name.Exception */ .highlight .nf { color: #a6e22e } /* Name.Function */ .highlight .nl { color: #f8f8f2 } /* Name.Label */ .highlight .nn { color: #f8f8f2 } /* Name.Namespace */ .highlight .nx { color: #a6e22e } /* Name.Other */ .highlight .py { color: #f8f8f2 } /* Name.Property */ .highlight .nt { color: #f92672 } /* Name.Tag */ .highlight .nv { color: #f8f8f2 } /* Name.Variable */ .highlight .ow { color: #f92672 } /* Operator.Word */ .highlight .w { color: #f8f8f2 } /* Text.Whitespace */ .highlight .mf { color: #ae81ff } /* Literal.Number.Float */ .highlight .mh { color: #ae81ff } /* Literal.Number.Hex */ .highlight .mi { color: #ae81ff } /* Literal.Number.Integer */ .highlight .mo { color: #ae81ff } /* Literal.Number.Oct */ .highlight .sb { color: #e6db74 } /* Literal.String.Backtick */ .highlight .sc { color: #e6db74 } /* Literal.String.Char */ .highlight .sd { color: #e6db74 } /* Literal.String.Doc */ .highlight .s2 { color: #e6db74 } /* Literal.String.Double */ .highlight .se { color: #ae81ff } /* Literal.String.Escape */ .highlight .sh { color: #e6db74 } /* Literal.String.Heredoc */ .highlight .si { color: #e6db74 } /* Literal.String.Interpol */ .highlight .sx { color: #e6db74 } /* Literal.String.Other */ .highlight .sr { color: #e6db74 } /* Literal.String.Regex */ .highlight .s1 { color: #e6db74 } /* Literal.String.Single */ .highlight .ss { color: #e6db74 } /* Literal.String.Symbol */ .highlight .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */ .highlight .vc { color: #f8f8f2 } /* Name.Variable.Class */ .highlight .vg { color: #f8f8f2 } /* Name.Variable.Global */ .highlight .vi { color: #f8f8f2 } /* Name.Variable.Instance */ .highlight .il { color: #ae81ff } /* Literal.Number.Integer.Long */ .highlight .gh { } /* Generic Heading & Diff Header */ .highlight .gu { color: #75715e; } /* Generic.Subheading & Diff Unified/Comment? */ .highlight .gd { color: #f92672; } /* Generic.Deleted & Diff Deleted */ .highlight .gi { color: #a6e22e; } /* Generic.Inserted & Diff Inserted */ capistrano-capistrano-603c346/docs/assets/css/normalize.css000066400000000000000000000166451520217215100240340ustar00rootroot00000000000000/*! normalize.css v2.1.1 | MIT License | git.io/normalize */ /* ========================================================================== HTML5 display definitions ========================================================================== */ /** * Correct `block` display not defined in IE 8/9. */ article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; } /** * Correct `inline-block` display not defined in IE 8/9. */ audio, canvas, video { display: inline-block; } /** * Prevent modern browsers from displaying `audio` without controls. * Remove excess height in iOS 5 devices. */ audio:not([controls]) { display: none; height: 0; } /** * Address styling not present in IE 8/9. */ [hidden] { display: none; } /* ========================================================================== Base ========================================================================== */ /** * 1. Prevent system color scheme's background color being used in Firefox, IE, * and Opera. * 2. Prevent system color scheme's text color being used in Firefox, IE, and * Opera. * 3. Set default font family to sans-serif. * 4. Prevent iOS text size adjust after orientation change, without disabling * user zoom. */ html { background: #fff; /* 1 */ color: #000; /* 2 */ font-family: sans-serif; /* 3 */ -ms-text-size-adjust: 100%; /* 4 */ -webkit-text-size-adjust: 100%; /* 4 */ } /** * Remove default margin. */ body { margin: 0; } /* ========================================================================== Links ========================================================================== */ /** * Address `outline` inconsistency between Chrome and other browsers. */ a:focus { outline: thin dotted; } /** * Improve readability when focused and also mouse hovered in all browsers. */ a:active, a:hover { outline: 0; } /* ========================================================================== Typography ========================================================================== */ /** * Address variable `h1` font-size and margin within `section` and `article` * contexts in Firefox 4+, Safari 5, and Chrome. */ h1 { font-size: 2em; margin: 0.67em 0; } /** * Address styling not present in IE 8/9, Safari 5, and Chrome. */ abbr[title] { border-bottom: 1px dotted; } /** * Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. */ b, strong { font-weight: bold; } /** * Address styling not present in Safari 5 and Chrome. */ dfn { font-style: italic; } /** * Address differences between Firefox and other browsers. */ hr { -moz-box-sizing: content-box; box-sizing: content-box; height: 0; } /** * Address styling not present in IE 8/9. */ mark { background: #ff0; color: #000; } /** * Correct font family set oddly in Safari 5 and Chrome. */ code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; } /** * Improve readability of pre-formatted text in all browsers. */ pre { white-space: pre-wrap; } /** * Set consistent quote types. */ q { quotes: "\201C" "\201D" "\2018" "\2019"; } /** * Address inconsistent and variable font size in all browsers. */ small { font-size: 80%; } /** * Prevent `sub` and `sup` affecting `line-height` in all browsers. */ sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } /* ========================================================================== Embedded content ========================================================================== */ /** * Remove border when inside `a` element in IE 8/9. */ img { border: 0; } /** * Correct overflow displayed oddly in IE 9. */ svg:not(:root) { overflow: hidden; } /* ========================================================================== Figures ========================================================================== */ /** * Address margin not present in IE 8/9 and Safari 5. */ figure { margin: 0; } /* ========================================================================== Forms ========================================================================== */ /** * Define consistent border, margin, and padding. */ fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } /** * 1. Correct `color` not being inherited in IE 8/9. * 2. Remove padding so people aren't caught out if they zero out fieldsets. */ legend { border: 0; /* 1 */ padding: 0; /* 2 */ } /** * 1. Correct font family not being inherited in all browsers. * 2. Correct font size not being inherited in all browsers. * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. */ button, input, select, textarea { font-family: inherit; /* 1 */ font-size: 100%; /* 2 */ margin: 0; /* 3 */ } /** * Address Firefox 4+ setting `line-height` on `input` using `!important` in * the UA stylesheet. */ button, input { line-height: normal; } /** * Address inconsistent `text-transform` inheritance for `button` and `select`. * All other form control elements do not inherit `text-transform` values. * Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. * Correct `select` style inheritance in Firefox 4+ and Opera. */ button, select { text-transform: none; } /** * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` * and `video` controls. * 2. Correct inability to style clickable `input` types in iOS. * 3. Improve usability and consistency of cursor style between image-type * `input` and others. */ button, html input[type="button"], /* 1 */ input[type="reset"], input[type="submit"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ } /** * Re-set default cursor for disabled elements. */ button[disabled], html input[disabled] { cursor: default; } /** * 1. Address box sizing set to `content-box` in IE 8/9. * 2. Remove excess padding in IE 8/9. */ input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ } /** * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome * (include `-moz` to future-proof). */ input[type="search"] { -webkit-appearance: textfield; /* 1 */ -moz-box-sizing: content-box; -webkit-box-sizing: content-box; /* 2 */ box-sizing: content-box; } /** * Remove inner padding and search cancel button in Safari 5 and Chrome * on OS X. */ input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } /** * Remove inner padding and border in Firefox 4+. */ button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } /** * 1. Remove default vertical scrollbar in IE 8/9. * 2. Improve readability and alignment in all browsers. */ textarea { overflow: auto; /* 1 */ vertical-align: top; /* 2 */ } /* ========================================================================== Tables ========================================================================== */ /** * Remove most spacing between table cells. */ table { border-collapse: collapse; border-spacing: 0; } capistrano-capistrano-603c346/docs/assets/css/social_foundicons.css000077500000000000000000000044631520217215100255330ustar00rootroot00000000000000/* font-face */ @font-face { font-family: "SocialFoundicons"; src: url("../fonts/social_foundicons.eot"); src: url("../fonts/social_foundicons.eot?#iefix") format("embedded-opentype"), url("../fonts/social_foundicons.woff") format("woff"), url("../fonts/social_foundicons.ttf") format("truetype"), url("../fonts/social_foundicons.svg#SocialFoundicons") format("svg"); font-weight: normal; font-style: normal; } /* global foundicon styles */ [class*="foundicon-"] { display: inline; width: auto; height: auto; line-height: inherit; vertical-align: baseline; background-image: none; background-position: 0 0; background-repeat: repeat; } [class*="foundicon-"]:before { font-family: "SocialFoundicons"; font-weight: normal; font-style: normal; text-decoration: inherit; } /* icons */ .foundicon-thumb-up:before { content: "\f000"; } .foundicon-thumb-down:before { content: "\f001"; } .foundicon-rss:before { content: "\f002"; } .foundicon-facebook:before { content: "\f003"; } .foundicon-twitter:before { content: "\f004"; } .foundicon-pinterest:before { content: "\f005"; } .foundicon-github:before { content: "\f006"; } .foundicon-path:before { content: "\f007"; } .foundicon-linkedin:before { content: "\f008"; } .foundicon-dribbble:before { content: "\f009"; } .foundicon-stumble-upon:before { content: "\f00a"; } .foundicon-behance:before { content: "\f00b"; } .foundicon-reddit:before { content: "\f00c"; } .foundicon-google-plus:before { content: "\f00d"; } .foundicon-youtube:before { content: "\f00e"; } .foundicon-vimeo:before { content: "\f00f"; } .foundicon-flickr:before { content: "\f010"; } .foundicon-slideshare:before { content: "\f011"; } .foundicon-picassa:before { content: "\f012"; } .foundicon-skype:before { content: "\f013"; } .foundicon-steam:before { content: "\f014"; } .foundicon-instagram:before { content: "\f015"; } .foundicon-foursquare:before { content: "\f016"; } .foundicon-delicious:before { content: "\f017"; } .foundicon-chat:before { content: "\f018"; } .foundicon-torso:before { content: "\f019"; } .foundicon-tumblr:before { content: "\f01a"; } .foundicon-video-chat:before { content: "\f01b"; } .foundicon-digg:before { content: "\f01c"; } .foundicon-wordpress:before { content: "\f01d"; } capistrano-capistrano-603c346/docs/assets/css/social_foundicons_ie7.css000066400000000000000000000064301520217215100262700ustar00rootroot00000000000000/* general icons for IE7 */ [class*="foundicon-"] { font-family: "SocialFoundicons"; font-weight: normal; font-style: normal; } .foundicon-thumb-up { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-thumb-down { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-rss { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-facebook { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-twitter { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-pinterest { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-github { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-path { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-linkedin { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-dribbble { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-stumble-upon { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-behance { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-reddit { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-google-plus { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-youtube { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-vimeo { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-flickr { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-slideshare { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-picassa { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-skype { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-steam { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-instagram { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-foursquare { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-delicious { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-chat { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-torso { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-tumblr { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-video-chat { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-digg { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } .foundicon-wordpress { *zoom: expression(this.runtimeStyle['zoom'] = "1", this.innerHTML = ""); } capistrano-capistrano-603c346/docs/assets/css/syntax.css000066400000000000000000000072511520217215100233530ustar00rootroot00000000000000.highlight { background: #ffffff; padding: 10px; } .highlight .c { color: #999988; font-style: italic } /* Comment */ .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ .highlight .k { font-weight: bold } /* Keyword */ .highlight .o { font-weight: bold } /* Operator */ .highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */ .highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */ .highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */ .highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #999999 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #aaaaaa } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { font-weight: bold } /* Keyword.Constant */ .highlight .kd { font-weight: bold } /* Keyword.Declaration */ .highlight .kp { font-weight: bold } /* Keyword.Pseudo */ .highlight .kr { font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #009999 } /* Literal.Number */ .highlight .s { color: #d14 } /* Literal.String */ .highlight .na { color: #008080 } /* Name.Attribute */ .highlight .nb { color: #0086B3 } /* Name.Builtin */ .highlight .nc { color: #445588; font-weight: bold } /* Name.Class */ .highlight .no { color: #008080 } /* Name.Constant */ .highlight .ni { color: #800080 } /* Name.Entity */ .highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #990000; font-weight: bold } /* Name.Function */ .highlight .nn { color: #555555 } /* Name.Namespace */ .highlight .nt { color: #000080 } /* Name.Tag */ .highlight .nv { color: #008080 } /* Name.Variable */ .highlight .ow { font-weight: bold } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mf { color: #009999 } /* Literal.Number.Float */ .highlight .mh { color: #009999 } /* Literal.Number.Hex */ .highlight .mi { color: #009999 } /* Literal.Number.Integer */ .highlight .mo { color: #009999 } /* Literal.Number.Oct */ .highlight .sb { color: #d14 } /* Literal.String.Backtick */ .highlight .sc { color: #d14 } /* Literal.String.Char */ .highlight .sd { color: #d14 } /* Literal.String.Doc */ .highlight .s2 { color: #d14 } /* Literal.String.Double */ .highlight .se { color: #d14 } /* Literal.String.Escape */ .highlight .sh { color: #d14 } /* Literal.String.Heredoc */ .highlight .si { color: #d14 } /* Literal.String.Interpol */ .highlight .sx { color: #d14 } /* Literal.String.Other */ .highlight .sr { color: #009926 } /* Literal.String.Regex */ .highlight .s1 { color: #d14 } /* Literal.String.Single */ .highlight .ss { color: #990073 } /* Literal.String.Symbol */ .highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */ .highlight .vc { color: #008080 } /* Name.Variable.Class */ .highlight .vg { color: #008080 } /* Name.Variable.Global */ .highlight .vi { color: #008080 } /* Name.Variable.Instance */ .highlight .il { color: #009999 } /* Literal.Number.Integer.Long */ capistrano-capistrano-603c346/docs/assets/favicon-16x16.png000066400000000000000000000012531520217215100234350ustar00rootroot00000000000000PNG  IHDR(-SgAMA asRGBePLTE65486566667=4B? C)K!(Q7]A$D9a? @h3k!G8#6d |=+F{3F|?<>.Ft9+$=^=y%N%y+P1c Jt=t4J7w2jMGP?%@8~6t2F{#Gh6~?H._:}3P^Ju3(Lv55K 2Q4@y2F}B5e4ZB(2`92K}+-a?,N@6o'Om*Jl.`"J83!\!7^5ucA? 9? F tRNS%* [IDATE_c۶m۶-GB3Pձ/y`׻듣R/߿g-ӭbC7Á,CK;{ s72z kv 0a|6531.͎@@PokHMYa!Ѿƒ@XCSXuUy'@ʘ9KB{jգ"IENDB`capistrano-capistrano-603c346/docs/assets/favicon-32x32.png000066400000000000000000000020721520217215100234310ustar00rootroot00000000000000PNG  IHDR DgAMA asRGBPLTEGpL6646666663>88P8RQ6<@9=RQ!D%J!C!I,=n%C< 7[:f6N.@s='2`0Av4I;%K%Ed*S~d [:M5L+5V8^ (Q'Hj5QK=8}5m:`0[0P'Js!?@t1Cx}&0],Wv#q<^2]D @g6KD>=c*8h6w/d2kJ@l%(Nx5u4q)=fA uB.^tT% tRNSE..B IDAT8˅r@;Y`3Bah N!ef7Hm❙nv0`41Sр)эk ac0#֥o7`H\&bkIT-ZgR9 RiBR' ^X|#rLR1 ~$VQJ0I8B"mt698IW]˒lHTYQs~4k_2' Ve?c ~?^889999999999999999999999999999997= P-%h;.}I6O:R;SS;R;R;R;R;R;R;W8a2U:Q<K7b7,A 79999999999999999999999998A#h5̲MSѴOGɩMȨMZ=Q;S;T;T;S;PRRRRRRѱMx@s=z>|>|>x>o>(ϕm*ƍۣY<899999999999999999998I,!BRRRSڿQѯLƚEA@??????>Ž7ԣ(_;9999999999999999998B%?RRRSڻGȝC@?Ï6Ǔ/>??????@ұMK(W9999999999999999999l6RRRR߻:Θ$Ï6ԝ Ï8?==???@ͨIٽQR߻8 נ[879999999999999997\8%@ӲMRS߻9 ݤ xP$^:&V3$X5$d?'~U.s8>@ϫKRS޼< ޥi F&8999999999999999@!k5?̦ISݽA ~ b==777778B#iC)=ټPRRS6Ɠ nG:89999999999999997d?'>ÕCؼQM`@!7999999987N0#ARSּQ89999999999997L."S6%899999999999999999997mF*??@ʕ,֝ v$W479999999999999988999999999999999999999]1@?@+ј}Q=k=.99999999999999999999999999999999999999=l6@??aY;R;R;K7B!89999999999999999999999999999999999998E%y;@?>Y;R;R;K7B!89999999999999999999999999999999999998C#$ћ$9?[ >SSؾQF}`3J,"7899999999999999997Y6٢e/Q Q:k@ֺQּP~b3989999999997H*!BRRRSѳOZ:c7,G%!:999999999999996uMw.JپQRҸOd4> 7999999986K."ARRRRER;S;M8`6+:99999999999998C$ݿGSRR׽Q?[=%<667767B#pS-GSRRRJXQ;R;S;xF4@ 8999999999999999;i ݾFRRܿKݤޥ"޼>ŸL`>Q;R;R;N9O*$899999999999999998E% ֟ ݪҰKRQݾF$(Z=Q;R;R;P:\3)99999999999999999997M,w >Đ4ءȓ.@ǝFӲMپS+ޤÊf.R:Q;R;R;Q:a6+;999999999999999999997G'!d3?>???@ÖCΜ.נܤަޥۣ՟&`2S:Q@v?R@???????}>s=e^:&`2{:>?@@@?e=R;R;O:zG5b7,G$!989999999999999999999999999999997:I( a='zQ-a2j5n6m6~O2h;.\3)L(#?8899999999999999999999999999999999998779<>=;9889999999999999999999'99999999999999999999999999999999999999999999999'9b999999999999999999999999999999999999999999999b99~9999999999999999999999999999999999999999999~999a99999999999999999999999999999999999999999a99&999999999999999999999999999999999999999&( @ 9.999999999999999999999999999.9E99999999999999999999999999999E9/9999999999999999999999999999999/999999999999889<=<:889999999999999999999997;I&"]3*m>0uD3wE4vD3n?0^4+K'#<8999999999999999998:cF*l:S:^>T]<`<^<_7ϖΔp(Z3^H(79999999999998D& >RSڿRӱMƛF@???=ɔ,߬֜  K*899999999999> |fF&89999999997qJ+@ЮL* J*6999997D' >GgJ,989999999999=k5@œ8 ݣʔT2799999998D& H+!7999999999998L+!~;@0ϖg.lB#8999999999889999999999997Z7%>?m'??ffQ;O9J9999999@"Q3$;79999999999997R0՞֟*S:U766<[=%BٿRR˫Ma>R<J7D" 8999999997~U޽ARS֮-dYbԩ$@EίOk@Q;R;`5+99999999998? s ߦ ֳCڿR߽=ʘ#g?Q;S;o@1>999999999998F&h(Ž7͗'=ǜEѯLޯ ͔t%W7Q;R;rB2B!89999999999998A"~U/>@??Ž9ƒ1ȓ.Ǔ16^:P:88999999999999/9999999999999999999999999999999/9E99999999999999999999999999999E9.999999999999999999999999999.(  9%999999999999999%9999979>?;8899999998<^?)sH2zH5{H6zH/d9(C" 8999998@#s9βNĝIx?s?/ɓ{hB999999c4۾J߲*Ι x*j5};ֱAE%8998Q/"A#ӜsKA";I( v:;]::9997uM,8ƏtK6898?!A#799999_2|=Q6D"!899988999999h"}9L8D" 899?!F) 8899997^јe8lK.787R5%Bk6L-"99997Z7֞˚'çKmP+A!<O0DոQa32rӸl;3$$3/UwZ$33$gO3$$33XvC$33!-,!!,-!;lr$33$ZwU/3$$3Og$33$CvX33$$37,!!,-!!-)K +и/+ ++и/%01#!"&5463!237#54637.'&#&#3  z z K ,?)VV|  NxXp-:gxK{G/01#".'67".'>7.57.673&>76>767> 1$(=TkBMM!GGEN9 +12 4; 2)% 7mcV  #:(1Z <- (:*dgeVB  /+4/582"C?<>M*(H<+ %   %%mĻ' i+W 6+@ O+ + i9i9A ]A']A O]A WW&W6WFW]AUWeW]d6W9o +"+;R+ 9d 9012#"&'>767>732>54.#"67>76&'.54>32#".7>54&#".54>`}II}`#A  ?&8\B$*LmBS|R*.1  ;T5.H2'6!   !=fI)I}I}``}I 31("0UtD3`J,5Tg1'F1+:++q|+dn++G*+#+A!&6FVfv]A&qA5EqA:#J#qA! ##)#9#I#Y#i#y#########]A ##)#qA:*J*qA! **)*9*I*Y*i*y*********]A **)*qA!::&:6:F:V:f:v:::::::::]A::&:qA5:E:qL9A:JqA! )9IYiy]A )q_и_/A!&6FVfv]A&qA5Eqи/99 ++++2иLиL/й012#".54>"32>54.654&'.#".;26767".=4&''.=#&467>=#.7>76&5'.'.7667>7.5467&676;2>7;#"&54632#"&54632[wEEw[[wDDw[Qj==jQQj==j? "&&" ? !," &C4              7F)&3 +.+( 2%    Ew[[wEEw[[wE0=jQQj==jQQj=2= %  % = 9.  *,%    R l  $jj$ l R    +      -: !45 27 NPq=) 4+ + + иAZj]A )9I]A ))&)6)F)]AU)e)] /9$++01#"&'5>532>54.#".54>32P0Y~N.& #-11'(AR*+RA' Q 3\MN\2Q>eH'-*G i #2#/@()@, W046@jL**Kk,0A/ <+ -+ +5 + и и/ и5C8+@%+-+- ии+и/и@1014.#"5#35467>32326'4&#";#32#!"&5463!2*9"(!% $*)##*(#Dk   z/F.  :1*  3**))*8e |  '' 1ERat޸u/r/uи/A:rJrqA! rr)r9rIrYriryrrrrrrrrr]A rr)rqrrи/929CK9S9v0+ `+01%".54>32.>.'#32%>7>7.'#2>7.'%>7.#"6._}II}__}II}&,BU. BY StI"3zEQ,QtMJoI6-@bE1(Ts)14L25K._5P7 1^L2.'I}__}II}__}I 5_J2 - 8Oa6QK8',@RS   L# +N=('(>O,/*/4!-3  F|""-[ͻD W+N I+# +2 8+ -+A DD&D6DFD]AUDeD] WD9IA NN&N6NFN]AUNeN]]/.>+S+>.9иS501#".'32654.546;232>52#"&=4.+"+.54>d.4I`D}kVI[-5-#!JC-;;-I9!"!.7*)!% #I2+537+5;046.'&#"1;2>54+"+"&'&'32!<.'&'>54&+";267>;2=4+"2#!"&5463!s gm f^&F/!(O -/$E"  ?8((F]   z = ]sL)., "'--( ! ! 4=s 2 1 |  b*2=EQ]fp/IU_h62#".'&676032>47/3#"'&'1&?;0+7#7'"&54632'#"&54632%>767/2.'>54&#".'6.'67&'>7'.54>32&#""32654&"&5676&/>32#".54677.'677&'>732>54.'61767>4.#"32>27#".54>7%"&54632&'632%4632&y'<)):&0##3!m    M?z''''(''(fZ%( ,  k''*,  %4  ,&447CuXYuCB8RSl?AoUUoA>jRO6C>kQQj>>jQQk>y Rj>AoUUoA?lSM  <C ,,B     ,%''''C''''| w (1  , 8  B! 0( ,E   4% 4&%4;iN--Ni; D3#*+Ia78bJ**Jb87`I,*"4C 4]D((D]44\D((D\9 ,I`78bJ**Jb87aI+o   C4,/, 3D#;Sizj s+8+ +9 99s9 99s)и1и3и95иsHкms9xs9|/D/.4+vm+4 иvxиx/013#!654./.5467>54.'37!"5463!2#5##33!"&=>7>3:#".5467>32"5327  x)11  ( SM:<= z KK 'A0^ 6/) W1,>( 4+@+7=;J. #;2*&  %.9* >  H,)+ ^ g2-EO#53LX * Z) // 9 9 901#!"&5463!2-  z HCf  ^o_/n/f/f_9016'.'.36'.'.'.'.'.'&>&5>7>7>2#!"&5463!  ).+ !  ( *E$    ,D"4$   z   #4%  ) &)'2 @ 4J G&-\Q>U |  '89/3и3/A_]A]A]3 A_]A]A]+ :(/7///014.#"32>%4.#"32>2#!"&5463!0A%%A00A%%A00A%%A00A%%A0J   z%A00A%%A00A%%A00A%%A00A |  !'x2#".54>!2#".54>#"'&'.'#".'&'&67.'&'.'.'.'.763267>%#".=3267>&'&'.'54767>;>767>7>7>7>76.'463!2!&'.'&'%#".+t((((((((7/  !)*( ,  &   )5  + (*)!  /   5)  (    &(   (((((((( ,"!M.         .M!#+    /   S     # (4AB//и 9Bи/3 '39)к<9C?// ?9'?93?9<?901##&'5%4>7&.'>7.'>324U: ȳPbr=VNH$B_;','>[i\?Bc(0*6NYM6)R*f\ Vgs=PI&8[D) B{lW"(#7R^S8>(sG%*'o1FPE0*' [3 r+ %+ A %]A3]nr39n/R ^ Xc+|-+Xi-w01654'&'.'.'&'.'&'&547632327654'&'&'&#"#"'&'&'&'&#"32767#"&'#".547&54>32632!%1(   12 +-:K68/-F(!"7)  .=aP9:(E]5!=)[xE #(E]5&D$'[xE+7-      '(16"$  !  ')(!6<5]E(Ex[-,8I5]E(Ex[/%)5Eu +$+- 3+y 9+y9 y9y9A*$:$rA! $$)$9$I$Y$i$y$$$$$$$$$]A! $$)$9$I$Y$i$y$$$$$$$$$qA $$r(y9AZ3j3]A 33)393I3]yKyn}+vP+!+ +*0+  90*99(9WиW/v01#"&54632'&#"2#"&'32654&/672#"&5462654&#"2>54.#"#"'.'&6732>5732#!"&5463!2"00"-2"//"-2 1 &&%%)99)##4''44&]1&*" $>+(}   z20""/% 0""/% &%%&8))9$$.'44'&4e$7 $*"f)7(a }    #5I]w߻"0++++;O+YE+a ^+a^и/A:EJEqA! EE)E9EIEYEiEyEEEEEEEEE]A EE)EqEa'A!;;&;6;F;V;f;v;;;;;;;;;]A;;&;qA5;E;q0iкk0a90n aye/$+T6+ (+@J+и ии ии и$4й,4,9 "и(/014&+";265%#3='#3'#3'3%2!.#"!5463!"32>54.".54>3274'!#!"&5332> Z Z x 7!!8 8!C  `99`  z<";--;""<,,<"+K8 8K++K8 8K   %?U00V?%l!!L 7L8 *11* -;""<,,<"";- 8K++K8 8K++K8 80 g50V?%%?V&T//7D+7 0132732+"/#"&'.>7>3264'7#!"&5463!'&".'.#"2?  ^P 7 =3 =o   @$ L*#?!D&$#W'* u :;6 $ t  @  #DIH#$$! //01#!"&5463!22#!"&5463! X    Y     T  T   /0////01%#"/#".54>32h  BD^{GG{^^{GXPR x?lSRl??lR[9_,!//9 901#!"&=467%.54>32m 23= 8L++L8 <1rqG2XA&&AX2Eq8.+ +01#!"&5463!2".=3=#5#+3;2>7=  z  X! I-4(#-0|  X jN=, j%.q 300]1//1,и,/ ,9, 2"/$/&/++0154&+";26=2#"'#"'&?.54>Ћ  M^{GG{^DB  WPXG{ A=   >?lRSl?x 9[Rl??g_LPTX\]?S+,<+++"ии?31 / и иии/$ииии" и!и )и *и1-и/@и@/0и0/?4и36и18и.9и3:иDиEиFиIи$JиJ/Kи1Mи.Nи/OиO/@Pи?Qи4Rи3Uи?Vи4Wи1Yи3Zи.\и^$+G+\N+-.+OA+L+ ++ии ии-иииAи$"и$&и$0и'и$(и0)и *и0/$2и03и$4и/5и.6и7и/9и.:и-;и =и?иACиLDиGIиAKиAMиLPиAQиRиLTиAUиLVиNWиOXиOYиNZи[01#+=#1313533;3=#+1##33#1+5335#535#5!5;=;3!53!#53#5;#53r788888j7֧87j88488884l7888777o886776BG64ll48Aj7ii7j8l88l4448?7'.iq+r+A!&6FVfv]A!&6FVfvqArA%5r#.989Q9a9g9jo9p9A:rJrqA! rr)r9rIrYriryrrrrrrrrr]A rr)rqt99+ ++ d01%".54>32"32>54.327'27'.#.7>0672>7676&'.7>.#"64'>ZvEEvZZwEEwZTo@@oTTo@@o5?=u   R; 3H-     2Ib2<8M/+*D17EwZZvEEvZZwEL@nTTo@@oTTn@;o o6H$C $)) .4[L7fWEGN^P  6X(NULES_]!1/+/' */01>;.'&>7632#!".'&%32+"&546h  [\ #!8u  u  .+" l"[$ B   X^<  B &FT#;Te}   - "  F  2P " 0  2 & Z4Social FoundiconsRegular1.000;pyrs;SocialFoundicons-RegularSocial Foundicons RegularVersion 1.00 2012SocialFoundicons-RegularZURBFont Icons for Foundationhttp://www.zurb.comCopyright (c) 2012 ZURB, http://www.zurb.com/Social FoundiconsRegular1.000;pyrs;SocialFoundicons-RegularSocial Foundicons RegularVersion 1.00 2012SocialFoundicons-RegularZURBFont Icons for Foundationhttp://www.zurb.comCopyright (c) 2012 ZURB, http://www.zurb.com/2#     a NULL ThumbDownRSSFacebookTwitter PinterestGithubPathLinkedInDribbble StumbleUponBehanceReddit GooglePlusYouTubeVimeoFlickr SlideSharePicassaSkypeSteam Instagram Fourquare DeliciousChatPersonTumblr VideoChatDigg WordpressThumbsUpcapistrano-capistrano-603c346/docs/assets/fonts/social_foundicons.svg000066400000000000000000000011461520217215100260730ustar00rootroot00000000000000 capistrano-capistrano-603c346/docs/assets/fonts/social_foundicons.ttf000066400000000000000000000407601520217215100260760ustar00rootroot00000000000000 POS/2pX`cmaph4DPcvt fpgmY7sglyfz}f5head\B6hhea$$hmtx|loca\<HmaxpC8 name2=postV@aprepn[~!˵~_< ˫iJt ##i ]2pyrs \+K%?'"#!'$/_3??]!J ~ ~"J ~ ~",K PXYD _^-, EiD`-,*!-, F%FRX#Y Id F had%F hadRX#eY/ SXi TX!@Yi TX!@eYY:-, F%FRX#Y F jad%F jadRX#Y/-,K &PXQXD@DY!! EPXD!YY-, EiD` E}iD`-,*-,K &SX@Y &SX#!#Y &SX#!#Y &SX#!#Y &SX#!@#Y &SX%EPX#!#!%E#!#!Y!YD- ,KSXED!!Y-+++cUB3+aJ-+la3+qUB3+ 9.$+  +cUB3+aJ-+% +" + + E}iD8"8"*1b\ 0. %+.)/01+'&/#"&5463!2#"&546;2x  [\r # 8ku  u  .+" "$   B ++/C0 :+ %+ +A ]:и/A %]:-и-/A0]E /"/5/+*+5?012#"&54.#"&5462#"&54.#"&546#".54>32rӸl;3$$3/UwZ$33$gO3$$33XvC$33!-,!!,-!;lr$33$ZwU/3$$3Og$33$CvX33$$37,!!,-!!-)K +и/+ ++и/%01#!"&5463!237#54637.'&#&#3  z z K ,?)VV|  NxXp-:gxK{G/01#".'67".'>7.57.673&>76>767> 1$(=TkBMM!GGEN9 +12 4; 2)% 7mcV  #:(1Z <- (:*dgeVB  /+4/582"C?<>M*(H<+ %   %%mĻ' i+W 6+@ O+ + i9i9A ]A']A O]A WW&W6WFW]AUWeW]d6W9o +"+;R+ 9d 9012#"&'>767>732>54.#"67>76&'.54>32#".7>54&#".54>`}II}`#A  ?&8\B$*LmBS|R*.1  ;T5.H2'6!   !=fI)I}I}``}I 31("0UtD3`J,5Tg1'F1+:++q|+dn++G*+#+A!&6FVfv]A&qA5EqA:#J#qA! ##)#9#I#Y#i#y#########]A ##)#qA:*J*qA! **)*9*I*Y*i*y*********]A **)*qA!::&:6:F:V:f:v:::::::::]A::&:qA5:E:qL9A:JqA! )9IYiy]A )q_и_/A!&6FVfv]A&qA5Eqи/99 ++++2иLиL/й012#".54>"32>54.654&'.#".;26767".=4&''.=#&467>=#.7>76&5'.'.7667>7.5467&676;2>7;#"&54632#"&54632[wEEw[[wDDw[Qj==jQQj==j? "&&" ? !," &C4              7F)&3 +.+( 2%    Ew[[wEEw[[wE0=jQQj==jQQj=2= %  % = 9.  *,%    R l  $jj$ l R    +      -: !45 27 NPq=) 4+ + + иAZj]A )9I]A ))&)6)F)]AU)e)] /9$++01#"&'5>532>54.#".54>32P0Y~N.& #-11'(AR*+RA' Q 3\MN\2Q>eH'-*G i #2#/@()@, W046@jL**Kk,0A/ <+ -+ +5 + и и/ и5C8+@%+-+- ии+и/и@1014.#"5#35467>32326'4&#";#32#!"&5463!2*9"(!% $*)##*(#Dk   z/F.  :1*  3**))*8e |  '' 1ERat޸u/r/uи/A:rJrqA! rr)r9rIrYriryrrrrrrrrr]A rr)rqrrи/929CK9S9v0+ `+01%".54>32.>.'#32%>7>7.'#2>7.'%>7.#"6._}II}__}II}&,BU. BY StI"3zEQ,QtMJoI6-@bE1(Ts)14L25K._5P7 1^L2.'I}__}II}__}I 5_J2 - 8Oa6QK8',@RS   L# +N=('(>O,/*/4!-3  F|""-[ͻD W+N I+# +2 8+ -+A DD&D6DFD]AUDeD] WD9IA NN&N6NFN]AUNeN]]/.>+S+>.9иS501#".'32654.546;232>52#"&=4.+"+.54>d.4I`D}kVI[-5-#!JC-;;-I9!"!.7*)!% #I2+537+5;046.'&#"1;2>54+"+"&'&'32!<.'&'>54&+";267>;2=4+"2#!"&5463!s gm f^&F/!(O -/$E"  ?8((F]   z = ]sL)., "'--( ! ! 4=s 2 1 |  b*2=EQ]fp/IU_h62#".'&676032>47/3#"'&'1&?;0+7#7'"&54632'#"&54632%>767/2.'>54&#".'6.'67&'>7'.54>32&#""32654&"&5676&/>32#".54677.'677&'>732>54.'61767>4.#"32>27#".54>7%"&54632&'632%4632&y'<)):&0##3!m    M?z''''(''(fZ%( ,  k''*,  %4  ,&447CuXYuCB8RSl?AoUUoA>jRO6C>kQQj>>jQQk>y Rj>AoUUoA?lSM  <C ,,B     ,%''''C''''| w (1  , 8  B! 0( ,E   4% 4&%4;iN--Ni; D3#*+Ia78bJ**Jb87`I,*"4C 4]D((D]44\D((D\9 ,I`78bJ**Jb87aI+o   C4,/, 3D#;Sizj s+8+ +9 99s9 99s)и1и3и95иsHкms9xs9|/D/.4+vm+4 иvxиx/013#!654./.5467>54.'37!"5463!2#5##33!"&=>7>3:#".5467>32"5327  x)11  ( SM:<= z KK 'A0^ 6/) W1,>( 4+@+7=;J. #;2*&  %.9* >  H,)+ ^ g2-EO#53LX * Z) // 9 9 901#!"&5463!2-  z HCf  ^o_/n/f/f_9016'.'.36'.'.'.'.'.'&>&5>7>7>2#!"&5463!  ).+ !  ( *E$    ,D"4$   z   #4%  ) &)'2 @ 4J G&-\Q>U |  '89/3и3/A_]A]A]3 A_]A]A]+ :(/7///014.#"32>%4.#"32>2#!"&5463!0A%%A00A%%A00A%%A00A%%A0J   z%A00A%%A00A%%A00A%%A00A |  !'x2#".54>!2#".54>#"'&'.'#".'&'&67.'&'.'.'.'.763267>%#".=3267>&'&'.'54767>;>767>7>7>7>76.'463!2!&'.'&'%#".+t((((((((7/  !)*( ,  &   )5  + (*)!  /   5)  (    &(   (((((((( ,"!M.         .M!#+    /   S     # (4AB//и 9Bи/3 '39)к<9C?// ?9'?93?9<?901##&'5%4>7&.'>7.'>324U: ȳPbr=VNH$B_;','>[i\?Bc(0*6NYM6)R*f\ Vgs=PI&8[D) B{lW"(#7R^S8>(sG%*'o1FPE0*' [3 r+ %+ A %]A3]nr39n/R ^ Xc+|-+Xi-w01654'&'.'.'&'.'&'&547632327654'&'&'&#"#"'&'&'&'&#"32767#"&'#".547&54>32632!%1(   12 +-:K68/-F(!"7)  .=aP9:(E]5!=)[xE #(E]5&D$'[xE+7-      '(16"$  !  ')(!6<5]E(Ex[-,8I5]E(Ex[/%)5Eu +$+- 3+y 9+y9 y9y9A*$:$rA! $$)$9$I$Y$i$y$$$$$$$$$]A! $$)$9$I$Y$i$y$$$$$$$$$qA $$r(y9AZ3j3]A 33)393I3]yKyn}+vP+!+ +*0+  90*99(9WиW/v01#"&54632'&#"2#"&'32654&/672#"&5462654&#"2>54.#"#"'.'&6732>5732#!"&5463!2"00"-2"//"-2 1 &&%%)99)##4''44&]1&*" $>+(}   z20""/% 0""/% &%%&8))9$$.'44'&4e$7 $*"f)7(a }    #5I]w߻"0++++;O+YE+a ^+a^и/A:EJEqA! EE)E9EIEYEiEyEEEEEEEEE]A EE)EqEa'A!;;&;6;F;V;f;v;;;;;;;;;]A;;&;qA5;E;q0iкk0a90n aye/$+T6+ (+@J+и ии ии и$4й,4,9 "и(/014&+";265%#3='#3'#3'3%2!.#"!5463!"32>54.".54>3274'!#!"&5332> Z Z x 7!!8 8!C  `99`  z<";--;""<,,<"+K8 8K++K8 8K   %?U00V?%l!!L 7L8 *11* -;""<,,<"";- 8K++K8 8K++K8 80 g50V?%%?V&T//7D+7 0132732+"/#"&'.>7>3264'7#!"&5463!'&".'.#"2?  ^P 7 =3 =o   @$ L*#?!D&$#W'* u :;6 $ t  @  #DIH#$$! //01#!"&5463!22#!"&5463! X    Y     T  T   /0////01%#"/#".54>32h  BD^{GG{^^{GXPR x?lSRl??lR[9_,!//9 901#!"&=467%.54>32m 23= 8L++L8 <1rqG2XA&&AX2Eq8.+ +01#!"&5463!2".=3=#5#+3;2>7=  z  X! I-4(#-0|  X jN=, j%.q 300]1//1,и,/ ,9, 2"/$/&/++0154&+";26=2#"'#"'&?.54>Ћ  M^{GG{^DB  WPXG{ A=   >?lRSl?x 9[Rl??g_LPTX\]?S+,<+++"ии?31 / и иии/$ииии" и!и )и *и1-и/@и@/0и0/?4и36и18и.9и3:иDиEиFиIи$JиJ/Kи1Mи.Nи/OиO/@Pи?Qи4Rи3Uи?Vи4Wи1Yи3Zи.\и^$+G+\N+-.+OA+L+ ++ии ии-иииAи$"и$&и$0и'и$(и0)и *и0/$2и03и$4и/5и.6и7и/9и.:и-;и =и?иACиLDиGIиAKиAMиLPиAQиRиLTиAUиLVиNWиOXиOYиNZи[01#+=#1313533;3=#+1##33#1+5335#535#5!5;=;3!53!#53#5;#53r788888j7֧87j88488884l7888777o886776BG64ll48Aj7ii7j8l88l4448?7'.iq+r+A!&6FVfv]A!&6FVfvqArA%5r#.989Q9a9g9jo9p9A:rJrqA! rr)r9rIrYriryrrrrrrrrr]A rr)rqt99+ ++ d01%".54>32"32>54.327'27'.#.7>0672>7676&'.7>.#"64'>ZvEEvZZwEEwZTo@@oTTo@@o5?=u   R; 3H-     2Ib2<8M/+*D17EwZZvEEvZZwEL@nTTo@@oTTn@;o o6H$C $)) .4[L7fWEGN^P  6X(NULES_]!1/+/' */01>;.'&>7632#!".'&%32+"&546h  [\ #!8u  u  .+" l"[$ B   X^<  B &FT#;Te}   - "  F  2P " 0  2 & Z4Social FoundiconsRegular1.000;pyrs;SocialFoundicons-RegularSocial Foundicons RegularVersion 1.00 2012SocialFoundicons-RegularZURBFont Icons for Foundationhttp://www.zurb.comCopyright (c) 2012 ZURB, http://www.zurb.com/Social FoundiconsRegular1.000;pyrs;SocialFoundicons-RegularSocial Foundicons RegularVersion 1.00 2012SocialFoundicons-RegularZURBFont Icons for Foundationhttp://www.zurb.comCopyright (c) 2012 ZURB, http://www.zurb.com/2#     a NULL ThumbDownRSSFacebookTwitter PinterestGithubPathLinkedInDribbble StumbleUponBehanceReddit GooglePlusYouTubeVimeoFlickr SlideSharePicassaSkypeSteam Instagram Fourquare DeliciousChatPersonTumblr VideoChatDigg WordpressThumbsUpcapistrano-capistrano-603c346/docs/assets/fonts/social_foundicons.woff000066400000000000000000000246241520217215100262430ustar00rootroot00000000000000wOFF) AOS/2C`pcmap0nPh4cvt ,fpgmsY7glyfH"H5z}fhead046\Bhhead$$hmtxG|loca&HH\maxp Cname&2post(taVprepn[~!xc`d``[m2p20^)x+o)N&6 uxc`d``~pHJ0H0_`e\#i ]xc`f^8iSCf`0 q *>2rOI01YH1 Kxc C k<{* :+A@ eð"B!>CPsAdo,%xc```fc&6F,= l "2e11 C(Rw130xi>`,Y u>V313RlI%8(!/x]=N08,H-++R8P@(< ?ҮDHih\p3].`3km L I UI8sl wdQ?:xo[ʊ`Vt)*Qs͜L/L`//FiC+*=*ctEch ꘔGd̫57JTAYCC*;`<1bOLDYTI <Qa5=ߝ '5$kxͰIq+Hfepb0fc``XʐŠ aghf p0ddcPabp1(00\`@-c°AE~P 4]{km YT8"8"*1bxڽ{yt\WᆬWj{/*ժTU%YdG^-޷8$1v(Ig#!4ә&$g!9"B2@np4`i󻷞dON{{{HIǥCd qȠ" e@J*Uh!]BB=Qo2I}F@e省e 3liy-M 4ISv(( ôz~:!> {DHl$O.b2/5Esb] b.*"39)!sLQY =Fe"h; ,(&|yNiPED'YyؠԨOH5|l |f[zkޓ_S;pF< D? d앱3y^[;iGvm@MB+"CJd+䳉`>W! Jbn`)EE&P4疱>lfuQQke1e|6K xI;z>wta<}Ν;IHRM /_:Ւ4eM.-$m FOJZ~Bj5C&u5[}^_ ۷g6oI}lWi5ptWKhz(`@y, t[54:)zEnўzu}N=ޘ#ۙ,r$ǾžE ^$p`~ݦ#o` `/YbF^v1Xb8y@ R^ /['4@;Xa,蛋d0($,Fq1B@sNVֆ't2C"/  Z"Ӛ`z[Є"UM&M/<4; 7eR&ɲ̷l-ocÞw6$)$1xp$Xhf|]Qt=e:ʨfc*͖*owk1ЫEgh=ӵ7nGz}| yO)F]X5 3-dBd`pp ࣀg/. 5netQ^颌e|-2(2(2(2(2(2(JWaw Bb(5 BP (5 BP (5 BP (5BXF16pVH*泴2% e CY|0%g Y|0%g Y|0%g Y|VsvY>^sa]°.an0K%v s].an0K%vienWv sI,KtHeoZ/ 5B;PP+ Zvu ؋ hEېn^HOʦkjM5Ҋ7Jctx1 &tŠ=rUR544NQIEqز:WYh*Ay:E F3 B<,5d 5δ1jZB6?3sg#F㧟eɠL|Oi&ng&qu[Į0*E]tkS􅌐SSh.קdEE[3S+V}=n l-_s j}Epo(}t ^ƽ25ig84ιT2 Ru!Ơ%`psŘk$]L >U,3K8djgeSLbJ$6ӠN!vǮHrb`46-לkul'.B.]8K D޳2Ǻ'_e!9 #`0 P*AJbK0%Tk:݇) | ʗxOè'5вC`n0l0=j!R]=UPnm/sԎ<}#Ү[o(ЁfCl\驿p dDo \z[vLI{|rqa#/-w9 Ttqc dcW0Ҷ% RhbŜ(qz ]5E, T5C*eQ. 5jVsfHOhOQlD.ԕ2-ebN?t;wWbʦ;vs|Zr"Y*%vVs;DR`WA4B &'=g ^Php/Xff~cc]cAc̯Xpk3!̱@$`¸p\D4\~>=_=}g*4xJRϭҧLK2(V킚w/hAg!Sm\if(0WM {_8n4o;҆?\DJ{a!uvYm^ۖsvVko~x&R->9Qۆ#Az%;[[[Z=mX5݉>M]v,[On8Ѥ][J1u=F$R{77^T Z)NWIR?/gj!=+%N7=xkdL/(<lV`Y`u\^TT"piٮPoPoV͡-Gy0n L`}` gP4@ ."N@69wL:Hic;eh$h7a g~nߗ@c lITjl yf#gj6NO$fC ̷^|x6X{v8氹Ov-ѼwL|837SuF)=-{ACi"$2,G R &!^U\\bsrxAx~e(?w`Q<)wB8J^iӪ_`qh"EX2o~ f'G飍ZKp1FRo}uV)xT5Ug<؟YGyqĞp 5- 3ߣ/u*Mmz+r;;B͡ṿ4${}MJ&i6j^CTzXSHrU;oNˣG&ojڲV4MsJ^c\5qKv/=znؤmTӿB@L=ߞ1 EljDNjˤZnMu:[UF_c6nfI2{Vc9)r dhҽ8}?6CP]YC]y[` l% 'WkCZme[,h<*ts6U2BJוW50O.Ѧb; ^~empLmŸ `h+TXp4] xs-,Zkf5ЬZ3yq ff?VWwD(ʭ?_CP+_XW* PUOj(ewXZҔm(vYR̨+Hھ~zB!/3/$ʇT43I#kMpЖ(SG2cTedƌd,'uO0gNru d4g<_{?}޻]Ȇ3)?39uS{~gvKʎ?lRI ưTJN̮]ϜgOt+Rm= vk fB ( vB~/+=.+R0$ A)x$o #_*l&1 ziFJT=v͙4R:ڰN"OJ>mC& D4ٝ~:ӥ~H;Kwܩ1;[:kxe-KLӤ[-7[7K{0,7*,Ii~tX>Z:bgoZlQzve u?e$+~wm:,I"c+NnPX!:ψpՒ(OP%(w*\B֐~պ,[An[ؖial+sHh>琞5*v7!wZa+P'h f`Mj@'Xmv=uu)[:e/9[T5p*|F$ڳ$Kݝ/nv\c=ԃRRq{F5?Q}F=ڷ/h[b5Kedž˾=f)g[sB>җntDZh\Ѡ4IB[}`fG6"m:MXJ2i|!><\ 2 ?\l2V1z> mH畷|\s&qS Nm[tGSH` j9!LuYS9ߴv MPbx?,ORmАH"v\z4@5Nü2CeL釂5u_]Ui@]RUSfvFL[tZ+/=(vRl=''JW2 fRЧW->!+bMuYS(H=ڒ4*̆]n5A^ U:6yXd )yg"# @Pb\Qp('ry.R[ua T.75_IclƏHi:i$C{Fw!߂m)f{sUQՠ#}#uAj5?f/\ALR5#VrRtgkrbRy8N+*M$2h)#$KBjasEEJiVNUUq)xFK1OTYG%MyPj{iRaK!FX.z&wFt%`ک]P [(~[ l2k8u[(p%)L?yF1QL;T&^CpD{Apd ''br/Ɋl Dߦ*N48,a*G/5n'2l_&%9懊3$0tv!|٠cUv0 SQjg;K81é6[1|LwdwIs<@6Tx0  b7n\$5o%ux{KdFud)~MndێGN=sV_y}xj :?I=lXZiwo\;gM;g-sU i*{&G9eMD x" ۀ_=h4"Ϳ :Ciu~QC::VS|m | c#y@ p>O>:5[_ `_m:?Cc|]ͽ;!q|p{+c)R*QELu8v::㗽{z[Q=i}vN0|/2MUx$ CX=N x 3uG9z!*A5~J-,m[x\9N2v:ѡw~idtqFzzGz[/#ٕ+Nwnrо;w߷>>^\\7rZ׶ PR!C"5@Q; 9~ڥj= C7/&||DF~Q .E̸;+u].ma kl^S5DWQN#t{[_߶vz]t^?3S)gFL}g0jj`q㒙F\ `mp4PoLAv&lc [ڧi= P?C=F֕wZ:s/HiZ;߼pnjϜ?%:ݺpԩOδg$iAg{o9W.89ZۿF"_4 ïypBP{۵XN^s贸Ltv,_n݋i&I\uZ>q}`Įw+ [!Ss()BX(f ,h^>tᾙ.:tټpO]'nW"*ySA$P|GA&;]5}ݝ6su핯_ITMj4UXwsm"sYom.Ivg$~$)̨w- - oқτ/6 :m̞':J7AU`7p{ ϡ wy?b"Rs;y}+}Pz`Pt6BIش~ 9#~ @ut&gX^<  B &FTxڕAK@_jAoXIZ<ٛBCo16P%I)<I< VE݅7ofxxXMb2X)lcC8MԅsT /RSu#\V5 P#l-< g74e,jƉp[Ɲ"lA8$\E̊p ~K3P =/|)Ur}{]9k6RE(87]}u9Gj-'*Sh-ƒ<#D쀚U]fBҬw9߻6Oq//W9jU3GDl5i>)`qm⚺ Gصt]yff5b7_xmYj@Dlv}O 7ac0AXC>GR# g&ߩnG~ Oόal!#@>p#89.p+\=8|U"ESTa-0d72' BTdieYC+U\-(M*KܕX&k=JQPRqM~,rn w%7LKo鯮υBuybFI/ݾUS[߉DYJmfx[capistrano-capistrano-603c346/docs/assets/forkme_right_white_ffffff.svg000066400000000000000000000226231520217215100264270ustar00rootroot00000000000000 ]> capistrano-capistrano-603c346/docs/assets/images/000077500000000000000000000000001520217215100217635ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/assets/images/BashStartupFiles1.png000066400000000000000000001106471520217215100260060ustar00rootroot00000000000000PNG  IHDRcƏcPLTE777---ccc111UUU444ZZZAAA>>>EEErrrʫ;;;MMM^^^IIImmm'''|||www崴iii ΝQQQ"""|BIDATx]zLlATQ Q *_ dDf~xHڋuV!1A| aAYm6%N?{P wa (H  "@g`Ve+1nV%V % )ܲ? J%'{J‚ۊxP _JF@m`\Ab].rx>5Z#W_ P3P`8l(Aև;y/2ܘPfAb-H*<~b4] 媗XnD"@|9f|H@Fc D(WJ8 :Pxz9B~9>3(C3*%FD9M81S@s⃌Ǣ0 k\h_0n5]`RIwe=RsWm&G0hĖΏP`σpN< MДQ:l~_k\ vLek3(J>3e6n:|M[ To\89U NР{ c8QpZ4u 2| +,@<`x;}Nq5^W6lMzp㯸߯竩Yg5iόd3>{ĥTojdsE&(y_Da~Ң] u64Imwx3J5X/c=h63N HW10xm$@ fzTUkq#3Ovpd31ӁuˀlάjA:h~䠝lue:2Uzm ;-)j\ZEħ1@5:v)n6NŃvT3qq%٬E s_,@"~ ɯgwN9{EǖOD@0g쒙I [%juS$J:9"Iڦ?eێp:נ6](""Aq9on{1(ĥH)kQ'ףYe>] Whvu]( 89$9w;P:e9< +aF^ 1lޟ[,Ǎ6=Z6I~1@Br,"A&*Kϛvȯ EnǶ+XG;J eY>Ļ!jFcJ(b)FJ޽}1jNVK32R a%q7@խ(>b2 cy~:o$2~o!67`DG<ug"&݅$ QAss&ɰz(! $0C!()d[1".$m5uJ7Ӫ@J8=@Vy8R(#nW)Hl@(_D9G*!NPlyG%CG NCm2Uadݎd?A;ר ~$C $ V[jm`y`d1MxϟU^aӾ(*l+drſRcy[bl]dJ2kD)]--U ۟X\k]5 'V\i;\峭D b $W*k@fyI}2M1Z.+,~rl+׍K.mσE޷+,Sw 00oj7!(tzu.T'(zfCN`lWU[DcA4%$&HK|NB{u `X wgZXB $d 8+@bЫѳkDTZ<MgBP~ CӚ_s,Z8^iTXƮXcPBzƦ۸Hپ@wiZP4d7yl%@&Sb}Hҗu1__db?$jb,`L](%vW]kJ8'OLQ } VHq2N k ęy8:L-j0Yg7Į q6@>9+)(՚U 7 ݃Vϑ"}L^٣[ fR BTkb7O`B.ٚǏ|K3#5_%iZEFqR,Lwug{L3o%ljD|F1$mg(uCl7ksͼI&{Oܻ="FcZiO߄vZBPĢpjb9[*ܠ՗}HI0gF۴ʲbL1%czO#3Ӝk[=&~{6 lӚ9uϮ`\Bצs uy vmbGjXOe-o,w~5j~c36qeS vEZn az`sg:YSb}8&m=Q ) bU ӵ"VkrUSRM ƔrM_=~l"Ts:}5 fc%y6Vi@AU;u_S %*L֚, F9J.'ZS}]A "Y`}%0liuv_H1FcNқ3bEs!}DԻ=xg-W33nQyNa̻7sbr9&88 m)'eSK#:=J'tD3_/ʪus+-91h}'U9q! ϴ\d#qbׇ(8W1er]ˍ4Ulλ[:u$̚ v C@z-bgRVs|2erkuI\;*_״ښ1̏Uf}%Q'o8ZUX=I^#Tc0E+Q2XB!Μt}m뢛\1|3aΗ ou 6J0; SfS_ iHξ!0O'~ 41k1#1|B/ق2`$1{Է2ɱC%6 5l}^f v>fOΒN; "퀱hU/M]rbxb >} ?7C'ӕ"NN m B{Gw0-( |}RC.LȣU=@,}{,Zs숿X˽\*+]9zZ f"L!dB*Um0j#\(1Be2dUN?Iʽ۬2'ph5M;;¥JL0&%0ۏ"% B` U:նp?8 Ya;1v(+N٢ۀ3P1}V;SwGV/U9>^wYVϺeW@ Wk oخW|F!8@gENʺ#^npF@1ՉT\N%B6Q˪+ gS' 0e5?рXݓt-c ]sĘՀm  X}$!##Z"V?cx9CMN|wio={!ZeQ(t5tuΕӆ"PAt2tuz. L!`} (V&%dMBՅS,@[g'P!3,;$XL H|aS %QH.GJP Aǣ$9)0e#0Qٗ~8*CoʹGIA@_\wю44sC$1QFB:Gs?~q* ^iSuJ|*#<D1f0k-;a,Z=1CϕZt"6c8ORk-{Y!l7ժNOBosY#dvbLJOe啋}ب帴9W*eo޶ BNbl"/?5+>`LF{=؉oxrjcZ=>$cfCӬeW;vA努+L.9Za»EDu;俻R?|#:Dxo$ zեd4ppWstD{azs';j7-t*v6$T,<\x1wY@qc9&aң+gUYo?Dx>?:ukmBba]"8F^-U#w9ǩ \K2 Q櫷F~ vȋ^oA``D,=3Wܫ1g8E߰DpȩmBo)=jĈ"$&^z̒tUr\;_m5%ފQ7f^IuͲL“ئw>HyLɧ~>"Nԗ1fM%Qv.D[c |=f1ճW62T{&Aj LK]\5 Lȼ46Og2z|d2R"BV4ɞnV K\hhve 6$Q?㶩+`{l*2SKcM&(gG~HxAY?#LzOq3рΫ|R3fD:b{R,0u:' [hX7+#0 4ZfwF̄咐ULS%'UXcsqaR "`e(Z%NKz DVdezn\إW3cu#,W15z|5Ko߱2vI6I"E7D@bO.{'w`KmTM$_,2YYohXX~~/'Q2uՙV#O<&0Ka+7Xn *8ؐbFF-|׋!F3`$&_[2Jh Mƍ7;yo8y|b%}֯ L7 |!޿92DA4.jgI_|l37zS9}tA2QJwdLU<-a+ \-㢀JVnGIXs7!f/ɦ=t΍ ! !d2&)d+t.*Xړ@L/?dW}{(!#p#XR|7歑>yp#KF`? ˙&L׭bdݹIX?L }{kɕ?#u#&2%ͽbZ#RH(ofPPK`{d#LFcEEA|k.S׃rG,옋Oξlmnt# v'ɢ57F]|>4 63P1w!YtF`cndx TF^$ѻ,~rjop2[Ys8OE?8zM_:+?;&ri)s%iBrmO Q^: ꔡQO*Mƅ 2B]v<Ԅ$*xQŪU?o^Ӟzm?ZmW0;ǵƩҬɡGC xp;/ajarln)De"S bBzL &(= ILwj RCKSفPQ FQzI%V <􁱮F q 05x}jq PScu$ J6T,m>5fxJٯsĬ$s `^#pI!|i@h{t~mW!@g *O0+_K[? lPᯑOXWO@bLX8ǗG^`ΑKBE){Ei ! ٺ{38\?|1{$sYsz>ɥ(x272/vRojňnG{Cѩi`*SNA'?HpPy!~f%1T8T4Pk\MxҵֿYsВWCZ3GW`%2QלCϭ_ZGxtz_΋=ظ?P1x~J9g.5 FnRadn!,t}jL`RԮçdI;S`|-S.G< ȹap',@ksV"C@XU\E!U:5Jp@@Po޷T;!ծvCIM(>Gm]Ƌз$I!-"oү3" B-WU2y儓xPGz*?-þ̙En%ˠ;fHPMcePH|؜i>EϬT/?hg,ҩ^PHS;˴?y/,zTӊl"R>p])_ڍ`JmA:%6ÿ)Ð[ˏ]m\Tn۴;Lg'O ObLq`dm0H?lq6M Xmu_1k⮑$Sac';by:HG<#z|'M4d`lZg%m=G |нwĿm"VtWؿq`U4n>2g g,#1Ḷ2]+3qm0FsƤf3K#ϱM#,3s"Cpx cxɢ) zk]46MʘП[6e OMb] HNYߡU7/_qOo-f) oĒ(wtaZN1[YszQĩ85ٶGh`؁hKD--5h UVfN &[#]z|/Nvq`ߍ=մ :'ɒYnu6M~L&XN+ӎ#D3~`2>S尞-9^5G!Gu@N"m]M} O$}S=a?w/)nc'Q*SFV|Qd#V6_{Iԉ|aj#_6`ޢ%5z(;Sn0d4",نT&u賐]`;_?@-2MkPQR/Y]@rs]Յ+|zy<$ n\uz䱢ɌJĝ2?,[1Dh!tIrG l6z]EFdܴXR_$i|PG""*$UfaDj-qߟZT!T42<쎛K G_sE"%SID1>%]0 R.uu]U昪d}$#Ycl ir6WlS-EhU d4c Cr-jB_ r~P3IYdSHS{$=`#W7V0vS<~XqW Weþ)Guy I'%'DnHt%OUIَ"]Zv\G w%%eTN^4A¶ St9qp=:&pZ5a6,'#1Zċ;#Q[9k& )-HyJ3 SC]N NI1Ӈ#.$DFIW3ƥ([ƴ_2]3G,osjϹbfA;m;Q#D1J$lF) _`#にp5U`D5MEK)27ŒmOGZ ի+ jL9*EDU0Xj;cqvV;eÕ!!֬PXU2gL,&"XQ>,escdRؼ7?8*Yd%םh$j0%StdNTa6^]FT|r9]*>T@Ec!O0F6\ SLIJ2b|$%D أN%HxB%T3 .˜\Z N91Em c'2f0F< U " L*՚2]Ol\H1VG˝,>vf:Tr7vƺoFsn-RdMS/CO Z,j273 4֖$HjU."y`A.~ 1n"A)c|BH,V6a .5-?bFF50<#9U$"r` @V:`hz}X.}rt.&?0N`k#ypvoZ&IiCfWV$i֒xIš r8A5o;+5F SN̸VVw1ss!ڂ|ey\APQ SKw~m.W,XSAX0iP.wډ*axtb *B,;0`Q9j)|^B i^CI@,Y(2Q{%6> /w2Ǡ҈yյuN(/am-|uJӽR}hp[h|O]L"cCV{'=@&Å$2kre>qҴm#sUl&x ac{&y}̾X[]揬\Bapǵ\4&*Gxt6Bu^Ԧ.+<; Mcw⓽KX5v"W2"1CR)* LƈFΐ -jx>=-F7^R]|r.UGhQm-"dbM izA OimhNH[gOI ku 7 I&8AYTZR-+Q: r)}VwN[*UAN_(%ٖ,wٔ躋 IZgn1YH[kvK3wH)Cꚸztzh6QC 1=xϪN;QQ$6Nyyꏳi4Kx-eN;gN {~8^$ |ӌj"w=z=lʀ=,5GKՃKS.qR$IQYxhN𓻒"LĬº '޶`:Ws%vm'ۮ\b̐ 91RٺTX3u6HU#¢֑)+˅T0arZLڎ^iiAƕlaBkvZDw^Rwj JTu 1#yeMnwېX6psd!#Im*rj$ "qKt'jP8bƞft*tH8rE߇ kleW(0ю!lYơ8 !xG/4T6Gx)d'ˍmҤPwC$@)9J[ ^]@V{n(iXsSkʶccN 6 âeΓ(b`]Lƴ]߉m~[oiR*`b{ˢ zEf/\*3gF<Ԣ>C,d*E:dj]j[vo_@3媯"7?ߎd NixZ&b?w-l@*(e)ʢ(եEwZDM6əs&dƪQ?:e&( !g=0! Cc {Dۚ" ' 2m7;Dv=Ӱu $$0􃓕vIdX{:eGކ{wd\!OA`4dS Yp<as7}#8AM? dt\M쮒a YHdC,!c2~ OGvUe؉7$0OɈa]%oV̵{2@F^N cOMle&(jyVxDdV$+ihy*%z-IdK-0!89F9F@PNy ;  ]KC-+CTb㙃?Z\| hHƽB_|U-Sя뛮.:E[v崥c Nvٟ*#AG͍oh-@0+)MïKY>RS`.aJR|i̽7rn:v-G^lLڋ +6RUy@ByŸw׏<9c!c<y0 }GY.3XċdP 23rƀ (nV9zj݊PBǒvFݎ%d^):,c4Y1f ⁌P}K1=Os#:=XqtG7wX r͞Pg 5cL-YŸ1f0k xq""pt[7T/Gq¶ՉH}o9H#["5ߛb/B✿k.4(%>8x2F#ھVVL>ȶV/ZN&?B/ Hq,3[Ʊ,57Xp4|: ;3H*C;ִMvH3U"#GdᴽV+67(6ݞWկyM wlf7zz[5AjGYZSݢ]=y6; `4nϗwvOUam$хQٓz:\ϭEwփV" lQCzMYuFҸ X3r.qCEL+pwLx* E?7 vBնcٶ&&$=3ٮG1b}XVkU2e־d)7{7廗'ˮOD7>WTG7*LM9cyq0sdu!ꔪRoEXn#eyMY/ Fm"ç_v*Ƴ,EgE>̧}gjO3"S\ .VdR]=i)l>l_l]`ai?1HqŖ58 QixZˊӨ wvg]kۆLcd=Ql4(V+Q>$93LdZU$e>O((G 9.dݨofl!厝os$3r9~BhBZQoY)ݨ;'C.O<ͪ2{G^a~/yŬ ʙw9Â@Z%@^^9)rtqHU!R"%y^Px.2}f#)FJ gx"-d&2OمFZ94/!= +5eOW3Ta$M"9D Ѵl;oG>NKD5bC(i ~_okY[ ,4Ⱞ)x/U(De]%a#? {Z3B=8 WۣKn-NmeUol8,a;3j+U| XzJcϘP0_Өi\mh& /dKxSA74h#P?L 2'JhB)N LSftW8)d.nJǡy|6x:fz`&-Rpw:/dG9&_2tz9閵gI*B7l|IQBLfڽ&>Қ)bh r}C}X }G"c.&m(}0;14WY*i> 9P,"} qh`v χOMrDʙɠ85D;C#K\&/(yɨ]Ȉ*HɥXtOߣINלqo"-B%XGxĕ X(!b3#X9"#T/]RLj.00^ aƪIʡ~}K^Pt 2[OuF ܺȁ7P#{jŇ(ne(c%f?@I1UaFR]lNJawah.'^A\^'&}f曣+q->ĖC*gw|ER8 THZowL @ `ЉW @||wrZ֮ldapA.3=7N8!v `p TKN@`)C?tU"y@ZK\H$hlp3"Q@13ZyBu=DTfu06A1AN\q( ʇX:*cGUSҴ Z62n%%uPo&By`^yz}Zk*/P@|(1RC,j6TcL{洉ncykF(Ƞ# L cEVgqAoǔ7bYĜRT>5Ies (`nkm( .񘻵w5XR$W^HUͷ Uf0m,DJ&7^.MĮ\at\Ř>J!t3!ϴ-w0)3$;+$:sv<6Q i,!D/#vMGm`6_sBs-I2nw nj[,06"hZL_{xH]7xJ%F.io1d? T yD\;̅1?~?΄;UÃIP!u wVG]9^53;NKLɴd2a~{HzBI0Q.quF-ߨ>c,F)cy8YF(а'Dʷs>X#hUHqV.sO6R"'5t(}HԾh"M$';W9gĄ BQP0!;9U󓎄MJ$2m3?~/C${,=?y@U@mF@;#,]ʋf`בnDYǧeɿ:TVX{ y1l}f Qs"r4j$pv7E+1uP??oЗq&_#6/;l"ݳ|"$+Gs4KJGʀbɹ*(MeGKw#[]|:|{xJt-BRpn6mH0T)bks&Ic)Ǩ\ga[pSH*?NRNIMj%㽫ikeK ܦReSPC@V2]Zgv8q)f v<^"4o rWtMC]m!ƋVJJơTo/sbq[0 &ƳS.d{c; 9Ϲ+9} [Jhmz~#2A?DgSzCV@NNit_̤.8m#܊w+O|+=a3,D7Zէ6SI-f esۢZJcƅPNLpd_3y)b;/ܤ_594J%dNZ:YwwM&4=,y+g Y4_%zƲFNl6,Z!th8s&e7l^T!ѾfL+A1a&4M5Kf0\spx֮#3,֕caI_یaKfjozNJ~Y0j2΄=8> E|3vgi[uI&2ƀ.3c"qsR EQ_㎥{k7PuNr]ƖfUw/FF}CP!Cjak31Fe K߱x!f#c3.d3_RŕZ Ő1v8&aݞvUĕۮ/3a`>XiߩSn^]H ;'c%e\׾:2F a%RP;cO=Ƅ ,Yˣ&k!Xn7)èX^|X4d܌!w `n d\3;ki7bό0.- 2M X `8eq C!12V )\ĨT d+ւnOSX`| M2ƫ ͑i_{dcX2fՈ\O8`[).2D-'R-|CXpHcB1wDi84c9܆F~2*S*%D"f`Lȡ=a+w "vlص B-+.QEa̐PXIi+Ȋc7eEj6Nz~2vB2"1m O|\lA8\/ 1~;B,dV31[c!č #a4PX TLM@`ŔAI x\rA(ECCP24üPOñ)x VP#Z"PōZ!cˢٴ" {f7o?ح%)e,(erv0(A2؋ޠMi#AuB!a^Y°Ҩ^ߴlc,l.nnn &  Tsڲ:e&pШgLe0P1*}ߍF4$$˜ s8GG~k`gQ >EgfN̘G;W'*ʄbZܚӤBֳWҠ]MfAi"cO1c6s ?QDO6F$1Zڌb<3)WS,2maAS:LH*1c?c?[p5xZ#DVM)QAMb)َN$f,t]d/lnB-MbBe Țfh2e15•+.c 'ƶ~1LKCRB*)DɘTz̘_P0`kRpc1o-|,6yAFČyfc;+gt`aX97ȟ#׈UBJs"01p`%jc"Q+i>?Rd k,d NMD( jV(UPQ%3&ǦkWK=0L vU* =E E\.qnEbS ,@149KFX,2j`VZLF /V{,a0Ah+E;T09n쉱^0!?WmDѾrz{A ʠLu'};,c3捱2[8+MD)\Qqg,6i @@Zzg(Ez-P"_.ocоadhÁU7($T3яW MmW\n]ry:cF3dKƐ5&\Pi2*& (g-q5Co]8}xƂ?U9j{QɸjhG~DObacf,@\3E>V(0;tmr㥌@_Wi輪B;xͣS򁺁]gO> 1p`r@ZQϴүL;NEH MZ 9@v^NT0LVX%C' Kdw@ j8Mǃ\=fQZݭ`@NNOo)0 Zi fXj(0a,Cӛw1wf'(* c)ɠ/ÞP`lܽz]F,#GHGqahQ#rz˸8kԤE!\?S礖}R4_Phˤ`"/ĀQ}0"66'^QTWO?BC'JGx^"0G>=aoz 71ްA;2Ɯ Ē7d%#|gΐ>/?;FuFvLh 6Cvv ӿ](\"NjlbSW#4րDB@B(?>R<ɲKİ/ޒEԕ3L=~m H~3g( FC>9#|F(Π؜Q ]o2qSb5bيnoɍ?f7qzIYPKc_5Sl*,W6~_(쏽]RņlqZ4tq]B54uw.﫺nZa>n&f3啡j;R!џZ5e!IBg2S)'< TiV*9&.u2Nw[!ݺ`1u Cssi.E9Nø C; (Y8X /  oӕyC@0PD\Wb3FTl,[cPޭ,Nj,sl4HViMZrIj&6a0t !js& :.LGQQ4Cʹ*^j8MJwe3NgR ]֦9J8Y`6IzCLmʥzқE02fvr*F*)^Jzc't=HYIjY::Pu׫  ?+V|g޻!̪kH]e VL, Ts5x e~y8;ţPr"tCy e w׹*EH@Ae8,DZT7 g{.?TIklv8\Yv%͗a";EHu>+Peޏ0ˢ ece ? h7~*Y~ui(SkEQd&Wice*vc|_1'gH^ӊ o'.|;4(d`3_;ב/ժGJ-g= n`|(s _a31gRudA#ؿoH2_5ߨ^z|MnX\rnvsrH¶bh9ut=4vZ?F_}喓0v7 joǩWlroƧC˩< Y$ NwEnSq:_,`W+ӧC޴IkrGA0$`$~#T;&2L9a)_Gc'BE ^ؼYz#{(K {Z8~?a0]3TvcH?"G(}s Ap `P- bTҴT|M-sjc騷xf~5f82A($/{h4Z sfkjz8}~);8PnB@U._|Z)>TRDuۿխ\~ʔF`#0qxd-R-7L 7Ayԫӂ~wc^kCdރ5˙^<|^-3F-̎҇X8JOtqŗ4lGJ-J 8d m-Y R厬̺%NK1ƨf?_{ܥd=9ﺿ6kXZ7و,BkC;ahQȂt~buFTEVd1 } &hĕ^F =; #˶UvmK>S> 滐o٧O .@aX$$'Iw[u4Z)%"r{Z?OZ{-.{v>mbhQ>'ŧT7ׁGC)LæflMϗzM]#U'Y ^cK2)d'MZ}oZ&W&+f=ScK#gld)0fSR0Da}Xp0^l?&I@v벷iM,´`[0ϊG}0&ǘ\KR W% $kWQL* w+`1гR<,Q([s>#KcEl~QdIcGdvv4cx轖¾W'?HXwf;#YnV@Uګ6Vat@5YrA554Uu&0VDg퀄NXLdJ|і ~djI c9Ey$eˆ/ay1HD"H|jZ)N mAKs#o_L֍L23lҐC)vP2 lF64XW?>= SRв~FAD?*~@(>ŀJtc'03cX3\===izB,SpuvMÅ'^-E3MQ:PrWlj(U):"g_/P al0^O[Ld<| )mcLQ4PFAʛI A`;WQ +p!]t@.t0 1*0,l$M0 @8eK @<8ϊ mŪ'P?à.P7*^wW\U <ɄI9IACXL$pʄl0 O$`X7ow`: "dD+4$4%EŒxtACˏ0 8mu0,hP(>  D0d&<낒 #^vk@SE{\A%i)!ۦ?qݣfS0,;`,06{\x>tP+<k/K77^7 Ϣ;p[Qn':DTy[vZY".ㅛjUuYapJתF*1gWPˀJNU `T%fB⡽RdV; W]`%~C*8ot&9/~2G1hafv튧Ňߌ28%rYlEƨ2!'fx$b9!$;8!GTw=BLOΡY6jBrg+~6ӧ6X ˪027|Mwܵ6 lEnPPPE5MBO;9=Ň2%gc.%cQꔧ͢;io*FqEܴr 䦣*N T~M |_ZJ=!z,hSu mJ(xujCdh m:K mP6'f)sQxyWe* /l!cUٝV&sF~F &hΈ-b2R4 ` yf~>N ȨY(Zx ҺB >ʴ̃i ;`g;/7{ mY>VsEiPG#{I*R^` 2չC3p,JeR]0Q `rWXJ:9QIO[v;fVv3NA?wy3'L מIR;ôh$ sǃ =w +CYI:a<`L  c:879l6ĩF1fa-ܒccoXn1co7ȱŘz1a2LmI=4rc{ȅ2*6, w;*aLw)Bc6nf0qal,2|wvR+ҕ ̿[W2L=n]9dz1]%oTyp 6JSky(LDFA7Q)[DzE@.dRCѓ*@: 큼&H( ͪQg*S2+!lȸ߲W^ɏX*v5ۑdUE̳ӆl(WUMWhrUI][pPt唣Nyf&K(svߦ7P ueWd'S&ZV* 1s6Mxp, *ďM$1' g ɑXd<מQRa7T U.L6h:z'm͚x5XA?(udRn@+-pvZqz'D'zQ4 W>Ig]1 V[*ۍ0imŒY_NӮOIKqfE֏PM3d_ѷ]`qL =>q6j[j oU>Zi0bhNuUXF61kK[1 ccikD+ES0VDgSśCRGq9ݿvS^ ,0BVhpg 'Q3+F^6M;WIm,}n+"1~QTT1t.FFP/RJm j3؜t3E16 B¡pcȰ-P\5j7jXɲg@XpULu6NfTSR¼,dB s{FPp\ -Wrm f^l. 2;6T=bwwnh/oxҠ:"[nfcxw:2ɘ][5vo!IZ4A|> 9K_%FJr{Vԡ\GQ׽~Q&ph,jr adeyQTSdV*Nߝ֊Q;a _a_׭I}PL,ytn>2Dg@ř]ݚOb]"N26;~1.DF m jH<iӀX?"ʝ6\0y_; n1orWc\UQI弍U{B ^<("bl{pW.dƀ纓~t 6H"d:ɔ*~R=TƱlO>QX ϕ,7]NKZ0O sVsxC%zJSj|(9v] –eMߕ\0۬\ԛjZ>>V ݰ|+<4Fct{rYcEp^yW̮ N@D`OA YD0}S#:e18TlYlU*TXad۰0tb1\pfY; eW8˞U(rc30`,mQvF1s>!Ig!kl|J VʌV{tJ6DA#۱t3v\ir֏^XsC] r>2,j&Sbm_^@S@Z;,<%P՘`^Ԕ_ӯQq. 06'9O8u8(IQESdǔ) &9Swϴ+2u,7*ay k%4ӎ{QXՉ u04bl7P x)_vz!,{vGlQͳbJ';aQ@89a+>pǖ KeC{`PvƎRn&z-*hu?_4M;t\mz5Bgw] u_{0b'? z6'lT;ihh (^mme">^Bhk۞i?7yv0pgUFV*6HҸ7Z(  \o$o)T= >U (KI0#y?~aA]n[|6||_Ɀzy 8Cq{Gj?/p 9°՟A_^5`9c1D0dErb яxHtaLA,c_0?qe!eZ4bŽėt੤ 0Z~xl _:QkŘ~Uy*c_4/]80ms. jg+ʉc0.Y3t3R~̒K#,2l~='t b20%ewϋ_5  `ڨHb _Ni>ͦ6 M6|k<\T@xo^NA RAPZ)<򉷽2X6SA~j҆5 x$J*55dk/Ɖ ^̿ +*1I^,~_vcr`rf2^{p$$ګ'x[_ ])c^H깗gJǙ?ډO&J/RPĩK;,F!ćCp/׽Bs!,d~w2֤ۨ:h\QƗj־G MzWaB0@8"—/1 ف.guedF/1b!wK 0V/_ڱSv:n]},學+)lmru{纝D -`n&S664?N-Y[gD;v)6)cN1s=47\YV9G?O(g~&DUKyIha/+jg[#{S*6 w+०[ tQt* T,ӂ칾^ ' Tņק1W2 eNc%/oT5$NɃ.he,Q~Fx @ĥUbN2ymBj: ^~x֗7JL3;Qν> YOA6tN/M◪~)?b!sJv~|^T1cPлPwZ? 8 Þ4XLϒ2!u1]zKHM=iG 5{8r}i{{(_?'*tN/e:1GùyJӛ00*Ǡ27+ОJmK3Dʜt*K*:x$ VղHrEw<~X;~aBgu9x- o-cFUY_H ]vœˑy;1JAҢydڊ1jA)$ILϬ7vd3lG h(b ) 3Dэs;U/?&#<вG"vqy/Yڕ]ˎ`^y~i`Ի:_}pMpC?auhU/k_γWt},.j<-0-,nq#a1Rbr^bV};B@~ ‘uM@7FoV3C!T}|K wkڬ7/2IXgY2/JHY}.N檾_ke(4.|gv&$~U߅2x>K3e_!~UL/+>/oem-Po&ڿDC5Lj;@b:i8h+H@ ]*K3UZkr(ewK,HLz =o;f&x&J\T[s;<={AWnоzU(ی:g[LJ$gˡwዽNv^6ԄI(FO3d{3L-v}'g}oH8iseg\sgI4( f2 -U>u(15,Ќv{0dgr.Kz[^ނIQs$;KBZ@B8mT8Ijd0j "?3ͧVs]Nh&D&QIQ=РNTaHC"MkDJεH!bU^ {|q*fZ=r;^-vyK=>Ղλ|*WØ[;5-pi>gQ X1\[LHQ5* 0L%N498!3@F6gri"H$ZAХO6fA#a c HBZMrΫ LعA?W\d{CZVatl2o_CH}JTvN+,E>Kxjbsxe# C%a9!di H '@|;)Ӏg٤PpJ3k0 ziNy,=#I6|By:e@j+'y9W;F-2eSi}軦[k6wBA[Lޙ6axuxU-ȬWUVw@|(/obHS](Z|D;:c<7/NTel$;dH㹉>kybB )9݁'30=Qms: |W&msɼ0,KƩN9Z옇Ly{֐̌:zIыg3vː̿|)8N=Ί MXuZZ#Г]~r6ԏ. cβֱ%,0U1冠G~"\3y|J҈N@i6!a ĴUS,WlL_l& i:)|o/; u,T9I5IENDB`capistrano-capistrano-603c346/docs/assets/images/CapistranoAvatar.png000066400000000000000000000066171520217215100257450ustar00rootroot00000000000000PNG  IHDRJ)|PLTEGpL9999999999999;R9?R$D%8Y=+7a#*N/>l:k/O:_?O1>9X>~P*Ik7Z-CL9O/3Dv2`6J~9R/WxGN,g(0WGe"t:t6k" wCGJ? n1`:u@L9R{ Ip:y\@er;tRNS0`@pP qh 4IDATxgWLǃRՅ@U>`a׶~JL2-&sq mC(؎qč6>h0 n|~<C* 0ōW%GB" ؏ҰȉvmFȏ|NyRx+VY#n<* AO̙CSToD jϐKjFADL2wjui.|nyuմy {p.7HNH QZf{ D1~_uzLŸ''Bz}y]@-4.Pc岎6sVҡ_S +4.ljqW1R/ Nnj)Z Ze*9/ˆZ$:ȃm?8 ͔tI?9,Q3iR`6L*JkZzөG0,3%i:fڠ6ⴺFK끊缕":%t裕CSjn6*i\dWZ@ t*(LfrdŨ9srHA5;JQ T9JБ>D4[I6ͭ ]:U M(EtUsPҘ5 wNZl`s+A=ᖬ'ܹK;ŀeJz87c#J' ޢ8:>c$Ҡ&K)1㝺4QiXc;ҠVu{73h&jT'PIwQow;fj^Mw1 7ԡk#Qx5Z˒[\CMCy8Lw#l-aH*l k/ IwP?1H1̺oIIuHp껂0Hy4fXkS;`7P?H ׷1}>*!.LG0k$a9zI:oC!^UM#,y/_>O9Z,'1Ǩ| ?ԑ8Jg,_lߜ@Y/hsa|tpݠ "YQAF`!<0)sب@$E2k9PAFNdOe qb1TQD`6K#^ʈ.8=t߹6E֬>:& ?]2"}({ n :L8ZǤ^XS+R%2@Cm(iQ{"M&Ȏ J7$"-*`$\N9FZ$>zh~Gj1p;p,G!.]TB5TŨ# Qt )}_:AJ e5ȣ@l}7pP[{ ;fMZgsuU ](O, cPm+3T 92T3-IbJ9O{rTO3ftIQUM ;]و{{ҿpv!FKA>v>f8~G-مUy)uBѣC874bz2qP3|VMDTv"@E=5p3[f`zG>*9>PɖP#8AM#\I7^{_g{Kc X}>P(tJ\PB U|+4 .]U K\Cd:6[C=G\f̃U24V*PEsYɯ <,ɋ[XEښ?M ͧfL{YUsT-جә3P~ ϮnĵȾ7u Ej7"JNޚ\vtpjݔF+?c)cu5ѦGvAktf<{ <=-"N\z]65';3G2DQnU“ ggyTn@BfzԮCSM(8{9C6Ghڜ#͜D'Z|~fu i0v|QeO rg :n&ׇxs?:_g=ԅTT7kW#.P~!Ԡ a#aAjHW  ְ BU @n_z a,P#OAY(/;#TW{ZRacrBӜiG0 GX}#PRXx;xY儃¼SopxO@Tp:M L7aYT;6{"ہM AV=?Zc;A?ygIENDB`capistrano-capistrano-603c346/docs/assets/images/CapistranoGraphic.png000066400000000000000000000243701520217215100261000ustar00rootroot00000000000000PNG  IHDRXv 8PLTEGpLR;R;S:>Q";R;R??;YN;R;R#6R(;R2??C>Ru;RRQI>r D;RRC;R;RIQR6;jM?&?;R?=]RQ;R;RR(o??R?;R 9_PC8XM0D.f@>}:ZWtRNS0 @C`` @e0Р@0` pPPPpp5'IDATxiCKC؄"@P@n(dY_?x63S]S۽+dIS3Ūm3U/׶+_4V5nkxd(Lv6+ɺSLٵª`24^tFw'eAZ2(-zy<-1IW̯5.gϘ_څ@dog3҅*[jk|!Vr 3m~XƯ x+C}ǂy}xoӁ )mՕdw&`'9/ i`p2[\e n bb^YyE+x[K+;OK<\e$Vl ӁJ /`g0>d2 k7 [N?6hT 7sd۠a`g8$, 9K^UUesLRTwQ;m;+T# < 2Z:F-Ҵ} k`2ZZWTN.gRRhG/QvSd-1. T (RQw'Vv v$ј*-^eX[&=ʜ]+WtJ7)Be+Pn;zH.-/>g+Tu))4M)-?:VKBd-&ʹ+ Yw ?4Y=Ac.`Ɉ[zg}%P8glJZï+7n}.TP¦%ߕ(+RUTަc& 3n?oscTWMP -n_)^_X%ZzeTdJm47xX]k֦*eL#wwY6Y%nj' uDΦ,Dd}ۯ7>8ze%^E#>V0N8d=ʶ#m3<ĊT:ZLV9Wn(o^cd}N\#뼵U]AĊRV']ܐ|Q8GYMQ.i% /Yg͸ңd5œI"Үdĥp;>Վ+-Q7=x0KŕO^xHd6-?^Y__{Xq¿\mCEώHVHFȕQtFoЕ7`/4BL<υiջ3QaY`pKS\z^O3. OG!h+QtJY-XB;EJdE{6T,L@'}Wf-45mDU~4fhe$pUcE;eU۽FKl0]T$RU EݤHS_8{-jZ蛅EϣH~QQFR2/w Nv"ZR{MR6,h:xyg̓XF eiaL Ħ^4t9,imc.zuQ)D:7Fm4t fz3w̬um'9uW0C ߬`I1kf,)[,uf{Z,˕<`V4ii4/WEKK%Zz4L/WҜ֚_OL,S4TSrؗ2H/=IXI/Xn>fWR htkw!t@A/X;kC̡Sz/:AY T wu!d5a4,ZjYjPfXdAS?|h Z)*YrK0_Ѻ}핋4S3a L kiR Vo<^IOOBZim; .}/2PjV l7Ba 3pRY+ZC$k7Vb{#<Y^0+ޒ |B=xxjYL0kR|{r<+DiNN[cDw;`v|/Ey^5|/k\W1Wj hh^0W*r߇6*3W*rsfg˃!aw(눹R:K[p&dE!oܒ5ܨR͕HCpR9,x5aupU{_8=ҳQ0\(YB#L1WxЬhbE8`P%Ws%dyJը`s@G%GP=+,+%OP BB\,B>)(X."̕5 lwG̕5 1CwqUBcC~Gb̕54CCw}A _3MJ VLېﰄi _Mxy8jHa5d'AG ߙ+lvQ4橧QтQdQG1ӜynDr;a;~o̕fR'5B\a e+Xa wJ|Lp;fk-_(܎}ЂhTWҞVu3Bu\M2(ۺ G+2˶6drŒd~˯.Zߘ+}?J= r!x$=ܐ\/ {sմxh֋ւ~ iEFuF0\2h-j0_(Ά=HF+ rI?W/D\i/ 쁶_,|4sc3yx9X\M3T:aI\/X,מ2W: 8=X7 k{;VPg@ɳ|d2\) j&k)Ƞ0Qj'<'d/IdPS<+Hd,Ƞp%Sx @)V~"{RJug:2$_([\% .lYAӠByD'&S]u ֗eM/GW2U "r5z/G35YaUvӴ7ubUWV05}?ʴYY,!lUc {JZ,X֦{.b5,A|wjUf8Zxb:pZ&Pb4X7-myw0zoP=?1ibP'x&I -P:w!XaNGT6in/wX_+뻞B6`̀tP碬왁!>rQ@B()YM͟p3idmjrE! 25 t!C (g*̤-m qQ}-u%qQb `A- "jQ#H1V\ڤpoHb,yBދe>mhxcwgQ1L)m`nf(Ź9jKsސ6pnJ^dl') Vك un Y\Z{fLQƨ%"S|?,2X(`0F} \V)i,|cX|;QŢ X,`tUX Ţ OtX +h`DbX b1X b1X, x)cP`1X,}W2X(f``,`,bxk2biV;*W,sHGY b,~bi"~-0X`M0FM7pe(=6, ,QRy9j/`0R.%xYh)Y,4G}0`y *S  XQR`, ٽsV' #o~dl-Y ʲyʲ#RcHkY&d8e!,p;'Yh{]7ڝBp{53tf̽,P;,Dqu}dNN-o / _ ^B3ǣ FS yYOGZj^ M GeP]{!/ }FG@ǡKLCMqFABjWWDa'Fhid]ׂ ~-);ݭZ ¼{ɞuHٽX/(Aem^P\lٽh10#s&s 9}7AP;g2^;G%Z녜8@IP/ H1:XGzɺ[ꞩ8  :X).Yl܅5^/dr GYer DY3/l© GFvYl/Sq/YTN% Z,d =Q,C +I˜KSM䂇] A%fhک.jCVH%kwtjZc!dEVO: & rE*xsb XA_#"<+OudP f?+:C?drpJVrA0},Y()i#h‰JGh-% )r&Y*Hd,\Q`KVE+I(CdaYz\aKtg,׈ApͿ,erg=Jq  ,fha#sJf3 >AT S aVbش,੊qGuuM~d6COO8R< 'J֌Fk % /3h+`ɺrh4C#υ8ڤ\4ClZ;<9opɚ% Mko\9EK8fhԛ^&JmoͿա):]^%K8r M K0\] qxs< *WJǭ4K`Xx{ լҬ#x3޼+ C=~gpY34')h<?8<Vn:Ux6r,l5~Q\WCP@kd uP~V-ܯdxB'B—+"d׏}(.4w+;ih (U,} *_;KU6W3Y|Cԝb-RWKJhyZm†ʶ%=j eKR#R2H^I|StJ-?irʶ{=Ae?/`jK Cf9^ַ$iudݶC3ӟxz@+|{KmyCnDMF!el2d%2G X`'ܱEr9.׸KKu\[R+9\; Kâo`wѫ9ZuhM ʕUʅXѴhUre@4&EJ YȚ Y'ʕcygɒWr%miXx<%4Nu% JH˂߷L{ Mʮ6]揽.1\od@+=1t\ǡҏU/sxh/*Ëjᴈx|Z'-w[$8VG遉:?bo-ѰYA HgWSU/QkѺ?Ve# 󝎬'ߨڍnũ $p:IUhebZ<TX~LjϩN먋ui*iZ,hªRo"h kJV)Y껺vx@zYKWSyXh "`yxŪ4Y gƁ9zO?[Ph\Ou.< Ͷ/'Y2rq&"4  =b hqgˌU sV2!2ғ:vk$[+=HRgֈ?8^YV\X8ex5JQa"1B6%r\_Mc+-Hnzh$b=1T[Ç쫨څ뫼9ҫpi0ORW wevU:w/+r'/M\C:+• =\ /Tl u*0;L`$ƨj'3 ՙ{7J5&'Ut=ܷl[4jH틀#$, ɣ߉1l)Q/a V{HX] /fS%)+^LE Y`ZB9b8?Urf|p^ؗE}ZL\&Ro8L$Brlфl1:~0ـ~l~ *7|ⓁIʟl[3JP@I8; MaS9aMQƪ7!k806ǡq_ގ%rn" qfwхXzwF{dtSť(\(jj3?xOnP?'cy\ʌ8̌ks]5f,oDt`f&nGa%3W L In_+`sd`A7t~-! D&3sdt1KIRF.' d`mX,mۛq,d%_ >#V B6p[BFʄlI*g؈gC%qϜkοcuέy 4,r{1^WSJ9`4~rS?%[,|=,Ӓ9ePVΫnJ)ι0ݹrm't_)4GeJV@L[^ajíb.ZotǬfpw\rtiR7`_`Wki8eyӤ?43@U{gt #(K?&,b57[`*h>%A1,"[9` hڔtmWkdZoK!-QcOj KXD%p_Hڒr,TXrYn*w)0O]t*gtwT&e60\9n4`rP<͛x\B/KL^]51Oy֮PMSlM˒Zt n{U~8['Q/ wČYeE8ǻaO6h(JV3Ջ 5cyc:ţChHڞ!֙ |,)" mޭ|Y <- /65͏fڄ˼0¬HLMa"on.&o>O^> 4[H$2Ŷ(8KkK|ƛr(0$+0]v  1u zං"IL I_9KwԚfpC\Rz\IILjo9XPxb4e)'aɺ G=-I T-s9R7q,c s"|#U"$0ZWj/1\ޱEn dQ $%&%|KQ$Lq(zRmQP;nX/%CO0H`MR,:& 皐m%vyS`HSvfhNU9wARFCLF(J&%+GJ /9Ͱ>H-KQz $j nl#>x6!l@3I[¹Eh& _K;0Ѧ*/Qĕ$7 :Wp[-}Zq`}heI-#_?01<&䘞$XR˒&[Rn669c82ԲjX^ARQYZ?>O> L[b2odD*K3CR,|%ZW8JRVHhFAs7I.1=ldjN+K^d(t=+ +$%N wz0dwHjM Ph,KasiϐQ40poQP0ނv Z p98YrYt7zF|;>\Rt &ڏ'BQ)$YY!t`kaYZ+)g1'rMe*/ӭ:2AEt+BttV CcL4Y_@Y*K@y.ey-z5 Fˬ c&C#,"ۋ~c^;b-4zgFD3jtaPdVrz! ]5WL2DW}gz9&39nTZ21}20DAev}Rtu4t֒K[5;a mL=s b>7Yۋy@9 ^Ưjޛ36;rr!Q+]lg͝ x!r!|T|d.s͂dbG@5+j:ɨa#1{%I=b.ꚕMDA!Prf?;}gA9vn1a9P/a9sƑK,͔A*DK:n 9KC)dBꃂ(N~Uh x'Lj ~ T%Afp8+ȱ,-T5-E?.yh혘hs^694o!1)#YC|&M蔋lq]}/?{_\^. dzL|eJ(HfUbx~Cƾ12/}^ Way4wڬȯ%|EŦjr]*,P k b 3w"[/Fj?Bɾ]"d5XPq5edŽˈOpDGM>$pfz,n"4jR: VEL- qHkU5flR%-{'‡>/ˁ〉}h90 0Mdx)1~.DWŲQ9x`OiDk /<ҧN-$Lmf.2to ,gq(`b;D}X-2€0:1aaIhCLlO?z9InIʼ .WBS;T](|Y3nTWp$d;I/% P%9k7ꮿ`(VRg|8ch>.ۗ!b˒TNYr71:/e俢L<|Jt}#+ynBJg5 W/g}jKGtGGͅjŷ@9Z'ZU_~@yƹXMZ0„36fZ.skxߵ:et:{}9`& ~0.a5aL*&ׁf?uʢ-N9[BxlVND)07fLsgTMGhQˢPΕeßTcU!y}&X:GĴ Ic%{ GN,TQ,XؿeFS6l/Jֽ̹_[69gW_>5欖 /ed9/ -ƅ6Df`ρnA?>wnTݾKJ1EJ;  XCˀWhU歡u2ĨR+]pa& zfP0wU2mHCRnKP8R˃z=raf|!!2^Wn2xix 63|GDGIr<=ơB]U^aX:gCyGJh`SW^wZ$J7LRC.⯅& VM^wEل;]o.3g)@a$|xїѬ"ta2I_˺kc,kYe$l[Bō X27;L|ET\#jKD!q1B%+JH220&7s$NJK:7+IL2u_=8[!Q1$)0/&HlrE[!XD}9ي]ZۃK|¨0 i_!Ϩ)]`?H)м8[tm\00]%U}A(u]HKc`vCY߅Bww` {Aן@tQaDl:@cC4lVD knnªUp~atd?Q$h g '#$.k̵|s͟"Wnx:)X3fF6,Z}P aYm(s0.NI&=A*7; I3eeIP 0q0'O`3Ӷ23}2zn?)M긬>bgMl^(EC6$t!^aPqg삭{le3ۋ@_HD/\{1ay*b:rCiD^G9~,4N.>uP} lń w 3P@?TfkݢgN_CAcTn@UDO86x"p0ΫsY< 0rzȯY[1KYpYr ^_j -˰)%MG*ݶY-ElUfȣ Pc@hALE7 ,6z\F]%<V޹WhY`

f]뾩ac@h6YlAcwD'^wrҏ.G LrS ú&~0K2ֺ0#qhV:u|qjQJ%8;K9eI9v6*XEc qZk<zCuޝ)zqZ*~zLI9 ;X*>BO$'ej0Յ O%Du~@Me]?R7SIcrru @%B).zQ"HnHYvz@Ǝ5G*sqݐNX>jzI X50Fp/~5zɾP0$}gsAfؽmZxU"[{Y6ۗĔ͟HK @6eIi¾ e!a57{s %D#S WW9*f1.&ΙwY<š^aD.a~`s ^ߥ*bGUJsyzKMUP*f,A%ɔ#Cծ(v0VKX[D&җbt)\1\`F rEF-IDeʑm#3ԺKWfpsKbw(Xx}P{]Vc(t[raVK(L 1/ M+ Y{ >z>hHFc.Ҵ j)5Y&v, I@8dzsFLԍNf( |zRBaaHK Lm!+KJ\|DpDvtHWΜHR:-ĺrhtH'm{uu繃z3:mg+2^_hZ ĺ[eϲ'h)fY[w.hjq ?'}Jt6/*#zCn3 ,HmF""3} `~w4( €0V:ˋ)WE`v\b@'C~TZԢMK@@3v(Gix%afT} {O˜Ct#ۘL03OU=K u[\aQ6H<͎@k- `-@1 )K&wդ006)ڜGQg3S?(y;j+9# ͽDg3 Gf1>bnq*5./H>4 .K&|Sȹ&b͊Lh+d&$z 2?W̑.K&{SLgBG>9F*5!"8BFx40^``gvzMJI6 ImHwKiKEQ4o 8yZAxr*2"A0Q j|?֨Y\UItGOOO-pbƴ]וr ׮ƔtG`nn;&ֺNꐌ0" I G9ʧcBn\HJeS L]i=yĢi_ gYS4(j"4 ̅cCL({H7aZ;7pQN&q-9PǢv<#뮾Z?u2Rei@ќ"n.R#.ڒV+9QM-;4XQ4/SÂ%sp|AdD%),Fi\Ɖ#٥?Mqf: Zr+%#M_Xe-F>DԱdUdEs=Fofd*$U1ďÍ),T9w]Ko57Hd/Ͷ(m~֎t²Bk^@í`Yxv+A ׆ @⹯և -Py%r>iP;җFzpZ[(o;s_(0Cd:b`A$"440PkZWi9N>7ۄڑ^Цh*L८_=jّɨo+=;w PJldHAZCqlam6C fpW 6lIV9':[=G0r*=PLV|6OgS'#pA*>).^WEw!Սmh #{e;`B(-d7]5y#7Zx8zgYxuf'&0L\s|/ZkV9r;5emxI?gYd3ӛleGBNU9fť*C焀pM>-$SAp')H]x44L-:0qFw)ou vM>ݨjMhXi 違mt78NE;5PW٦7KoZf/EȓIfPf䜯sS\bNLtm"5,..cIK~`E' E6&!dцq>,8L n]"p./t: .%,6*8sSNf|%KoXc(,ѯ2ͣ !|ppUltPni_Ok^D}ZSx"Nd2p?G* /䋠k&NZxk8,` d8s6*[D:@n#&FrE13& 3䧖,XM3!p&Z䱹 _|;M%4N2#W<ز0u=!/?Nnl <JNhR>8j,anO3 3m@:BaڌB !؈U4]XZn})<=f Q q]l4]Xz5ƫ7&dGx^>Du k6gx`JfIKeAzy[rb(k~bpM%i2_\f^:28sVY6B"c 1xvw@N\KKo8ND.@cދE^V^b 0BK-06 ȝsoUrkh%6saF=_n$HTq笒B4s%KA;&In~ԍ,}r5phgP6Dshs2]kj-f[(.@>f:A]u@geĖ@0.-$kS|"((.e;vq\3|t̟Mn\6M3 0Qg%ObqSNwu<6Җ.QOgfojb\YD /?ZBP:ǖʓ=Ve>,r21 ~G+z6# 7fJ@Es_yzuУ1nQȗWD>){pI=u<]Fgq Ckm#fI.mZ dPG΍(7g0HqxdO~A:9#vui?]Zt`|F5!]ټv}b (=iSyr)75p{{pSB݂@xcS.ycbn̉|^Hn=TG n!LrµVTv9P 2M[QG.u#R |@0͎d=ݶ њB%Gul'܅ >DߔOOo׺"7 \GI1|ؕ@Y$*.o)jH*VWABzL :]&5ՋϜA;_Nn#V!oan ۛocPLvYS@⫌-}{gt@䪝%)'K5I Q#kLt3Erl S mX]`9UA٭U''x7 F.f{#Qs]ř i *Z35w#ɍT($t)e֓/w92Yon/Ƈto`[5f]a]7xÚ*I<NnH%Mei)̅1)Մ .%@}D6~ LYno" Sh渊>;>C7>gI23@K mKyKSdB3 MO+M馫11ܭ -_L sJ3gğ&6G>ordDu䅴Lh|Cr3HQt!M2'B0ъĚ ̙zBO# |tB:M{/B`gjGm[r tB$0v$-V{"(= p[r} b'`$1WܒM-jTtP> X xR5ݼ ?u=Qn ˆ5ԽUcD~5s; b}Xy cv̴j?9en2`:t@>Z޺2Ӹy$Ϡma웢q@հi^C%w}}94w>}b_6a8WήTsv8jZOxOỌm+>${\w]LgOv8ֿqe7sinNYDtN b:&-{\F[7sncy&l mPl~gȐF;,HHCf%M âsR1@+؝_s#ӿYUU%/$=q?OǤY,`)&8b42pҋU5q?T{&y6_JJ ${lts}3gY7a;$ 9;ntg3 _:y-`(H=Jl&|`fm@%4#~D] K#% ]hFPܤL mc̐Pl1\{+z|sZ61j`m]ug6҈RYOmn>y@ef=t0&\"^jٟ4I=JJFp)*ﺼj Hf RLd(ļgWR$^uuT0*121o~/g-׀/H$nhoח9o~ͽN,JIx]?m,Kٍ/=_t!#A+P%^X9knW]mv}J>f.g;GC0Mr4yu;>dΒLXp}n}laĥn1xez &Emq|]IwuYW,RǛblydvUb{={>}ޙ E@KlGt;h!.fcWۻ~j1YygvKEN-BS N:8/3A % (]{ƐnVbJE#w |aur⑟^^PAXgg~Y[Gޘ:b(1[z1 K:P)zN] J] v6y1 S'>^ º~(slDaiU7ɋ vgD֪Ξ)" $bF0PXj ú ^13$Q.b>ӹ !{ tOiI{Ad>OӾ" 2-1oKA"6wiҰ) pO\p2"3{ )(٘"毲oRy&b=+ 7) ^zd8-bO] È'&*7 =,U"fm ¿ fijBĜ#1UW€vSx A "DLTכ b "))b !1s +ne?b?a?R>?,-4+Uc>b|$ S(W(DLS1SDLaI P\?dWD?"341,@1E_do+1ě 7 "͇EsBw>ڏYX֑Uza"Fa31" U sQ$Ѽ80DPXnJ?"u Izc" ) 6a@%-f7-a\J"fhbڇJFKU x@p }oaUv7&b>ALۥLwe) @1PwfޘXFd6+xIjPT6qkՔdøumjT8QIwos$]?y -ɺ fSn"#ߪ{A{qw7 ܏?1 ܝ~䢹#@/| fP47PR?^@J?!Cc(wesh]q/ 0/_H[~E$Ap*4afP14椹iMԏ:ߜ *~#7P. l/=N"+إM%^,k@[K =ш*W02sj)STA+|f847PlȜ6%=N57 €Q8@o`^s -wyi ,H~ p' _Tۚ$0[@)_4`I2[=ptBsuQg{djDn$ #3H>dy28)4!$8I1Uz*7kO{sIͨW%rǧ=T$+lCk=XCiw7q !*]C~ vq|Jo9$I2MèHVܧ,mC:dϴq@8$ɜXW]dVm"b'fTi>__fK/zAF2տee:hb'0̠xN,,ad XL2z qH&CX_X@08"{[{I%I2IU>XDciRq$I&1.N,{TNL̪N,{kAj?H̠8e6g1Z>@8N]K hG&N4a&fw_x(t"3hsz%cɾ|mоj8V&HiQmܭIud.b'I&qHAZU\>ȍc2dYu_K#s {z6dE'a#s "Ϝ=IJ]:cx"a6̥hDW^An#f0ʪn$S$`bY>)I&?xdb>$ft$QThI&X ݽ4Jv5dcQtP_沓L@0JvM,{%qyA-?Xt 'R(eK*DQMK,\(}b"E%1J\.ll3X WuZdF6JV '"a\ѢA6}F}$]|f^g սhS1*3S>-r4St;(>qdfywG_JDWPum@6QՒ/Sj,MBSY۱I `‘F)";w|/@czJ XJ$LGˬTs|pOrT%m/` XQER3̼FXa,p5J 9;_=cbY(}4XB}*T;_Ab!e0rC)K$+6g[xkfc.)7'L \f/w}{WR86@|Y]r@=_5>=b,+b RIu_?U#Շ?J*ntXXQ 4IFq[&pX G`I!sP7X^, pe b9[%R6P̍ Lƣ5t.~L,eU-FU% wЧ XFcbyc,1鳸-;n,z`L{BMG+nD#;4Qr)76lq[TRƬ \'`O+4ڻiudf8K(~ڷU 3e$M"\Ṭ])1x]x.c5gѵt睚y _`gm`^MrI|2I#v[=s' t3{֧ӣet -irے2luқL#nzhQrwX/mwD.iAY(TQ&Kgi#Lq6Szɸzg&_nL^<(K=ْe6g}"huVBX2_GX=匤ܖqS R[r{Bǔ}erKj`q;q. JZ-bq'%A26j`fsޮħ>7Lz?%Z)l>-3ʲ$- vA=8HPזq"]0ȁ(qϟν-- $9Kҋ=,Td%X屎wOpǃQizs\)klQc͏| wۛnGdؖv@="~;!dVqG+dZyLxD؄bJp`Z I`~i+1 w6VbL.q3UZz4ba1~kof0\Q9si08"%2 s,e&JL/.>y%R$Ly`ŌױKv#|9Y~>1-wwmrX4[X-AC9lBxk:Qo2^);dYDL+`_R A/6mU۳=ګC?yܜf]"_}[a?3 o(D:itR]f@`eC̺K\io:Y0=Χ6,I Qԙ 'A9&7G WW/5jdS1^SH„.+m$NV z^/e&Jai|LG|yǂ."ddT~e(S `3"fˬL)y+/ ^Gw!G|ME.˜mp3sQ*";gp]n(|܉Ǐ̗&.5g[|sCC0͞lgV@럮4B?o**sK;nk MQy׀0ۧQPRjW4wfn76;=V1d|p5eC.R^x_ˡt#T| UϬ4h+*fq;q[+Gx[&Wvi&l3»wI4.NRAnIy?FDrDOQEڊ#)^g;2gqN`8&nw>(Nq@|I8{!jAgc1RۥъO'^0ߢ\n{ "zO3u\DXf8LDgV2 99<y-IQsieZPȆ:0u9~=qH{csAmFڇw]uAM 7{6q[_$eh\sFs G+9Y]C/v+5 o2NQ Y{ػ0i`0sɄyjAmS%hU&HpT݌LbP S ҽ]܆W#t0S{3lY P/zϿr*zۡ<,24 ~LAws-!ҕ7IE?8xNr $.ru+RpsH#Jv;ۇUi\^tD3.KQun{606Rz>;@s(Zd%&$csyut>J=~2Z{R 鞿:YAEj-e e; @%a|Pl4 f*']YURIZ?;zSAi} K?>|ԠmeZ Dpa⇼tH1޲D.;q'9X!#.5; djut6`|4U$Y$dP+D[ƞ]GTT]$q* {d"< :i qoQVto`sF'fMTq<\!Mtn~|>k]Cڠ\G,"?En`zX[c[et~Ȑ_5-1x<*'G%BEs] 4qeԽLTa:NŴ/P LE=B1cF$!a̷y PG3o7l<@$@FbCK&y&eԾYH85h'R#4J2cS(dGy q'+Otu@ޡ^'uqcrbR2RaM]nBʏV+lqoZr}rZ/:Payv @. 做̢|M9TLZ6azS"xq("3RVD)14FG47@C7hieC]|!b#a SuLʌK%/ ZӶ0%#nϚf}#q^*AyN]ԕGTfb}6:'k"}0jz˦RjNyB<|~+v#2uC=zJL* `k[eӫ͊w?KFf.yBa#M/|~F UhrjiqT$N"u|&iRJR8!#'l ܃03AЄ;*/pdor};%W\cp32N\ HϺ.H&d ~D6c]Z<4+cOD&h.>Z#=gjtMSږN37èֳ媑Jмl] ]jHΨql=$2֩& a"cBr-P.>R@WCV`sT%IG~ ao@4wp78~@mhni8ytWɝweߦ60cPeQ&nmU#vu0X9AKɓ1вbo:앑;\;fk}|K=u)ŧx>5STOG1}25 Jž{TREXw A;YP.r~H?VT9{ŕ+ !Pͼll{tS@'FF*k `vJuBKe ;o<&{'h~:mo+ԑt3c=gm\yLb٢K*3J@NmDZR̷ #mt9N[qdlC"; }@-#S r@us`[݃^&:<>(A'⩇j'-Nd ӱvڞYAeWkp&J#Al%80˵ -Yf:\8f-8n,)mW.0 0 ABP%t?E+΃W~J T[lŲ td;IXEsƯx0 ¶Ɋ-٩10CLOp?#xՑ2RlԱW/?;BM諦g5 D22 N`ƒF5}|o V*i!u}aWiğOg#cKN}%wǔiB惩h>!.kں0AmХ[N-*`. CZ?(,>Ncr?%.k'Zʸ MMi9qCw_ Q'UNթ*ɱu:[c.# `ȱ{ѽqY%\;bˁ%/ %o+}R\Z_s@Uu0*BЍڏX/uˆa*&C5I yEsS:%Dijxc}赓CKy`%_Csniɡ>TI:̸܌g#s[6jG R_v[B4Z)~>,) MXY/@滈R**k(qZk9u/{eag|.T OK|O>/*akd ~,{7By2\NDHמ/RE G;0S˔X2Ғf)\kMfvk  \B}qɍ7!( Ρy! By!n;{; 6~.d-9Fw l % EL}#qd H""Q(T%%7ڻO4Y&)`4cSժ&ڪVE,9,%р M:H\ U U@iyHɼѰ9OJd.D9sJw'+'Pp9!K*38\&3EjrC*`uE#22Ube0V $We#VL3`^X0tMd#CV$Cϧtn wz$}_D%]A_^ lQhk(` ^,oBRN觰cd+9Aa9HK}T2j{]0';c/XFWjRq׹-{g:)ڕWB,@?m hmۻDa * Q 9Sm?ow}\ ~"0 =y`b9s2u;n=$q$T3&G,ȏ_v-vBF'URǧrÝb`DREmyt`ݢ&2\QgSF&y.1b*ۑeM|3[1J \UǎXy6,=r/'ak73"X9NnkXL{ }eVpR2JEX8($}U-(2+8h˜?~ hhBe.aeBh]Ά?Bf%tdbgqhdơuiI$J$sx@I8 <%ASAkt+ $33/Mtʨfri" 1ĚkH&l[;pS,2KywG8gX{'/+(1iu`r_ivFn3¸MִqGK!v+^d7,Ybϫ!rcNjkIpbMO8H"#g'*U3~J [J36%,3D/"oD̀}K>T]2}@ ?2^ua!\nx헏MWvĜDA2@W4N4p󧢭h 01<%Y24fθEg%/FZ%U˒geyįkfuF츮+a0V `ŒITJnJHu G#>l)eg$ 0`Eyd#Rɉ'ɹ֚'Fnl S z u4SƔB亻I%,2ѰL'0vq@W/.w ;0v%CGYLFD KxWֿNuxX1K)!4wRqa!ZVW%/ /%Ĭ3009ڽJT9g(< LxH6$XZ h† <%ucSƏHΦ$ ̒ҥAB/tTL#yd-˒TÌEHwʒEH nf>c͵⟷qe&[ƻqbMLVaT gN6Wז jr^97/Tһ]6i4,4&)mZ-/Ku:tWkeB.`2 %5<+Sދ2a2ɲhU_̋^Z%L&u$Yk-E㛠%S1 j)BQ*tBF' {!D]W"0RF&@&vvBu'VtnJpL"^@_Ms>cUIENDB`capistrano-capistrano-603c346/docs/assets/images/CapistranoLogo.png000066400000000000000000000112701520217215100254160ustar00rootroot00000000000000PNG  IHDR9*PPLTEGpLRRRRRRRRRRRRQR>PRQ?;S;R ;RjR?;R?7B2'Rx=l;R>dK A{R?<[6R,??;R ">;R+kR 6@">bR;R?P7X9_DON1E+j>Lz4qtRNS"3ݻwDf̈UР0`@ @0 @0 ``P`pPp@PPqАpyRb8gIDATxi{GHBP -7$,ZJ)AI^)i$Kk;M4 WiF3T [2ݍ/7l$eˎϦ[itdf/Xy F"_ez& Dd_-e L4Y/]E@F9VV>q7*kz[&n$Mr +&ZbBw0T! I( %.7Rz33oQ76H4yا\=v:#,F.<]wW'oH0?M|{>ˁ-ˈޏzmdɷKXl6gcGwz >}z-i&@ϿkߏYFiÏMFIE! tcS=@/(lDrȥ& m66!α 쨗 2ϯ(|k>_ne@4ѧ} 2S90>" \w]K+P4)"r/@:} 8}icg_Ν܂|7BF;v~r:.Q~Tn;pla_Lϱyu\zwUvvFPd E7OH/O8ӧ{_  wkurAϭk_@{{S2[b#Ԡm7o?1a鷘MSo\$O04bh Z mK!XHK#O^rWy0U3MK[-Ob9QV ϰG5[ V㯄#>&}O燯]ʃѼsV 1x?e{C__,c %kUߧli9kmv^e1[.f2 ;E }#Vz9(I}uD/3?;bc%:ګ%Aph ~Jױǽү ^ ?j}xehjbJJ"3Xo0ʫ$.Zɫfoʨ{.%"ڭL]vXpۗ+)=S;^6sa몬:eh5?v,ps{DzQ3>dQxǏ=^<˴ CǤ|/Gm\4#C~m$ɾgc׮O3m$~a.;yB׮F -_J`3=S.r??r*F&Nq*kV`>Qw~"KUvX`.܋i](xlϬ oCr2T+X]ib2n>KW/nT(P:a4=m-JYJ7Ug~I ӚK~~MUSV.Wq QjM^(1J~ܦMkgc g.[Q^{Qs ?^f?gߜ{hpHpzGh K'v6 KXZJsW8Jj."?w_8~tiNKˇbTLIϳ\C[*F=+7'?3OqU1 v-u-0냗 ?+=JVax^{leyz⿻t[gn/޵,?2w msPWF7~EoAwW/kǑ^rvyQ=L0b&r?~3߱sG~XVwV+zR(QU~e<z`Owy6sFY&ҨWj(ʎ_}J _~ˉ {ַ8~plH/D #>Grk9B C%O^&rYB4QHÃGrv?ꯃSE Hrhjze/ ᜿C77_(.2|,|S j _gM0?~AШGiDžjXDA3qtBuF0c'E=?dUƏ0.9ǭ 52}Ȭoy=?(PeZqmhGe\z~''8̈́< 6xdUt  Ohwg~-TcXs9qeZ¯J[' xI7jҾU9~JwllGT\N5*IgB8c6iZ E@"%Jfn`uAiiaF+~m;:"XU[%SQSR&sRۈڍDl gFS|Z4DmӦ[/G,&ӣ1K}~߾˾=um0<KڐI_0 ?P~% Ȩ<;T$Ӟ=n"hht qU,Rciu9'Km ?g/2<7y]r=wMy١ NOMă|mćYl8:QBӭ_wo5;7D<~^ƺAKl7BzUmys"~F~EHwҗokI?|8Vpl5kCȩ-Ml"H\eG0%j%g bVEQË.S"G:2Ś;·~Ұ׮-l }؉i,)QAy%SNA[od0mNuğKN>m~v??V _9GeQa]UB8"= $7dNT/Tȓ& a5L?p=B? k?x O?@pNzQo|/q?{uKDS2k _W_lC\7n)K8,0vXN_oF^d"* !{UJW%Ͼk找/m'h'Gæ/ ZWpxGRc|(w77o `b7H炠R %u_RE o;gz!-h&އ].`9׎7n0G~QZ+G @rZㄏ 9|ȫ`/ȡ,q"~cv-&9ES%fXdٵ&2mr ;Qj/ )%+/䀭8"0a*^̋ 2_uۆ$ٸ 'D:IENDB`capistrano-capistrano-603c346/docs/assets/images/airbrussh-screenshot.png000066400000000000000000001462451520217215100266620ustar00rootroot00000000000000PNG  IHDRPgAMA asRGBPLTE &-tlkjMNL.%)ډ??=10-]]\tsrRq;ƅ˷ddZV?y|pOT9a"bdc}@/M {WEKu2F`wmI&&&k,>[QxŴ{0P>vxX[ˡIDATx w8% jOrz Ilkߌnq&_Ʋ0#!^H'{fJH$҃EDz$VA)Dz&ft]-*w$ɯT=ېHGݘXk$'TRt)H+@i$S>7wyxߌtϻ P7 QRq螆9< at~k[  Pi :iF kxP39sg@(/TyOQ >"/^D1t9 Pi k) PSEPH&j (2QB$]CL>Ր WArmr%y;JKSJYB)@xK$T. IQM!"OMo7FmJ2PP~jMmjEW%+@8$Sp<( <89{ggzN6ImE.+Yy@hՊ]PJ.wi@Z8 PwPP)Z@/st@Pu?HS|T<^iʧuO]Az@aZ}-QEQE 2/(EU(>_o:JٴL@M#c.⣀ʥ'OZD.jԇ1,*I'E ("T)J'Nq@c*emuxcW *3ܬ)7 P)䘚uAm(xё}:F/U#7]TbV<0!|k-PyP"7_2'\K[Bwك+?t]P.H"(D@HOj$S1he~u5 6Fǃ +5V˭{۲oBwp6=.fPa۟=S}lnt`x(MX^7J{|=1]BVyhtWD2?g _& (*&[ 1)H}T}]arZP[6%yc bc2$v/L҅V&d/BzYM 3T˛`g62S8&]?m*!~]8Bf@ϷBy!dv%Ö}PJ*.Y0r4/mzˍ l1z.#SI"0Kg)p\>w~ JMtx R4e&+ P*SJoMLNA0hͻau@⼲a/Dqp7/wF[nUzΫU%UfT.\I\(XUVOѺiǷJ7`J㷢qMȮvDs!s@ ĵ5bn KC `,䃳Pa:3`;,WsPwmk^Ki)3Uù!P5Z1ɪZ)U 'b% lWYVpvВ;B AM_a4]%7]L?U״(? Q[bҙozWkonJfh\(R%3 (R>B,e+a-# %0x=o >J썯Ee2Xrb\?e fov.䔺&-J8=*rPD3䁲qQ%J)(fC\ )5t (`dwx|P9qJ:0c C@D@^('KZdL?k-~# hl-6a\rmV9:{4(T5K8R6̔Ӓ"P"~Z|h/kyN5=BPbJt1-`ͷ`?&l?ϭXlw'4KTeʠW孒&J4"t>P};SufIP3-Wwv|oĝ]6S J1>X&orcfmVnغ yP7xBPou|f9<5Mcg/\Xx Is+ڶt/]obzvdwf—[嶼*nTGfEztkggV8.U&k$R TP(F6ڑ5k;н}j-]b5NwN"~7Tv;ڣD VϬSd;ƿ1^~uE{8b\!, ,Q]_oA.NY>6ߌEげK3bEvaE>rx#m'r 1!B/b1[@D ۩[ E:X(aO8PSSh<_PDz4PH4fj$E/ zzqqʄӜAw&\oj&_^^L A@ yn:g†E=޽޼{]܈;Rzekmg ~R][7a>6r9QliA" yFCJ4]^Pxoqҵ;|WVZˏ;PIJGhnw>'\ =QQϩEq۰0|h >oߩù4!n{pJt,{K(#a?skǭ!=T4tO:}F2=.r (.<9&qym Wܞi }z?J0SN/N(C`Γ@$G@2n:;]P<^RʰP~On|Z.P=I }g@m#2;P<p; O _m`sGPqG N 0oҖs|~ޤ10M{8CE[mm4?!YGP<PP|9r鰇,َlY=Zjy@7 ͔pp {$>c/>7&=2zykzPX|;nR|u̒vZjI@uZ<"FF70CuRB>`MV?BͨOH֎y\3|!ѯwEhBĥt|a{+j S9)55ԇG yϊžJto|! ې@.yз7ɷUR< /lz!yb5Wbr97mQQmS:ܺVB8B^C+NJ/FK5}_;C1;};43fY{ӐܟNwjӐY~{hɩ+u љSdwg[hi驜;QN:U"Fb,J4y'#r]HrgMIu{AڥYWd؞ՇkG;ObL4{O'%Ӧgۛ 4v_?6@T: ?84醡2Si5Ow8bٰ("X_ fPg<]s0q (k/+gK4+@i{^' 'TPrtd47.y(+mi('8GK'+9i@O )ϣcĶw9: +%t} l"<8ـy*qN/^3I;{公=T )±u衬fߋq8: 9l^;&`</Q z4^pN);z܋ڧ{\Z>P Cܷލ] +9>#= a w~6~O-M&!_PɎUwg+*0r]88)qh%'@\nʥQ} g|?iI{a6&鍜RIcOE^-;™nGzd?KA#875BKcZDh>IP:S:Z9ufzVcW\7O-PGV%x}׹w@/m {^,k.~gRMmyw~c+Jroc{|J+/K-- 6{^ h9[1)NN|Ht-du,ov]Z>C織e HA2X'a1=Ӎ:^aIMPDBqU.goy{ Ŭ=3DS/.fq(=m̰g!;iSkIk<"7?ڊ^Aiuc{6z<*ƒ<7cFz["OnC6iA[,`d;Y E`,xK^6mѫ^ak]\Q`SM7wTF->nUI w⋀Kjn;} ]g'foS{x(e*L۔ofG[W45 2KZjy<@2n z.I4Iªwa]Cu8XP{{ZCab*d( YNN`0ČR̶7!^y$ɰލZC0vX y =j$홀5]HQPb?<~ʱa/S?*὾NZm@E& j Md!EK2M o&Mq̷!/rT]ṔR6dN=Lɲi(Q(6j(;?b?5 Y>P0&=-|i g*ρZcmI%Xr65T+Nb@pGr(-@I@m="_ݭ|6媀rXcO%R힊" M 2@m+jiY:4K|hAYk`LNPQ (tDVn &G/Mj4̒gu]@&(meL{S3;vJ_ph!Pfoů7Ţ3zC[ַ]9y*= #6L>ÆW(Ezgu>LpO=p9u 7UeʼmdYdk2NF gHyیf>@So)Fa9c5~rG{(ưK]' Zq b1!a$ܐo"ъQq1hm2%90KcIQޱ/u8(W8zlwNЅpLj%&@`9GL|f5#' ˆl_ zfa0{-!Tyc:r-}@\lFr/|ss&|;SRӼ,lRZ;CpIӬǖ8zjpDҔ<~ E8_XuDٔm< i@?0鏟\ K9UMC( -Q(̤RE瀚 PJDKTjeq'NwŠl녲uA26STYe-$]|Gx^υ4UE J#D]-{(Q~(xBC4)5t#+vzTI`% (4Ty1O|if*JT)) uR.^^0P46JmHYZ¦yi(dMK+dP={t\SZw7U"PQ. {*SɧpD!6vt#OHis@ti'I '="2iNVOɥf&e>cB$Qr*'b"(5OhJYEm;L픠̄5JrM^jeS$%[[#km IuZn!wMӤݺI5 G}_^n*eR5J}XFLkQ.ЅOoU3 j3ngv;6͐5 t|*E޷w^r5{CA;<`c]yT (¶~_'((E PVSUUFD4ܡujBg41VuCjgL6ځe3u >nא I+}jy1d /JxOBA\2/f -Ԍ5!<: Ou! Y\0[RQ.PS3P1& 0\Z2DGYt<m;s/\[Z'/$\( "R.|'xiP4bb?r;\F9P8'%%(\VH-=˵]u 3Vn@EkOO&3"J31vBq:$ afrTm1fz!lQ~GLFBwZx<{tLok9pO._'{J߷^n5ٻui@B/] r'ɖㄶwu٩B/ؚ˗ $#iBosT\ O|f'"Г "~j+wH^̀PFBQQ5Tڧoi&(SUKóO!EWkQgx9dPs2x8ʞmRc~NMhQWc R ޡe&0F'G2]W32~syCFV~g_w5f6>70{mP_P)3 qM4 a $:C@}'`G4Nf5ɓ#݌R ZDzG :& ;!APE {J6$Mv-պ-QEߧc*Pn!Jؘ+O'|7rMN={ lD̿E @nm,'BDL*'|?yP$4x4~5~|N_/P?/2Oc QBWX|oE'r3(.oGT<ԓ^%;97fK{n5X=D@vR6G P\D D`Q|!%ήawR,޾XÔ@#޴j6ݛG?1[A\KriBC0I(Zn}`@uZ[({p[N궵v9;Gҭ{n-3LGE_*E^lpuo1JQe;/ a_iHw-l}c"g]Ȏ;|Aic Nʈajo[5{ }*7J/ `-ձEimiLYX(MpWf8O1QPm=<ھl_o](XХ?ȧА`C#bѶ =d/+NKl|oRZl(]=ӍZm7@53N]D#7{|aCD6y=]M7o)_nҥ0m%M͆.lTR5CFҿ֚c'3d< 탼#l4 Rڸ4c65Q^oDv^{MpQh[<5P}w1 ӰotxÒO6"FRJ@/:!rH#DyrQԭch[j[$hWGГx:ԵQ y׶&= HZ<#vzZOH>Cr  6P-v8o;;أdЇ>lf_G\PcDn]Ba;bX/B@m[^HD2kW "/AG (켴=)t 4͝xn3q`rz\( PuZ/90rb}ddK~\;||1 LߙRsT{ }*7.! gpH*h`lCR[CqEZB>> どi^'ۚ?i(OcJK@|`}Oi '@9{G8ں7۫91`cz Qrv~xvuiJ l=SS&Mf@iQB6"* -$M4yv m-JETYM~6ϒ](`z.M7y{UMs=$( ?b D5E'%t|HIzE^ڮH[Lmڍ6]_v:L-/p=@GnԽF*>R66^Dtt*1Ѳ GS }^+G#t#mPgCߞ򲷓O./_m9Xd(&vLĎ+؎LZ]^ηߓҧr3l(x!Qf 8q'R8LzIމ7rav6q(tژ?ٻq Zb3uX^]m>v_I37ⴑH$%@ZܘYl<0(wWEO7$W9][y,8i/ߪ˓z]Q; 1=LZ'{ Aȹrf| ߾L^6LM0|1@ec%5/lA\5cǐOψ'0"VižDcɕ̑Cs}ӯbj:(k_5zFvXkD^p$q (mojp h"&iaޙ3_/r)_1}JE(~x "g-!g)$Jҋ ih!L] 3}g|Bq}B|!'_[,)-8aD1;"9{5`z'FP Ոy/1&ڛ1b\@4_z唇!^tY5A`p+lbBt?V iܻU7/[&pʶuyThCNJ]BJސ둙?ׇZrG^RBأ]PrzP{ Freg%Nґ5%nfu,_^u^]20wiw[JR$Tq|'mLz8,vܡOYlhq U,ûTW_cvPK퉣/SÛ 6K`K@ DsOk<"]vohM:,K,2~6%l֛f[@FT-<ĪN45"ݾ43aMo{;X(=eQb*l>)u(YMsztm'|:&c:;M4:ثT5-%,X5Vۦii7MZ tuo=k4\RIyIP/{HCZ#t:tFƔT\Oz (;'Щ̶J "n!t?;q$_Mc6^a4!8.r)!kng@n@lrzDN0./p`[X3<߻|b{~ve@6#JX槓Kص8}EJ1ӛnJ$ $^HL=o}ep'ԾS'sl?GЀ#"L>a;}k.TZ_) ,sK&L VCSNyuT({]U6miAo1Ɉ&\|Y9R.@A?|N1NE@^8峀ҒO8((Gy @~03Z1&z !L:U|ӉM>+'*W, + 9gud!`~<ۚ9ME& *て "kĽ*3 dju|jPFOSϡ?N;?G< RUoOQ܉Yy|Ţ)5@ ySyF&rU5O3v@!ASE;Igۅ궙[_WY&,ҤDN#R^]eCJfm>.v-ƔcRZ HuZG8+P6[ @eM/ (4q\[}ydu]UQs[Nt :̴@iw E5?J"|(36ʵĀ"8ځA걀s.TZ@lI }&tx^xh-.ZpjKh H'nȳ8u @|/yYUSSOևFF*K-* 36*bռhD 7i0r(]}!L5&%Ijt.u,w]vpЭ/F[oHsWC'+FHC\*#y"F+GcX9[0&I]eN>8q4i 9| F/uoiD; 1Ą#dUoO)HCa6kws\.Ck>ƚ.ju>ܚ6 =cCIпRFԴV7[w;W_x1%[ñ{{SMs~DX7x+ɷ(hU_miu^{CC񣉟03Ɣ.xx#w 73|>I~aEv33rzKris~'zf0pKjdODBp{W8Kt}c}IT{R0//7MWZ2eC:Mt3%0dfnKLcDcduGa bT[\|x X9`RfX6$7bf| `f~qȝ?=b0?G_B[' _e220t<3$Y.+na |}aԞa#"7{33cf-Gh-/ÌX,fgptKtO13=9K(Uvj~. &W^a1'aX$fFԦc,afL4=͓``u$XhhXE&𶬄^AL'}h,LA$1!,pM0zo$p Z?=MQ'eR" Khyeǃa>dZ-(e e!ly13 E]a 3c`w[0I>X80)bİȞy$.r23r&` !=7ar|ZEcWKT(rĶ<(L 0rYL=.Ĕ OۓPg}F0 n &ef,;fF.[2bft̑ٱ̌23Z@rm;g`[1 Ș1 SHΗZ)Y߬~p9YBz30,E)Wt]&ud EK7n;= ޹pm3ax^p06gM#Y^%ߩuNb,f^,kzY0#%ңPv\zG*YtwZp1>2ڒ9eoxd3%32=0=/dDAF2NFf<ȌȌQNOf< H>Qk=H瑤Bb`m  /ĸ$ }1@ft 4CDh?цRG2^7)nJc?8P"Du%J~d?dt $vddE Bˍa<>}`(WdF%%^fd:-'VFf|>Of u׏a$yȌ$#oYw$H\")^D!s#,YKCUOk{) SAEBbd) Tws 0iFzbz&=N%+?bP; Cu|/2AȌ4mn LPJf_HɌ#2#dFLO,g72clwHmGfĜXϐ}`wWu\.G<= t89hd>INP OȄH| uDP=*͘JȌMKȈXdFHɌL-dF~`dF Lk""ZHf<cUPyiy4MɌdx~ Li ,82# ɌL|y|wVdƟ{+NXN3|[&gM3JJ#9l2_|VA|74kAV135"`"&Jz%%A?P{P|pkt$3b8dF ugG2c0!ȌWHf e 3Ȍv?%,sdƯe2#do|"b7+;=Xȏfg@<: 4v0#H+控?! ֓ SA%q9K5D(<8E͈٤L$3RuXG:o!Ȍw=l}%2$dom2co]$31Μ5#3vЃdƃWޞ5 Cw{z:;b[4iF%ɜ!m!V(D?+!1!H*(),mO嬶$ ,gA)+AHݓ &M4xMcT(Hr<ɌaJf<ѕ,.Ovw;Xk::2]w:}!3 O{>~-_FvMs ̈́O̳-okױ͑,!aZ.M'?a{1'ȴJ|I5+YY<S$ښGs:~+dF[s 8V c9ZT]}o|Kj@fƱ2AEtRǩ_/$s|5&⏣z?琫 :lk҆pȌ/-;Ow݋/7ӂL_Ɣ]S? Ғ< X׺՜7P1tɀ |QPl[=307qz&= ܳkQP/Z*Ab 2Il`Z8RTq`B_DT"R8-}?J0D#VYH0TaY@Oj}7sSA,8$d*_ p #J0 _֬AH{ U!barAT(-{WBE$xx!U~O0LFn(C3oR2燌`x[}!ڙ6{bn,%yMͦ3oc AF2 f`( iB0<%0SF0t00 ` O0|EH5t0k6!>oW0pEcx nCdAZm:``8aA4 %a]&3?2pU Ea"`(/8{Vۈ? `؋ A'#B$ "¤G0<7!<~ہ`f`$C(O0O0TA'D0(E3Pf$o* e $l` CCiϑhQ 7)0 = {CT0Ѝi(@o9h E J D>8 !q6e!F O0H0tx""\`U=bXBu_7$d 0 1YPw '#cF0!! k"" 2g/C>.c۽ns$!=Ҵ-=2&j|(dYPIvL0n'b$~aegIG0D @0DG0DENr^i<4ɴ 5!a /,;͚ S `8J0!C$!AG0Ѭ IPPpi$CNj!h Krwc`8H0d5EP,_`=H04e,\JX{ Yjʎ=V|cT =I9}%_v]&bo-yT!Hoo_Z)baNBOek0 'W-'?/z0 K/[Q`)NvE M,x(@b3BΉ)cx!KJI<wT < j o-(a~·fTv. ӎK7Jf n&D&L(\^ua O7<{!mp[yoj y\1-%Djmsg[gA-_m><(QUj5NjUUwv\;rwgla.B |6m[3x2Glס7i ,(&0}D\.d.ORGI0tnQPo[8=Pt\u|)TAq&!*:ܟUVAëZ TPjXiնM7"B%w Cђo|O7kH4bRQPK uq~c cxY>%hWCGÅ &O¡jRv~^LEnĢ+]r%.+J>$'dI՝T"bH _bקuiP*"ESbt So\/W6ϟ>S gvJd?O4e}R@HiR_66ߤ"3  lj3 3>~}_u"EC U[ ko+k+A&&G$P/v޷[[4o%۞=y@@K?^u~_cTf$dy XM!B6dɞy}v}yncGW ` 5 wc.[?8@kꮟKb@f]uw\}~nxR(]듣2XTN$E0#"=P}q >)QgGE wEvZ&u~v<峋1ġ;Ag 2;EAr'(:ۿ#*ң5^1M Cx0ҽ0LO60C 1${#E4oEU ]0 , t vq ?N`Kg*R 1z7era:..8H:oV"M멒6M3h)+"n3~ P( SlT*sz}|Oݙ7iHTxXMP8rεu)D|R3Uѳ-ʸ ҹ&6$~gږ:WBjz\)_t=uQCEzl$H.2 *vB8*k (3{bk3nd ӂhBTP\=ijcM[=%pe((|zSx)zʰJٲV rmUJNW9 "LS_3?I})-2Maؖ]y^]@S wzkz(@7u$Pz6۳ g >KmؒϬ`xİ(ky4}xZt >kڛsR/AxzRAoP^E@Ez $ *Pm`ރ@¶ZG=+kݹٔ@Dx^ܗlM`@ߨ[ƗluM4ãa]+ (8c 8EʌuHPmPޫk55&e4zzxzn!N J^+eN*`ZlL=X9i(jg^cu7QP"=䳁x/Խ|ȳK$^AB<3SPn˅S9ε˩1+¥x?ɕӂP33[U-NճXyKavGugxUxmHY CWT |n䥑xK$% /&usCJ*?*G] 4l NewӪԳJWEH(Z 1-b?Xt"}C5dȜ_ItzS`Ʋ(4?o܂ ޔQ򹂟b#IR|{-j;4X% }F4̐FWUhV(X"EFޔo)S>&-xfϩ7ƻ?j(nF;碩! LJ:}Jz):AG:*.(< B1<N#s;v!? Zjqό'is}(x_w̙Rd1PڷjQLuxTYؑu-Pu{ϹvK㯶س49V |o.DB6]uqee"ګ[g}=q/琷gqNZB89TlT`=@ơ>lR(S~{8vL1sg#+X"~˴+edF! z.Y, A3) 8x7uᝩii(@qu|m ,tÀQ#/~ 9"!rDz|D*CŴ4Tzݕ#ƌ `QV̭54u]!PMR+P@m~t@`:csx\-4h䊈"2 _*@=4X{=!vѵwtMlG;-wҴ^X@P4lI@@jWVC.+ dm~u| ;m ^劀"k(;"6>jV؅FSޥhP@iTD_m*@K&8(TQJaeF+. rk-G`<P`yPaee#GS L Pxe)ŒdFCko[Y˔;[bo B'P^џpDtU5Հht;bk(X]8"fF.8-Sgo$QĨJ3_T;y' ϪNZdӄIƨF,O|!0U5:9SL (5"Lh|z5^ۧ.5oV5K"U{t?5l3V>4t|I m)CV8fsD@H ]uTgrPVIRfn1&]ԋok[o4ku[dmw|:i8T@H+*TT$(;\@@М vNՃ~@ "A)?hILMmҸ Gq D\F#H@e@ W4q]`rt^U>} va{"]QС7TXHL~;яa{̣;OSmdX&Ӝ3Q?SG7id}Vpb{xu|sc(?~LsC (?^TP A [fPb)]rCS(#,|"$*n0ȉ7``Nѕc$Z~+->tAP?X>7HW#o5>_i#{οn3~.Kezw|v#es ~4oO b]/cA!k@q뾼s QyW8[&2g3cw_mNC?]|\2G}/^'GHg5thC2;A_J&?3[h^~D@};>>tKCY/}d"n}l?tR.|~ E\<@-]<ck G9LIv]ny|ݿ8E,Z'Eł]>E:2|mf lXmX]*G܎wPB*}!~@icGu>Η۹vlJ4g}io|iA]W?Rnp8@fp@8ߚ曵WЉ}:-f?/6|PGV!b3Rrs}8 ev%T` StH*?hY̲}*'h$'W实^3lygVמGwt:'h?Dr6c>]k|{Yp:Q!U͐y0EgGc_%CLc(r8 @PEvI&]@e qѱn7l1Y@),dv<ҟT97_\Ssi#JU;~ bt#m l `# ;FJ[<`.珶|O+nwi-JkB_# χr}m"t[nΏ | ȧj 哎~7s\x(K@>}ؠ-ׁȷGghN|S l˱Ϩf[h7vď|L,V U$0w^eyG\-o\/0I{>\\2"<>oDG|s\Y^~^yJ>T\恻Y)WF^\>D;V{ @/ri|[}l ׮]>P/96\"Q#2S؁Zt_^XhH`LO H_/=Wt%b= 0oN= Oc#چǒXܺ|~KӎhZYקރ䓽 3N'kt[4M 0߿C|W 6yh62M޻K`|橼؋]x?'eF5,XmBI#<.ݽV@[rY˒Y#yˤhևU]SeOU 6Υ}:/ |[g1cawfT>?&3e $vM1F,I?*Z.fxd;LZ[_Wr%׭fɳuRueh@n+&z~(F@KRz6 q.a<nOe_Nq>iחCV2izݗY>Qi= |r9g0|P>ЕL H^̔a|B>D>kZza5Pтbzj,irϤ|}uͣ Z$k K#-Z_:حW R t n8w]7>#CuYCB~O7o"zdzb`3rs`3'@7j[v2PMd8POP [Ob' ҙ1#m_!>9jj@;E-70. O'6wG6MӲHA.Ē[ =>;a1؇zPB yVߝV~46%`:?ҝ/tc(OxڱM$G"pwj3XwuƃzÐ7`};cX#Qv9]=*Ë{~Fn_mz >UuLE~ޒ1'IR+!`|f])zAq_bG,\tz=QM) YӤ,mTSiU@uJ}ձ^O#nyծmg׷ ɐdgϧdM?<>+S_gz=N#R:J33uQDoݴR)9 v>m $,Lx1Jў¤ 9 tHߝ^^ rms@2VdF+VUV5_D_ǻeP{r(=9_]V\5 j(([,/'s ("֌{L=aN}>b"6YQto UUdzPbVI USv: jd#@;P r&( 0#3*!o-PN$h0O%#HUHw>uLP:#:-iA&|zVg=;AYf[S}x!C*\;.~2 ()r#JA8 <7h0O71A\>5&. sanFZ"iqdn>ۚL#J#^GNxb1$vEwtN)lfL~W(иHMۑ|SEC>>It&:Z}SڢZI $oooO7h 3mm𶗜6L⽵U24Ovq6/DhÿhcA=^n4'!8ޠ04}qty<)ɀ8)ףym݌^< Ƞdy0 鶿8T c#rt3mb(7#|֮Af4 t>CqFdz&NR\{qA9_7p/A;img9ڴr X818}n-]GB1hvKŷJ5hf4ބ87>.mݏg4ǓWLJtiחΣ`ǷyyLySEip@cЛW-O*]zXOc~A]חA]x]iCTΞtN7(D"Ï_ved$=bv<;z%N)>-D=1v}Hx~.}:Q2 *v\/um<8=:)[c{tKo/@V\RmIzSTR0DdJRWe!/aP@O鯋eCbS]GwY8";*AOc20Pγ#"b|5~B&EގN &O%)#rQ|/mH| #KuDM`ܮ& (X7j}|}@.w.ڞ.iV~]PIP եloAr'8_/"C>"b$RzYe3q_D3 }wnBCa Ñ) \O91{ ψzg%~>f;"ˈZ? d>-Kit:봿[ud(N`|B 僡|x]Vu*uYu辘cN(|KpZ_wx: G0u5(&uLs[c% $yF[uIH$'@ٱWB[9J{$U"S4_GȓzpP|C* rT/NO jv^mWwmBq{T"J90Hn w..ЅR tߠTEX=@nPA]`H '%=k$<-fEuHxf"}?O>=ܥzmnigl0#?+QhՓss;iE})IxP'Qz&GkL(H~֞\/1D~nAgl~]/dxPi肃tI(% KPt)ۿP$e a7f7@/93O*B3'wɜ`Wh>6Hx|BD[ 6'M6}zcJ|e [^ԠguXI3巊ZF%a`..uBaGz_0@%A Hf2O_gB" SJ$ pD“zHrDB:d:yiT# H,!Hxœi"ɹFd G~sAO ,Cy.VPXgNA2!t1#&]u)??n(Ft|a<];U/gP;nz !o3Ra nB4ꊳSpiKJkc#puP[W̋d+.ɟ c.![3rBaZ=t)H #CFY¼\# r [qA>Q.-+wAܬe Cđ'n(y͚_r+E~,ΰ@䁥7I& ZHoҩXg_6IT"] 'p k_M*R=肅^&UvOwAh |-x&B7>tW<| 8%UM9B5g}>rh9 K% zee?eY Xk$Nqq?䌇?G:~XqOSw9?f#ٚoHZ/XXs۠vT{̝< *w b 2I00׼ *ЍS!!u[0O# o<{I*_ȇJLMD0g d}/̠ܿ,8aU"pXXí|B%%Lntg2p[P`J!VsA8UjPʞF0dkz8f K{\6x+w/mFkU4%yd=۲9q4@Q8q2){{> a`I&~< "Zs3 pZ˅M`hM0| 1 WE _eo`>"C^ 2[gƹ`p6*ʂUY=V'i"8` ׁ e dADeّ`HYB5F Ϛ`&a8" /`!e U`I0 y~}Ǔ;mpyP dA$7 :ǩ.Gv{: cBPt($z*>W$E0ܾ#چåɷ`(O`HCPj]aX0ATLïQ0L T)vJH,ԧ~Y0P&P/zA P"|fez!XB=!“ ĉCl!`xJ/!CTjI^3ۼ>`ٜl몓x嵼x(a{,׵. C$G!`[ 1 Bc/b ''^GmmMTB&@8ٜ kBMb6RA- E0 U/m = ]s`Xp2iL0De9PY0dغ~Z`|ĒE俯& !=}K"k Et@0ľ`h$(dNVB { 7 W&.ucQQY%2gM-&ruC H0=54y_@ zi-| 2>:h5$vn1!RiSȢOɨ̺<{?UjTa@CH< `ݽyc[~; .%'jǍbg0+s۞!r9/P̾%0{U{>"], ~X8w DsxU :7YXgl:6:,k]nO/ 7ko$ZY0̌Q7,\~9^mҹml΄2pRwolwp=a*rIŇXƴ!wGR}GԸ=)mr~O볅P"S sԞKΰ&fęE]zPJ]ϾxU<PR$D> OYԻ *5ak!Mo&񨘧'⠜W'i9Q!ʀ`H(?.ozq VFq×mvB|6swBDT`'D:"P^{IyБ`ܑ`s)]ێu* ~RvmyDAׇ$yiy8M$dI۷7+EHʅ_Gv>9nnN(-?Pt~v9GeY,E TC ݙdhq%`Ģǫ=T PaFt=t`z^\;fpF(6KAWE?nVb+9J/-_.7ez,49!H 58līf31x+R^vk[BHx]L(Q-:.aĽ3 VcN U߾.xc黼!8qD.cLLq 7<&'淛Z*Mw;gqr#sc!@j}EM+v EQU_؋0\G L0| %TG0OsK e(~ `H9b~ *L(Z ) LDp!tS0(j`aλ6OEl&~"-EHve6ӕ;.@Pڼs` ~`k^/` gPUPT,hCʂ!ٻZ#OU\pXoŮ PCtߣ`^0 7 H0 w{k,N*. Ŗ D0k~I4 O\a> OWï{CD+ CrM00#o7 `hkp\B!nD0tƮ,Q*p-'U% aT0lJǛS]T-E⥈z&\g3dmx%@C- C, a`sï ?E0,,"w&&. $Գ*M C,! Z  E(,a-ZBŮ٨``'+^˰ 'T (kvz_09!/bO0 KB5>eClˇͰ}PpLB`ǭY4APj`]ZpaCN P ClC}^PBdqM ?/H.D p]eUtg!{a yQ0 ۩H(D{H&, ?`$2P^=ZcS`.){ )(Wc4MXS#aAXGK+B͈{~Ie8.tўC_`Kԧ/_ XNQvC06N~P?.{:0k 5б-k}݌cMQ!u}C<joazm*,3^mqm6<(wFoTT ^ˆ$7Js{KxuBz>{;%2}= yI0u~jf>vu{vsqݗK./ΈqƩykt -!"^~WW"ҍt=DMÉ_ h)6#)P^aHs/yJ;p/! =p)X_@rNO-Y0Wp7 JfK'TsQǩ~Eǽ)Su>Z7܅Ֆ8׈@{:NUcrS D0oWW$&szB7J$<rjqh%3"*ܭK^ k$ ؉XGD m*˦8}:_y}e@t2 ?D0A!PgP^;YCi!4˳m$Ƅ q"iE@ #*Nz58>0C\5/F]?$@Y)WyW]Bv[C?# /%H$5߳.}ф9:1޳gf.E $ܹ9]0y{vSP/ . KsN "ᡗxk`q769 OOd:,󓄇%ş́ $m-f\J%= JtD8D%P$|dh|H5SբȈr]3d6ԍ 7'ԏ^,X(,龉S8D5;tX;ms ^}CꝨTA0\@~ňIeOMB%J$h%ZD j>?G uJ^0LTċ#Ne]Ue&'Pr,q$NTx3J[C5qJ8 l I-kiҘYGZ?'*Lg!}'% o݄z҄r70S"!P}q!D,ch$<,] T L+_b /^>g0Ѯ#"`GgX,%e %믄;4 P |k!m.oEޟ|M(^߅/?sBzD cPdztX.u8 \'8 KbɃ$LL:8qeOA| ߮enJ/L0"ٹ% eT /7v:D{ 9P$ aQ0DmCNJ0`&""~|sAt_ڵ*͈Ӻ A4C,N&-"8=a9tO6?&!_x[CkEC3*Q3vC Hx4% UG$ Jx iydA9pu`ȂaB! 1L0|G7u}:]C’P_qp݉Ә4LJmG7N$8A%Ub!_NJC_,dz%`ȉ*q!CTVp, Kx*͉D?|*rDS$:|j%`:'~E“g /y u6*Qi Afdٯ//0ݭoT0UB)hA TGK88a&geRBĩw"Vqߎ68]K=NlZ>v80R;$k^4h4.ⓞIEAǣ%E‹_crL0ϔhTA9T$M}D/WVCkԫ\q [=N`:N,u 8zi܌'HT?ayE0ВB)bScp&(z"r&GU*g|>J]$7t\] R|"̠:l1RT(W;^",<`ͭjlVil>oOc*E>S;B":.V0a|hW'// w?`= /?}bumɟ ѹ3ܦNGpΌթ8#{n&Nx[(7,b3}!|S* ]7 ar ޸w8]ןܿLBuNba=EXxB]!/DZcW(k%ßV u@{P|eA/\ .o˿geP݆t"^d(L[fx Ku擎.OZm~C ," 0 JBoaqC10TBx<C \ۘ!ގ 1% G  П `XPŽk/U#r !FC uKobaR%fe-0J [#ڶх`X|9p3d`K ma+th!I-f:AB`K Yl~d~@א+KMFP (YC"3e! ls*(T/ fm dbsSD<+u^]ʆ0|3n}ToAER]_P&2_H* *ü4؊k6We8?@DpEL#e$`c/ *%OEw]A -Ж0{/V3O٠T@ABa0.ӳD@q0'!$ dς _G$qJy(zb"aCDVŢtl;_Y{z#>FK0ezvX+5DJcU{:Sje.YM WGZG>ptpkxp:dg)BY"L Ñ Ňo}Zzu:b|:c^E`Ch4ĭvRI)r=[@AmG#Q*(D8A6,(s~wki ɳ=<;I \$8{ 092G BZy],a8ANj͹Wۖ?7ڥh÷A=+(co8'Aw. b.d¯ۇjR7Trý<AKVsqCbALcA}┬PnhҀ"ZFPa8{>ҍܹ =EO]UP]<3'%FJ-&\qLJLfz׳#wNiYiլzP-I ܑ̧ʶ<4g57Wn&b1jJȳbO)]SPDo qpgB}~]e62 }ijU^+|` ;AP<}m#YIkB=8wUA ?pTG*4e\wwE{*`&]ṯ?^ ד,g (c-0QJWg建|[}_CfmkZB3+x:[oKZF7f.u )6JYS,*f"a1OJ3/T H[]9ޘwq{=) l!pU6eY@L6?%!ZBĠ{?[чLY j`??=X)~[6K|,4(^x%/;ugs.xJ,_]<+HGq~s}QP層a\a]j`2``p##S e1f zP' ^*>I[{ ,G rC% c1\W;~sx#"ZW7,8' )_4 ;i91i) Zt:/eYEcw AZBu I)I5*K@0p i7hAٽ! emK#gH2g>},8@wW3tp0+ܼ>%9]ntn c7Ow0LuSM~?$O7} KrpyZ_\ZP|m䊯Bh6"v:R έx?lIQt̆Ikz?2B7BR܁7v:k.t_?5͟º~;d|4|lsϞCa%SJ$AU)Fs|N hh犀`kџCx62ZzQu,T=Um#utչaҏ=+]N?W>X LwTE:w:'jJpzԔOo}|{ύ\{wo.^}{>9;9)i8. 3 B Єs}tpx\5 y@kanT$.NGeklgsws$%IZshȤ $ EXyj]k{GzSs܇,?C S@?+r=j3Q9(I(Y[rx}3qN3~ޗ/~Lŕr43FQ~)yX~F~?gVΪ_ȇ%=O֎TNJ7[W+lR@Q2h nr4Ly,?) }'0s\Sqݤ^Wu~L~ |P:=}c|ӔqG(WrzQ~-֎[gaU\EѓDd4 /'3î\\Y9Xgp,k(/͒$MQΞ, tw3YqC"Zs %9>=WW^{ӫYz@ %P. Tb$e)A akix!9P I.d=FJvE=q}HXsI6݋>x(dBo3NX.0zw._]~@ iCrAP4墦Wɿs (Yȇzk K{籫C+r010;ӫk^U꟥>C|!Q6q̀:e!|g1:yg?ZΩ<5K*PVsE j߳KN/ӯh1.tPT.k("7ҧrqA]Tu3B @~΁+CIs[{GLͰH#=W  (eR]G >BYXx(PU`,<2UaLmo5}EQZ&\l{}P.t:zowe>x}Aҙl?R % ˙-}!VN:Vk>\VN`H| ޸z:q\Z9|Ezzzu~^W5"T]W?m_ W[ frZTyW. Qv F͂RY3}娼>8.7z3w{xkc@;":AニE钎7\_wQNN9яlcN#ڴrOs'GycP o[^y^}޴wթ>镍IW7ҫKʀ`*!wGZ _%qO^Je7|\&}Vqs^W%U7r``ZLeJd꬜}MX.Y]i_igt. kOuara9ZDyzZڠ^J5Xx_J{t1]ԋˡ'9lv}ϥ=vP>|PnW7WOѣxXмTZɤ[,J&({:Y+ |M@AC[{5lW/B/XeŮ7~L&1UpȄ7SYKkLҋ,]?ȡGL-i.ƅ#wϕ@C/n);ߑX^m~W!ЫKiz]?פdQ@Ixw.JtTP(*HI`Pz?o :&A?HNVLGnj_"<}@i@݄4X+>M8 L%}cBԋMHذ~^?P5½#E7/{ԿI˽0$XMܶP73旿{1z{uM΀/4lKGz< &s5 `=]R ׀H9ӆ]3NYU| b 3ƛn[z\E\KqwՆ&.vK5ߒ75Jn*a _Px5YvʶSF8jl/loڛbTԋ(> TMO+\rG[#:(vv.'LC򕻎қy}o`R@Bo61|$ 2!@A:z^|.;]w 7!#[7]4po.P9~K>YeMN ݱDOCViFô4ڍ>sT=Uȩq@64Płl-'n(#ۅr DL0h*)*~&yoZ,K+ ^GLBkNhr4Gte*ƹ 7h6~Á}MӏPK}];czw!KPVuv"wlʑe+7Oۃ*llzd!#`nҍO|]՞ ag7M粚kP(7,o>yd=uhe@kv~ζEP5<٩e@VN|/8]jPJrgH;$˓GmJ/AST iڪMiikRs =4Z+PC@+wa+E 2B1@'.C@=ګB1 PHeLq]GR%Di4?"E9y}5i,@H~$(F=eGn4A2[v)y}+.&w3[KJwu r۸op9MsFp]]#n؇x.d&i~q>o^_i١1匦APۻ4mq/Nodv.dtn±Cnun{m#Ej;oإ|ԡ$޿H=D~C~C!FϢMS}}'p8yZt6/7cbA[wm!e4b`0drnӷh֦yWtv OֳYbLLӗo<)qPDM[0?YmGk}K0Dqa^h6؝vf`:`&zɝS9;L,-'_]l*v qCH!P^‰i, А߼vس-{WW[k݂߶jOUynfejx(ٟr}I߱oh݁C_B9}zzhV߅d ΎFEqxяZ̸G[vvS:RaE֌ku̝#S$Ng9M+N)NIӊ祂P:_h$Ƴ`p0Gɂx])C{89uNg@ ZZ>&R=T\4ӝY2k/Zn.-G8'r(">忞*Z$RVd7a*PU }É( gΝv,]PK9\}B_I\2QGX66sxC^08Cg;iT *;3X\/ 0}t˼  R4+v]c>2Jt9bd&C"»`rK.Ev2aBsN9,HBhfhW h]PtBKdD:⡔A%ٓ9`1>&*ngPj~ԗENW0ɇTB 'O!\x̒d BS"Ӓ@jG}E&2їRS;‹POJ&|DӜ.QzȑB£OB ! oyNtTo$UD{!)i   %"|2D!فhh(v'I^߅HHDgɈc&P2!%<5!CxJ@0 -% Pɇkz!"tCpi4&WJ+p QN sHQ է)]PD;/KR8Tr47$=ǗH{=S^&ZR*bA>B_&I yn|,ؖP! nȂAɂa@4GTCz(v'F2$?ơP`&W*O0pPqҀhvk!ݏ @2Q o( nvhH JOBLH THzi /P̜ÂI\p/v@! s(GJahb|v/0ý# f9C;d2d0Ho@\r~#R&Dt|y:\v8 ڵU]HMH!0dCJ:hgDG hy]DP!2!O+j`Hr !0ߋ%!& Lkɇ̼d>jI,(v%Y0Ԅ BAT;`\Z,J`C0q;k6;xdz3b$J qj ! >/{75Lc 21NodvkTXb3EBc-D;@9TJ "9Fd9s&2Oʧn_fr#a¡dA,;\UȂL)z\>b$L0 D0`D0\ބ0\>,']2"t^vӀT'|m,o$_)*@KRQ_kvpz# A i6Y0ɐq/ف}vh=j4\#"FKTCd!Pph#l㖀vTxCC B~]<@%qP J*$, .S7LC#/ZS!jM8HA*<@LC-x  (+!;HH"47P%YPGG`7FOzIֿU/[T6Cx J:.-DZW&6 ľF%=nMzPT%Afi W$YN}kJrrK1D&&'cAA,KPe9bdGu k9d;* Mx;fRz š Vea> ںPocpB܏DPK,Tt0D=>VWcuM<qlĿnE5L-v$_ӈ~Z;( kvvo j;x+z@8T_ [_P/m&8D8ƴŭVjx)ÅSMeV<' /[골eۼczFw+s4l<?5Z/PECЭӉUݣ:[?Tz;jg,ޡW;(`#`c56w 經` xCqj{Cڒَ^}Vo'kz /݋j@Љ0l$4%zwfX.r/VǠ[+?<0[C X~Cnkl y IULC˦ A,fhȽs@C7} J5aV(۫&.wնYC[!`m}y3P`ӎT.3w^.<PȽ eIiS0CWliR0>$!ᑏK`f1 D Ѻ+2y`S7("ȎB//nzQ04I~`HCUC R0O B0$ʿ8*~x?oK0'/ڄۛݧ(b;Bn,T ) Jp.{K0=T.`xZ }. PMEBeal:tIq`2CdOCIP7㋂q a~vpL0\ uXo)PLa;.&5;&ȞBEPODD.~v50+X B5Cj 0J.4g?:h!|P`(RP3Nي`U`U0Ww_DhBa%*C"B0q i  ! @0DvJ8CS C\0 P'}"BB  )CM>ӓ*~y{P 5qq"( }Iӷ *]`H$kT \*7OM40CdOD0.QYp'Lm  9 /CZ)Ҋ`H"pH`\0|Ζ{?(9d2Bn+TqR̞i I0!o -7).2M ]mYOC !7򭗬D 9-l*?' |Z[1= ӟR]#,ԕ0Q0,gZтݼ*x|-}3}?J硐Bl ieR[St|?8}W}o{6"(m[̖|z~֌+ wݰAQ(AB9 AP(ABB AP(ABM(ܭPB AP(AABP,T աPrB9 'CP] #Ό~ A}B] 5L]W*dwџm}anIENDB`capistrano-logo-harrow-logo-c-primary-darker-w640.png000066400000000000000000000221341520217215100336200ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/assets/imagesPNG  IHDRKPLTEGpL+6*56b+6*6,7+6,6*5+5+60!K+6+6*6*6+6P+6+6+6. K+6+7+6+6.!F=:R+6:Q+6+6+6:T+66+69Q9S2+7PP+6PON==j,2>9+6+6;`$P>=@>:QL:Q:Q3]?>:Q9t:QEQ}&o>=:R>=QQP9<>:QBQG:R?>:Q&;R=R>?J9QQ,:QJ;BM9PQF[G,7;R?Rۛ@;tRNS}S"*#\نis 1JB 9]&y³Hؚb6΂5<*ηSsvrja?'Q3UdEߨI4ĜuDung!IDATxy[ɾdzNrrC%;$d5AFEQQEtTuFuęq9y,Hwz^3g$۫`PKJ,,t{s.\Y[jounmʅx$ }AC{5 lE,eٻze"C˩ ^S|x0WэrjloԎ@,~ _nXL+*"4Ufab'썱7_2~)p"^e^%6/)* i2I|"Qea ^f'*dD%=N;kJvѿZp\*5WU{V+@<fAl0#htŵ]0re(Yz4Q L5_D4ˢ/(=,Q#(B)6 4盧hd4|/29pcV z``BpEs?i3uEl5x~N^E9MQ@cFQh3zH?IWlIm8!ՊZۘ /%|\&L'IϛZ(_Ҝ0/p((?2T'A&AJӽş ?8u)9 &5/.T`U0a.m$\z516$mjUc!Jk 7 rYu9oRKtIv/@QW)Q6 "0֟)!Ti+ZA~kX !LIlPGqLOO̬SAܞ$#*:HtB _z*&9 &>|R>^ʳA)xHM/@ˆf<=/r$BIT*GX)/WGJe^%-_Dq·oħ{Vk.Im8p= Il_]Jd^fkL^r_uN;R=Ӓd 0Al**?39^mXI뻘@0EjW˅!Gka2/.&}_d撙I=u8 '=~O |Dgp*!** NBx:ک@xp/T50 D=zŜ=<&М_v_v>ω)᎟/o~us2'^@8AoEw6{݌xs'z/l7zqJءQ6nѮ1yɽ>UoZ2  [D({r'!iu B5 ܽR}r񂾇p&LX~QӌP:DZ8#>eY׎ ({|q=g΍0!g a@H}gz3 6Gmn#0k9?0sw o"xz²VqR\KFd yp4^I?MU/s rf`v`  CpTh6&uJF6nt>*'B_@x'[e]h>peC@c[FRݩLhV1`.|Q(>RͥaX@v 0Wꋟ:/HAbvB 0X[_+0#(S( Z! 4}e%ę6qdNHC5ۉ$*Iڥ>r!ks۵ e{ʩ)!{T~5L -srR`a"oWr 3i1ˀ. Sڮ rRTܙGXO`hDN8cEY$a e,b>9q-˵s'`[{/bdX;-> | |ZH ^ao|}3ag~M6t;UwcN;g4? J)G0O$~. ̩̈;Rt:HrOQy}^ "t砀hMMԯpgsX7&kŔ>. G+1fL;-14߱ " }>K*rrma9z =E@zI}]0J з $9]!ze߯J ).؅>NpRy6?l/@ZE%df P$@$\Qpx:zliw2?jnz&ޱGڪED\\HCt2  я w]?wA`ZRn]s;[ AAh)w?7#B4#CAPɂNC{!ijG Bݸ E]p20aNUZLY0‹SU1BEPz|hغjh &͡8GP; ӺXjgPsCATG`@jk ƒ f?1D|#;:$d  Fw1!'-;f@vŵqY@P捝^ @cmW}e݋/Zq 𝨏<殯4oLWilB0U{xp_E8 l ReG kJj}ONJ bӱUl,:X@;s<9ٸ'@$ƣЁ-L$Ɏ=2$7'`WI f1d]j 9U,${gnj`iB~(:w6a>̖Pb2xlpߘ;jO@ʽ!) 5xP<- g!=J;x 52/,? L )0 ``:b8 -z|A``l9va(@+G 8&BCЦ4lW dLcm |eU= ;`#x܇xJE|R +z!8ⴺy& HdX_\9_5 teRhX0K"}3/1f7XEG?v0$cVbj@Nz*F XiSQ?zKim6c- tX!HVeSSNxhl)r#i0r<>oEjVZ @;PFz b}_ 3?(yx\4vhA˂9ȃ?wUFB|:DZ&T}v+-`@'z{=V= 4w7|W`Z:0“[>DAB&IKoCU !6 Q3Y#G]='`iG<~B !HC^Ӟߟ"0Y~6I R:xxMbA滆 ͂h40ɷ|&Z=/L,zPA.\WyMYaHߣ*. P)R@ɇEyWɘ \PBtTrAjS@+Cxa͐fǪzJ-h bL_~S$섩M"0"Ѫu ][J(_opt^qcdy\>70'ԤH ޢ2[|YYEq[q 7+i"8sFWXR2i=ěfzy?*?oBq5Jz @iq4Z@a=f9g)y]vi ڊq eg!9pcy̺̲ !I^*f 3OKprBrL5iקXyY9)ϝa<Qi+ m@2#s}yG '%`HpGk q4]3H8hZ~Ջ9"7 ~0THj ֌_A8khVm[X W"bR?b.@"/VΉ ZЊU5m}pkM◢CyqUqR0F!LJzuqZ?*!Ts9+K2=kQ{#h d."z#c>LƜt^ߔSYk lqK ٱxM)>pr9u%g PHx=HV64Rыku7fZ+SJ-=l*c$D+~$ҍ@}D,.oՉꢰ$'(Vf] 7$nl,L`$;2mۛ%#)yB*ۛK>._U!L OZa)7wz@w=,H {bvob\Hnolx?-T%р-XHb{<DZku?8$qiIENDB`capistrano-capistrano-603c346/docs/assets/images/git-check-example-screenshot.png000066400000000000000000000467531520217215100301520ustar00rootroot00000000000000PNG  IHDR,gAMA asRGBPLTEߵ"e{+Ӆs|㻊#y|J𾥉㏚|֭Uԭm|┚e|d|;و؜5Bƾٵ"ۋΖ(⓽e{e=Ҷ;ͻ\Բ۸Ŏ%խ5ڬ·sÌbj'"àgK5ֆyj.׫κЃd}}k|ǐXF۱̎Nb׸!F݌Ų:Q:CpRKپJ̨qӓxؒ҅döWڏ̨٨;>8Bӥ>ǩҭȬݽľ٩ٔѯ|ۼĸɿMΟfB/ÊT׬Yw|۸svbpWlNtgAkmbȤ9Iױ d襦tPŽ8NKE.6AmsODxDJIDATx}cT5tzg miՂByUy"o  ( u-⢫NΝ鴔Ҝn^$33 !F1bĈ#7flYߠ^X=*ȳx ScĈK?o9"nO ,حV ,^s{ƫȍ)+`t|ݱx^XmUKlw!mu)")n^ .%b7 ';~-\ %o?}b3/k>%^Hx.}K.M殯>.]Tn{-~iէy,f.3,$އ"?oZ,N{[ >(G%w,w 8,'#7}7G>_}?/Dt(?bP? `^y[B0_Uy[Ͽ[;~CȠj2M OJikGBW,)HenWBJL T涑L,-j}*aĔࡴH=qRtYy9rSp/8T2K7x0,u?:Q7;OS2S¸+=+),օܢL6SpCH^Ew#k,+oxu&~Ͽ(!6!dnҧs0̙3wm~#MƟ7,k7Hp2Z(f...+iÙmGn2cv:KRA?vi9o%դ|gf)MTq2e,en ' n 5GB|`[RIvg脒;yB>yP~+yyǯJ! ѹ\MU0rvz5IXf΀MFzYв:Wf#7#ClwP`z#^ OFZs/m[^98?d<,GjK3|֧D!l3lbcrU;nwNF ldGjieYީe)C 5=2" = hKN:m#>lR['}bEzf1b$ _* +nߠY#cGzf1bmu94 pWzB}ܕT-; A vNuvSbQ)KfJ*4- K g~c Z*]+J$7D"psKܿ\*w%^Eťlf rs);KҼYgo 鑛}Kցv{muRp 7BJpOݴj72L+DĢ`{ &2g#'m%di,  ?59EgJ ^EfՂ,&|L(ɪ0)9@[ext 6k4{YN>6J7PDFXN|jimܻ˿ a)np{Pw{H4ph,o8s\.=KIb}|fվTVK2^:$}܆4k-`+nI(ltͨnEaisA7$WK|#^ܰ 9ucoc|cdƮY7rwYrǵLlUɽ"KbݼVXln^'yyqd~c pܮHgyC9V[M7ۡ !B=wLDơzeNMO1(rAq&ёՉi,md~@GAz!ܭQB|Vml`bcNcE=yD|uFciԐBp c1݋KkN6r$&.u]u6ד@ZӰ47oH_* |&BFXnnR$ ^ %JP~3Lzr uvwt5k:.q;V9Gdq쎖kHңNerF3"nxS[Q7ަ~@n-ӓ:W8'x3䱇Oǂsw&,p6£QoM_XiIiPT]CuZ-38 Gj:mm~I|npwYӽ|:IF$#%+%Oc6Mq*)U~K:ܓ8n+[%OzH]hSd2Ĭ [h]s3\VmLzW/ek|4;9BIHQw]|n %|o( W>ex=IneNĸ8tLB Ǥb|CdW|ĴSo]?1)3Ew+[g1WLlM Hs\a|o軰8(9)>2) cSx ڠȤ2PtNL% &Q&%4*^"SN(ύضm^Ky*;`y7w31HvilRaF#}B@Al:x \oUss|MYi~P1)w k}!>q|oRK;>-0xtUF(p-<}L|#' sJ)7{ xlX>M2ݚ|˳i?XeARംv[]^c˫8p %;|8!Jӗ?L i`@2?> M02 ')٘6pub]K{PEn p'QygNtِ;aN{Ճ`S0VBHduAu{>pÓ!L@A͊.?p{0_$o5Fbo60=x[rՄ̡ IKցMV0+vm$;w%}>1^NU&WL #/P t OGssm?cߪt/+jLNeq~O|jM ,@Z+:{=a V٦C[:Ppgu{Ǔ nx"'{,qP,p;*;a TÐl946ú!]~#8L(t$:V|zZXMf1pI[PMqΣ:l},ψ <-S3::~P.fN(|XTE|wM9)&2̉>;6a`xotqEg3upL/Gk7nq% F0'-@? 6vxpeh KwtۏޜHc Y%}7N0 +C ;? _al bjx?h +nnLHD2Tz(a -e.cljȩؓ܅Z@Zl´>yZaNQ6@G̫#Q8^ollj <p{t:rE[.d9wP , [;*ۏ|sؽؖ@hH³_~w\Q72f̐Kd#zEI[%)Ϸ&Fɲxѻ'+Ea/82jNE=$Ideܶ On*..nםm_?Q$NCvZ15ifҒ% T~nvl—pђOև}lCTo:1/ɲK$3Cw5|n[s{3 ϣc &X˟q QIqiD,?~F5)emإfrzY$.V'fsq{4b*J5؏<5M,Zh?ʮ ȝApe\ %vy=vENOHsD!૚8҅.@Kz&p/̲h9#O gw !OAJc1þ,(͑l\ie{ñ\ZTOڌD<[ [{gdu*j9wB6xF]Ip;n>wroAd<<[d^u6` `:;؊+Һ|7җk(sҐ̌5@ð_6'tK j3': 4yZ?0G\{ T6jY* s*ySxFiH# -pr^n>7HR2ӍLeq7݆/P;DlgVbewɀ#N, Yy:6,Q蜷enp#yeٗ[9A/h)JcSxFiH#qOR{]ΩcFp#)F<\s2r17@oټt&ysoQ,BFf YAmi " fRi2t6TjԎpJK)H2H#,&|N(-Hx&x72Ⱥ<3p0c1<2--M"ޑFbl,/ͪ}dt([r|nX-9w8[7--~KP3#1~{wOcdfGufܑn gt"Ӻe.p#'.1\%H3ҵ;Hmz?5X.]Fs?oGRn<[ܞ3y1`#6>}J˓V1 &0J"ĩ:Pᔓu˨G~]TjhL;k @NvE尷oCY !]E+p7|kYF )Le~87\-/;M{ܘE/OE(̂('6HmDgO$O,#ANJit'/bd9_͛i ]F⑐$HRm^;>wYUN?f[]q ְcud3?v: ~wWNWBQiz]7tt~Ԁ nJ H+B4r嚟s'zB~IVc<?Ǔ zl7Ws2q i8Hٯ~AVi^GxUl)r@O%UWߛ'}O#xx*lo Q&)\}IVc>^#Oy%'{9'?u'D[{ d}U&=s֠;QRM FO>:ӵګkU!eN#Uj9aSVj7,a=\gHJzAEMV%r(8׀UBЅ1_g<wςl, p7 |nz7>;[("JPr|4/:SZ,^Ϋ򯾭i !QtfJθX|0}ARA&Hs#i5o <tM)P-2޿X;\Vͦ)Qr!-g<,tܑ .?`mi׉>Ax0:aN指r/b׉>`6Y0#7nFi7rrv4B͙yunLH}ƭ[t[yO)g#C6˂ױe!k4>#F1b)VfcB8'$yQ@-ɩbǣ?ofrjn,&2 i)|3*;$ވkquH%u٩v"^j7y:מ佛o`9t>#Ե> 58iI9~UN^.yrYs_W]?5@i`>=;iN]?>7mr'$yÐ]{KT>7lE0֪Rzt4yU(rr^NW܃c=]CUiIҤuHLcEŅN]_|=jr$~>7!#g.dC.'@޲UWN|}e䏀)GrN,wHeq=AO;^>7Ґ n߷00p-wY B`euZx:;-ϓo߾n,SӿJ|9|ez7.zi쫕Zw<.l˿"wIot^Bn\_\-.B_1IdqKCɔ[?t4l V4 %w< 8]_6 2',^3-!pNE}JΦ=7WA]ўஓ-Ȝ!ޝ+"I/.pp#Ӻ)|` n)7E/j9 ԘƮ&NJ}"cۮ1r 'JdsArߧܫ%UuK;>}< cZ, CzZ09 8yIԇ>mL[o?66ȜL։}g:dW1TvӇ[ھ4H${* zjw|n! v/BN˔ nFtd,{E7%S5Z7>U%]7(u'Ӷ%Ccigz'}bLa"fŒI7;"'/\[%Wu\/ľ jISH߻'Ҥ7 YC~5v:=Tg>:''m}g!CN 3\\o* wy#w|nԴ !=/D{ܜ l>d/`Gop,]*N.*,~j nz%1]ϊia/iʅX#`1Bߦ |-bwn55,]=wz7Ɔ9S2[􄸪^K#c>Oa"ڀîsr:,rU~'=/OZvH]ک0$gRՊFGw]|n!#g{ï-܌ v.p?@qjE6*[,o2g K}NZXMf1p_^*7#b 7@'Ka곣!i 3xͳ>p˙"mbm9%ixY\v:3`-z.?P7ATJڮFwqs# g%?|B DFʌڳ*Yt^~Ί֕ts""E3$EdI9?6OoX_fuz~K 4ltpȭ /[ sj-3=EdA*yÙ$HoM$޳w3EOY+0;~ yaKV$;ri6LAV}+Cg7nX|wM9+#9">ܢNWxʻlËcZ, KWoz_Nl-6L4D}ZYߌ=aբ >:?k;oW|:7k;$v}By PJo޻Zܜm>7> n-k|nО/X]Ӻ)VN┓xp~6f#1-#?Pɢ܆)Fjc}upZ/)i#7)yZ, v ZiNZlK`9r>ڵ46@zm6Ȝ\SEv!`2a'!13;妷 z*W֎;D4F?$o]o9 ;.—6c""mʢ dt%k$GS^(퉲81  ઙzp7G jA[oGm۳z]{ezڑj]oSito }=u,qObۮ{wPci6D8+}ܙ(Wcdm]:hu+Kk۪VggB"B]Dz6ko78[q5lF90.2n[Q`?$, -KkC˪4(Km6w.EQS=,e׫E;,ZhEFF=E#Z=z3=4$?˕] ;?c/ 6J؍綏:syvqŜw>1Nz^_Tb?bBMzQoEC'z*p6h\rA5vfY,hQC{"HY5P3F3=4Ыs;+7-߉w+/6q!)0UgkQNTƴ\ <6JcEzɞE1iOgv>Qrfe6TAl=[ΖAD<#:8ʮ_OeCG6+]m;{ų@Q]K> nw܍N+?z>)aK[J ~'ڕƂQp)C7*5^}}id\ۖ]UB,Xjy]2*0&P׀QReS`:2-݂go=50/ȯXvb>U:ح8|t ᏹ%_c;܍NlIt@G=b?0i=t'Ew'4۴x5pv&/K'0^E;I?ub۱[\n6iscc9ze l ;#^ 滋$wUmZ}Oţ s0CyemSO2W4l2[S ikǯؚ]-2eLc)F"V#="e ܘyy.0ʁN ܎>j<:E۱[yqW'G DhwKEnLU'I5an zEX"*xozdRI+b"ǩؙӄcYE\%̅-,~&FQyhE͑#G6E"VHZ>rc;p^oO`вgr-N}F}h7>']kSԑ8:t\ũyGFWÖ;܃0Zl;o*0̇SS%oj%T.p3`,גNox:hjgȪ?5#^8^wO8?8j ND}Lv%$n ?VA=Ff{,wAʫs?okpje~dsN69{N:e UD0uE-0'8(&L'̃ނC;(N t:PyEN]T s;U?@\+N=hY$?ޞuDHJubEbqao%l&? B W:n<>7)ֲ捨I׮étPF;GN\[! =CcW4rӹD`9|P;6a3SP[cV@e:-VC_XO3vV 1ԋ9 Y n' ׉mʋcGנ~9d }skpjk~v/9_03c_"+_ ͔@H ?%ܐsl)=ьe̫!ˍ!iup1}8#ĠԺ hY-N(uN)zm-Phwy޽}],va`k œW~ՈW5!~p·|+=TGuPg#?) GU}ζa[ ׅp tBz狟R!X6صӞi)pyj9_䔭?'{icͅnM n^28 ><n$}x g-/]mtRe4,0 afdlM* >nٱ8o-57XYFMOCfM n3}W .s{PWj`pb#i[e 2Ai^啉4Dbg~9"}'[-`>6+; [F79ذL)];̤N;>mSc| |M#i@4,"1_c$Z7_be۞))9ibp7-#{Υ$vS^dsJ<[{ MPd/#1lh-"V/dedU(یM n[@vS* ,L@xtU&, nVVw{!xOݝebFn0{B <E#QVӺE`.d[҆OykQ;W!% }lS ׇ@pW> ȝ|esUÃIn\ J^,(8}4|Js‹w{nOia.|0 IN4k p_>w'ٰܹmj#wz2!"rOɀ[w0M0tN4l-բ8v[ܑ 9?4M%ׇ@QdvS!ۯu6+ד;6xttѝ-|:tCBu_/_Nֱj(;GxPx"-hW 41Cl}[Z UƗj͍`7ݔ 5U̟Fy9&jNmd'QVJ[&zy8Qd= f-޷QeЧv||O#,mNlkds淨Z/b~\oԀ$o7 C4F'H^'װjȉFtY&`͔q#.p>w6Bߌ*7o[~h$W-x܌ G7VЙ:5H,Rm_G z$+(9{F-FppKƸp7s> c> m;9C/Fܧ9+ptpApd~czJݝ~W.;R1>= -)zPLAKc܈9y:чs+aNy nswSWn.ۜ"hݼj*c;gp,x'[#DRL.Ftp>7BT7%ï!sFGRAVnd~c o덑-5w G)Syj1nDwsȍ]vE@|'׹-*1R3jWsH|Hyli{\{(L-WGƸ$>TiںP tt&ɛgpK⦃ԛ8P# "^8gozټH3ܞ^cKYzD%V׈ {V׈$Cpa/icWp,%2/;ŀHz鼡d_UT^eLlw!FV$d{Scr&aH\ HNu26ҼdŽ ;}%Da[;aYK׏t^~#i$o]R qF# TMﺩ{AbII;nk)=I%OLGFsdn>/)pzJW> gZ$-/)β,gΰ F%ks[ܛ2;Uwٰ>Rgk#_?5gXx V"S:bIʈtKi>ʔ٫JasGLs"/ et(fm{.4:Tn^ MӧFﵬEUtAqqO-kbd:"cp1IRs)0piF7qʲf`&iqY#%y͢op'sA«]4pz)Fຍ|ڙ_sHR2#FK ueohו%դڃ[B([X%;1艃;g~#"|OsJpk&iqn#0U#K}cy3g.!+l#3) @5 Tpa < F"iw\KEUnI܀Hvԗm#X(o26F"git2y}Z4BP?ɳ`dWO=Y.Y .T`HLp$59,,%9HN( x\3v7b$}Zv#7L\ZT\< ٭SV" s{"4+i K H3sO6^|n\å@ ܆mHx"710|n#Ofq5mI ssFॎ-܆mHtin6Fn6|n<[si?ۓQmFmFnT1|n#7>#F1bĈ#F1bĈ#F1bĈ#F1bĈ#F1bĈ#F1b1eb!ױ–ϼ Cy9UJ,lQ`syCRDćFN쉅'R~w19fwp_=KEy29U dzOmhNq~s6j(S÷i7;i_UQMqw|vd-M蔓p^gbՈo)0b]k}\ܻgp"IaB}89zhz<9F #ʑ{!{Oϭ@Z!eT(;Zb8r8BUqxr&FF\-iJQ&'rS<۫ϼI?cC"P:÷řk"Vqi[b@v"7!s{}n&AZOˡ> m} m#F 9o꞉'r_pI|nm nBt/isWG9 *Ha#WMUEx"7luHϭK0\t>sǔndTn`HCBEdiK@Ԁj^ewSy\yo͎طpr"tWT]c נWSmɔ>ܓgjAƑ-TwWRG[YK r8e%vz5i5s :}`wc}ܽ:<R`Mykd@.>iAF VknII颙6󹳋0pXHG^^L(/jTVx9Ԡy/2ȱںTZTc;U+tE"`Tc _7[{,k'!9/ЛIF-Y4t5gS*יP{-a fA/)5Ԓ#܁{}0w 26r->79܈#F!~FB"{ֲIENDB`capistrano-capistrano-603c346/docs/assets/images/github-personal-api-token-page.png000066400000000000000000000157261520217215100304060ustar00rootroot00000000000000PNG  IHDRWXgAMA asRGB%PLTE333`fffңfgmK09efhuthgs̚shlgfesܭخśoqhϢy1Yf85֯r17PM64j<34DŤejemez8kΝ,J`85C44rʺjz/CigؼҮġiHzny;7ѯDCFoє熔ؙt숬ȥt/:y}}{Τ]R7}HOlwǮ{ZӛV:eK6ȨۃK\sX;]㲺nurN7Rs_JɫƬDnYmmF>~=tOIDATx흇_YT ˒3H((`Bs>ϋ^{ifvAT?鮪nOwiEAP( BP( BP( BP( BP( B4Z >ơ|f@0k όU(+XP*$\ ^BͿ`Բ%x 5BQ˖`j-e.A"x#`Ln-l0kQ[_ x+wUUUOO-?WUu)n\tAs⪞"rs]5Rָ BUR0-_Ix]Lv)R *, 1B\@ͩ`ފ 8 ?G4O4㯆>St]4Ɖd]g\>=gwRL_) %,=ZOOS(!]^z̙yKgY(|Hz 'SYWFkC%9K[&N'qɍKoj:e?9k+O}ud3zeRAp4F95s/D߆Ԓ3f\ Xruh%?;It6$7 )4"^EGHu!W$SYiQLE`םNNnD5J/-^nDpD- ' f;mSlIOJ0o\JB޻ 9 Eў.؍^Wʀ}\_L7\ >MH;gH:zQ1!Zx52 u5^z[P 8BI}(n2x=s"y~ _fO:)ʡJRFu ߳e1yn]^:!;Bȷ,]tp0O"xAo T%h 7I/-^nD0[>&7>܋nxAJ"|_t P`Ck""X𥘾<Kx%xvTnsA::z]׻z{0Z v19 КC)&aP}LmEu`ɺd52"Xԝo^Fo/746n|}VSD ]+BG_j /'²"xKwog)՜Vz\l,u7|֜a+V4jI->kuˆ7iZ#Cmax9jZ&LgMJV=+n<C__(f9fm%mMdV ͼjA-o7H0j-Y5V̂MyG0o,^Za&h#oVl75_P/$l A_ D-!($BQ($#($BQ($#($BQ($#($BQ($ v>z46`ݜG36Qr?g9\%%@Qr{U4BmrڭںX?nQX>:J~UmZ'Iz%ӗᘪ^N" Or/ (5kf!#w@뱚JΥpsy InUm[*;"wX\PTSBTl)Pe}RX4K 0X0@S8)Y9Fn%vu5\NGoۙ8UDaՅTiPSGz|Xs;0"9|OmJׯ˜Ns}TۚRZ Qiң4ad==|eƺEpLlSRBת#icn<܋=؈*-9$#m)r'F$I]O;ceͶ(A؄ a5Z iҶ>oDs@FnB.htv+vpՖ!ǟe{7B(T5)sc-|H(%gm|9F >jܢh6pL8IZڢݻP2=8m23@lkI#Qw>S tz}b&W4uϣj\iz 'lO n3g1\e"Uw$vlQ\'pP`, 39>,<b"/'/U8hI"E 1K_ZlGy&sy )G1gc@[ܳ#xp RRYj:/.=>THxוt" |󿚜D#5"P(g ӳ\2Y_n?-to.LmW/aBWb孞K8C% bFzo J{?!Rx9F7($ F!(B!($ F!(B!($ F!(B!($ F- P(EPH [/Oa ^ ;–HyGC͋]ǏHr$X k׋^ņ6iH2$!eE7a$xY|~^;/KC7>y-͡qz6F Qa@R8? 8tgzϦ@$ ^83݁&$ ^8eN~6ꋏC݇exD/Ajf~x; ;&jeU#}5X#qDfg촨ە1W]Goׄ_FO[K׉-C9L,6Aaݦ3ѧe%9 pD7.:n"[@t?ݮTW{v~~ d?\vZ֑GvtW%sI|!vgJnDu!"틏Ki_u$$T_ |Ly=V]bR;{|g{vݞ-vd7-} %.$xxeij#)觓TUk94%7!&+-}`6d@_jFąm6nd*qKF'\[8gycO/sq/=K:l0yl]io7sJpXO=:yɋ\ڥmIÃ,9t^5 B!v]{hWNLܗU(Oj*=̠ԌL#عN qd\̥n(`vmjL'"x—^G[w{.JȤ_}䃻d rӛ$is@pHݖ{쩏V#8w~ΧlXG-)p)昺(}19q*Mh[du-,:UF]I]S}7LB׭T݅E|.e2]N,%?Rt{w? #0V) 8E&ͺUEG|~2> G}~'/BZ\t& kC de+RcYf ,aLd| ZxYg)u7|֜V ;h97(FaFR~."rӚqޘpilIO9w'|]5lt\̟&4RTfBGE5u#H0ԥ#}e|ޒm|"f5A=/טͻ֭մe}؛۳[݇I؄WΕ(ğx⼨#߅07קݶޝuؽFIΫöh߸6ܶޏWFe{ϫ佧+յޅӸцũzۉ~Ì%FRVܨí]۹ڸµ\רrӥ֓oȑ&ĻɶM>8BEBڸ֌ևς_Ҿԇձu݇nلgѤ@vϒjħeqL9BSlGܺpA/ʳ-֬YzШ̶hҴҼS9sbuԞ)b;[Y=F˫JNJ 7UGt dtPEwND.6Aꤖ椶S00ЪCVIDATx]{E!ɼ&$HBHH& I1 †` @@^.@>DTVA@V꺢Uﺊ^u?㞪:U]3$MIQsNשǯr!r!ڑ0;$l\eWoXὯ|&1-1Z>9+U!a'ZбeI-b]h6T(Ȓ5p]ecI%tC?[.FjhX M6 BKF2q ha$ܛץ\_\w* tdO_ӿፆѫA~x64LoC}nl6tCõI``_ϩXݬ74,exFɍ_w'G+8˷5'd@>] I*.$ӤIG"9 L>Ȅד DO,n z! Py92\s6~k 6l>kl`ݟ #Yt.^xa񥃠c2i/zMixZAdX2$E > tU'9d 20c7*C6A +ϔZldh0a[ % UE7QRBъ٘\<=+MiDpn Ef;ߡE`)aↆrv!$ zͤD62vfҸ40ӆ $*TOA0If"LZr$"a&Kf/!Bm1I dqRse0q/{'ox ѯ}nmx㚶Jt{M02 z91l"זn({?'`fuM##'C0@J֬n~+ϡ9:22,Tvs*|H9jV]}饛ޑ=K _zCnBۜNEUL+Dƅd~7y? ĥU= f'qș#71,*{d;dd6c9۾idb|6XL0rY7ܹɡtlnjF.UPmա| 2sϦ0DL Х T,DžA)pBwdgk _MT #Tpܴ?FPWFOp|zg埾o<_nXLE\Y"CPt.ph(Ƅu/yE gk]8{ώtDK aF&y9ۡP\sՖieSJ@`gjnj5ISLP'h:5:ϥ`gpȡ6쯓'O$2R&so) Y =6>bUq 5K|>ۣ:[r>ߚNg e˫fdT@ld̨A02MӏYNgAPeXۃ*55b{A֕obtN @2 A78Ԃ1Gͤ`+C3ePK,3t><*tCѯ&a7WO(Cg32 A78=m0`_35sP k f f lOW}dΉg$` S}3$jCr 9$~C'P0m=GG|AhuV?01 By;Y-+<8Dy}8w9 θGϜ0¡dv+- s8ݬ\p) Ӽ<;},(0;ӇՓz^{@I[[EW2qwp"d`q DOrZs=Y &YxE!@42GwGf x."C#IOf>@k@f |K) D(SUG,=myAM̠I\5LZ.eI../͵E* ] ^/Rz簑ʄ&*5%IIUE. Pba~  =}{nHҟw+Depm4k'Wp gs܉q1O&Qdxm/0#\\kSc2$׮`@P\Oz"*c \eceO\DvJaJBr$h%uu L!K|>=Bg/yJ)yd] 23He_L?|@-#tX`mw_feσ 5B!">urXczUxK{s˦c`_2ش7{+ݧieoVe/3dq[B;s0ȍU᎔ZI7k`uﶭ_sϿF^H19xd[I5 ᛍ2D3He%K(yC:<0!ݚfP@iޑ=E>$B8QH' O&qЍ瑥Bx\,]5Ǧj> ɘ^/!Sq}e|Ʃ5 %({u!酀. "-JBYdv@Y0UAGJ mI7}z,B&J7PG.=1~e>bgdgb"fŻLB+C:$L$nMT3h#u`$I$B$89mu'ոoc3OAq/ 9pfWrK]1+-NVcϒs*%( sڕD|]TTT"*ܑRs ҷtQpkʐo64OOZDeDL38 72А!ÕaS+W dt:C߳7YaԸ$ \m0.c… +.p Ī ,NQ:2@'IwsJH&GMx\'+>K%e}NyU#dH.m6NŏQSL %24g@e7Ӄ$C(f^2,ʰ0ª gh>1-5)lIbfxSD^T2SC.$'U$Wv*M%c]-G4x\6$"(Ug^H&@L*}Zt p ,n&qe`f$yJdOfR}424g@e0|OJhŧ>EGhw!4`QYmΦY!"Γ^+٬)] t-ƥSY[ݴs @k;;6f {l]+ NKe.i Srtˑ$2wȺ%zrߥm6x1%'<ض4xWWh JO3EDKU62[E%. |y7 x8Pn,LVTK2n|< Cogfl>v^N"(9/ #9ߘK)êh5 -?j"ĺoTmwэU7+swjt~)n ߬Ias$SgF7TLScYkZ9V V$X~nr- dG6la .XJr}T3T&4BEǖWGh'}^z!{Tk4X}.x+G&[:ߒ Nc,G"Ž ⒅Kc2|Б?|}Pe _~zJy mg WJߟ20WM:uoat#K$ 2(pʰ}_N.Rp*pN$ЖxZB<~(i@/{}u4)%Eui$J"+b><;OW..AT/~>nC9.C ,RsТ XH!Ը@RnWG WϫI/~(i@/{~`A+ƲGYgd?2z$Op~ߕ+Ė@mԃx k㈴^~.dBw>E)$|+sT'r0,W;Z%СU13'~'h;eh <~~5 exR_@edS$G67j[Su2dY?8<̏ <44d~ǎAϫ5Y~^o +sov(O)rcU#V,2\y;)ʦR^5ؖxT<4=I}1 YIIL2d's<#<a`l?x..8l>~e!x@ +,B3BH& :RjdhP{(@ItQ+áU'G[- R#at'>se92W<.AcqʉeqhfnG0s0~ْKg#x@L*~zŁN_"&V;32?ׂ$q&xו/{R,K*K)~ 82KݗG,@psW;t}Cm O*PpPRX|2;hʀ=efRb&NS녚-f{TDI*P~f>ROL T7Ih f-i]22 7$IHX~@@^~:=~S׳r~q⩺2 \XF~<+^ nw> ǮQSU: Ǝ 0nraוǾO뚃t}}J S#mJ)JUAGA@A;01&x%ۼ "x(i@/{'1I#`yXʀqKx|j|0@o@1˙8q|`9x"YP@K8j(dR xU#KCAd?+oϐ˾=j{(_f `lp^Vjͳp8~?vb-T(F)sn%Ft`_M:T9xҏӹꊤC O?u9do :~LT_(A ¡6>c 0>(:({#6( tю]L\ŠBA jѡ4/@__׆y!O긑cg c/><,W1(PbsÅҏ\i2Ttf {s¯WeMCLfa>N|Edu@< ˗^>X1K/'y}:Y4ɬW}! :ʈdaM')  z?ʠ_}6MK8QDay k|&D .ktA?y DRFT_t1{VBOzoX9$ h 2 _aJs֤ ޜI۞%Fy":Xt2ԑg9_ŀ>zty}֓z>4flSEp̓̎xѼ^ ?Rk08ѭ0k?œQ s?@W1e /-o9VWW7=2OPWcKtO)^Ki -CaT޹KTت xΎ2܌դA*zȪ|ReFw=74eHT /|@l3.V43~%~kQ-\0}ɻR } 7&s%wA^haJ?4'MwP>:Xl:O+:~{M4a 5`d|@rI.WV ?M6dzAaXD\րAptGI4KFF΍gp:C9C nq^5p@R )gGu<8fC`#Źў?c1>|֧̈ET2vq*|Q+[<7jۗbiջW5'/*6%ikBʌ@׾)ty*e7+4C34NRHTN+aϹw}6Cz(8hWV fAθ\E}QhI;ABʌ5Xp޻a^e{qڻ:1|idHqvX@6G,72 [9U)݆Z6HD#/EkBq;M(/:6%~A-h 1sC` dӅ}tC*{>Uu@ⶼ&Kdi\7`\|<0W>X9 r'gP ɘ3^r)Y>bղg/"ge]96};2cm7.׮8!)5)OA~ȝNe'8^u@CL6ӓ`)1\/vA~X qrRFZѺqp])::E~2=]A(SoQLMgdIbVY>a)z4ǝK |؂QlE .q)Cx>p,uHA(;]x |amв.1tӳe\a4skjxLew .txr6~ɊRIDe@~t b2׍Ps>?48bVe`#2Hڵe:`^R[$LObQAbcAg$Me-(Vi]`k46#t5y<5ǣqC02K$7=~pz4E2`&e {5}L|6cIa+ c!{2=Leze|ɸ$NԌ[G,k[<< Ludgq82e.NvNV[Y3I/S4PԸ0}諙IJ~" fID)Za9%WLNKa/w T$ڂQlֵTZ(M q(5&Я+!}3zl(6gŏʬʠņ^ol%z7ަ'>v/ѵX~`̼fFqS5:`ݵ rI ~2`&u<;E?;w 8kd'AZ\nЉhQ!Rr~X&ђ`)z wO3'('7HD\N&؂Qu[+-6ǡ;Dg'PЁlF#V<_ZJNAk@ŌWccѸ FX~s-N;`eg@6N2*B0cB}<7k _:8^>_x;) HZGDv\ 9ymbT8OV"?]ˊ ٖ:pydJΏ)LK"U+ d&-7HDkZA Z=*KֵVW6QmfOa K.^ ṇș֊1+1RhѮM3l3-39s=]?ELSQGigOFc+u<cرp8s:ہ58hw0qS;\XZM嫀R UbJe?R^7_9 ՖxQMv7ľ:܉[wT@`2_4)($7< )B℣̘*;;5NJۯDLcH 0%%,40B -k {Z߾,RKhqzM>>c_I Ƃv3L(Xw7G֘w1/uM`7ek_ gtz'#å61Keͺra#y$44^@U1;,\pԨ-ѲwyjFn 5N?CGA6ˣs~+#mg WJL榃#Eϣo1TV*P0jzGSp}%9ZfKflZ<lC/ pgKN%PrLhi|8vV<:~y;yxJ!PC:htk#mԡ%9D34Pk~R6ӻr/LIJ2mU猃x=R/II)э%"hy'$7a9pguW*F vE~Pp܆x?~ 7},}WwrfX[@2ʷ1'00_lJ|P{d!MzP#`Uy"&ymz$txFNho8>='D.|bGiq@sgN%0p9F ebݱYEvl&c&8 ֖Le3*A}yB.S3%0ehMXF҈ tvʰ@<%twM o4-;zf3c_?B[k8cĚ}#J1GX"JV {w`*mGCxJngqGJYO}oԶ['@xii)IebݱY1hZ )PN-E`\eSf _mK<*CKn:P>}M.7f#tbpķ :YOIL["Q8X1,|7FLc  yg,\8@:9Y8Rj6?Kf[B4A?xn' &?*<2EݱY51*ɚvqQqe>2lTA2:_uxux tTh-{=1jY|"=H38t^K3aVғepgX/#I'sʐoΘR:{(SXʟ7-b]$I|@Ǭi ;r^N}d@~(1LeHP3,*-IT'.(ï3ZqӁ93ZT@t}1#5<]nO8tDwdoA.~Km6]U޴7d:[2p>t_ d앱H cex\30uiЈe/j>\x2Ue("q3jor_]YZE VJ W"Lj NšֳR\^j%RrД҂%P%ڎH-dAq#mL`;vee9xR;~Ns~z)8/OKTRj[b"IX4E-qZe&hCޣ]Xn r>e0ϭȏ FiKO 9y)XY*)٧,%V}@LrKwH-d)=1.LrdClG$7p Xmc?O)x^$Oͻy" /EvqLI~sV)H*-[#h->^4j[&IŢ,"%'ƅiV+Cv>= ;(eҥ&Z3჻`w_P~}/^eI=sG{ {1s-!x J7k+"Glnj 7Кw=Ꙙs95߽\wS= [Nϸ0,h' 8[Q4Sb J7믛3`˘D (.c ɝt9Ll\e>z'n* wBSO=֑&P@,ˢqV+YW(^#]n4(RC FS?&/\"H8:w2-WPjji۬mN珣j!r!r3po3Ť0#֊ׇ)<邃gx{YLb_?]@2Lj.MS@ V)cVx0w3.g`R$[d =KeQ@5%&~,-Ifr'P ݗ?9W3^Ex! Qcqޭ";+gzx 8& -ӵH(/}g,.y/o~:fG~Ρ K{b@;)DƒE4P9PL"ZJ12`y]ȡs(gxo]Z|!D0!jMd;}>^'PJ tYܙaC`)ܬevFr 9C9PWɓ+ Ld[j- *)T1z3Ca".l[$;]h[wUaB鵡g ey/&R}qE8dChKVt*AexdTzR1`4UO?j^#ئxFAud\起ޥL Yf9yW\dk_1$x[㲫#wv kKוt7 cG6DM}{&96KgBܛgo7wYbMrSIfe ~26Ũ77ͫgrjvR A #3(C*=>&Sԋ`2yWyK'⽏ i MK8QD˼A\yVgj8@NQTsEy$%),DRyK_~Y 6kv$~?{$ ?m;0gĂ0gXfR)Ceh<1)_L{L\ީ#mXiMfI1_c'ƮU )XeaOiL߿*Ҟa'|  2e}9M(CΧ- *>34XLҠg՘˒O8}+Şto.8a.DȀ|D~Ҝ5))F~ZtaKjvx12ܑ1Gͤ`+CƎ̠æGWM/mlҨz>ah;|Q#^4Z@LDŽ)TC~e| Kv$~_5:?$s&+Yogc4鎔S`n钿ѣ ]Ir!r!:%qN8ԉkȉŀIENDB`capistrano-capistrano-603c346/docs/assets/js/000077500000000000000000000000001520217215100211325ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/assets/js/foundation.min.js000066400000000000000000002314071520217215100244270ustar00rootroot00000000000000/* * Foundation Responsive Library * http://foundation.zurb.com * Copyright 2013, ZURB * Free to use under the MIT license. * http://www.opensource.org/licenses/mit-license.php */ /*jslint unparam: true, browser: true, indent: 2 */ // Accommodate running jQuery or Zepto in noConflict() mode by // using an anonymous function to redefine the $ shorthand name. // See http://docs.jquery.com/Using_jQuery_with_Other_Libraries // and http://zeptojs.com/ var libFuncName=null;if(typeof jQuery=="undefined"&&typeof Zepto=="undefined"&&typeof $=="function")libFuncName=$;else if(typeof jQuery=="function")libFuncName=jQuery;else{if(typeof Zepto!="function")throw new TypeError;libFuncName=Zepto}(function(e,t,n,r){"use strict";t.matchMedia=t.matchMedia||function(e,t){var n,r=e.documentElement,i=r.firstElementChild||r.firstChild,s=e.createElement("body"),o=e.createElement("div");return o.id="mq-test-1",o.style.cssText="position:absolute;top:-100em",s.style.background="none",s.appendChild(o),function(e){return o.innerHTML='­',r.insertBefore(s,i),n=o.offsetWidth===42,r.removeChild(s),{matches:n,media:e}}}(n),Array.prototype.filter||(Array.prototype.filter=function(e){if(this==null)throw new TypeError;var t=Object(this),n=t.length>>>0;if(typeof e!="function")return;var r=[],i=arguments[1];for(var s=0;s>>0;if(n===0)return-1;var r=0;arguments.length>1&&(r=Number(arguments[1]),r!=r?r=0:r!=0&&r!=Infinity&&r!=-Infinity&&(r=(r>0||-1)*Math.floor(Math.abs(r))));if(r>=n)return-1;var i=r>=0?r:Math.max(n-Math.abs(r),0);for(;i0)for(var l=u.length-1;l>=0;l--)f.push(this.init_lib(u[l],a))}else{/reflow/i.test(n)&&(a[1]="reflow");for(var c in this.libs)f.push(this.init_lib(c,a))}return typeof n=="function"&&a.unshift(n),this.response_obj(f,a)},response_obj:function(e,t){for(var n=0,r=t.length;n=0;r--)this.lib_methods.hasOwnProperty(n[r])&&(this.libs[e.name][n[r]]=this.lib_methods[n[r]])},random_str:function(e){var t="0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz".split("");e||(e=Math.floor(Math.random()*t.length));var n="";for(var r=0;r=0;r--)i=s[r].split(":"),/true/i.test(i[1])&&(i[1]=!0),/false/i.test(i[1])&&(i[1]=!1),u(i[1])&&(i[1]=parseInt(i[1],10)),i.length===2&&i[0].length>0&&(n[a(i[0])]=a(i[1]));return n},delay:function(e,t){return setTimeout(e,t)},scrollTo:function(n,r,i){if(i<0)return;var s=r-e(t).scrollTop(),o=s/i*10;this.scrollToTimerCache=setTimeout(function(){isNaN(parseInt(o,10))||(t.scrollTo(0,e(t).scrollTop()+o),this.scrollTo(n,r,i-10))}.bind(this),10)},scrollLeft:function(e){if(!e.length)return;return"scrollLeft"in e[0]?e[0].scrollLeft:e[0].pageXOffset},empty:function(e){if(e.length&&e.length>0)return!1;if(e.length&&e.length===0)return!0;for(var t in e)if(hasOwnProperty.call(e,t))return!1;return!0}},fix_outer:function(e){e.outerHeight=function(e,t){return typeof Zepto=="function"?e.height():typeof t!="undefined"?e.outerHeight(t):e.outerHeight()},e.outerWidth=function(e){return typeof Zepto=="function"?e.width():typeof bool!="undefined"?e.outerWidth(bool):e.outerWidth()}},error:function(e){return e.name+" "+e.message+"; "+e.more},off:function(){return e(this.scope).off(".fndtn"),e(t).off(".fndtn"),!0},zj:function(){return typeof Zepto!="undefined"?Zepto:jQuery}()},e.fn.foundation=function(){var e=Array.prototype.slice.call(arguments,0);return this.each(function(){return Foundation.init.apply(Foundation,[this].concat(e)),this})}})(libFuncName,this,this.document),function(e,t,n,r){"use strict";Foundation.libs.interchange={name:"interchange",version:"4.2.2",cache:{},settings:{load_attr:"interchange",named_queries:{"default":"only screen and (min-width: 1px)",small:"only screen and (min-width: 768px)",medium:"only screen and (min-width: 1280px)",large:"only screen and (min-width: 1440px)",landscape:"only screen and (orientation: landscape)",portrait:"only screen and (orientation: portrait)",retina:"only screen and (-webkit-min-device-pixel-ratio: 2),only screen and (min--moz-device-pixel-ratio: 2),only screen and (-o-min-device-pixel-ratio: 2/1),only screen and (min-device-pixel-ratio: 2),only screen and (min-resolution: 192dpi),only screen and (min-resolution: 2dppx)"},directives:{replace:function(e,t){if(/IMG/.test(e[0].nodeName)){var n=t.split("/"),r=n[n.length-1],i=e[0].src;if((new RegExp(r,"i")).test(e[0].src))return;return e[0].src=t,e.trigger("replace",[e[0].src,i])}}}},init:function(t,n,r){return Foundation.inherit(this,"throttle"),typeof n=="object"&&e.extend(!0,this.settings,n),this.events(),this.images(),typeof n!="string"?this.settings.init:this[n].call(this,r)},events:function(){var n=this;e(t).on("resize.fndtn.interchange",n.throttle(function(){n.resize.call(n)},50))},resize:function(){var e=this.cache;for(var t in e)if(e.hasOwnProperty(t)){var n=this.results(t,e[t]);n&&this.settings.directives[n.scenario[1]](n.el,n.scenario[0])}},results:function(t,n){var r=n.length,i=[];if(r>0){var s=e('[data-uuid="'+t+'"]');for(var o=r-1;o>=0;o--){var u=n[o][2];if(this.settings.named_queries.hasOwnProperty(u))var a=matchMedia(this.settings.named_queries[u]);else var a=matchMedia(n[o][2]);if(a.matches)return{el:s,scenario:n[o]}}}return!1},images:function(e){return typeof this.cached_images=="undefined"||e?this.update_images():this.cached_images},update_images:function(){var t=n.getElementsByTagName("img"),r=t.length,i="data-"+this.settings.load_attr;this.cached_images=[];for(var s=r-1;s>=0;s--)this.loaded(e(t[s]),s===0,function(e,t){if(e){var n=e.getAttribute(i)||"";n.length>0&&this.cached_images.push(e)}t&&this.enhance()}.bind(this));return"deferred"},loaded:function(e,t,n){function r(){n(e[0],t)}function i(){this.one("load",r);if(/MSIE (\d+\.\d+);/.test(navigator.userAgent)){var e=this.attr("src"),t=e.match(/\?/)?"&":"?";t+="random="+(new Date).getTime(),this.attr("src",e+t)}}if(!e.attr("src")){r();return}e[0].complete||e[0].readyState===4?r():i.call(e)},enhance:function(){var n=this.images().length;for(var r=n-1;r>=0;r--)this._object(e(this.images()[r]));return e(t).trigger("resize")},parse_params:function(e,t,n){return[this.trim(e),this.convert_directive(t),this.trim(n)]},convert_directive:function(e){var t=this.trim(e);return t.length>0?t:"replace"},_object:function(e){var t=this.parse_data_attr(e),n=[],r=t.length;if(r>0)for(var i=r-1;i>=0;i--){var s=t[i].split(/\((.*?)(\))$/);if(s.length>1){var o=s[0].split(","),u=this.parse_params(o[0],o[1],s[1]);n.push(u)}}return this.store(e,n)},uuid:function(e){function n(){return((1+Math.random())*65536|0).toString(16).substring(1)}var t=e||"-";return n()+n()+t+n()+t+n()+t+n()+t+n()+n()+n()},store:function(e,t){var n=this.uuid(),r=e.data("uuid");return r?this.cache[r]:(e.attr("data-uuid",n),this.cache[n]=t)},trim:function(t){return typeof t=="string"?e.trim(t):t},parse_data_attr:function(e){var t=e.data(this.settings.load_attr).split(/\[(.*?)\]/),n=t.length,r=[];for(var i=n-1;i>=0;i--)t[i].replace(/[\W\d]+/,"").length>4&&r.push(t[i]);return r},reflow:function(){this.images(!0)}}}(Foundation.zj,this,this.document),function(e,t,n,r){"use strict";Foundation.libs.dropdown={name:"dropdown",version:"4.2.0",settings:{activeClass:"open",is_hover:!1,opened:function(){},closed:function(){}},init:function(t,n,r){return this.scope=t||this.scope,Foundation.inherit(this,"throttle scrollLeft data_options"),typeof n=="object"&&e.extend(!0,this.settings,n),typeof n!="string"?(this.settings.init||this.events(),this.settings.init):this[n].call(this,r)},events:function(){var n=this;e(this.scope).on("click.fndtn.dropdown","[data-dropdown]",function(t){var r=e.extend({},n.settings,n.data_options(e(this)));t.preventDefault(),r.is_hover||n.toggle(e(this))}).on("mouseenter","[data-dropdown]",function(t){var r=e.extend({},n.settings,n.data_options(e(this)));r.is_hover&&n.toggle(e(this))}).on("mouseleave","[data-dropdown-content]",function(t){var r=e('[data-dropdown="'+e(this).attr("id")+'"]'),i=e.extend({},n.settings,n.data_options(r));i.is_hover&&n.close.call(n,e(this))}).on("opened.fndtn.dropdown","[data-dropdown-content]",this.settings.opened).on("closed.fndtn.dropdown","[data-dropdown-content]",this.settings.closed),e("body").on("click.fndtn.dropdown",function(t){var r=e(t.target).closest("[data-dropdown-content]");if(e(t.target).data("dropdown"))return;if(r.length>0&&(e(t.target).is("[data-dropdown-content]")||e.contains(r.first()[0],t.target))){t.stopPropagation();return}n.close.call(n,e("[data-dropdown-content]"))}),e(t).on("resize.fndtn.dropdown",n.throttle(function(){n.resize.call(n)},50)).trigger("resize"),this.settings.init=!0},close:function(t){var n=this;t.each(function(){e(this).hasClass(n.settings.activeClass)&&(e(this).css(Foundation.rtl?"right":"left","-99999px").removeClass(n.settings.activeClass),e(this).trigger("closed"))})},open:function(e,t){this.css(e.addClass(this.settings.activeClass),t),e.trigger("opened")},toggle:function(t){var n=e("#"+t.data("dropdown"));this.close.call(this,e("[data-dropdown-content]").not(n)),n.hasClass(this.settings.activeClass)?this.close.call(this,n):(this.close.call(this,e("[data-dropdown-content]")),this.open.call(this,n,t))},resize:function(){var t=e("[data-dropdown-content].open"),n=e("[data-dropdown='"+t.attr("id")+"']");t.length&&n.length&&this.css(t,n)},css:function(n,r){var i=n.offsetParent();if(i.length>0&&/body/i.test(n.offsetParent()[0].nodeName)){var s=r.offset();s.top-=n.offsetParent().offset().top,s.left-=n.offsetParent().offset().left}else var s=r.position();if(this.small())n.css({position:"absolute",width:"95%",left:"2.5%","max-width":"none",top:s.top+this.outerHeight(r)});else{if(!Foundation.rtl&&e(t).width()>this.outerWidth(n)+r.offset().left){var o=s.left;n.hasClass("right")&&n.removeClass("right")}else{n.hasClass("right")||n.addClass("right");var o=s.left-(this.outerWidth(n)-this.outerWidth(r))}n.attr("style","").css({position:"absolute",top:s.top+this.outerHeight(r),left:o})}return n},small:function(){return e(t).width()<768||e("html").hasClass("lt-ie9")},off:function(){e(this.scope).off(".fndtn.dropdown"),e("html, body").off(".fndtn.dropdown"),e(t).off(".fndtn.dropdown"),e("[data-dropdown-content]").off(".fndtn.dropdown"),this.settings.init=!1},reflow:function(){}}}(Foundation.zj,this,this.document),function(e,t,n){function f(e){var t={},r=/^jQuery\d+$/;return n.each(e.attributes,function(e,n){n.specified&&!r.test(n.name)&&(t[n.name]=n.value)}),t}function l(e,r){var i=this,s=n(i);if(i.value==s.attr("placeholder")&&s.hasClass("placeholder"))if(s.data("placeholder-password")){s=s.hide().next().show().attr("id",s.removeAttr("id").data("placeholder-id"));if(e===!0)return s[0].value=r;s.focus()}else i.value="",s.removeClass("placeholder"),i==t.activeElement&&i.select()}function c(){var e,t=this,r=n(t),i=r,s=this.id;if(t.value==""){if(t.type=="password"){if(!r.data("placeholder-textinput")){try{e=r.clone().attr({type:"text"})}catch(o){e=n("").attr(n.extend(f(this),{type:"text"}))}e.removeAttr("name").data({"placeholder-password":!0,"placeholder-id":s}).bind("focus.placeholder",l),r.data({"placeholder-textinput":e,"placeholder-id":s}).before(e)}r=r.removeAttr("id").hide().prev().attr("id",s).show()}r.addClass("placeholder"),r[0].value=r.attr("placeholder")}else r.removeClass("placeholder")}var r="placeholder"in t.createElement("input"),i="placeholder"in t.createElement("textarea"),s=n.fn,o=n.valHooks,u,a;r&&i?(a=s.placeholder=function(){return this},a.input=a.textarea=!0):(a=s.placeholder=function(){var e=this;return e.filter((r?"textarea":":input")+"[placeholder]").not(".placeholder").bind({"focus.placeholder":l,"blur.placeholder":c}).data("placeholder-enabled",!0).trigger("blur.placeholder"),e},a.input=r,a.textarea=i,u={get:function(e){var t=n(e);return t.data("placeholder-enabled")&&t.hasClass("placeholder")?"":e.value},set:function(e,r){var i=n(e);return i.data("placeholder-enabled")?(r==""?(e.value=r,e!=t.activeElement&&c.call(e)):i.hasClass("placeholder")?l.call(e,!0,r)||(e.value=r):e.value=r,i):e.value=r}},r||(o.input=u),i||(o.textarea=u),n(function(){n(t).delegate("form","submit.placeholder",function(){var e=n(".placeholder",this).each(l);setTimeout(function(){e.each(c)},10)})}),n(e).bind("beforeunload.placeholder",function(){n(".placeholder").each(function(){this.value=""})}))}(this,document,Foundation.zj),function(e,t,n,r){"use strict";Foundation.libs.placeholder={name:"placeholder",version:"4.2.2",init:function(n,r,i){this.scope=n||this.scope,typeof r!="string"&&(t.onload=function(){e("input, textarea").placeholder()})}}}(Foundation.zj,this,this.document),function(e,t,n,r){"use strict";Foundation.libs.forms={name:"forms",version:"4.2.2",cache:{},settings:{disable_class:"no-custom",last_combo:null},init:function(t,n,r){return typeof n=="object"&&e.extend(!0,this.settings,n),typeof n!="string"?(this.settings.init||this.events(),this.assemble(),this.settings.init):this[n].call(this,r)},assemble:function(){e('form.custom input[type="radio"]',e(this.scope)).not('[data-customforms="disabled"]').not("."+this.settings.disable_class).each(this.append_custom_markup),e('form.custom input[type="checkbox"]',e(this.scope)).not('[data-customforms="disabled"]').not("."+this.settings.disable_class).each(this.append_custom_markup),e("form.custom select",e(this.scope)).not('[data-customforms="disabled"]').not("."+this.settings.disable_class).not("[multiple=multiple]").each(this.append_custom_select)},events:function(){var r=this;e(this.scope).on("click.fndtn.forms","form.custom span.custom.checkbox",function(t){t.preventDefault(),t.stopPropagation(),r.toggle_checkbox(e(this))}).on("click.fndtn.forms","form.custom span.custom.radio",function(t){t.preventDefault(),t.stopPropagation(),r.toggle_radio(e(this))}).on("change.fndtn.forms","form.custom select",function(t,n){if(!e(this).not('[data-customforms="disabled"])'))return;r.refresh_custom_select(e(this),n)}).on("click.fndtn.forms","form.custom label",function(t){if(e(t.target).is("label")){var n=e("#"+r.escape(e(this).attr("for"))).not('[data-customforms="disabled"]'),i,s;n.length!==0&&(n.attr("type")==="checkbox"?(t.preventDefault(),i=e(this).find("span.custom.checkbox"),i.length===0&&(i=n.add(this).siblings("span.custom.checkbox").first()),r.toggle_checkbox(i)):n.attr("type")==="radio"&&(t.preventDefault(),s=e(this).find("span.custom.radio"),s.length===0&&(s=n.add(this).siblings("span.custom.radio").first()),r.toggle_radio(s)))}}).on("mousedown.fndtn.forms","form.custom div.custom.dropdown",function(){return!1}).on("click.fndtn.forms","form.custom div.custom.dropdown a.current, form.custom div.custom.dropdown a.selector",function(t){var n=e(this),s=n.closest("div.custom.dropdown"),o=i(s,"select");s.hasClass("open")||e(r.scope).trigger("click"),t.preventDefault();if(!1===o.is(":disabled"))return s.toggleClass("open"),s.hasClass("open")?e(r.scope).on("click.fndtn.forms.customdropdown",function(){s.removeClass("open"),e(r.scope).off(".fndtn.forms.customdropdown")}):e(r.scope).on(".fndtn.forms.customdropdown"),!1}).on("click.fndtn.forms touchend.fndtn.forms","form.custom div.custom.dropdown li",function(t){var n=e(this),r=n.closest("div.custom.dropdown"),s=i(r,"select"),o=0;t.preventDefault(),t.stopPropagation();if(!e(this).hasClass("disabled")){e("div.dropdown").not(r).removeClass("open");var u=n.closest("ul").find("li.selected");u.removeClass("selected"),n.addClass("selected"),r.removeClass("open").find("a.current").text(n.text()),n.closest("ul").find("li").each(function(e){n[0]===this&&(o=e)}),s[0].selectedIndex=o,s.data("prevalue",u.html()),s.trigger("change")}}),e(t).on("keydown",function(t){var r=n.activeElement,i=Foundation.libs.forms,s=e(".custom.dropdown.open");if(s.length>0){t.preventDefault(),t.which===13&&s.find("li.selected").trigger("click"),t.which===27&&s.removeClass("open");if(t.which>=65&&t.which<=90){var o=i.go_to(s,t.which),u=s.find("li.selected");o&&(u.removeClass("selected"),i.scrollTo(o.addClass("selected"),300))}if(t.which===38){var u=s.find("li.selected"),a=u.prev(":not(.disabled)");a.length>0&&(a.parent()[0].scrollTop=a.parent().scrollTop()-i.outerHeight(a),u.removeClass("selected"),a.addClass("selected"))}else if(t.which===40){var u=s.find("li.selected"),o=u.next(":not(.disabled)");o.length>0&&(o.parent()[0].scrollTop=o.parent().scrollTop()+i.outerHeight(o),u.removeClass("selected"),o.addClass("selected"))}}}),this.settings.init=!0},go_to:function(e,t){var n=e.find("li"),r=n.length;if(r>0)for(var i=0;i').insertAfter(r)),s.toggleClass("checked",r.is(":checked")),s.toggleClass("disabled",r.is(":disabled"))},append_custom_select:function(t,n){var r=Foundation.libs.forms,i=e(n),s=i.next("div.custom.dropdown"),o=s.find("ul"),u=s.find(".current"),a=s.find(".selector"),f=i.find("option"),l=f.filter(":selected"),c=i.attr("class")?i.attr("class").split(" "):[],h=0,p="",d,v=!1;if(s.length===0){var m=i.hasClass("small")?"small":i.hasClass("medium")?"medium":i.hasClass("large")?"large":i.hasClass("expand")?"expand":"";s=e('

    '),a=s.find(".selector"),o=s.find("ul"),p=f.map(function(){var t=e(this).attr("class")?e(this).attr("class"):"";return"
  • "+e(this).html()+"
  • "}).get().join(""),o.append(p),v=s.prepend(''+l.html()+"").find(".current"),i.after(s).addClass("hidden-field")}else p=f.map(function(){return"
  • "+e(this).html()+"
  • "}).get().join(""),o.html("").append(p);r.assign_id(i,s),s.toggleClass("disabled",i.is(":disabled")),d=o.find("li"),r.cache[s.data("id")]=d.length,f.each(function(t){this.selected&&(d.eq(t).addClass("selected"),v&&v.html(e(this).html())),e(this).is(":disabled")&&d.eq(t).addClass("disabled")});if(!s.is(".small, .medium, .large, .expand")){s.addClass("open");var r=Foundation.libs.forms;r.hidden_fix.adjust(o),h=r.outerWidth(d)>h?r.outerWidth(d):h,Foundation.libs.forms.hidden_fix.reset(),s.removeClass("open")}},assign_id:function(e,t){var n=[+(new Date),Foundation.random_str(5)].join("-");e.attr("data-id",n),t.attr("data-id",n)},refresh_custom_select:function(t,n){var r=this,i=0,s=t.next(),o=t.find("option"),u=s.find("li");if(u.length!==this.cache[s.data("id")]||n)s.find("ul").html(""),o.each(function(){var t=e("
  • "+e(this).html()+"
  • ");s.find("ul").append(t)}),o.each(function(t){this.selected&&(s.find("li").eq(t).addClass("selected"),s.find(".current").html(e(this).html())),e(this).is(":disabled")&&s.find("li").eq(t).addClass("disabled")}),s.removeAttr("style").find("ul").removeAttr("style"),s.find("li").each(function(){s.addClass("open"),r.outerWidth(e(this))>i&&(i=r.outerWidth(e(this))),s.removeClass("open")}),u=s.find("li"),this.cache[s.data("id")]=u.length},toggle_checkbox:function(e){var t=e.prev(),n=t[0];!1===t.is(":disabled")&&(n.checked=n.checked?!1:!0,e.toggleClass("checked"),t.trigger("change"))},toggle_radio:function(e){var t=e.prev(),n=t.closest("form.custom"),r=t[0];!1===t.is(":disabled")&&(n.find('input[type="radio"][name="'+this.escape(t.attr("name"))+'"]').next().not(e).removeClass("checked"),e.hasClass("checked")||e.toggleClass("checked"),r.checked=e.hasClass("checked"),t.trigger("change"))},escape:function(e){return e?e.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"):""},hidden_fix:{tmp:[],hidden:null,adjust:function(t){var n=this;n.hidden=t.parents(),n.hidden=n.hidden.add(t).filter(":hidden"),n.hidden.each(function(){var t=e(this);n.tmp.push(t.attr("style")),t.css({visibility:"hidden",display:"block"})})},reset:function(){var t=this;t.hidden.each(function(n){var i=e(this),s=t.tmp[n];s===r?i.removeAttr("style"):i.attr("style",s)}),t.tmp=[],t.hidden=null}},off:function(){e(this.scope).off(".fndtn.forms")},reflow:function(){}};var i=function(t,n){var t=t.prev();while(t.length){if(t.is(n))return t;t=t.prev()}return e()}}(Foundation.zj,this,this.document),function(e,t,n,r){"use strict";Foundation.libs.alerts={name:"alerts",version:"4.2.2",settings:{speed:300,callback:function(){}},init:function(t,n,r){return this.scope=t||this.scope,typeof n=="object"&&e.extend(!0,this.settings,n),typeof n!="string"?(this.settings.init||this.events(),this.settings.init):this[n].call(this,r)},events:function(){var t=this;e(this.scope).on("click.fndtn.alerts","[data-alert] a.close",function(n){n.preventDefault(),e(this).closest("[data-alert]").fadeOut(t.speed,function(){e(this).remove(),t.settings.callback()})}),this.settings.init=!0},off:function(){e(this.scope).off(".fndtn.alerts")},reflow:function(){}}}(Foundation.zj,this,this.document),function(e,t,n,r){"use strict";Foundation.libs.magellan={name:"magellan",version:"4.2.2",settings:{activeClass:"active"},init:function(t,n,r){return this.scope=t||this.scope,Foundation.inherit(this,"data_options"),typeof n=="object"&&e.extend(!0,this.settings,n),typeof n!="string"?(this.settings.init||(this.fixed_magellan=e("[data-magellan-expedition]"),this.set_threshold(),this.last_destination=e("[data-magellan-destination]").last(),this.events()),this.settings.init):this[n].call(this,r)},events:function(){var n=this;e(this.scope).on("arrival.fndtn.magellan","[data-magellan-arrival]",function(t){var r=e(this),i=r.closest("[data-magellan-expedition]"),s=i.attr("data-magellan-active-class")||n.settings.activeClass;r.closest("[data-magellan-expedition]").find("[data-magellan-arrival]").not(r).removeClass(s),r.addClass(s)}),this.fixed_magellan.on("update-position.fndtn.magellan",function(){var t=e(this)}).trigger("update-position"),e(t).on("resize.fndtn.magellan",function(){this.fixed_magellan.trigger("update-position")}.bind(this)).on("scroll.fndtn.magellan",function(){var r=e(t).scrollTop();n.fixed_magellan.each(function(){var t=e(this);typeof t.data("magellan-top-offset")=="undefined"&&t.data("magellan-top-offset",t.offset().top),typeof t.data("magellan-fixed-position")=="undefined"&&t.data("magellan-fixed-position",!1);var i=r+n.settings.threshold>t.data("magellan-top-offset"),s=t.attr("data-magellan-top-offset");t.data("magellan-fixed-position")!=i&&(t.data("magellan-fixed-position",i),i?(t.addClass("fixed"),t.css({position:"fixed",top:0})):(t.removeClass("fixed"),t.css({position:"",top:""})),i&&typeof s!="undefined"&&s!=0&&t.css({position:"fixed",top:s+"px"}))})}),this.last_destination.length>0&&e(t).on("scroll.fndtn.magellan",function(r){var i=e(t).scrollTop(),s=i+e(t).height(),o=Math.ceil(n.last_destination.offset().top);e("[data-magellan-destination]").each(function(){var t=e(this),r=t.attr("data-magellan-destination"),u=t.offset().top-i;u<=n.settings.threshold&&e("[data-magellan-arrival='"+r+"']").trigger("arrival"),s>=e(n.scope).height()&&o>i&&o0?this.outerHeight(this.fixed_magellan,!0):0)},off:function(){e(this.scope).off(".fndtn.magellan")},reflow:function(){}}}(Foundation.zj,this,this.document),function(e,t,n,r){"use strict";Foundation.libs.reveal={name:"reveal",version:"4.2.2",locked:!1,settings:{animation:"fadeAndPop",animationSpeed:250,closeOnBackgroundClick:!0,closeOnEsc:!0,dismissModalClass:"close-reveal-modal",bgClass:"reveal-modal-bg",open:function(){},opened:function(){},close:function(){},closed:function(){},bg:e(".reveal-modal-bg"),css:{open:{opacity:0,visibility:"visible",display:"block"},close:{opacity:1,visibility:"hidden",display:"none"}}},init:function(t,n,r){return Foundation.inherit(this,"data_options delay"),typeof n=="object"?e.extend(!0,this.settings,n):typeof r!="undefined"&&e.extend(!0,this.settings,r),typeof n!="string"?(this.events(),this.settings.init):this[n].call(this,r)},events:function(){var t=this;return e(this.scope).off(".fndtn.reveal").on("click.fndtn.reveal","[data-reveal-id]",function(n){n.preventDefault();if(!t.locked){var r=e(this),i=r.data("reveal-ajax");t.locked=!0;if(typeof i=="undefined")t.open.call(t,r);else{var s=i===!0?r.attr("href"):i;t.open.call(t,r,{url:s})}}}).on("click.fndtn.reveal",this.close_targets(),function(n){n.preventDefault();if(!t.locked){var r=e.extend({},t.settings,t.data_options(e(".reveal-modal.open")));if(e(n.target)[0]===e("."+r.bgClass)[0]&&!r.closeOnBackgroundClick)return;t.locked=!0,t.close.call(t,e(this).closest(".reveal-modal"))}}).on("open.fndtn.reveal",".reveal-modal",this.settings.open).on("opened.fndtn.reveal",".reveal-modal",this.settings.opened).on("opened.fndtn.reveal",".reveal-modal",this.open_video).on("close.fndtn.reveal",".reveal-modal",this.settings.close).on("closed.fndtn.reveal",".reveal-modal",this.settings.closed).on("closed.fndtn.reveal",".reveal-modal",this.close_video),e("body").bind("keyup.reveal",function(n){var r=e(".reveal-modal.open"),i=e.extend({},t.settings,t.data_options(r));n.which===27&&i.closeOnEsc&&r.foundation("reveal","close")}),!0},open:function(t,n){if(t)if(typeof t.selector!="undefined")var r=e("#"+t.data("reveal-id"));else{var r=e(this.scope);n=t}else var r=e(this.scope);if(!r.hasClass("open")){var i=e(".reveal-modal.open");typeof r.data("css-top")=="undefined"&&r.data("css-top",parseInt(r.css("top"),10)).data("offset",this.cache_offset(r)),r.trigger("open"),i.length<1&&this.toggle_bg(r);if(typeof n=="undefined"||!n.url)this.hide(i,this.settings.css.close),this.show(r,this.settings.css.open);else{var s=this,o=typeof n.success!="undefined"?n.success:null;e.extend(n,{success:function(t,n,u){e.isFunction(o)&&o(t,n,u),r.html(t),e(r).foundation("section","reflow"),s.hide(i,s.settings.css.close),s.show(r,s.settings.css.open)}}),e.ajax(n)}}},close:function(t){var t=t&&t.length?t:e(this.scope),n=e(".reveal-modal.open");n.length>0&&(this.locked=!0,t.trigger("close"),this.toggle_bg(t),this.hide(n,this.settings.css.close))},close_targets:function(){var e="."+this.settings.dismissModalClass;return this.settings.closeOnBackgroundClick?e+", ."+this.settings.bgClass:e},toggle_bg:function(t){e(".reveal-modal-bg").length===0&&(this.settings.bg=e("
    ",{"class":this.settings.bgClass}).appendTo("body")),this.settings.bg.filter(":visible").length>0?this.hide(this.settings.bg):this.show(this.settings.bg)},show:function(n,r){if(r){if(/pop/i.test(this.settings.animation)){r.top=e(t).scrollTop()-n.data("offset")+"px";var i={top:e(t).scrollTop()+n.data("css-top")+"px",opacity:1};return this.delay(function(){return n.css(r).animate(i,this.settings.animationSpeed,"linear",function(){this.locked=!1,n.trigger("opened")}.bind(this)).addClass("open")}.bind(this),this.settings.animationSpeed/2)}if(/fade/i.test(this.settings.animation)){var i={opacity:1};return this.delay(function(){return n.css(r).animate(i,this.settings.animationSpeed,"linear",function(){this.locked=!1,n.trigger("opened")}.bind(this)).addClass("open")}.bind(this),this.settings.animationSpeed/2)}return n.css(r).show().css({opacity:1}).addClass("open").trigger("opened")}return/fade/i.test(this.settings.animation)?n.fadeIn(this.settings.animationSpeed/2):n.show()},hide:function(n,r){if(r){if(/pop/i.test(this.settings.animation)){var i={top:-e(t).scrollTop()-n.data("offset")+"px",opacity:0};return this.delay(function(){return n.animate(i,this.settings.animationSpeed,"linear",function(){this.locked=!1,n.css(r).trigger("closed")}.bind(this)).removeClass("open")}.bind(this),this.settings.animationSpeed/2)}if(/fade/i.test(this.settings.animation)){var i={opacity:0};return this.delay(function(){return n.animate(i,this.settings.animationSpeed,"linear",function(){this.locked=!1,n.css(r).trigger("closed")}.bind(this)).removeClass("open")}.bind(this),this.settings.animationSpeed/2)}return n.hide().css(r).removeClass("open").trigger("closed")}return/fade/i.test(this.settings.animation)?n.fadeOut(this.settings.animationSpeed/2):n.hide()},close_video:function(t){var n=e(this).find(".flex-video"),r=n.find("iframe");r.length>0&&(r.attr("data-src",r[0].src),r.attr("src","about:blank"),n.hide())},open_video:function(t){var n=e(this).find(".flex-video"),i=n.find("iframe");if(i.length>0){var s=i.attr("data-src");if(typeof s=="string")i[0].src=i.attr("data-src");else{var o=i[0].src;i[0].src=r,i[0].src=o}n.show()}},cache_offset:function(e){var t=e.show().height()+parseInt(e.css("top"),10);return e.hide(),t},off:function(){e(this.scope).off(".fndtn.reveal")},reflow:function(){}}}(Foundation.zj,this,this.document),function(e,t,n,r){"use strict";Foundation.libs.tooltips={name:"tooltips",version:"4.2.2",settings:{selector:".has-tip",additionalInheritableClasses:[],tooltipClass:".tooltip",appendTo:"body","disable-for-touch":!1,tipTemplate:function(e,t){return''+t+''}},cache:{},init:function(t,n,r){Foundation.inherit(this,"data_options");var i=this;typeof n=="object"?e.extend(!0,this.settings,n):typeof r!="undefined"&&e.extend(!0,this.settings,r);if(typeof n=="string")return this[n].call(this,r);Modernizr.touch?e(this.scope).on("click.fndtn.tooltip touchstart.fndtn.tooltip touchend.fndtn.tooltip","[data-tooltip]",function(t){var n=e.extend({},i.settings,i.data_options(e(this)));n["disable-for-touch"]||(t.preventDefault(),e(n.tooltipClass).hide(),i.showOrCreateTip(e(this)))}).on("click.fndtn.tooltip touchstart.fndtn.tooltip touchend.fndtn.tooltip",this.settings.tooltipClass,function(t){t.preventDefault(),e(this).fadeOut(150)}):e(this.scope).on("mouseenter.fndtn.tooltip mouseleave.fndtn.tooltip","[data-tooltip]",function(t){var n=e(this);/enter|over/i.test(t.type)?i.showOrCreateTip(n):(t.type==="mouseout"||t.type==="mouseleave")&&i.hide(n)})},showOrCreateTip:function(e){var t=this. getTip(e);return t&&t.length>0?this.show(e):this.create(e)},getTip:function(t){var n=this.selector(t),r=null;return n&&(r=e('span[data-selector="'+n+'"]'+this.settings.tooltipClass)),typeof r=="object"?r:!1},selector:function(e){var t=e.attr("id"),n=e.attr("data-tooltip")||e.attr("data-selector");return(t&&t.length<1||!t)&&typeof n!="string"&&(n="tooltip"+Math.random().toString(36).substring(7),e.attr("data-selector",n)),t&&t.length>0?t:n},create:function(t){var n=e(this.settings.tipTemplate(this.selector(t),e("
    ").html(t.attr("title")).html())),r=this.inheritable_classes(t);n.addClass(r).appendTo(this.settings.appendTo),Modernizr.touch&&n.append('tap to close '),t.removeAttr("title").attr("title",""),this.show(t)},reposition:function(n,r,i){var s,o,u,a,f,l;r.css("visibility","hidden").show(),s=n.data("width"),o=r.children(".nub"),u=this.outerHeight(o),a=this.outerHeight(o),l=function(e,t,n,r,i,s){return e.css({top:t?t:"auto",bottom:r?r:"auto",left:i?i:"auto",right:n?n:"auto",width:s?s:"auto"}).end()},l(r,n.offset().top+this.outerHeight(n)+10,"auto","auto",n.offset().left,s);if(e(t).width()<767)l(r,n.offset().top+this.outerHeight(n)+10,"auto","auto",12.5,e(this.scope).width()),r.addClass("tip-override"),l(o,-u,"auto","auto",n.offset().left);else{var c=n.offset().left;Foundation.rtl&&(c=n.offset().left+n.offset().width-this.outerWidth(r)),l(r,n.offset().top+this.outerHeight(n)+10,"auto","auto",c,s),r.removeClass("tip-override"),i&&i.indexOf("tip-top")>-1?l(r,n.offset().top-this.outerHeight(r),"auto","auto",c,s).removeClass("tip-override"):i&&i.indexOf("tip-left")>-1?l(r,n.offset().top+this.outerHeight(n)/2-u*2.5,"auto","auto",n.offset().left-this.outerWidth(r)-u,s).removeClass("tip-override"):i&&i.indexOf("tip-right")>-1&&l(r,n.offset().top+this.outerHeight(n)/2-u*2.5,"auto","auto",n.offset().left+this.outerWidth(n)+u,s).removeClass("tip-override")}r.css("visibility","visible").hide()},inheritable_classes:function(t){var n=["tip-top","tip-left","tip-bottom","tip-right","noradius"].concat(this.settings.additionalInheritableClasses),r=t.attr("class"),i=r?e.map(r.split(" "),function(t,r){if(e.inArray(t,n)!==-1)return t}).join(" "):"";return e.trim(i)},show:function(e){var t=this.getTip(e);this.reposition(e,t,e.attr("class")),t.fadeIn(150)},hide:function(e){var t=this.getTip(e);t.fadeOut(150)},reload:function(){var t=e(this);return t.data("fndtn-tooltips")?t.foundationTooltips("destroy").foundationTooltips("init"):t.foundationTooltips("init")},off:function(){e(this.scope).off(".fndtn.tooltip"),e(this.settings.tooltipClass).each(function(t){e("[data-tooltip]").get(t).attr("title",e(this).text())}).remove()},reflow:function(){}}}(Foundation.zj,this,this.document),function(e,t,n,r){"use strict";Foundation.libs.clearing={name:"clearing",version:"4.2.2",settings:{templates:{viewing:'×'},close_selectors:".clearing-close",init:!1,locked:!1},init:function(t,n,r){var i=this;return Foundation.inherit(this,"set_data get_data remove_data throttle data_options"),typeof n=="object"&&(r=e.extend(!0,this.settings,n)),typeof n!="string"?(e(this.scope).find("ul[data-clearing]").each(function(){var t=e(this),n=n||{},r=t.find("li"),s=i.get_data(t);!s&&r.length>0&&(n.$parent=t.parent(),i.set_data(t,e.extend({},i.settings,n,i.data_options(t))),i.assemble(t.find("li")),i.settings.init||i.events().swipe_events())}),this.settings.init):this[n].call(this,r)},events:function(){var n=this;return e(this.scope).on("click.fndtn.clearing","ul[data-clearing] li",function(t,r,i){var r=r||e(this),i=i||r,s=r.next("li"),o=n.get_data(r.parent()),u=e(t.target);t.preventDefault(),o||n.init(),i.hasClass("visible")&&r[0]===i[0]&&s.length>0&&n.is_open(r)&&(i=s,u=i.find("img")),n.open(u,r,i),n.update_paddles(i)}).on("click.fndtn.clearing",".clearing-main-next",function(e){this.nav(e,"next")}.bind(this)).on("click.fndtn.clearing",".clearing-main-prev",function(e){this.nav(e,"prev")}.bind(this)).on("click.fndtn.clearing",this.settings.close_selectors,function(e){Foundation.libs.clearing.close(e,this)}).on("keydown.fndtn.clearing",function(e){this.keydown(e)}.bind(this)),e(t).on("resize.fndtn.clearing",function(){this.resize()}.bind(this)),this.settings.init=!0,this},swipe_events:function(){var t=this;e(this.scope).on("touchstart.fndtn.clearing",".visible-img",function(t){t.touches||(t=t.originalEvent);var n={start_page_x:t.touches[0].pageX,start_page_y:t.touches[0].pageY,start_time:(new Date).getTime(),delta_x:0,is_scrolling:r};e(this).data("swipe-transition",n),t.stopPropagation()}).on("touchmove.fndtn.clearing",".visible-img",function(n){n.touches||(n=n.originalEvent);if(n.touches.length>1||n.scale&&n.scale!==1)return;var r=e(this).data("swipe-transition");typeof r=="undefined"&&(r={}),r.delta_x=n.touches[0].pageX-r.start_page_x,typeof r.is_scrolling=="undefined"&&(r.is_scrolling=!!(r.is_scrolling||Math.abs(r.delta_x)
    ');var r=e("#foundationClearingHolder"),i=this.get_data(n),s=n.detach(),o={grid:'",viewing:i.templates.viewing},u='
    '+o.viewing+o.grid+"
    ";return r.after(u).remove()},open:function(e,t,n){var r=n.closest(".clearing-assembled"),i=r.find("div").first(),s=i.find(".visible-img"),o=s.find("img").not(e);this.locked()||(o.attr("src",this.load(e)).css("visibility","hidden"),this.loaded(o,function(){o.css("visibility","visible"),r.addClass("clearing-blackout"),i.addClass("clearing-container"),s.show(),this.fix_height(n).caption(s.find(".clearing-caption"),e).center(o).shift(t,n,function(){n.siblings().removeClass("visible"),n.addClass("visible")})}.bind(this)))},close:function(t,n){t.preventDefault();var r=function(e){return/blackout/.test(e.selector)?e:e.closest(".clearing-blackout")}(e(n)),i,s;return n===t.target&&r&&(i=r.find("div").first(),s=i.find(".visible-img"),this.settings.prev_index=0,r.find("ul[data-clearing]").attr("style","").closest(".clearing-blackout").removeClass("clearing-blackout"),i.removeClass("clearing-container"),s.hide()),!1},is_open:function(e){return e.parent().attr("style").length>0},keydown:function(t){var n=e(".clearing-blackout").find("ul[data-clearing]");t.which===39&&this.go(n,"next"),t.which===37&&this.go(n,"prev"),t.which===27&&e("a.clearing-close").trigger("click")},nav:function(t,n){var r=e(".clearing-blackout").find("ul[data-clearing]");t.preventDefault(),this.go(r,n)},resize:function(){var t=e(".clearing-blackout .visible-img").find("img");t.length&&this.center(t)},fix_height:function(t){var n=t.parent().children(),r=this;return n.each(function(){var t=e(this),n=t.find("img");t.height()>r.outerHeight(n)&&t.addClass("fix-height")}).closest("ul").width(n.length*100+"%"),this},update_paddles:function(e){var t=e.closest(".carousel").siblings(".visible-img");e.next().length>0?t.find(".clearing-main-next").removeClass("disabled"):t.find(".clearing-main-next").addClass("disabled"),e.prev().length>0?t.find(".clearing-main-prev").removeClass("disabled"):t.find(".clearing-main-prev").addClass("disabled")},center:function(e){return this.rtl?e.css({marginRight:-(this.outerWidth(e)/2),marginTop:-(this.outerHeight(e)/2)}):e.css({marginLeft:-(this.outerWidth(e)/2),marginTop:-(this.outerHeight(e)/2)}),this},load:function(e){if(e[0].nodeName==="A")var t=e.attr("href");else var t=e.parent().attr("href");return this.preload(e),t?t:e.attr("src")},preload:function(e){this.img(e.closest("li").next()).img(e.closest("li").prev())},loaded:function(e,t){function n(){t()}function r(){this.one("load",n);if(/MSIE (\d+\.\d+);/.test(navigator.userAgent)){var e=this.attr("src"),t=e.match(/\?/)?"&":"?";t+="random="+(new Date).getTime(),this.attr("src",e+t)}}if(!e.attr("src")){n();return}e[0].complete||e[0].readyState===4?n():r.call(e)},img:function(e){if(e.length){var t=new Image,n=e.find("a");n.length?t.src=n.attr("href"):t.src=e.find("img").attr("src")}return this},caption:function(e,t){var n=t.data("caption");return n?e.html(n).show():e.text("").hide(),this},go:function(e,t){var n=e.find(".visible"),r=n[t]();r.length&&r.find("img").trigger("click",[n,r])},shift:function(e,t,n){var r=t.parent(),i=this.settings.prev_index||t.index(),s=this.direction(r,e,t),o=parseInt(r.css("left"),10),u=this.outerWidth(t),a;t.index()!==i&&!/skip/.test(s)?/left/.test(s)?(this.lock(),r.animate({left:o+u},300,this.unlock())):/right/.test(s)&&(this.lock(),r.animate({left:o-u},300,this.unlock())):/skip/.test(s)&&(a=t.index()-this.settings.up_count,this.lock(),a>0?r.animate({left:-(a*u)},300,this.unlock()):r.animate({left:0},300,this.unlock())),n()},direction:function(t,n,r){var i=t.find("li"),s=this.outerWidth(i)+this.outerWidth(i)/4,o=Math.floor(this.outerWidth(e(".clearing-container"))/s)-1,u=i.index(r),a;return this.settings.up_count=o,this.adjacent(this.settings.prev_index,u)?u>o&&u>this.settings.prev_index?a="right":u>o-1&&u<=this.settings.prev_index?a="left":a=!1:a="skip",this.settings.prev_index=u,a},adjacent:function(e,t){for(var n=t+1;n>=t-1;n--)if(n===e)return!0;return!1},lock:function(){this.settings.locked=!0},unlock:function(){this.settings.locked=!1},locked:function(){return this.settings.locked},outerHTML:function(e){return e.outerHTML||(new XMLSerializer).serializeToString(e)},off:function(){e(this.scope).off(".fndtn.clearing"),e(t).off(".fndtn.clearing"),this.remove_data(),this.settings.init=!1},reflow:function(){this.init()}}}(Foundation.zj,this,this.document),function(e,t,n){function i(e){return e}function s(e){return decodeURIComponent(e.replace(r," "))}var r=/\+/g,o=e.cookie=function(r,u,a){if(u!==n){a=e.extend({},o.defaults,a),u===null&&(a.expires=-1);if(typeof a.expires=="number"){var f=a.expires,l=a.expires=new Date;l.setDate(l.getDate()+f)}return u=o.json?JSON.stringify(u):String(u),t.cookie=[encodeURIComponent(r),"=",o.raw?u:encodeURIComponent(u),a.expires?"; expires="+a.expires.toUTCString():"",a.path?"; path="+a.path:"",a.domain?"; domain="+a.domain:"",a.secure?"; secure":""].join("")}var c=o.raw?i:s,h=t.cookie.split("; ");for(var p=0,d=h.length;p×',timer:'
    ',tip:'
    ',wrapper:'
    ',button:'',modal:'
    ',expose:'
    ',exposeCover:'
    '},exposeAddClass:""},settings:{},init:function(t,n,r){return this.scope=t||this.scope,Foundation.inherit(this,"throttle data_options scrollTo scrollLeft delay"),typeof n=="object"?e.extend(!0,this.settings,this.defaults,n):e.extend(!0,this.settings,this.defaults,r),typeof n!="string"?(this.settings.init||this.events(),this.settings.init):this[n].call(this,r)},events:function(){var n=this;e(this.scope).on("click.joyride",".joyride-next-tip, .joyride-modal-bg",function(e){e.preventDefault(),this.settings.$li.next().length<1?this.end():this.settings.timer>0?(clearTimeout(this.settings.automate),this.hide(),this.show(),this.startTimer()):(this.hide(),this.show())}.bind(this)).on("click.joyride",".joyride-close-tip",function(e){e.preventDefault(),this.end()}.bind(this)),e(t).on("resize.fndtn.joyride",n.throttle(function(){if(e("[data-joyride]").length>0&&n.settings.$next_tip){if(n.settings.exposed.length>0){var t=e(n.settings.exposed);t.each(function(){var t=e(this);n.un_expose(t),n.expose(t)})}n.is_phone()?n.pos_phone():n.pos_default(!1,!0)}},100)),this.settings.init=!0},start:function(){var t=this,n=e(this.scope).find("[data-joyride]"),r=["timer","scrollSpeed","startOffset","tipAnimationFadeSpeed","cookieExpires"],i=r.length;this.settings.init||this.init(),this.settings.$content_el=n,this.settings.$body=e(this.settings.tipContainer),this.settings.body_offset=e(this.settings.tipContainer).position(),this.settings.$tip_content=this.settings.$content_el.find("> li"),this.settings.paused=!1,this.settings.attempts=0,this.settings.tipLocationPatterns={top:["bottom"],bottom:[],left:["right","top","bottom"],right:["left","top","bottom"]},typeof e.cookie!="function"&&(this.settings.cookieMonster=!1);if(!this.settings.cookieMonster||this.settings.cookieMonster&&e.cookie(this.settings.cookieName)===null)this.settings.$tip_content.each(function(n){var s=e(this);e.extend(!0,t.settings,t.data_options(s));for(var o=i-1;o>=0;o--)t.settings[r[o]]=parseInt(t.settings[r[o]],10);t.create({$li:s,index:n})}),!this.settings.startTimerOnClick&&this.settings.timer>0?(this.show("init"),this.startTimer()):this.show("init")},resume:function(){this.set_li(),this.show()},tip_template:function(t){var n,r;return t.tip_class=t.tip_class||"",n=e(this.settings.template.tip).addClass(t.tip_class),r=e.trim(e(t.li).html())+this.button_text(t.button_text)+this.settings.template.link+this.timer_instance(t.index),n.append(e(this.settings.template.wrapper)),n.first().attr("data-index",t.index),e(".joyride-content-wrapper",n).append(r),n[0]},timer_instance:function(t){var n;return t===0&&this.settings.startTimerOnClick&&this.settings.timer>0||this.settings.timer===0?n="":n=this.outerHTML(e(this.settings.template.timer)[0]),n},button_text:function(t){return this.settings.nextButton?(t=e.trim(t)||"Next",t=this.outerHTML(e(this.settings.template.button).append(t)[0])):t="",t},create:function(t){var n=t.$li.attr("data-button")||t.$li.attr("data-text"),r=t.$li.attr("class"),i=e(this.tip_template({tip_class:r,index:t.index,button_text:n,li:t.$li}));e(this.settings.tipContainer).append(i)},show:function(t){var n=null;this.settings.$li===r||e.inArray(this.settings.$li.index(),this.settings.pauseAfter)===-1?(this.settings.paused?this.settings.paused=!1:this.set_li(t),this.settings.attempts=0,this.settings.$li.length&&this.settings.$target.length>0?(t&&(this.settings.preRideCallback(this.settings.$li.index(),this.settings.$next_tip),this.settings.modal&&this.show_modal()),this.settings.preStepCallback(this.settings.$li.index(),this.settings.$next_tip),this.settings.modal&&this.settings.expose&&this.expose(),this.settings.tipSettings=e.extend(this.settings,this.data_options(this.settings.$li)),this.settings.timer=parseInt(this.settings.timer,10),this.settings.tipSettings.tipLocationPattern=this.settings.tipLocationPatterns[this.settings.tipSettings.tipLocation],/body/i.test(this.settings.$target.selector)||this.scroll_to(),this.is_phone()?this.pos_phone(!0):this.pos_default(!0),n=this.settings.$next_tip.find(".joyride-timer-indicator"),/pop/i.test(this.settings.tipAnimation)?(n.width(0),this.settings.timer>0?(this.settings.$next_tip.show(),this.delay(function(){n.animate({width:n.parent().width()},this.settings.timer,"linear")}.bind(this),this.settings.tipAnimationFadeSpeed)):this.settings.$next_tip.show()):/fade/i.test(this.settings.tipAnimation)&&(n.width(0),this.settings.timer>0?(this.settings.$next_tip.fadeIn(this.settings.tipAnimationFadeSpeed).show(),this.delay(function(){n.animate({width:n.parent().width()},this.settings.timer,"linear")}.bind(this),this.settings.tipAnimationFadeSpeed)):this.settings.$next_tip.fadeIn(this.settings.tipAnimationFadeSpeed)),this.settings.$current_tip=this.settings.$next_tip):this.settings.$li&&this.settings.$target.length<1?this.show():this.end()):this.settings.paused=!0},is_phone:function(){return Modernizr?Modernizr.mq("only screen and (max-width: 767px)")||e(".lt-ie9").length>0:this.settings.$window.width()<767},hide:function(){this.settings.modal&&this.settings.expose&&this.un_expose(),this.settings.modal||e(".joyride-modal-bg").hide(),this.settings.$current_tip.hide(),this.settings.postStepCallback(this.settings.$li.index(),this.settings.$current_tip)},set_li:function(e){e?(this.settings.$li=this.settings.$tip_content.eq(this.settings.startOffset),this.set_next_tip(),this.settings.$current_tip=this.settings.$next_tip):(this.settings.$li=this.settings.$li.next(),this.set_next_tip()),this.set_target()},set_next_tip:function(){this.settings.$next_tip=e(".joyride-tip-guide[data-index='"+this.settings.$li.index()+"']"),this.settings.$next_tip.data("closed","")},set_target:function(){var t=this.settings.$li.attr("data-class"),r=this.settings.$li.attr("data-id"),i=function(){return r?e(n.getElementById(r)):t?e("."+t).first():e("body")};this.settings.$target=i()},scroll_to:function(){var n,r;n=e(t).height()/2,r=Math.ceil(this.settings.$target.offset().top-n+this.outerHeight(this.settings.$next_tip)),r>0&&this.scrollTo(e("html, body"),r,this.settings.scrollSpeed)},paused:function(){return e.inArray(this.settings.$li.index()+1,this.settings.pauseAfter)===-1},restart:function(){this.hide(),this.settings.$li=r,this.show("init")},pos_default:function(n,r){var i=Math.ceil(e(t).height()/2),s=this.settings.$next_tip.offset(),o=this.settings.$next_tip.find(".joyride-nub"),u=Math.ceil(this.outerWidth(o)/2),a=Math.ceil(this.outerHeight(o)/2),f=n||!1;f&&(this.settings.$next_tip.css("visibility","hidden"),this.settings.$next_tip.show()),typeof r=="undefined"&&(r=!1);if(!/body/i.test(this.settings.$target.selector)){if(this.bottom()){var l=this.settings.$target.offset().left;Foundation.rtl&&(l=this.settings.$target.offset().width-this.settings.$next_tip.width()+l),this.settings.$next_tip.css({top:this.settings.$target.offset().top+a+this.outerHeight(this.settings.$target),left:l}),this.nub_position(o,this.settings.tipSettings.nubPosition,"top")}else if(this.top()){var l=this.settings.$target.offset().left;Foundation.rtl&&(l=this.settings.$target.offset().width-this.settings.$next_tip.width()+l),this.settings.$next_tip.css({top:this.settings.$target.offset().top-this.outerHeight(this.settings.$next_tip)-a,left:l}),this.nub_position(o,this.settings.tipSettings.nubPosition,"bottom")}else this.right()?(this.settings.$next_tip.css({top:this.settings.$target.offset().top,left:this.outerWidth(this.settings.$target)+this.settings.$target.offset().left+u}),this.nub_position(o,this.settings.tipSettings.nubPosition,"left")):this.left()&&(this.settings.$next_tip.css({top:this.settings.$target.offset().top,left:this.settings.$target.offset().left-this.outerWidth(this.settings.$next_tip)-u}),this.nub_position(o,this.settings.tipSettings.nubPosition,"right"));!this.visible(this.corners(this.settings.$next_tip))&&this.settings.attempts0&&arguments[0]instanceof e)i=arguments[0];else{if(!this.settings.$target||!!/body/i.test(this.settings.$target.selector))return!1;i=this.settings.$target}if(i.length<1)return t.console&&console.error("element not valid",i),!1;n=e(this.settings.template.expose),this.settings.$body.append(n),n.css({top:i.offset().top,left:i.offset().left,width:this.outerWidth(i,!0),height:this.outerHeight(i,!0)}),r=e(this.settings.template.exposeCover),s={zIndex:i.css("z-index"),position:i.css("position")},o=i.attr("class")==null?"":i.attr("class"),i.css("z-index",parseInt(n.css("z-index"))+1),s.position=="static"&&i.css("position","relative"),i.data("expose-css",s),i.data("orig-class",o),i.attr("class",o+" "+this.settings.exposeAddClass),r.css({top:i.offset().top,left:i.offset().left,width:this.outerWidth(i,!0),height:this.outerHeight(i,!0)}),this.settings.$body.append(r),n.addClass(u),r.addClass(u),i.data("expose",u),this.settings.postExposeCallback(this.settings.$li.index(),this.settings.$next_tip,i),this.add_exposed(i)},un_expose:function(){var n,r,i,s,o,u=!1;if(arguments.length>0&&arguments[0]instanceof e)r=arguments[0];else{if(!this.settings.$target||!!/body/i.test(this.settings.$target.selector))return!1;r=this.settings.$target}if(r.length<1)return t.console&&console.error("element not valid",r),!1;n=r.data("expose"),i=e("."+n),arguments.length>1&&(u=arguments[1]),u===!0?e(".joyride-expose-wrapper,.joyride-expose-cover").remove():i.remove(),s=r.data("expose-css"),s.zIndex=="auto"?r.css("z-index",""):r.css("z-index",s.zIndex),s.position!=r.css("position")&&(s.position=="static"?r.css("position",""):r.css("position",s.position)),o=r.data("orig-class"),r.attr("class",o),r.removeData("orig-classes"),r.removeData("expose"),r.removeData("expose-z-index"),this.remove_exposed(r)},add_exposed:function(t){this.settings.exposed=this.settings.exposed||[],t instanceof e||typeof t=="object"?this.settings.exposed.push(t[0]):typeof t=="string"&&this.settings.exposed.push(t)},remove_exposed:function(t){var n,r;t instanceof e?n=t[0]:typeof t=="string"&&(n=t),this.settings.exposed=this.settings.exposed||[],r=this.settings.exposed.length;for(var i=0;ia&&(a=u),[n.offset().topn.offset().left]},visible:function(e){var t=e.length;while(t--)if(e[t])return!1;return!0},nub_position:function(e,t,n){t==="auto"?e.addClass(n):e.addClass(t)},startTimer:function(){this.settings.$li.length?this.settings.automate=setTimeout(function(){this.hide(),this.show(),this.startTimer()}.bind(this),this.settings.timer):clearTimeout(this.settings.automate)},end:function(){this.settings.cookieMonster&&e.cookie(this.settings.cookieName,"ridden",{expires:this.settings.cookieExpires,domain:this.settings.cookieDomain}),this.settings.timer>0&&clearTimeout(this.settings.automate),this.settings.modal&&this.settings.expose&&this.un_expose(),this.settings.$next_tip.data("closed",!0),e(".joyride-modal-bg").hide(),this.settings.$current_tip.hide(),this.settings.postStepCallback(this.settings.$li.index(),this.settings.$current_tip),this.settings.postRideCallback(this.settings.$li.index(),this.settings.$current_tip),e(".joyride-tip-guide").remove()},outerHTML:function(e){return e.outerHTML||(new XMLSerializer).serializeToString(e)},off:function(){e(this.scope).off(".joyride"),e(t).off(".joyride"),e(".joyride-close-tip, .joyride-next-tip, .joyride-modal-bg").off(".joyride"),e(".joyride-tip-guide, .joyride-modal-bg").remove(),clearTimeout(this.settings.automate),this.settings={}},reflow:function(){}}}(Foundation.zj,this,this.document),function(e,t,n,r){"use strict";Foundation.libs=Foundation.libs||{},Foundation.libs.orbit={name:"orbit",version:"4.2.0",settings:{timer_speed:1e4,pause_on_hover:!0,resume_on_mouseout:!1,animation_speed:500,bullets:!0,stack_on_small:!0,navigation_arrows:!0,slide_number:!0,container_class:"orbit-container",stack_on_small_class:"orbit-stack-on-small",next_class:"orbit-next",prev_class:"orbit-prev",timer_container_class:"orbit-timer",timer_paused_class:"paused",timer_progress_class:"orbit-progress",slides_container_class:"orbit-slides-container",bullets_container_class:"orbit-bullets",bullets_active_class:"active",slide_number_class:"orbit-slide-number",caption_class:"orbit-caption",active_slide_class:"active",orbit_transition_class:"orbit-transitioning"},init:function(t,n,r){var i=this;Foundation.inherit(i,"data_options"),typeof n=="object"&&e.extend(!0,i.settings,n);if(e(t).is("[data-orbit]")){var s=e.extend(!0,{},i);s._init(idx,el)}e("[data-orbit]",t).each(function(t,n){var r=e.extend(!0,{},i);r._init(t,n)})},_container_html:function(){var e=this;return'
    '},_bullets_container_html:function(t){var n=this,r=e('
      ');return t.each(function(t,i){var s=e('
    1. ');t===0&&s.addClass(n.settings.bullets_active_class),r.append(s)}),r},_slide_number_html:function(t,n){var r=this,i=e('
      ');return i.append(""+t+" of "+n+""),i},_timer_html:function(){var e=this;return typeof e.settings.timer_speed=="number"&&e.settings.timer_speed>0?'
      ':""},_next_html:function(){var e=this;return'Next '},_prev_html:function(){var e=this;return'Prev '},_init:function(t,n){var r=this,i=e(n),s=i.wrap(r._container_html()).parent(),o=i.children();e.extend(!0,r.settings,r.data_options(i)),r.settings.navigation_arrows&&(s.append(r._prev_html()),s.append(r._next_html())),i.addClass(r.settings.slides_container_class),r.settings.stack_on_small&&s.addClass(r.settings.stack_on_small_class),r.settings.slide_number&&s.append(r._slide_number_html(1,o.length)),s.append(r._timer_html()),r.settings.bullets&&s.after(r._bullets_container_html(o)),i.append(o.first().clone().attr("data-orbit-slide","")),i.prepend(o.last().clone().attr("data-orbit-slide","")),i.css(Foundation.rtl?"marginRight":"marginLeft","-100%"),o.first().addClass(r.settings.active_slide_class),r._init_events(i),r._init_dimensions(i),r._start_timer(i)},_init_events:function(i){var s=this,o=i.parent();e(t).on("load.fndtn.orbit",function(){i.height(""),i.height(i.height(o.height())),i.trigger("orbit:ready")}).on("resize.fndtn.orbit",function(){i.height(""),i.height(i.height(o.height()))}),e(n).on("click.fndtn.orbit","[data-orbit-link]",function(t){t.preventDefault();var n=e(t.currentTarget).attr("data-orbit-link"),r=i.find("[data-orbit-slide="+n+"]").first();r.length===1&&(s._reset_timer(i,!0),s._goto(i,r.index(),function(){}))}),o.siblings("."+s.settings.bullets_container_class).on("click.fndtn.orbit","[data-orbit-slide-number]",function(t){t.preventDefault(),s._reset_timer(i,!0),s._goto(i,e(t.currentTarget).data("orbit-slide-number"),function(){})}),o.on("mouseenter.fndtn.orbit",function(e){s.settings.pause_on_hover&&s._stop_timer(i)}).on("mouseleave.fndtn.orbit",function(e){s.settings.resume_on_mouseout&&s._start_timer(i)}).on("orbit:after-slide-change.fndtn.orbit",function(e,t){var n=o.find("."+s.settings.slide_number_class);n.length===1&&n.replaceWith(s._slide_number_html(t.slide_number,t.total_slides))}).on("orbit:next-slide.fndtn.orbit click.fndtn.orbit","."+s.settings.next_class.split(" ").join("."),function(e){e.preventDefault(),s._reset_timer(i,!0),s._goto(i,"next",function(){})}).on("orbit:prev-slide.fndtn.orbit click.fndtn.orbit","."+s.settings.prev_class.split(" ").join("."),function(e){e.preventDefault(),s._reset_timer(i,!0),s._goto(i,"prev",function(){})}).on("orbit:toggle-play-pause.fndtn.orbit click.fndtn.orbit touchstart.fndtn.orbit","."+s.settings.timer_container_class,function(t){t.preventDefault();var n=e(t.currentTarget).toggleClass(s.settings.timer_paused_class),r=n.closest("."+s.settings.container_class).find("."+s.settings.slides_container_class);n.hasClass(s.settings.timer_paused_class)?s._stop_timer(r):s._start_timer(r)}).on("touchstart.fndtn.orbit",function(e){e.touches||(e=e.originalEvent);var t={start_page_x:e.touches[0].pageX,start_page_y:e.touches[0].pageY,start_time:(new Date).getTime(),delta_x:0,is_scrolling:r};o.data("swipe-transition",t),e.stopPropagation()}).on("touchmove.fndtn.orbit",function(e){e.touches||(e=e.originalEvent);if(e.touches.length>1||e.scale&&e.scale!==1)return;var t=o.data("swipe-transition");typeof t=="undefined"&&(t={}),t.delta_x=e.touches[0].pageX-t.start_page_x,typeof t.is_scrolling=="undefined"&&(t.is_scrolling=!!(t.is_scrolling||Math.abs(t.delta_x)0&&(r.toggle_active.call(this,t,r),r.reflow())}),e(t).on("resize.fndtn.section",r.throttle(function(){r.resize.call(this)},30)).on("hashchange",function(){r.settings.toggled||(r.set_active_from_hash(),e(this).trigger("resize"))}).trigger("resize"),e(n).on("click.fndtn.section",function(t){e(t.target).closest(r.settings.title_selector).length<1&&e(r.settings.nav_selector).children(r.settings.region_selector).removeClass("active").attr("style","")})},toggle_active:function(t,n){var r=e(this),n=Foundation.libs.section,i=r.closest(n.settings.region_selector),s=r.siblings(n.settings.content_selector),o=i.parent(),u=e.extend({},n.settings,n.data_options(o)),a=o.children(n.settings.active_region_selector);n.settings.toggled=!0,!u.deep_linking&&s.length>0&&t.preventDefault();if(i.hasClass("active"))(n.small(o)||n.is_vertical_nav(o)||n.is_horizontal_nav(o)||n.is_accordion(o))&&(a[0]!==i[0]||a[0]===i[0]&&!u.one_up)&&i.removeClass("active").attr("style","");else{var a=o.children(n.settings.active_region_selector),f=n.outerHeight(i.children(n.settings.title_selector));if(n.small(o)||u.one_up)n.small(o)?a.attr("style",""):a.attr("style","visibility: hidden; padding-top: "+f+"px;");n.small(o)?i.attr("style",""):i.css("padding-top",f),i.addClass("active"),a.length>0&&a.removeClass("active").attr("style",""),n.is_vertical_tabs(o)&&(s.css("display","block"),a!==null&&a.children(n.settings.content_selector).css("display","none"))}setTimeout(function(){n.settings.toggled=!1},300),u.callback()},resize:function(){var t=Foundation.libs.section,n=e(t.settings.section_selector);n.each(function(){var n=e(this),r=n.children(t.settings.active_region_selector),i=e.extend({},t.settings,t.data_options(n));if(r.length>1)r.not(":first").removeClass("active").attr("style","");else if(r.length<1&&!t.is_vertical_nav(n)&&!t.is_horizontal_nav(n)&&!t.is_accordion(n)){var s=n.children(t.settings.region_selector).first();(i.one_up||!t.small(n))&&s.addClass("active"),t.small(n)?s.attr("style",""):s.css("padding-top",t.outerHeight(s.children(t.settings.title_selector)))}t.small(n)?r.attr("style",""):r.css("padding-top",t.outerHeight(r.children(t.settings.title_selector))),t.position_titles(n),t.is_horizontal_nav(n)&&!t.small(n)||t.is_vertical_tabs(n)&&!t.small(n)?t.position_content(n):t.position_content(n,!1)})},is_vertical_nav:function(e){return/vertical-nav/i.test(e.data("section"))},is_horizontal_nav:function(e){return/horizontal-nav/i.test(e.data("section"))},is_accordion:function(e){return/accordion/i.test(e.data("section"))},is_horizontal_tabs:function(e){return/^tabs$/i.test(e.data("section"))},is_vertical_tabs:function(e){return/vertical-tabs/i.test(e.data("section"))},set_active_from_hash:function(){var n=t.location.hash.substring(1),r=e("[data-section]"),i=this;r.each(function(){var t=e(this),r=e.extend({},i.settings,i.data_options(t));if(n.length>0&&r.deep_linking){var s=t.children(i.settings.region_selector).attr("style","").removeClass("active"),o=s.map(function(){var t=e(i.settings.content_selector,this),r=t.data("slug");if((new RegExp(r,"i")).test(n))return t}),u=o.length;for(var a=u-1;a>=0;a--)e(o[a]).parent().addClass("active")}})},position_titles:function(t,n){var r=this,i=t.children(this.settings.region_selector).map(function(){return e(this).children(r.settings.title_selector)}),s=0,o=0,r=this;typeof n=="boolean"?i.attr("style",""):i.each(function(){r.is_vertical_tabs(t)?(e(this).css("top",o),o+=r.outerHeight(e(this))):(r.rtl?e(this).css("right",s):e(this).css("left",s),s+=r.outerWidth(e(this)))})},position_content:function(t,n){var r=this,i=t.children(r.settings.region_selector),s=i.map(function(){return e(this).children(r.settings.title_selector)}),o=i.map(function(){return e(this).children(r.settings.content_selector)});if(typeof n=="boolean")o.attr("style",""),t.attr("style","");else if(r.is_vertical_tabs(t)&&!r.small(t)){var u=0,a=Number.MAX_VALUE,f=null;i.each(function(){var n=e(this),i=n.children(r.settings.title_selector),s=n.children(r.settings.content_selector),o=0;f=r.outerWidth(i),o=r.outerWidth(t)-f,o").insertAfter(s.settings.$topbar);s.settings.breakPoint=n.width(),n.remove(),s.assemble(),s.settings.$topbar.parent().hasClass("fixed")&&e("body").css("padding-top",s.outerHeight(s.settings.$topbar))}),s.settings.init||this.events(),this.settings.init):this[r].call(this,i)},events:function(){var n=this,r=this.outerHeight(e(".top-bar, [data-topbar]"));e(this.scope).off(".fndtn.topbar").on("click.fndtn.topbar",".top-bar .toggle-topbar, [data-topbar] .toggle-topbar",function(i){var s=e(this).closest(".top-bar, [data-topbar]"),o=s.find("section, .section"),u=s.children("ul").first();i.preventDefault(),n.breakpoint()&&(n.rtl?(o.css({right:"0%"}),o.find(">.name").css({right:"100%"})):(o.css({left:"0%"}),o.find(">.name").css({left:"100%"})),o.find("li.moved").removeClass("moved"),s.data("index",0),s.toggleClass("expanded").css("max-height","")),s.hasClass("expanded")?s.parent().hasClass("fixed")&&(s.parent().removeClass("fixed"),s.addClass("fixed"),e("body").css("padding-top","0"),n.settings.scrolltop&&t.scrollTo(0,0)):s.hasClass("fixed")&&(s.parent().addClass("fixed"),s.removeClass("fixed"),e("body").css("padding-top",r))}).on("mouseenter mouseleave",".top-bar li",function(t){if(!n.settings.is_hover)return;/enter|over/i.test(t.type)?e(this).addClass("hover"):e(this).removeClass("hover")}).on("click.fndtn.topbar",".top-bar li.has-dropdown",function(t){if(n.breakpoint())return;var r=e(this),i=e(t.target),s=r.closest("[data-topbar], .top-bar"),o=s.data("topbar");if(n.settings.is_hover&&!Modernizr.touch)return;t.stopImmediatePropagation(),i[0].nodeName==="A"&&i.parent().hasClass("has-dropdown")&&t.preventDefault(),r.hasClass("hover")?r.removeClass("hover").find("li").removeClass("hover"):r.addClass("hover")}).on("click.fndtn.topbar",".top-bar .has-dropdown>a, [data-topbar] .has-dropdown>a",function(t){if(n.breakpoint()){t.preventDefault();var r=e(this),i=r.closest(".top-bar, [data-topbar]"),s=i.find("section, .section"),o=i.children("ul").first(),u=r.next(".dropdown").outerHeight(),a=r.closest("li");i.data("index",i.data("index")+1),a.addClass("moved"),n.rtl?(s.css({right:-(100*i.data("index"))+"%"}),s.find(">.name").css({right:100*i.data("index")+"%"})):(s.css({left:-(100*i.data("index"))+"%"}),s.find(">.name").css({left:100*i.data("index")+"%"})),i.css("max-height",n.height(r.siblings("ul"))+n.outerHeight(o,!0))}}),e(t).on("resize.fndtn.topbar",function(){n.breakpoint()||e(".top-bar, [data-topbar]").css("max-height","").removeClass("expanded").find("li").removeClass("hover")}.bind(this)),e("body").on("click.fndtn.topbar",function(t){var n=e(t.target).closest("[data-topbar], .top-bar");if(n.length>0)return;e(".top-bar li, [data-topbar] li").removeClass("hover")}),e(this.scope).on("click.fndtn",".top-bar .has-dropdown .back, [data-topbar] .has-dropdown .back",function(t){t.preventDefault();var r=e(this),i=r.closest(".top-bar, [data-topbar]"),s=i.children("ul").first(),o=i.find("section, .section"),u=r.closest("li.moved"),a=u.parent();i.data("index",i.data("index")-1),n.rtl?(o.css({right:-(100*i.data("index"))+"%"}),o.find(">.name").css({right:100*i.data("index")+"%"})):(o.css({left:-(100*i.data("index"))+"%"}),o.find(">.name").css({left:100*i.data("index")+"%"})),i.data("index")===0?i.css("max-height",""):i.css("max-height",n.height(a)+n.outerHeight(s,!0)),setTimeout(function(){u.removeClass("moved")},300)})},breakpoint:function(){return e(n).width()<=this.settings.breakPoint||e("html").hasClass("lt-ie9")},assemble:function(){var t=this;this.settings.$section.detach(),this.settings.$section.find(".has-dropdown>a").each(function(){var n=e(this),r=n.siblings(".dropdown"),i=n.attr("href");if(i&&i.length>1)var s=e('
    2. '+n.text()+"
    3. ");else var s=e('
    4. ');t.settings.custom_back_text==1?s.find("h5>a").html("« "+t.settings.back_text):s.find("h5>a").html("« "+n.html()),r.prepend(s)}),this.settings.$section.appendTo(this.settings.$topbar),this.sticky()},height:function(t){var n=0,r=this;return t.find("> li").each(function(){n+=r.outerHeight(e(this),!0)}),n},sticky:function(){var n="."+this.settings.stickyClass;if(e(n).length>0){var r=e(n).length?e(n).offset().top:0,i=e(t),s=this.outerHeight(e(".top-bar"));i.scroll(function(){i.scrollTop()>=r?(e(n).addClass("fixed"),e("body").css("padding-top",s)):i.scrollTop()×' + '' }, // comma delimited list of selectors that, on click, will close clearing, // add 'div.clearing-blackout, div.visible-img' to close on background click close_selectors : '.clearing-close', // event initializers and locks init : false, locked : false }, init : function (scope, method, options) { var self = this; Foundation.inherit(this, 'set_data get_data remove_data throttle data_options'); if (typeof method === 'object') { options = $.extend(true, this.settings, method); } if (typeof method !== 'string') { $(this.scope).find('ul[data-clearing]').each(function () { var $el = $(this), options = options || {}, lis = $el.find('li'), settings = self.get_data($el); if (!settings && lis.length > 0) { options.$parent = $el.parent(); self.set_data($el, $.extend({}, self.settings, options, self.data_options($el))); self.assemble($el.find('li')); if (!self.settings.init) { self.events().swipe_events(); } } }); return this.settings.init; } else { // fire method return this[method].call(this, options); } }, // event binding and initial setup events : function () { var self = this; $(this.scope) .on('click.fndtn.clearing', 'ul[data-clearing] li', function (e, current, target) { var current = current || $(this), target = target || current, next = current.next('li'), settings = self.get_data(current.parent()), image = $(e.target); e.preventDefault(); if (!settings) self.init(); // if clearing is open and the current image is // clicked, go to the next image in sequence if (target.hasClass('visible') && current[0] === target[0] && next.length > 0 && self.is_open(current)) { target = next; image = target.find('img'); } // set current and target to the clicked li if not otherwise defined. self.open(image, current, target); self.update_paddles(target); }) .on('click.fndtn.clearing', '.clearing-main-next', function (e) { this.nav(e, 'next') }.bind(this)) .on('click.fndtn.clearing', '.clearing-main-prev', function (e) { this.nav(e, 'prev') }.bind(this)) .on('click.fndtn.clearing', this.settings.close_selectors, function (e) { Foundation.libs.clearing.close(e, this) }) .on('keydown.fndtn.clearing', function (e) { this.keydown(e) }.bind(this)); $(window).on('resize.fndtn.clearing', function () { this.resize() }.bind(this)); this.settings.init = true; return this; }, swipe_events : function () { var self = this; $(this.scope) .on('touchstart.fndtn.clearing', '.visible-img', function(e) { if (!e.touches) { e = e.originalEvent; } var data = { start_page_x: e.touches[0].pageX, start_page_y: e.touches[0].pageY, start_time: (new Date()).getTime(), delta_x: 0, is_scrolling: undefined }; $(this).data('swipe-transition', data); e.stopPropagation(); }) .on('touchmove.fndtn.clearing', '.visible-img', function(e) { if (!e.touches) { e = e.originalEvent; } // Ignore pinch/zoom events if(e.touches.length > 1 || e.scale && e.scale !== 1) return; var data = $(this).data('swipe-transition'); if (typeof data === 'undefined') { data = {}; } data.delta_x = e.touches[0].pageX - data.start_page_x; if ( typeof data.is_scrolling === 'undefined') { data.is_scrolling = !!( data.is_scrolling || Math.abs(data.delta_x) < Math.abs(e.touches[0].pageY - data.start_page_y) ); } if (!data.is_scrolling && !data.active) { e.preventDefault(); var direction = (data.delta_x < 0) ? 'next' : 'prev'; data.active = true; self.nav(e, direction); } }) .on('touchend.fndtn.clearing', '.visible-img', function(e) { $(this).data('swipe-transition', {}); e.stopPropagation(); }); }, assemble : function ($li) { var $el = $li.parent(); $el.after('
      '); var holder = $('#foundationClearingHolder'), settings = this.get_data($el), grid = $el.detach(), data = { grid: '', viewing: settings.templates.viewing }, wrapper = '
      ' + data.viewing + data.grid + '
      '; return holder.after(wrapper).remove(); }, // event callbacks open : function ($image, current, target) { var root = target.closest('.clearing-assembled'), container = root.find('div').first(), visible_image = container.find('.visible-img'), image = visible_image.find('img').not($image); if (!this.locked()) { // set the image to the selected thumbnail image .attr('src', this.load($image)) .css('visibility', 'hidden'); this.loaded(image, function () { image.css('visibility', 'visible'); // toggle the gallery root.addClass('clearing-blackout'); container.addClass('clearing-container'); visible_image.show(); this.fix_height(target) .caption(visible_image.find('.clearing-caption'), $image) .center(image) .shift(current, target, function () { target.siblings().removeClass('visible'); target.addClass('visible'); }); }.bind(this)); } }, close : function (e, el) { e.preventDefault(); var root = (function (target) { if (/blackout/.test(target.selector)) { return target; } else { return target.closest('.clearing-blackout'); } }($(el))), container, visible_image; if (el === e.target && root) { container = root.find('div').first(); visible_image = container.find('.visible-img'); this.settings.prev_index = 0; root.find('ul[data-clearing]') .attr('style', '').closest('.clearing-blackout') .removeClass('clearing-blackout'); container.removeClass('clearing-container'); visible_image.hide(); } return false; }, is_open : function (current) { return current.parent().attr('style').length > 0; }, keydown : function (e) { var clearing = $('.clearing-blackout').find('ul[data-clearing]'); if (e.which === 39) this.go(clearing, 'next'); if (e.which === 37) this.go(clearing, 'prev'); if (e.which === 27) $('a.clearing-close').trigger('click'); }, nav : function (e, direction) { var clearing = $('.clearing-blackout').find('ul[data-clearing]'); e.preventDefault(); this.go(clearing, direction); }, resize : function () { var image = $('.clearing-blackout .visible-img').find('img'); if (image.length) { this.center(image); } }, // visual adjustments fix_height : function (target) { var lis = target.parent().children(), self = this; lis.each(function () { var li = $(this), image = li.find('img'); if (li.height() > self.outerHeight(image)) { li.addClass('fix-height'); } }) .closest('ul') .width(lis.length * 100 + '%'); return this; }, update_paddles : function (target) { var visible_image = target .closest('.carousel') .siblings('.visible-img'); if (target.next().length > 0) { visible_image .find('.clearing-main-next') .removeClass('disabled'); } else { visible_image .find('.clearing-main-next') .addClass('disabled'); } if (target.prev().length > 0) { visible_image .find('.clearing-main-prev') .removeClass('disabled'); } else { visible_image .find('.clearing-main-prev') .addClass('disabled'); } }, center : function (target) { if (!this.rtl) { target.css({ marginLeft : -(this.outerWidth(target) / 2), marginTop : -(this.outerHeight(target) / 2) }); } else { target.css({ marginRight : -(this.outerWidth(target) / 2), marginTop : -(this.outerHeight(target) / 2) }); } return this; }, // image loading and preloading load : function ($image) { if ($image[0].nodeName === "A") { var href = $image.attr('href'); } else { var href = $image.parent().attr('href'); } this.preload($image); if (href) return href; return $image.attr('src'); }, preload : function ($image) { this .img($image.closest('li').next()) .img($image.closest('li').prev()); }, loaded : function (image, callback) { // based on jquery.imageready.js // @weblinc, @jsantell, (c) 2012 function loaded () { callback(); } function bindLoad () { this.one('load', loaded); if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) { var src = this.attr( 'src' ), param = src.match( /\?/ ) ? '&' : '?'; param += 'random=' + (new Date()).getTime(); this.attr('src', src + param); } } if (!image.attr('src')) { loaded(); return; } if (image[0].complete || image[0].readyState === 4) { loaded(); } else { bindLoad.call(image); } }, img : function (img) { if (img.length) { var new_img = new Image(), new_a = img.find('a'); if (new_a.length) { new_img.src = new_a.attr('href'); } else { new_img.src = img.find('img').attr('src'); } } return this; }, // image caption caption : function (container, $image) { var caption = $image.data('caption'); if (caption) { container .html(caption) .show(); } else { container .text('') .hide(); } return this; }, // directional methods go : function ($ul, direction) { var current = $ul.find('.visible'), target = current[direction](); if (target.length) { target .find('img') .trigger('click', [current, target]); } }, shift : function (current, target, callback) { var clearing = target.parent(), old_index = this.settings.prev_index || target.index(), direction = this.direction(clearing, current, target), left = parseInt(clearing.css('left'), 10), width = this.outerWidth(target), skip_shift; // we use jQuery animate instead of CSS transitions because we // need a callback to unlock the next animation if (target.index() !== old_index && !/skip/.test(direction)){ if (/left/.test(direction)) { this.lock(); clearing.animate({left : left + width}, 300, this.unlock()); } else if (/right/.test(direction)) { this.lock(); clearing.animate({left : left - width}, 300, this.unlock()); } } else if (/skip/.test(direction)) { // the target image is not adjacent to the current image, so // do we scroll right or not skip_shift = target.index() - this.settings.up_count; this.lock(); if (skip_shift > 0) { clearing.animate({left : -(skip_shift * width)}, 300, this.unlock()); } else { clearing.animate({left : 0}, 300, this.unlock()); } } callback(); }, direction : function ($el, current, target) { var lis = $el.find('li'), li_width = this.outerWidth(lis) + (this.outerWidth(lis) / 4), up_count = Math.floor(this.outerWidth($('.clearing-container')) / li_width) - 1, target_index = lis.index(target), response; this.settings.up_count = up_count; if (this.adjacent(this.settings.prev_index, target_index)) { if ((target_index > up_count) && target_index > this.settings.prev_index) { response = 'right'; } else if ((target_index > up_count - 1) && target_index <= this.settings.prev_index) { response = 'left'; } else { response = false; } } else { response = 'skip'; } this.settings.prev_index = target_index; return response; }, adjacent : function (current_index, target_index) { for (var i = target_index + 1; i >= target_index - 1; i--) { if (i === current_index) return true; } return false; }, // lock management lock : function () { this.settings.locked = true; }, unlock : function () { this.settings.locked = false; }, locked : function () { return this.settings.locked; }, // plugin management/browser quirks outerHTML : function (el) { // support FireFox < 11 return el.outerHTML || new XMLSerializer().serializeToString(el); }, off : function () { $(this.scope).off('.fndtn.clearing'); $(window).off('.fndtn.clearing'); this.remove_data(); // empty settings cache this.settings.init = false; }, reflow : function () { this.init(); } }; }(Foundation.zj, this, this.document)); capistrano-capistrano-603c346/docs/assets/js/foundation/foundation.cookie.js000066400000000000000000000037301520217215100272570ustar00rootroot00000000000000/*! * jQuery Cookie Plugin v1.3 * https://github.com/carhartl/jquery-cookie * * Copyright 2011, Klaus Hartl * Dual licensed under the MIT or GPL Version 2 licenses. * http://www.opensource.org/licenses/mit-license.php * http://www.opensource.org/licenses/GPL-2.0 * * Modified to work with Zepto.js by ZURB */ (function ($, document, undefined) { var pluses = /\+/g; function raw(s) { return s; } function decoded(s) { return decodeURIComponent(s.replace(pluses, ' ')); } var config = $.cookie = function (key, value, options) { // write if (value !== undefined) { options = $.extend({}, config.defaults, options); if (value === null) { options.expires = -1; } if (typeof options.expires === 'number') { var days = options.expires, t = options.expires = new Date(); t.setDate(t.getDate() + days); } value = config.json ? JSON.stringify(value) : String(value); return (document.cookie = [ encodeURIComponent(key), '=', config.raw ? value : encodeURIComponent(value), options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE options.path ? '; path=' + options.path : '', options.domain ? '; domain=' + options.domain : '', options.secure ? '; secure' : '' ].join('')); } // read var decode = config.raw ? raw : decoded; var cookies = document.cookie.split('; '); for (var i = 0, l = cookies.length; i < l; i++) { var parts = cookies[i].split('='); if (decode(parts.shift()) === key) { var cookie = decode(parts.join('=')); return config.json ? JSON.parse(cookie) : cookie; } } return null; }; config.defaults = {}; $.removeCookie = function (key, options) { if ($.cookie(key) !== null) { $.cookie(key, null, options); return true; } return false; }; })(Foundation.zj, document); capistrano-capistrano-603c346/docs/assets/js/foundation/foundation.dropdown.js000066400000000000000000000124371520217215100276460ustar00rootroot00000000000000/*jslint unparam: true, browser: true, indent: 2 */ ;(function ($, window, document, undefined) { 'use strict'; Foundation.libs.dropdown = { name : 'dropdown', version : '4.2.0', settings : { activeClass: 'open', is_hover: false, opened: function(){}, closed: function(){} }, init : function (scope, method, options) { this.scope = scope || this.scope; Foundation.inherit(this, 'throttle scrollLeft data_options'); if (typeof method === 'object') { $.extend(true, this.settings, method); } if (typeof method !== 'string') { if (!this.settings.init) { this.events(); } return this.settings.init; } else { return this[method].call(this, options); } }, events : function () { var self = this; $(this.scope) .on('click.fndtn.dropdown', '[data-dropdown]', function (e) { var settings = $.extend({}, self.settings, self.data_options($(this))); e.preventDefault(); if (!settings.is_hover) self.toggle($(this)); }) .on('mouseenter', '[data-dropdown]', function (e) { var settings = $.extend({}, self.settings, self.data_options($(this))); if (settings.is_hover) self.toggle($(this)); }) .on('mouseleave', '[data-dropdown-content]', function (e) { var target = $('[data-dropdown="' + $(this).attr('id') + '"]'), settings = $.extend({}, self.settings, self.data_options(target)); if (settings.is_hover) self.close.call(self, $(this)); }) .on('opened.fndtn.dropdown', '[data-dropdown-content]', this.settings.opened) .on('closed.fndtn.dropdown', '[data-dropdown-content]', this.settings.closed); $('body').on('click.fndtn.dropdown', function (e) { var parent = $(e.target).closest('[data-dropdown-content]'); if ($(e.target).data('dropdown')) { return; } if (parent.length > 0 && ($(e.target).is('[data-dropdown-content]') || $.contains(parent.first()[0], e.target))) { e.stopPropagation(); return; } self.close.call(self, $('[data-dropdown-content]')); }); $(window).on('resize.fndtn.dropdown', self.throttle(function () { self.resize.call(self); }, 50)).trigger('resize'); this.settings.init = true; }, close: function (dropdown) { var self = this; dropdown.each(function () { if ($(this).hasClass(self.settings.activeClass)) { $(this) .css(Foundation.rtl ? 'right':'left', '-99999px') .removeClass(self.settings.activeClass); $(this).trigger('closed'); } }); }, open: function (dropdown, target) { this .css(dropdown .addClass(this.settings.activeClass), target); dropdown.trigger('opened'); }, toggle : function (target) { var dropdown = $('#' + target.data('dropdown')); this.close.call(this, $('[data-dropdown-content]').not(dropdown)); if (dropdown.hasClass(this.settings.activeClass)) { this.close.call(this, dropdown); } else { this.close.call(this, $('[data-dropdown-content]')) this.open.call(this, dropdown, target); } }, resize : function () { var dropdown = $('[data-dropdown-content].open'), target = $("[data-dropdown='" + dropdown.attr('id') + "']"); if (dropdown.length && target.length) { this.css(dropdown, target); } }, css : function (dropdown, target) { var offset_parent = dropdown.offsetParent(); // temporary workaround until 4.2 if (offset_parent.length > 0 && /body/i.test(dropdown.offsetParent()[0].nodeName)) { var position = target.offset(); position.top -= dropdown.offsetParent().offset().top; position.left -= dropdown.offsetParent().offset().left; } else { var position = target.position(); } if (this.small()) { dropdown.css({ position : 'absolute', width: '95%', left: '2.5%', 'max-width': 'none', top: position.top + this.outerHeight(target) }); } else { if (!Foundation.rtl && $(window).width() > this.outerWidth(dropdown) + target.offset().left) { var left = position.left; if (dropdown.hasClass('right')) { dropdown.removeClass('right'); } } else { if (!dropdown.hasClass('right')) { dropdown.addClass('right'); } var left = position.left - (this.outerWidth(dropdown) - this.outerWidth(target)); } dropdown.attr('style', '').css({ position : 'absolute', top: position.top + this.outerHeight(target), left: left }); } return dropdown; }, small : function () { return $(window).width() < 768 || $('html').hasClass('lt-ie9'); }, off: function () { $(this.scope).off('.fndtn.dropdown'); $('html, body').off('.fndtn.dropdown'); $(window).off('.fndtn.dropdown'); $('[data-dropdown-content]').off('.fndtn.dropdown'); this.settings.init = false; }, reflow : function () {} }; }(Foundation.zj, this, this.document)); capistrano-capistrano-603c346/docs/assets/js/foundation/foundation.forms.js000066400000000000000000000424161520217215100271400ustar00rootroot00000000000000(function ($, window, document, undefined) { 'use strict'; Foundation.libs.forms = { name: 'forms', version: '4.2.2', cache: {}, settings: { disable_class: 'no-custom', last_combo : null }, init: function (scope, method, options) { if (typeof method === 'object') { $.extend(true, this.settings, method); } if (typeof method !== 'string') { if (!this.settings.init) { this.events(); } this.assemble(); return this.settings.init; } else { return this[method].call(this, options); } }, assemble: function () { $('form.custom input[type="radio"]', $(this.scope)) .not('[data-customforms="disabled"]') .not('.' + this.settings.disable_class) .each(this.append_custom_markup); $('form.custom input[type="checkbox"]', $(this.scope)) .not('[data-customforms="disabled"]') .not('.' + this.settings.disable_class) .each(this.append_custom_markup); $('form.custom select', $(this.scope)) .not('[data-customforms="disabled"]') .not('.' + this.settings.disable_class) .not('[multiple=multiple]') .each(this.append_custom_select); }, events: function () { var self = this; $(this.scope) .on('click.fndtn.forms', 'form.custom span.custom.checkbox', function (e) { e.preventDefault(); e.stopPropagation(); self.toggle_checkbox($(this)); }) .on('click.fndtn.forms', 'form.custom span.custom.radio', function (e) { e.preventDefault(); e.stopPropagation(); self.toggle_radio($(this)); }) .on('change.fndtn.forms', 'form.custom select', function (e, force_refresh) { if (!$(this).not('[data-customforms="disabled"])')) return; self.refresh_custom_select($(this), force_refresh); }) .on('click.fndtn.forms', 'form.custom label', function (e) { if ($(e.target).is('label')) { var $associatedElement = $('#' + self.escape($(this).attr('for'))).not('[data-customforms="disabled"]'), $customCheckbox, $customRadio; if ($associatedElement.length !== 0) { if ($associatedElement.attr('type') === 'checkbox') { e.preventDefault(); $customCheckbox = $(this).find('span.custom.checkbox'); //the checkbox might be outside after the label or inside of another element if ($customCheckbox.length === 0) { $customCheckbox = $associatedElement.add(this).siblings('span.custom.checkbox').first(); } self.toggle_checkbox($customCheckbox); } else if ($associatedElement.attr('type') === 'radio') { e.preventDefault(); $customRadio = $(this).find('span.custom.radio'); //the radio might be outside after the label or inside of another element if ($customRadio.length === 0) { $customRadio = $associatedElement.add(this).siblings('span.custom.radio').first(); } self.toggle_radio($customRadio); } } } }) .on('mousedown.fndtn.forms', 'form.custom div.custom.dropdown', function () { return false; }) .on('click.fndtn.forms', 'form.custom div.custom.dropdown a.current, form.custom div.custom.dropdown a.selector', function (e) { var $this = $(this), $dropdown = $this.closest('div.custom.dropdown'), $select = getFirstPrevSibling($dropdown, 'select'); // make sure other dropdowns close if (!$dropdown.hasClass('open')) $(self.scope).trigger('click'); e.preventDefault(); if (false === $select.is(':disabled')) { $dropdown.toggleClass('open'); if ($dropdown.hasClass('open')) { $(self.scope).on('click.fndtn.forms.customdropdown', function () { $dropdown.removeClass('open'); $(self.scope).off('.fndtn.forms.customdropdown'); }); } else { $(self.scope).on('.fndtn.forms.customdropdown'); } return false; } }) .on('click.fndtn.forms touchend.fndtn.forms', 'form.custom div.custom.dropdown li', function (e) { var $this = $(this), $customDropdown = $this.closest('div.custom.dropdown'), $select = getFirstPrevSibling($customDropdown, 'select'), selectedIndex = 0; e.preventDefault(); e.stopPropagation(); if (!$(this).hasClass('disabled')) { $('div.dropdown').not($customDropdown).removeClass('open'); var $oldThis = $this.closest('ul') .find('li.selected'); $oldThis.removeClass('selected'); $this.addClass('selected'); $customDropdown.removeClass('open') .find('a.current') .text($this.text()); $this.closest('ul').find('li').each(function (index) { if ($this[0] === this) { selectedIndex = index; } }); $select[0].selectedIndex = selectedIndex; //store the old value in data $select.data('prevalue', $oldThis.html()); $select.trigger('change'); } }); $(window).on('keydown', function (e) { var focus = document.activeElement, self = Foundation.libs.forms, dropdown = $('.custom.dropdown.open'); if (dropdown.length > 0) { e.preventDefault(); if (e.which === 13) { dropdown.find('li.selected').trigger('click'); } if (e.which === 27) { dropdown.removeClass('open'); } if (e.which >= 65 && e.which <= 90) { var next = self.go_to(dropdown, e.which), current = dropdown.find('li.selected'); if (next) { current.removeClass('selected'); self.scrollTo(next.addClass('selected'), 300); } } if (e.which === 38) { var current = dropdown.find('li.selected'), prev = current.prev(':not(.disabled)'); if (prev.length > 0) { prev.parent()[0].scrollTop = prev.parent().scrollTop() - self.outerHeight(prev); current.removeClass('selected'); prev.addClass('selected'); } } else if (e.which === 40) { var current = dropdown.find('li.selected'), next = current.next(':not(.disabled)'); if (next.length > 0) { next.parent()[0].scrollTop = next.parent().scrollTop() + self.outerHeight(next); current.removeClass('selected'); next.addClass('selected'); } } } }); this.settings.init = true; }, go_to: function (dropdown, character) { var lis = dropdown.find('li'), count = lis.length; if (count > 0) { for (var i = 0; i < count; i++) { var first_letter = lis.eq(i).text().charAt(0).toLowerCase(); if (first_letter === String.fromCharCode(character).toLowerCase()) return lis.eq(i); } } }, scrollTo: function (el, duration) { if (duration < 0) return; var parent = el.parent(); var li_height = this.outerHeight(el); var difference = (li_height * (el.index())) - parent.scrollTop(); var perTick = difference / duration * 10; this.scrollToTimerCache = setTimeout(function () { if (!isNaN(parseInt(perTick, 10))) { parent[0].scrollTop = parent.scrollTop() + perTick; this.scrollTo(el, duration - 10); } }.bind(this), 10); }, append_custom_markup: function (idx, sel) { var $this = $(sel), type = $this.attr('type'), $span = $this.next('span.custom.' + type); if (!$this.parent().hasClass('switch')) { $this.addClass('hidden-field'); } if ($span.length === 0) { $span = $('').insertAfter($this); } $span.toggleClass('checked', $this.is(':checked')); $span.toggleClass('disabled', $this.is(':disabled')); }, append_custom_select: function (idx, sel) { var self = Foundation.libs.forms, $this = $(sel), $customSelect = $this.next('div.custom.dropdown'), $customList = $customSelect.find('ul'), $selectCurrent = $customSelect.find(".current"), $selector = $customSelect.find(".selector"), $options = $this.find('option'), $selectedOption = $options.filter(':selected'), copyClasses = $this.attr('class') ? $this.attr('class').split(' ') : [], maxWidth = 0, liHtml = '', $listItems, $currentSelect = false; if ($customSelect.length === 0) { var customSelectSize = $this.hasClass('small') ? 'small' : $this.hasClass('medium') ? 'medium' : $this.hasClass('large') ? 'large' : $this.hasClass('expand') ? 'expand' : ''; $customSelect = $('
        '); $selector = $customSelect.find(".selector"); $customList = $customSelect.find("ul"); liHtml = $options.map(function () { var copyClasses = $(this).attr('class') ? $(this).attr('class') : ''; return "
      • " + $(this).html() + "
      • "; }).get().join(''); $customList.append(liHtml); $currentSelect = $customSelect .prepend('' + $selectedOption.html() + '') .find(".current"); $this.after($customSelect) .addClass('hidden-field'); } else { liHtml = $options.map(function () { return "
      • " + $(this).html() + "
      • "; }) .get().join(''); $customList.html('') .append(liHtml); } // endif $customSelect.length === 0 self.assign_id($this, $customSelect); $customSelect.toggleClass('disabled', $this.is(':disabled')); $listItems = $customList.find('li'); // cache list length self.cache[$customSelect.data('id')] = $listItems.length; $options.each(function (index) { if (this.selected) { $listItems.eq(index).addClass('selected'); if ($currentSelect) { $currentSelect.html($(this).html()); } } if ($(this).is(':disabled')) { $listItems.eq(index).addClass('disabled'); } }); // // If we're not specifying a predetermined form size. // if (!$customSelect.is('.small, .medium, .large, .expand')) { // ------------------------------------------------------------------------------------ // This is a work-around for when elements are contained within hidden parents. // For example, when custom-form elements are inside of a hidden reveal modal. // // We need to display the current custom list element as well as hidden parent elements // in order to properly calculate the list item element's width property. // ------------------------------------------------------------------------------------- $customSelect.addClass('open'); // // Quickly, display all parent elements. // This should help us calcualate the width of the list item's within the drop down. // var self = Foundation.libs.forms; self.hidden_fix.adjust($customList); maxWidth = (self.outerWidth($listItems) > maxWidth) ? self.outerWidth($listItems) : maxWidth; Foundation.libs.forms.hidden_fix.reset(); $customSelect.removeClass('open'); } // endif }, assign_id: function ($select, $customSelect) { var id = [+new Date(), Foundation.random_str(5)].join('-'); $select.attr('data-id', id); $customSelect.attr('data-id', id); }, refresh_custom_select: function ($select, force_refresh) { var self = this; var maxWidth = 0, $customSelect = $select.next(), $options = $select.find('option'), $listItems = $customSelect.find('li'); if ($listItems.length !== this.cache[$customSelect.data('id')] || force_refresh) { $customSelect.find('ul').html(''); $options.each(function () { var $li = $('
      • ' + $(this).html() + '
      • '); $customSelect.find('ul').append($li); }); // re-populate $options.each(function (index) { if (this.selected) { $customSelect.find('li').eq(index).addClass('selected'); $customSelect.find('.current').html($(this).html()); } if ($(this).is(':disabled')) { $customSelect.find('li').eq(index).addClass('disabled'); } }); // fix width $customSelect.removeAttr('style') .find('ul').removeAttr('style'); $customSelect.find('li').each(function () { $customSelect.addClass('open'); if (self.outerWidth($(this)) > maxWidth) { maxWidth = self.outerWidth($(this)); } $customSelect.removeClass('open'); }); $listItems = $customSelect.find('li'); // cache list length this.cache[$customSelect.data('id')] = $listItems.length; } }, toggle_checkbox: function ($element) { var $input = $element.prev(), input = $input[0]; if (false === $input.is(':disabled')) { input.checked = ((input.checked) ? false : true); $element.toggleClass('checked'); $input.trigger('change'); } }, toggle_radio: function ($element) { var $input = $element.prev(), $form = $input.closest('form.custom'), input = $input[0]; if (false === $input.is(':disabled')) { $form.find('input[type="radio"][name="' + this.escape($input.attr('name')) + '"]') .next().not($element).removeClass('checked'); if (!$element.hasClass('checked')) { $element.toggleClass('checked'); } input.checked = $element.hasClass('checked'); $input.trigger('change'); } }, escape: function (text) { if (!text) return ''; return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); }, hidden_fix: { /** * Sets all hidden parent elements and self to visibile. * * @method adjust * @param {jQuery Object} $child */ // We'll use this to temporarily store style properties. tmp: [], // We'll use this to set hidden parent elements. hidden: null, adjust: function ($child) { // Internal reference. var _self = this; // Set all hidden parent elements, including this element. _self.hidden = $child.parents(); _self.hidden = _self.hidden.add($child).filter(":hidden"); // Loop through all hidden elements. _self.hidden.each(function () { // Cache the element. var $elem = $(this); // Store the style attribute. // Undefined if element doesn't have a style attribute. _self.tmp.push($elem.attr('style')); // Set the element's display property to block, // but ensure it's visibility is hidden. $elem.css({ 'visibility': 'hidden', 'display': 'block' }); }); }, // end adjust /** * Resets the elements previous state. * * @method reset */ reset: function () { // Internal reference. var _self = this; // Loop through our hidden element collection. _self.hidden.each(function (i) { // Cache this element. var $elem = $(this), _tmp = _self.tmp[i]; // Get the stored 'style' value for this element. // If the stored value is undefined. if (_tmp === undefined) // Remove the style attribute. $elem.removeAttr('style'); else // Otherwise, reset the element style attribute. $elem.attr('style', _tmp); }); // Reset the tmp array. _self.tmp = []; // Reset the hidden elements variable. _self.hidden = null; } // end reset }, off: function () { $(this.scope).off('.fndtn.forms'); }, reflow : function () {} }; var getFirstPrevSibling = function($el, selector) { var $el = $el.prev(); while ($el.length) { if ($el.is(selector)) return $el; $el = $el.prev(); } return $(); }; }(Foundation.zj, this, this.document)); capistrano-capistrano-603c346/docs/assets/js/foundation/foundation.interchange.js000066400000000000000000000152321520217215100302750ustar00rootroot00000000000000/*jslint unparam: true, browser: true, indent: 2 */ ;(function ($, window, document, undefined) { 'use strict'; Foundation.libs.interchange = { name : 'interchange', version : '4.2.2', cache : {}, settings : { load_attr : 'interchange', named_queries : { 'default' : 'only screen and (min-width: 1px)', small : 'only screen and (min-width: 768px)', medium : 'only screen and (min-width: 1280px)', large : 'only screen and (min-width: 1440px)', landscape : 'only screen and (orientation: landscape)', portrait : 'only screen and (orientation: portrait)', retina : 'only screen and (-webkit-min-device-pixel-ratio: 2),' + 'only screen and (min--moz-device-pixel-ratio: 2),' + 'only screen and (-o-min-device-pixel-ratio: 2/1),' + 'only screen and (min-device-pixel-ratio: 2),' + 'only screen and (min-resolution: 192dpi),' + 'only screen and (min-resolution: 2dppx)' }, directives : { replace : function (el, path) { if (/IMG/.test(el[0].nodeName)) { var path_parts = path.split('/'), path_file = path_parts[path_parts.length - 1], orig_path = el[0].src; if (new RegExp(path_file, 'i').test(el[0].src)) return; el[0].src = path; return el.trigger('replace', [el[0].src, orig_path]); } } } }, init : function (scope, method, options) { Foundation.inherit(this, 'throttle'); if (typeof method === 'object') { $.extend(true, this.settings, method); } this.events(); this.images(); if (typeof method !== 'string') { return this.settings.init; } else { return this[method].call(this, options); } }, events : function () { var self = this; $(window).on('resize.fndtn.interchange', self.throttle(function () { self.resize.call(self); }, 50)); }, resize : function () { var cache = this.cache; for (var uuid in cache) { if (cache.hasOwnProperty(uuid)) { var passed = this.results(uuid, cache[uuid]); if (passed) { this.settings.directives[passed .scenario[1]](passed.el, passed.scenario[0]); } } } }, results : function (uuid, scenarios) { var count = scenarios.length, results_arr = []; if (count > 0) { var el = $('[data-uuid="' + uuid + '"]'); for (var i = count - 1; i >= 0; i--) { var rule = scenarios[i][2]; if (this.settings.named_queries.hasOwnProperty(rule)) { var mq = matchMedia(this.settings.named_queries[rule]); } else { var mq = matchMedia(scenarios[i][2]); } if (mq.matches) { return {el: el, scenario: scenarios[i]}; } } } return false; }, images : function (force_update) { if (typeof this.cached_images === 'undefined' || force_update) { return this.update_images(); } return this.cached_images; }, update_images : function () { var images = document.getElementsByTagName('img'), count = images.length, data_attr = 'data-' + this.settings.load_attr; this.cached_images = []; for (var i = count - 1; i >= 0; i--) { this.loaded($(images[i]), (i === 0), function (image, last) { if (image) { var str = image.getAttribute(data_attr) || ''; if (str.length > 0) { this.cached_images.push(image); } } if (last) this.enhance(); }.bind(this)); } return 'deferred'; }, // based on jquery.imageready.js // @weblinc, @jsantell, (c) 2012 loaded : function (image, last, callback) { function loaded () { callback(image[0], last); } function bindLoad () { this.one('load', loaded); if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) { var src = this.attr( 'src' ), param = src.match( /\?/ ) ? '&' : '?'; param += 'random=' + (new Date()).getTime(); this.attr('src', src + param); } } if (!image.attr('src')) { loaded(); return; } if (image[0].complete || image[0].readyState === 4) { loaded(); } else { bindLoad.call(image); } }, enhance : function () { var count = this.images().length; for (var i = count - 1; i >= 0; i--) { this._object($(this.images()[i])); } return $(window).trigger('resize'); }, parse_params : function (path, directive, mq) { return [this.trim(path), this.convert_directive(directive), this.trim(mq)]; }, convert_directive : function (directive) { var trimmed = this.trim(directive); if (trimmed.length > 0) { return trimmed; } return 'replace'; }, _object : function(el) { var raw_arr = this.parse_data_attr(el), scenarios = [], count = raw_arr.length; if (count > 0) { for (var i = count - 1; i >= 0; i--) { var split = raw_arr[i].split(/\((.*?)(\))$/); if (split.length > 1) { var cached_split = split[0].split(','), params = this.parse_params(cached_split[0], cached_split[1], split[1]); scenarios.push(params); } } } return this.store(el, scenarios); }, uuid : function (separator) { var delim = separator || "-"; function S4() { return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); } return (S4() + S4() + delim + S4() + delim + S4() + delim + S4() + delim + S4() + S4() + S4()); }, store : function (el, scenarios) { var uuid = this.uuid(), current_uuid = el.data('uuid'); if (current_uuid) return this.cache[current_uuid]; el.attr('data-uuid', uuid); return this.cache[uuid] = scenarios; }, trim : function(str) { if (typeof str === 'string') { return $.trim(str); } return str; }, parse_data_attr : function (el) { var raw = el.data(this.settings.load_attr).split(/\[(.*?)\]/), count = raw.length, output = []; for (var i = count - 1; i >= 0; i--) { if (raw[i].replace(/[\W\d]+/, '').length > 4) { output.push(raw[i]); } } return output; }, reflow : function () { this.images(true); } }; }(Foundation.zj, this, this.document)); capistrano-capistrano-603c346/docs/assets/js/foundation/foundation.joyride.js000066400000000000000000000636331520217215100274630ustar00rootroot00000000000000/*jslint unparam: true, browser: true, indent: 2 */ (function ($, window, document, undefined) { 'use strict'; Foundation.libs.joyride = { name: 'joyride', version : '4.2.2', defaults : { expose : false, // turn on or off the expose feature modal : false, // Whether to cover page with modal during the tour tipLocation : 'bottom', // 'top' or 'bottom' in relation to parent nubPosition : 'auto', // override on a per tooltip bases scrollSpeed : 300, // Page scrolling speed in milliseconds, 0 = no scroll animation timer : 0, // 0 = no timer , all other numbers = timer in milliseconds startTimerOnClick : true, // true or false - true requires clicking the first button start the timer startOffset : 0, // the index of the tooltip you want to start on (index of the li) nextButton : true, // true or false to control whether a next button is used tipAnimation : 'fade', // 'pop' or 'fade' in each tip pauseAfter : [], // array of indexes where to pause the tour after exposed : [], // array of expose elements tipAnimationFadeSpeed: 300, // when tipAnimation = 'fade' this is speed in milliseconds for the transition cookieMonster : false, // true or false to control whether cookies are used cookieName : 'joyride', // Name the cookie you'll use cookieDomain : false, // Will this cookie be attached to a domain, ie. '.notableapp.com' cookieExpires : 365, // set when you would like the cookie to expire. tipContainer : 'body', // Where will the tip be attached postRideCallback : function (){}, // A method to call once the tour closes (canceled or complete) postStepCallback : function (){}, // A method to call after each step preStepCallback : function (){}, // A method to call before each step preRideCallback : function (){}, // A method to call before the tour starts (passed index, tip, and cloned exposed element) postExposeCallback : function (){}, // A method to call after an element has been exposed template : { // HTML segments for tip layout link : '×', timer : '
        ', tip : '
        ', wrapper : '
        ', button : '', modal : '
        ', expose : '
        ', exposeCover: '
        ' }, exposeAddClass : '' // One or more space-separated class names to be added to exposed element }, settings : {}, init : function (scope, method, options) { this.scope = scope || this.scope; Foundation.inherit(this, 'throttle data_options scrollTo scrollLeft delay'); if (typeof method === 'object') { $.extend(true, this.settings, this.defaults, method); } else { $.extend(true, this.settings, this.defaults, options); } if (typeof method !== 'string') { if (!this.settings.init) this.events(); return this.settings.init; } else { return this[method].call(this, options); } }, events : function () { var self = this; $(this.scope) .on('click.joyride', '.joyride-next-tip, .joyride-modal-bg', function (e) { e.preventDefault(); if (this.settings.$li.next().length < 1) { this.end(); } else if (this.settings.timer > 0) { clearTimeout(this.settings.automate); this.hide(); this.show(); this.startTimer(); } else { this.hide(); this.show(); } }.bind(this)) .on('click.joyride', '.joyride-close-tip', function (e) { e.preventDefault(); this.end(); }.bind(this)); $(window).on('resize.fndtn.joyride', self.throttle(function () { if ($('[data-joyride]').length > 0 && self.settings.$next_tip) { if (self.settings.exposed.length > 0) { var $els = $(self.settings.exposed); $els.each(function () { var $this = $(this); self.un_expose($this); self.expose($this); }); } if (self.is_phone()) { self.pos_phone(); } else { self.pos_default(false, true); } } }, 100)); this.settings.init = true; }, start : function () { var self = this, $this = $(this.scope).find('[data-joyride]'), integer_settings = ['timer', 'scrollSpeed', 'startOffset', 'tipAnimationFadeSpeed', 'cookieExpires'], int_settings_count = integer_settings.length; if (!this.settings.init) this.init(); // non configureable settings this.settings.$content_el = $this; this.settings.$body = $(this.settings.tipContainer); this.settings.body_offset = $(this.settings.tipContainer).position(); this.settings.$tip_content = this.settings.$content_el.find('> li'); this.settings.paused = false; this.settings.attempts = 0; this.settings.tipLocationPatterns = { top: ['bottom'], bottom: [], // bottom should not need to be repositioned left: ['right', 'top', 'bottom'], right: ['left', 'top', 'bottom'] }; // can we create cookies? if (typeof $.cookie !== 'function') { this.settings.cookieMonster = false; } // generate the tips and insert into dom. if (!this.settings.cookieMonster || this.settings.cookieMonster && $.cookie(this.settings.cookieName) === null) { this.settings.$tip_content.each(function (index) { var $this = $(this); $.extend(true, self.settings, self.data_options($this)); // Make sure that settings parsed from data_options are integers where necessary for (var i = int_settings_count - 1; i >= 0; i--) { self.settings[integer_settings[i]] = parseInt(self.settings[integer_settings[i]], 10); } self.create({$li : $this, index : index}); }); // show first tip if (!this.settings.startTimerOnClick && this.settings.timer > 0) { this.show('init'); this.startTimer(); } else { this.show('init'); } } }, resume : function () { this.set_li(); this.show(); }, tip_template : function (opts) { var $blank, content; opts.tip_class = opts.tip_class || ''; $blank = $(this.settings.template.tip).addClass(opts.tip_class); content = $.trim($(opts.li).html()) + this.button_text(opts.button_text) + this.settings.template.link + this.timer_instance(opts.index); $blank.append($(this.settings.template.wrapper)); $blank.first().attr('data-index', opts.index); $('.joyride-content-wrapper', $blank).append(content); return $blank[0]; }, timer_instance : function (index) { var txt; if ((index === 0 && this.settings.startTimerOnClick && this.settings.timer > 0) || this.settings.timer === 0) { txt = ''; } else { txt = this.outerHTML($(this.settings.template.timer)[0]); } return txt; }, button_text : function (txt) { if (this.settings.nextButton) { txt = $.trim(txt) || 'Next'; txt = this.outerHTML($(this.settings.template.button).append(txt)[0]); } else { txt = ''; } return txt; }, create : function (opts) { var buttonText = opts.$li.attr('data-button') || opts.$li.attr('data-text'), tipClass = opts.$li.attr('class'), $tip_content = $(this.tip_template({ tip_class : tipClass, index : opts.index, button_text : buttonText, li : opts.$li })); $(this.settings.tipContainer).append($tip_content); }, show : function (init) { var $timer = null; // are we paused? if (this.settings.$li === undefined || ($.inArray(this.settings.$li.index(), this.settings.pauseAfter) === -1)) { // don't go to the next li if the tour was paused if (this.settings.paused) { this.settings.paused = false; } else { this.set_li(init); } this.settings.attempts = 0; if (this.settings.$li.length && this.settings.$target.length > 0) { if (init) { //run when we first start this.settings.preRideCallback(this.settings.$li.index(), this.settings.$next_tip); if (this.settings.modal) { this.show_modal(); } } this.settings.preStepCallback(this.settings.$li.index(), this.settings.$next_tip); if (this.settings.modal && this.settings.expose) { this.expose(); } this.settings.tipSettings = $.extend(this.settings, this.data_options(this.settings.$li)); this.settings.timer = parseInt(this.settings.timer, 10); this.settings.tipSettings.tipLocationPattern = this.settings.tipLocationPatterns[this.settings.tipSettings.tipLocation]; // scroll if not modal if (!/body/i.test(this.settings.$target.selector)) { this.scroll_to(); } if (this.is_phone()) { this.pos_phone(true); } else { this.pos_default(true); } $timer = this.settings.$next_tip.find('.joyride-timer-indicator'); if (/pop/i.test(this.settings.tipAnimation)) { $timer.width(0); if (this.settings.timer > 0) { this.settings.$next_tip.show(); this.delay(function () { $timer.animate({ width: $timer.parent().width() }, this.settings.timer, 'linear'); }.bind(this), this.settings.tipAnimationFadeSpeed); } else { this.settings.$next_tip.show(); } } else if (/fade/i.test(this.settings.tipAnimation)) { $timer.width(0); if (this.settings.timer > 0) { this.settings.$next_tip .fadeIn(this.settings.tipAnimationFadeSpeed) .show(); this.delay(function () { $timer.animate({ width: $timer.parent().width() }, this.settings.timer, 'linear'); }.bind(this), this.settings.tipAnimationFadeSpeed); } else { this.settings.$next_tip.fadeIn(this.settings.tipAnimationFadeSpeed); } } this.settings.$current_tip = this.settings.$next_tip; // skip non-existant targets } else if (this.settings.$li && this.settings.$target.length < 1) { this.show(); } else { this.end(); } } else { this.settings.paused = true; } }, is_phone : function () { if (Modernizr) { return Modernizr.mq('only screen and (max-width: 767px)') || $('.lt-ie9').length > 0; } return (this.settings.$window.width() < 767); }, hide : function () { if (this.settings.modal && this.settings.expose) { this.un_expose(); } if (!this.settings.modal) { $('.joyride-modal-bg').hide(); } this.settings.$current_tip.hide(); this.settings.postStepCallback(this.settings.$li.index(), this.settings.$current_tip); }, set_li : function (init) { if (init) { this.settings.$li = this.settings.$tip_content.eq(this.settings.startOffset); this.set_next_tip(); this.settings.$current_tip = this.settings.$next_tip; } else { this.settings.$li = this.settings.$li.next(); this.set_next_tip(); } this.set_target(); }, set_next_tip : function () { this.settings.$next_tip = $(".joyride-tip-guide[data-index='" + this.settings.$li.index() + "']"); this.settings.$next_tip.data('closed', ''); }, set_target : function () { var cl = this.settings.$li.attr('data-class'), id = this.settings.$li.attr('data-id'), $sel = function () { if (id) { return $(document.getElementById(id)); } else if (cl) { return $('.' + cl).first(); } else { return $('body'); } }; this.settings.$target = $sel(); }, scroll_to : function () { var window_half, tipOffset; window_half = $(window).height() / 2; tipOffset = Math.ceil(this.settings.$target.offset().top - window_half + this.outerHeight(this.settings.$next_tip)); if (tipOffset > 0) { this.scrollTo($('html, body'), tipOffset, this.settings.scrollSpeed); } }, paused : function () { return ($.inArray((this.settings.$li.index() + 1), this.settings.pauseAfter) === -1); }, restart : function () { this.hide(); this.settings.$li = undefined; this.show('init'); }, pos_default : function (init, resizing) { var half_fold = Math.ceil($(window).height() / 2), tip_position = this.settings.$next_tip.offset(), $nub = this.settings.$next_tip.find('.joyride-nub'), nub_width = Math.ceil(this.outerWidth($nub) / 2), nub_height = Math.ceil(this.outerHeight($nub) / 2), toggle = init || false; // tip must not be "display: none" to calculate position if (toggle) { this.settings.$next_tip.css('visibility', 'hidden'); this.settings.$next_tip.show(); } if (typeof resizing === 'undefined') { resizing = false; } if (!/body/i.test(this.settings.$target.selector)) { if (this.bottom()) { var leftOffset = this.settings.$target.offset().left; if (Foundation.rtl) { leftOffset = this.settings.$target.offset().width - this.settings.$next_tip.width() + leftOffset; } this.settings.$next_tip.css({ top: (this.settings.$target.offset().top + nub_height + this.outerHeight(this.settings.$target)), left: leftOffset}); this.nub_position($nub, this.settings.tipSettings.nubPosition, 'top'); } else if (this.top()) { var leftOffset = this.settings.$target.offset().left; if (Foundation.rtl) { leftOffset = this.settings.$target.offset().width - this.settings.$next_tip.width() + leftOffset; } this.settings.$next_tip.css({ top: (this.settings.$target.offset().top - this.outerHeight(this.settings.$next_tip) - nub_height), left: leftOffset}); this.nub_position($nub, this.settings.tipSettings.nubPosition, 'bottom'); } else if (this.right()) { this.settings.$next_tip.css({ top: this.settings.$target.offset().top, left: (this.outerWidth(this.settings.$target) + this.settings.$target.offset().left + nub_width)}); this.nub_position($nub, this.settings.tipSettings.nubPosition, 'left'); } else if (this.left()) { this.settings.$next_tip.css({ top: this.settings.$target.offset().top, left: (this.settings.$target.offset().left - this.outerWidth(this.settings.$next_tip) - nub_width)}); this.nub_position($nub, this.settings.tipSettings.nubPosition, 'right'); } if (!this.visible(this.corners(this.settings.$next_tip)) && this.settings.attempts < this.settings.tipSettings.tipLocationPattern.length) { $nub.removeClass('bottom') .removeClass('top') .removeClass('right') .removeClass('left'); this.settings.tipSettings.tipLocation = this.settings.tipSettings.tipLocationPattern[this.settings.attempts]; this.settings.attempts++; this.pos_default(); } } else if (this.settings.$li.length) { this.pos_modal($nub); } if (toggle) { this.settings.$next_tip.hide(); this.settings.$next_tip.css('visibility', 'visible'); } }, pos_phone : function (init) { var tip_height = this.outerHeight(this.settings.$next_tip), tip_offset = this.settings.$next_tip.offset(), target_height = this.outerHeight(this.settings.$target), $nub = $('.joyride-nub', this.settings.$next_tip), nub_height = Math.ceil(this.outerHeight($nub) / 2), toggle = init || false; $nub.removeClass('bottom') .removeClass('top') .removeClass('right') .removeClass('left'); if (toggle) { this.settings.$next_tip.css('visibility', 'hidden'); this.settings.$next_tip.show(); } if (!/body/i.test(this.settings.$target.selector)) { if (this.top()) { this.settings.$next_tip.offset({top: this.settings.$target.offset().top - tip_height - nub_height}); $nub.addClass('bottom'); } else { this.settings.$next_tip.offset({top: this.settings.$target.offset().top + target_height + nub_height}); $nub.addClass('top'); } } else if (this.settings.$li.length) { this.pos_modal($nub); } if (toggle) { this.settings.$next_tip.hide(); this.settings.$next_tip.css('visibility', 'visible'); } }, pos_modal : function ($nub) { this.center(); $nub.hide(); this.show_modal(); }, show_modal : function () { if (!this.settings.$next_tip.data('closed')) { var joyridemodalbg = $('.joyride-modal-bg'); if (joyridemodalbg.length < 1) { $('body').append(this.settings.template.modal).show(); } if (/pop/i.test(this.settings.tipAnimation)) { joyridemodalbg.show(); } else { joyridemodalbg.fadeIn(this.settings.tipAnimationFadeSpeed); } } }, expose : function () { var expose, exposeCover, el, origCSS, origClasses, randId = 'expose-'+Math.floor(Math.random()*10000); if (arguments.length > 0 && arguments[0] instanceof $) { el = arguments[0]; } else if(this.settings.$target && !/body/i.test(this.settings.$target.selector)){ el = this.settings.$target; } else { return false; } if(el.length < 1){ if(window.console){ console.error('element not valid', el); } return false; } expose = $(this.settings.template.expose); this.settings.$body.append(expose); expose.css({ top: el.offset().top, left: el.offset().left, width: this.outerWidth(el, true), height: this.outerHeight(el, true) }); exposeCover = $(this.settings.template.exposeCover); origCSS = { zIndex: el.css('z-index'), position: el.css('position') }; origClasses = el.attr('class') == null ? '' : el.attr('class'); el.css('z-index',parseInt(expose.css('z-index'))+1); if (origCSS.position == 'static') { el.css('position','relative'); } el.data('expose-css',origCSS); el.data('orig-class', origClasses); el.attr('class', origClasses + ' ' + this.settings.exposeAddClass); exposeCover.css({ top: el.offset().top, left: el.offset().left, width: this.outerWidth(el, true), height: this.outerHeight(el, true) }); this.settings.$body.append(exposeCover); expose.addClass(randId); exposeCover.addClass(randId); el.data('expose', randId); this.settings.postExposeCallback(this.settings.$li.index(), this.settings.$next_tip, el); this.add_exposed(el); }, un_expose : function () { var exposeId, el, expose , origCSS, origClasses, clearAll = false; if (arguments.length > 0 && arguments[0] instanceof $) { el = arguments[0]; } else if(this.settings.$target && !/body/i.test(this.settings.$target.selector)){ el = this.settings.$target; } else { return false; } if(el.length < 1){ if (window.console) { console.error('element not valid', el); } return false; } exposeId = el.data('expose'); expose = $('.' + exposeId); if (arguments.length > 1) { clearAll = arguments[1]; } if (clearAll === true) { $('.joyride-expose-wrapper,.joyride-expose-cover').remove(); } else { expose.remove(); } origCSS = el.data('expose-css'); if (origCSS.zIndex == 'auto') { el.css('z-index', ''); } else { el.css('z-index', origCSS.zIndex); } if (origCSS.position != el.css('position')) { if(origCSS.position == 'static') {// this is default, no need to set it. el.css('position', ''); } else { el.css('position', origCSS.position); } } origClasses = el.data('orig-class'); el.attr('class', origClasses); el.removeData('orig-classes'); el.removeData('expose'); el.removeData('expose-z-index'); this.remove_exposed(el); }, add_exposed: function(el){ this.settings.exposed = this.settings.exposed || []; if (el instanceof $ || typeof el === 'object') { this.settings.exposed.push(el[0]); } else if (typeof el == 'string') { this.settings.exposed.push(el); } }, remove_exposed: function(el){ var search, count; if (el instanceof $) { search = el[0] } else if (typeof el == 'string'){ search = el; } this.settings.exposed = this.settings.exposed || []; count = this.settings.exposed.length; for (var i=0; i < count; i++) { if (this.settings.exposed[i] == search) { this.settings.exposed.splice(i, 1); return; } } }, center : function () { var $w = $(window); this.settings.$next_tip.css({ top : ((($w.height() - this.outerHeight(this.settings.$next_tip)) / 2) + $w.scrollTop()), left : ((($w.width() - this.outerWidth(this.settings.$next_tip)) / 2) + this.scrollLeft($w)) }); return true; }, bottom : function () { return /bottom/i.test(this.settings.tipSettings.tipLocation); }, top : function () { return /top/i.test(this.settings.tipSettings.tipLocation); }, right : function () { return /right/i.test(this.settings.tipSettings.tipLocation); }, left : function () { return /left/i.test(this.settings.tipSettings.tipLocation); }, corners : function (el) { var w = $(window), window_half = w.height() / 2, //using this to calculate since scroll may not have finished yet. tipOffset = Math.ceil(this.settings.$target.offset().top - window_half + this.settings.$next_tip.outerHeight()), right = w.width() + this.scrollLeft(w), offsetBottom = w.height() + tipOffset, bottom = w.height() + w.scrollTop(), top = w.scrollTop(); if (tipOffset < top) { if (tipOffset < 0) { top = 0; } else { top = tipOffset; } } if (offsetBottom > bottom) { bottom = offsetBottom; } return [ el.offset().top < top, right < el.offset().left + el.outerWidth(), bottom < el.offset().top + el.outerHeight(), this.scrollLeft(w) > el.offset().left ]; }, visible : function (hidden_corners) { var i = hidden_corners.length; while (i--) { if (hidden_corners[i]) return false; } return true; }, nub_position : function (nub, pos, def) { if (pos === 'auto') { nub.addClass(def); } else { nub.addClass(pos); } }, startTimer : function () { if (this.settings.$li.length) { this.settings.automate = setTimeout(function () { this.hide(); this.show(); this.startTimer(); }.bind(this), this.settings.timer); } else { clearTimeout(this.settings.automate); } }, end : function () { if (this.settings.cookieMonster) { $.cookie(this.settings.cookieName, 'ridden', { expires: this.settings.cookieExpires, domain: this.settings.cookieDomain }); } if (this.settings.timer > 0) { clearTimeout(this.settings.automate); } if (this.settings.modal && this.settings.expose) { this.un_expose(); } this.settings.$next_tip.data('closed', true); $('.joyride-modal-bg').hide(); this.settings.$current_tip.hide(); this.settings.postStepCallback(this.settings.$li.index(), this.settings.$current_tip); this.settings.postRideCallback(this.settings.$li.index(), this.settings.$current_tip); $('.joyride-tip-guide').remove(); }, outerHTML : function (el) { // support FireFox < 11 return el.outerHTML || new XMLSerializer().serializeToString(el); }, off : function () { $(this.scope).off('.joyride'); $(window).off('.joyride'); $('.joyride-close-tip, .joyride-next-tip, .joyride-modal-bg').off('.joyride'); $('.joyride-tip-guide, .joyride-modal-bg').remove(); clearTimeout(this.settings.automate); this.settings = {}; }, reflow : function () {} }; }(Foundation.zj, this, this.document)); capistrano-capistrano-603c346/docs/assets/js/foundation/foundation.js000066400000000000000000000271711520217215100260140ustar00rootroot00000000000000/* * Foundation Responsive Library * http://foundation.zurb.com * Copyright 2013, ZURB * Free to use under the MIT license. * http://www.opensource.org/licenses/mit-license.php */ /*jslint unparam: true, browser: true, indent: 2 */ // Accommodate running jQuery or Zepto in noConflict() mode by // using an anonymous function to redefine the $ shorthand name. // See http://docs.jquery.com/Using_jQuery_with_Other_Libraries // and http://zeptojs.com/ var libFuncName = null; if (typeof jQuery === "undefined" && typeof Zepto === "undefined" && typeof $ === "function") { libFuncName = $; } else if (typeof jQuery === "function") { libFuncName = jQuery; } else if (typeof Zepto === "function") { libFuncName = Zepto; } else { throw new TypeError(); } (function ($, window, document, undefined) { 'use strict'; /* matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license https://github.com/paulirish/matchMedia.js */ window.matchMedia = window.matchMedia || (function( doc, undefined ) { "use strict"; var bool, docElem = doc.documentElement, refNode = docElem.firstElementChild || docElem.firstChild, // fakeBody required for fakeBody = doc.createElement( "body" ), div = doc.createElement( "div" ); div.id = "mq-test-1"; div.style.cssText = "position:absolute;top:-100em"; fakeBody.style.background = "none"; fakeBody.appendChild(div); return function(q){ div.innerHTML = "­"; docElem.insertBefore( fakeBody, refNode ); bool = div.offsetWidth === 42; docElem.removeChild( fakeBody ); return { matches: bool, media: q }; }; }( document )); // add dusty browser stuff if (!Array.prototype.filter) { Array.prototype.filter = function(fun /*, thisp */) { "use strict"; if (this == null) { throw new TypeError(); } var t = Object(this), len = t.length >>> 0; if (typeof fun !== "function") { return; } var res = [], thisp = arguments[1]; for (var i = 0; i < len; i++) { if (i in t) { var val = t[i]; // in case fun mutates this if (fun && fun.call(thisp, val, i, t)) { res.push(val); } } } return res; } } if (!Function.prototype.bind) { Function.prototype.bind = function (oThis) { if (typeof this !== "function") { // closest thing possible to the ECMAScript 5 internal IsCallable function throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable"); } var aArgs = Array.prototype.slice.call(arguments, 1), fToBind = this, fNOP = function () {}, fBound = function () { return fToBind.apply(this instanceof fNOP && oThis ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments))); }; fNOP.prototype = this.prototype; fBound.prototype = new fNOP(); return fBound; }; } if (!Array.prototype.indexOf) { Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) { "use strict"; if (this == null) { throw new TypeError(); } var t = Object(this); var len = t.length >>> 0; if (len === 0) { return -1; } var n = 0; if (arguments.length > 1) { n = Number(arguments[1]); if (n != n) { // shortcut for verifying if it's NaN n = 0; } else if (n != 0 && n != Infinity && n != -Infinity) { n = (n > 0 || -1) * Math.floor(Math.abs(n)); } } if (n >= len) { return -1; } var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); for (; k < len; k++) { if (k in t && t[k] === searchElement) { return k; } } return -1; } } // fake stop() for zepto. $.fn.stop = $.fn.stop || function() { return this; }; window.Foundation = { name : 'Foundation', version : '4.2.2', cache : {}, init : function (scope, libraries, method, options, response, /* internal */ nc) { var library_arr, args = [scope, method, options, response], responses = [], nc = nc || false; // disable library error catching, // used for development only if (nc) this.nc = nc; // check RTL this.rtl = /rtl/i.test($('html').attr('dir')); // set foundation global scope this.scope = scope || this.scope; if (libraries && typeof libraries === 'string' && !/reflow/i.test(libraries)) { if (/off/i.test(libraries)) return this.off(); library_arr = libraries.split(' '); if (library_arr.length > 0) { for (var i = library_arr.length - 1; i >= 0; i--) { responses.push(this.init_lib(library_arr[i], args)); } } } else { if (/reflow/i.test(libraries)) args[1] = 'reflow'; for (var lib in this.libs) { responses.push(this.init_lib(lib, args)); } } // if first argument is callback, add to args if (typeof libraries === 'function') { args.unshift(libraries); } return this.response_obj(responses, args); }, response_obj : function (response_arr, args) { for (var i = 0, len = args.length; i < len; i++) { if (typeof args[i] === 'function') { return args[i]({ errors: response_arr.filter(function (s) { if (typeof s === 'string') return s; }) }); } } return response_arr; }, init_lib : function (lib, args) { return this.trap(function () { if (this.libs.hasOwnProperty(lib)) { this.patch(this.libs[lib]); return this.libs[lib].init.apply(this.libs[lib], args); } else { return function () {}; } }.bind(this), lib); }, trap : function (fun, lib) { if (!this.nc) { try { return fun(); } catch (e) { return this.error({name: lib, message: 'could not be initialized', more: e.name + ' ' + e.message}); } } return fun(); }, patch : function (lib) { this.fix_outer(lib); lib.scope = this.scope; lib.rtl = this.rtl; }, inherit : function (scope, methods) { var methods_arr = methods.split(' '); for (var i = methods_arr.length - 1; i >= 0; i--) { if (this.lib_methods.hasOwnProperty(methods_arr[i])) { this.libs[scope.name][methods_arr[i]] = this.lib_methods[methods_arr[i]]; } } }, random_str : function (length) { var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'.split(''); if (!length) { length = Math.floor(Math.random() * chars.length); } var str = ''; for (var i = 0; i < length; i++) { str += chars[Math.floor(Math.random() * chars.length)]; } return str; }, libs : {}, // methods that can be inherited in libraries lib_methods : { set_data : function (node, data) { // this.name references the name of the library calling this method var id = [this.name,+new Date(),Foundation.random_str(5)].join('-'); Foundation.cache[id] = data; node.attr('data-' + this.name + '-id', id); return data; }, get_data : function (node) { return Foundation.cache[node.attr('data-' + this.name + '-id')]; }, remove_data : function (node) { if (node) { delete Foundation.cache[node.attr('data-' + this.name + '-id')]; node.attr('data-' + this.name + '-id', ''); } else { $('[data-' + this.name + '-id]').each(function () { delete Foundation.cache[$(this).attr('data-' + this.name + '-id')]; $(this).attr('data-' + this.name + '-id', ''); }); } }, throttle : function(fun, delay) { var timer = null; return function () { var context = this, args = arguments; clearTimeout(timer); timer = setTimeout(function () { fun.apply(context, args); }, delay); }; }, // parses data-options attribute on nodes and turns // them into an object data_options : function (el) { var opts = {}, ii, p, opts_arr = (el.attr('data-options') || ':').split(';'), opts_len = opts_arr.length; function isNumber (o) { return ! isNaN (o-0) && o !== null && o !== "" && o !== false && o !== true; } function trim(str) { if (typeof str === 'string') return $.trim(str); return str; } // parse options for (ii = opts_len - 1; ii >= 0; ii--) { p = opts_arr[ii].split(':'); if (/true/i.test(p[1])) p[1] = true; if (/false/i.test(p[1])) p[1] = false; if (isNumber(p[1])) p[1] = parseInt(p[1], 10); if (p.length === 2 && p[0].length > 0) { opts[trim(p[0])] = trim(p[1]); } } return opts; }, delay : function (fun, delay) { return setTimeout(fun, delay); }, // animated scrolling scrollTo : function (el, to, duration) { if (duration < 0) return; var difference = to - $(window).scrollTop(); var perTick = difference / duration * 10; this.scrollToTimerCache = setTimeout(function() { if (!isNaN(parseInt(perTick, 10))) { window.scrollTo(0, $(window).scrollTop() + perTick); this.scrollTo(el, to, duration - 10); } }.bind(this), 10); }, // not supported in core Zepto scrollLeft : function (el) { if (!el.length) return; return ('scrollLeft' in el[0]) ? el[0].scrollLeft : el[0].pageXOffset; }, // test for empty object or array empty : function (obj) { if (obj.length && obj.length > 0) return false; if (obj.length && obj.length === 0) return true; for (var key in obj) { if (hasOwnProperty.call(obj, key)) return false; } return true; } }, fix_outer : function (lib) { lib.outerHeight = function (el, bool) { if (typeof Zepto === 'function') { return el.height(); } if (typeof bool !== 'undefined') { return el.outerHeight(bool); } return el.outerHeight(); }; lib.outerWidth = function (el) { if (typeof Zepto === 'function') { return el.width(); } if (typeof bool !== 'undefined') { return el.outerWidth(bool); } return el.outerWidth(); }; }, error : function (error) { return error.name + ' ' + error.message + '; ' + error.more; }, // remove all foundation events. off: function () { $(this.scope).off('.fndtn'); $(window).off('.fndtn'); return true; }, zj : function () { if (typeof Zepto !== 'undefined') { return Zepto; } else { return jQuery; } }() }; $.fn.foundation = function () { var args = Array.prototype.slice.call(arguments, 0); return this.each(function () { Foundation.init.apply(Foundation, [this].concat(args)); return this; }); }; }(libFuncName, this, this.document)); capistrano-capistrano-603c346/docs/assets/js/foundation/foundation.magellan.js000066400000000000000000000113521520217215100275650ustar00rootroot00000000000000/*jslint unparam: true, browser: true, indent: 2 */ ;(function ($, window, document, undefined) { 'use strict'; Foundation.libs.magellan = { name : 'magellan', version : '4.2.2', settings : { activeClass: 'active' }, init : function (scope, method, options) { this.scope = scope || this.scope; Foundation.inherit(this, 'data_options'); if (typeof method === 'object') { $.extend(true, this.settings, method); } if (typeof method !== 'string') { if (!this.settings.init) { this.fixed_magellan = $("[data-magellan-expedition]"); this.set_threshold(); this.last_destination = $('[data-magellan-destination]').last(); this.events(); } return this.settings.init; } else { return this[method].call(this, options); } }, events : function () { var self = this; $(this.scope).on('arrival.fndtn.magellan', '[data-magellan-arrival]', function (e) { var $destination = $(this), $expedition = $destination.closest('[data-magellan-expedition]'), activeClass = $expedition.attr('data-magellan-active-class') || self.settings.activeClass; $destination .closest('[data-magellan-expedition]') .find('[data-magellan-arrival]') .not($destination) .removeClass(activeClass); $destination.addClass(activeClass); }); this.fixed_magellan .on('update-position.fndtn.magellan', function(){ var $el = $(this); // $el.data("magellan-fixed-position",""); // $el.data("magellan-top-offset", ""); }) .trigger('update-position'); $(window) .on('resize.fndtn.magellan', function() { this.fixed_magellan.trigger('update-position'); }.bind(this)) .on('scroll.fndtn.magellan', function() { var windowScrollTop = $(window).scrollTop(); self.fixed_magellan.each(function() { var $expedition = $(this); if (typeof $expedition.data('magellan-top-offset') === 'undefined') { $expedition.data('magellan-top-offset', $expedition.offset().top); } if (typeof $expedition.data('magellan-fixed-position') === 'undefined') { $expedition.data('magellan-fixed-position', false) } var fixed_position = (windowScrollTop + self.settings.threshold) > $expedition.data("magellan-top-offset"); var attr = $expedition.attr('data-magellan-top-offset'); if ($expedition.data("magellan-fixed-position") != fixed_position) { $expedition.data("magellan-fixed-position", fixed_position); if (fixed_position) { $expedition.addClass('fixed'); $expedition.css({position:"fixed", top:0}); } else { $expedition.removeClass('fixed'); $expedition.css({position:"", top:""}); } if (fixed_position && typeof attr != 'undefined' && attr != false) { $expedition.css({position:"fixed", top:attr + "px"}); } } }); }); if (this.last_destination.length > 0) { $(window).on('scroll.fndtn.magellan', function (e) { var windowScrollTop = $(window).scrollTop(), scrolltopPlusHeight = windowScrollTop + $(window).height(), lastDestinationTop = Math.ceil(self.last_destination.offset().top); $('[data-magellan-destination]').each(function () { var $destination = $(this), destination_name = $destination.attr('data-magellan-destination'), topOffset = $destination.offset().top - windowScrollTop; if (topOffset <= self.settings.threshold) { $("[data-magellan-arrival='" + destination_name + "']").trigger('arrival'); } // In large screens we may hit the bottom of the page and dont reach the top of the last magellan-destination, so lets force it if (scrolltopPlusHeight >= $(self.scope).height() && lastDestinationTop > windowScrollTop && lastDestinationTop < scrolltopPlusHeight) { $('[data-magellan-arrival]').last().trigger('arrival'); } }); }); } this.settings.init = true; }, set_threshold : function () { if (!this.settings.threshold) { this.settings.threshold = (this.fixed_magellan.length > 0) ? this.outerHeight(this.fixed_magellan, true) : 0; } }, off : function () { $(this.scope).off('.fndtn.magellan'); }, reflow : function () {} }; }(Foundation.zj, this, this.document)); capistrano-capistrano-603c346/docs/assets/js/foundation/foundation.orbit.js000066400000000000000000000361361520217215100271330ustar00rootroot00000000000000;(function ($, window, document, undefined) { 'use strict'; Foundation.libs = Foundation.libs || {}; Foundation.libs.orbit = { name: 'orbit', version: '4.2.0', settings: { timer_speed: 10000, pause_on_hover: true, resume_on_mouseout: false, animation_speed: 500, bullets: true, stack_on_small: true, navigation_arrows: true, slide_number: true, container_class: 'orbit-container', stack_on_small_class: 'orbit-stack-on-small', next_class: 'orbit-next', prev_class: 'orbit-prev', timer_container_class: 'orbit-timer', timer_paused_class: 'paused', timer_progress_class: 'orbit-progress', slides_container_class: 'orbit-slides-container', bullets_container_class: 'orbit-bullets', bullets_active_class: 'active', slide_number_class: 'orbit-slide-number', caption_class: 'orbit-caption', active_slide_class: 'active', orbit_transition_class: 'orbit-transitioning' }, init: function (scope, method, options) { var self = this; Foundation.inherit(self, 'data_options'); if (typeof method === 'object') { $.extend(true, self.settings, method); } if ($(scope).is('[data-orbit]')) { var scoped_self = $.extend(true, {}, self); scoped_self._init(idx, el); } $('[data-orbit]', scope).each(function(idx, el) { var scoped_self = $.extend(true, {}, self); scoped_self._init(idx, el); }); }, _container_html: function() { var self = this; return '
        '; }, _bullets_container_html: function($slides) { var self = this, $list = $('
          '); $slides.each(function(idx, slide) { var $item = $('
        1. '); if (idx === 0) { $item.addClass(self.settings.bullets_active_class); } $list.append($item); }); return $list; }, _slide_number_html: function(slide_number, total_slides) { var self = this, $container = $('
          '); $container.append('' + slide_number + ' of ' + total_slides + ''); return $container; }, _timer_html: function() { var self = this; if (typeof self.settings.timer_speed === 'number' && self.settings.timer_speed > 0) { return '
          '; } else { return ''; } }, _next_html: function() { var self = this; return 'Next '; }, _prev_html: function() { var self = this; return 'Prev '; }, _init: function (idx, slider) { var self = this, $slides_container = $(slider), $container = $slides_container.wrap(self._container_html()).parent(), $slides = $slides_container.children(); $.extend(true, self.settings, self.data_options($slides_container)); if (self.settings.navigation_arrows) { $container.append(self._prev_html()); $container.append(self._next_html()); } $slides_container.addClass(self.settings.slides_container_class); if (self.settings.stack_on_small) { $container.addClass(self.settings.stack_on_small_class); } if (self.settings.slide_number) { $container.append(self._slide_number_html(1, $slides.length)); } $container.append(self._timer_html()); if (self.settings.bullets) { $container.after(self._bullets_container_html($slides)); } // To better support the "sliding" effect it's easier // if we just clone the first and last slides $slides_container.append($slides.first().clone().attr('data-orbit-slide','')); $slides_container.prepend($slides.last().clone().attr('data-orbit-slide','')); // Make the first "real" slide active $slides_container.css(Foundation.rtl ? 'marginRight' : 'marginLeft', '-100%'); $slides.first().addClass(self.settings.active_slide_class); self._init_events($slides_container); self._init_dimensions($slides_container); self._start_timer($slides_container); }, _init_events: function ($slides_container) { var self = this, $container = $slides_container.parent(); $(window) .on('load.fndtn.orbit', function() { $slides_container.height(''); $slides_container.height($slides_container.height($container.height())); $slides_container.trigger('orbit:ready'); }) .on('resize.fndtn.orbit', function() { $slides_container.height(''); $slides_container.height($slides_container.height($container.height())); }); $(document).on('click.fndtn.orbit', '[data-orbit-link]', function(e) { e.preventDefault(); var id = $(e.currentTarget).attr('data-orbit-link'), $slide = $slides_container.find('[data-orbit-slide=' + id + ']').first(); if ($slide.length === 1) { self._reset_timer($slides_container, true); self._goto($slides_container, $slide.index(), function() {}); } }); $container.siblings('.' + self.settings.bullets_container_class) .on('click.fndtn.orbit', '[data-orbit-slide-number]', function(e) { e.preventDefault(); self._reset_timer($slides_container, true); self._goto($slides_container, $(e.currentTarget).data('orbit-slide-number'),function() {}); }); $container .on('mouseenter.fndtn.orbit', function(e) { if (self.settings.pause_on_hover) { self._stop_timer($slides_container); } }) .on('mouseleave.fndtn.orbit', function(e) { if (self.settings.resume_on_mouseout) { self._start_timer($slides_container); } }) .on('orbit:after-slide-change.fndtn.orbit', function(e, orbit) { var $slide_number = $container.find('.' + self.settings.slide_number_class); if ($slide_number.length === 1) { $slide_number.replaceWith(self._slide_number_html(orbit.slide_number, orbit.total_slides)); } }) .on('orbit:next-slide.fndtn.orbit click.fndtn.orbit', '.' + self.settings.next_class.split(" ").join("."), function(e) { e.preventDefault(); self._reset_timer($slides_container, true); self._goto($slides_container, 'next', function() {}); }) .on('orbit:prev-slide.fndtn.orbit click.fndtn.orbit', '.' + self.settings.prev_class.split(" ").join("."), function(e) { e.preventDefault(); self._reset_timer($slides_container, true); self._goto($slides_container, 'prev', function() {}); }) .on('orbit:toggle-play-pause.fndtn.orbit click.fndtn.orbit touchstart.fndtn.orbit', '.' + self.settings.timer_container_class, function(e) { e.preventDefault(); var $timer = $(e.currentTarget).toggleClass(self.settings.timer_paused_class), $slides_container = $timer.closest('.' + self.settings.container_class) .find('.' + self.settings.slides_container_class); if ($timer.hasClass(self.settings.timer_paused_class)) { self._stop_timer($slides_container); } else { self._start_timer($slides_container); } }) .on('touchstart.fndtn.orbit', function(e) { if (!e.touches) { e = e.originalEvent; } var data = { start_page_x: e.touches[0].pageX, start_page_y: e.touches[0].pageY, start_time: (new Date()).getTime(), delta_x: 0, is_scrolling: undefined }; $container.data('swipe-transition', data); e.stopPropagation(); }) .on('touchmove.fndtn.orbit', function(e) { if (!e.touches) { e = e.originalEvent; } // Ignore pinch/zoom events if(e.touches.length > 1 || e.scale && e.scale !== 1) return; var data = $container.data('swipe-transition'); if (typeof data === 'undefined') { data = {}; } data.delta_x = e.touches[0].pageX - data.start_page_x; if ( typeof data.is_scrolling === 'undefined') { data.is_scrolling = !!( data.is_scrolling || Math.abs(data.delta_x) < Math.abs(e.touches[0].pageY - data.start_page_y) ); } if (!data.is_scrolling && !data.active) { e.preventDefault(); self._stop_timer($slides_container); var direction = (data.delta_x < 0) ? 'next' : 'prev'; data.active = true; self._goto($slides_container, direction, function() {}); } }) .on('touchend.fndtn.orbit', function(e) { $container.data('swipe-transition', {}); e.stopPropagation(); }); }, _init_dimensions: function ($slides_container) { var $container = $slides_container.parent(), $slides = $slides_container.children(); $slides_container.css('width', $slides.length * 100 + '%'); $slides.css('width', 100 / $slides.length + '%'); $slides_container.height($container.height()); $slides_container.css('width', $slides.length * 100 + '%'); }, _start_timer: function ($slides_container) { var self = this, $container = $slides_container.parent(); var callback = function() { self._reset_timer($slides_container, false); self._goto($slides_container, 'next', function() { self._start_timer($slides_container); }); }; var $timer = $container.find('.' + self.settings.timer_container_class), $progress = $timer.find('.' + self.settings.timer_progress_class), progress_pct = ($progress.width() / $timer.width()), delay = self.settings.timer_speed - (progress_pct * self.settings.timer_speed); $progress.animate({'width': '100%'}, delay, 'linear', callback); $slides_container.trigger('orbit:timer-started'); }, _stop_timer: function ($slides_container) { var self = this, $container = $slides_container.parent(), $timer = $container.find('.' + self.settings.timer_container_class), $progress = $timer.find('.' + self.settings.timer_progress_class), progress_pct = $progress.width() / $timer.width(); self._rebuild_timer($container, progress_pct * 100 + '%'); // $progress.stop(); $slides_container.trigger('orbit:timer-stopped'); $timer = $container.find('.' + self.settings.timer_container_class); $timer.addClass(self.settings.timer_paused_class); }, _reset_timer: function($slides_container, is_paused) { var self = this, $container = $slides_container.parent(); self._rebuild_timer($container, '0%'); if (typeof is_paused === 'boolean' && is_paused) { var $timer = $container.find('.' + self.settings.timer_container_class); $timer.addClass(self.settings.timer_paused_class); } }, _rebuild_timer: function ($container, width_pct) { // Zepto is unable to stop animations since they // are css-based. This is a workaround for that // limitation, which rebuilds the dom element // thus stopping the animation var self = this, $timer = $container.find('.' + self.settings.timer_container_class), $new_timer = $(self._timer_html()), $new_timer_progress = $new_timer.find('.' + self.settings.timer_progress_class); if (typeof Zepto === 'function') { $timer.remove(); $container.append($new_timer); $new_timer_progress.css('width', width_pct); } else if (typeof jQuery === 'function') { var $progress = $timer.find('.' + self.settings.timer_progress_class); $progress.css('width', width_pct); $progress.stop(); } }, _goto: function($slides_container, index_or_direction, callback) { var self = this, $container = $slides_container.parent(), $slides = $slides_container.children(), $active_slide = $slides_container.find('.' + self.settings.active_slide_class), active_index = $active_slide.index(), margin_position = Foundation.rtl ? 'marginRight' : 'marginLeft'; if ($container.hasClass(self.settings.orbit_transition_class)) { return false; } if (index_or_direction === 'prev') { if (active_index === 0) { active_index = $slides.length - 1; } else { active_index--; } } else if (index_or_direction === 'next') { active_index = (active_index+1) % $slides.length; } else if (typeof index_or_direction === 'number') { active_index = (index_or_direction % $slides.length); } if (active_index === ($slides.length - 1) && index_or_direction === 'next') { $slides_container.css(margin_position, '0%'); active_index = 1; } else if (active_index === 0 && index_or_direction === 'prev') { $slides_container.css(margin_position, '-' + ($slides.length - 1) * 100 + '%'); active_index = $slides.length - 2; } // Start transition, make next slide active $container.addClass(self.settings.orbit_transition_class); $active_slide.removeClass(self.settings.active_slide_class); $($slides[active_index]).addClass(self.settings.active_slide_class); // Make next bullet active var $bullets = $container.siblings('.' + self.settings.bullets_container_class); if ($bullets.length === 1) { $bullets.children().removeClass(self.settings.bullets_active_class); $($bullets.children()[active_index-1]).addClass(self.settings.bullets_active_class); } var new_margin_left = '-' + (active_index * 100) + '%'; // Check to see if animation will occur, otherwise perform // callbacks manually $slides_container.trigger('orbit:before-slide-change'); if ($slides_container.css(margin_position) === new_margin_left) { $container.removeClass(self.settings.orbit_transition_class); $slides_container.trigger('orbit:after-slide-change', [{slide_number: active_index, total_slides: $slides_container.children().length - 2}]); callback(); } else { var properties = {}; properties[margin_position] = new_margin_left; $slides_container.animate(properties, self.settings.animation_speed, 'linear', function() { $container.removeClass(self.settings.orbit_transition_class); $slides_container.trigger('orbit:after-slide-change', [{slide_number: active_index, total_slides: $slides_container.children().length - 2}]); callback(); }); } } }; }(Foundation.zj, this, this.document)); capistrano-capistrano-603c346/docs/assets/js/foundation/foundation.placeholder.js000066400000000000000000000116011520217215100302640ustar00rootroot00000000000000/*! http://mths.be/placeholder v2.0.7 by @mathias Modified to work with Zepto.js by ZURB */ ;(function(window, document, $) { var isInputSupported = 'placeholder' in document.createElement('input'), isTextareaSupported = 'placeholder' in document.createElement('textarea'), prototype = $.fn, valHooks = $.valHooks, hooks, placeholder; if (isInputSupported && isTextareaSupported) { placeholder = prototype.placeholder = function() { return this; }; placeholder.input = placeholder.textarea = true; } else { placeholder = prototype.placeholder = function() { var $this = this; $this .filter((isInputSupported ? 'textarea' : ':input') + '[placeholder]') .not('.placeholder') .bind({ 'focus.placeholder': clearPlaceholder, 'blur.placeholder': setPlaceholder }) .data('placeholder-enabled', true) .trigger('blur.placeholder'); return $this; }; placeholder.input = isInputSupported; placeholder.textarea = isTextareaSupported; hooks = { 'get': function(element) { var $element = $(element); return $element.data('placeholder-enabled') && $element.hasClass('placeholder') ? '' : element.value; }, 'set': function(element, value) { var $element = $(element); if (!$element.data('placeholder-enabled')) { return element.value = value; } if (value == '') { element.value = value; // Issue #56: Setting the placeholder causes problems if the element continues to have focus. if (element != document.activeElement) { // We can't use `triggerHandler` here because of dummy text/password inputs :( setPlaceholder.call(element); } } else if ($element.hasClass('placeholder')) { clearPlaceholder.call(element, true, value) || (element.value = value); } else { element.value = value; } // `set` can not return `undefined`; see http://jsapi.info/jquery/1.7.1/val#L2363 return $element; } }; isInputSupported || (valHooks.input = hooks); isTextareaSupported || (valHooks.textarea = hooks); $(function() { // Look for forms $(document).delegate('form', 'submit.placeholder', function() { // Clear the placeholder values so they don't get submitted var $inputs = $('.placeholder', this).each(clearPlaceholder); setTimeout(function() { $inputs.each(setPlaceholder); }, 10); }); }); // Clear placeholder values upon page reload $(window).bind('beforeunload.placeholder', function() { $('.placeholder').each(function() { this.value = ''; }); }); } function args(elem) { // Return an object of element attributes var newAttrs = {}, rinlinejQuery = /^jQuery\d+$/; $.each(elem.attributes, function(i, attr) { if (attr.specified && !rinlinejQuery.test(attr.name)) { newAttrs[attr.name] = attr.value; } }); return newAttrs; } function clearPlaceholder(event, value) { var input = this, $input = $(input); if (input.value == $input.attr('placeholder') && $input.hasClass('placeholder')) { if ($input.data('placeholder-password')) { $input = $input.hide().next().show().attr('id', $input.removeAttr('id').data('placeholder-id')); // If `clearPlaceholder` was called from `$.valHooks.input.set` if (event === true) { return $input[0].value = value; } $input.focus(); } else { input.value = ''; $input.removeClass('placeholder'); input == document.activeElement && input.select(); } } } function setPlaceholder() { var $replacement, input = this, $input = $(input), $origInput = $input, id = this.id; if (input.value == '') { if (input.type == 'password') { if (!$input.data('placeholder-textinput')) { try { $replacement = $input.clone().attr({ 'type': 'text' }); } catch(e) { $replacement = $('').attr($.extend(args(this), { 'type': 'text' })); } $replacement .removeAttr('name') .data({ 'placeholder-password': true, 'placeholder-id': id }) .bind('focus.placeholder', clearPlaceholder); $input .data({ 'placeholder-textinput': $replacement, 'placeholder-id': id }) .before($replacement); } $input = $input.removeAttr('id').hide().prev().attr('id', id).show(); // Note: `$input[0] != input` now! } $input.addClass('placeholder'); $input[0].value = $input.attr('placeholder'); } else { $input.removeClass('placeholder'); } } }(this, document, Foundation.zj)); ;(function ($, window, document, undefined) { 'use strict'; Foundation.libs.placeholder = { name : 'placeholder', version : '4.2.2', init : function (scope, method, options) { this.scope = scope || this.scope; if (typeof method !== 'string') { window.onload = function () { $('input, textarea').placeholder(); } } } }; }(Foundation.zj, this, this.document)); capistrano-capistrano-603c346/docs/assets/js/foundation/foundation.reveal.js000066400000000000000000000226461520217215100272730ustar00rootroot00000000000000/*jslint unparam: true, browser: true, indent: 2 */ ;(function ($, window, document, undefined) { 'use strict'; Foundation.libs.reveal = { name: 'reveal', version : '4.2.2', locked : false, settings : { animation: 'fadeAndPop', animationSpeed: 250, closeOnBackgroundClick: true, closeOnEsc: true, dismissModalClass: 'close-reveal-modal', bgClass: 'reveal-modal-bg', open: function(){}, opened: function(){}, close: function(){}, closed: function(){}, bg : $('.reveal-modal-bg'), css : { open : { 'opacity': 0, 'visibility': 'visible', 'display' : 'block' }, close : { 'opacity': 1, 'visibility': 'hidden', 'display': 'none' } } }, init : function (scope, method, options) { Foundation.inherit(this, 'data_options delay'); if (typeof method === 'object') { $.extend(true, this.settings, method); } else if (typeof options !== 'undefined') { $.extend(true, this.settings, options); } if (typeof method !== 'string') { this.events(); return this.settings.init; } else { return this[method].call(this, options); } }, events : function () { var self = this; $(this.scope) .off('.fndtn.reveal') .on('click.fndtn.reveal', '[data-reveal-id]', function (e) { e.preventDefault(); if (!self.locked) { var element = $(this), ajax = element.data('reveal-ajax'); self.locked = true; if (typeof ajax === 'undefined') { self.open.call(self, element); } else { var url = ajax === true ? element.attr('href') : ajax; self.open.call(self, element, {url: url}); } } }) .on('click.fndtn.reveal', this.close_targets(), function (e) { e.preventDefault(); if (!self.locked) { var settings = $.extend({}, self.settings, self.data_options($('.reveal-modal.open'))); if ($(e.target)[0] === $('.' + settings.bgClass)[0] && !settings.closeOnBackgroundClick) { return; } self.locked = true; self.close.call(self, $(this).closest('.reveal-modal')); } }) .on('open.fndtn.reveal', '.reveal-modal', this.settings.open) .on('opened.fndtn.reveal', '.reveal-modal', this.settings.opened) .on('opened.fndtn.reveal', '.reveal-modal', this.open_video) .on('close.fndtn.reveal', '.reveal-modal', this.settings.close) .on('closed.fndtn.reveal', '.reveal-modal', this.settings.closed) .on('closed.fndtn.reveal', '.reveal-modal', this.close_video); $( 'body' ).bind( 'keyup.reveal', function ( event ) { var open_modal = $('.reveal-modal.open'), settings = $.extend({}, self.settings, self.data_options(open_modal)); if ( event.which === 27 && settings.closeOnEsc) { // 27 is the keycode for the Escape key open_modal.foundation('reveal', 'close'); } }); return true; }, open : function (target, ajax_settings) { if (target) { if (typeof target.selector !== 'undefined') { var modal = $('#' + target.data('reveal-id')); } else { var modal = $(this.scope); ajax_settings = target; } } else { var modal = $(this.scope); } if (!modal.hasClass('open')) { var open_modal = $('.reveal-modal.open'); if (typeof modal.data('css-top') === 'undefined') { modal.data('css-top', parseInt(modal.css('top'), 10)) .data('offset', this.cache_offset(modal)); } modal.trigger('open'); if (open_modal.length < 1) { this.toggle_bg(modal); } if (typeof ajax_settings === 'undefined' || !ajax_settings.url) { this.hide(open_modal, this.settings.css.close); this.show(modal, this.settings.css.open); } else { var self = this, old_success = typeof ajax_settings.success !== 'undefined' ? ajax_settings.success : null; $.extend(ajax_settings, { success: function (data, textStatus, jqXHR) { if ( $.isFunction(old_success) ) { old_success(data, textStatus, jqXHR); } modal.html(data); $(modal).foundation('section', 'reflow'); self.hide(open_modal, self.settings.css.close); self.show(modal, self.settings.css.open); } }); $.ajax(ajax_settings); } } }, close : function (modal) { var modal = modal && modal.length ? modal : $(this.scope), open_modals = $('.reveal-modal.open'); if (open_modals.length > 0) { this.locked = true; modal.trigger('close'); this.toggle_bg(modal); this.hide(open_modals, this.settings.css.close); } }, close_targets : function () { var base = '.' + this.settings.dismissModalClass; if (this.settings.closeOnBackgroundClick) { return base + ', .' + this.settings.bgClass; } return base; }, toggle_bg : function (modal) { if ($('.reveal-modal-bg').length === 0) { this.settings.bg = $('
          ', {'class': this.settings.bgClass}) .appendTo('body'); } if (this.settings.bg.filter(':visible').length > 0) { this.hide(this.settings.bg); } else { this.show(this.settings.bg); } }, show : function (el, css) { // is modal if (css) { if (/pop/i.test(this.settings.animation)) { css.top = $(window).scrollTop() - el.data('offset') + 'px'; var end_css = { top: $(window).scrollTop() + el.data('css-top') + 'px', opacity: 1 }; return this.delay(function () { return el .css(css) .animate(end_css, this.settings.animationSpeed, 'linear', function () { this.locked = false; el.trigger('opened'); }.bind(this)) .addClass('open'); }.bind(this), this.settings.animationSpeed / 2); } if (/fade/i.test(this.settings.animation)) { var end_css = {opacity: 1}; return this.delay(function () { return el .css(css) .animate(end_css, this.settings.animationSpeed, 'linear', function () { this.locked = false; el.trigger('opened'); }.bind(this)) .addClass('open'); }.bind(this), this.settings.animationSpeed / 2); } return el.css(css).show().css({opacity: 1}).addClass('open').trigger('opened'); } // should we animate the background? if (/fade/i.test(this.settings.animation)) { return el.fadeIn(this.settings.animationSpeed / 2); } return el.show(); }, hide : function (el, css) { // is modal if (css) { if (/pop/i.test(this.settings.animation)) { var end_css = { top: - $(window).scrollTop() - el.data('offset') + 'px', opacity: 0 }; return this.delay(function () { return el .animate(end_css, this.settings.animationSpeed, 'linear', function () { this.locked = false; el.css(css).trigger('closed'); }.bind(this)) .removeClass('open'); }.bind(this), this.settings.animationSpeed / 2); } if (/fade/i.test(this.settings.animation)) { var end_css = {opacity: 0}; return this.delay(function () { return el .animate(end_css, this.settings.animationSpeed, 'linear', function () { this.locked = false; el.css(css).trigger('closed'); }.bind(this)) .removeClass('open'); }.bind(this), this.settings.animationSpeed / 2); } return el.hide().css(css).removeClass('open').trigger('closed'); } // should we animate the background? if (/fade/i.test(this.settings.animation)) { return el.fadeOut(this.settings.animationSpeed / 2); } return el.hide(); }, close_video : function (e) { var video = $(this).find('.flex-video'), iframe = video.find('iframe'); if (iframe.length > 0) { iframe.attr('data-src', iframe[0].src); iframe.attr('src', 'about:blank'); video.hide(); } }, open_video : function (e) { var video = $(this).find('.flex-video'), iframe = video.find('iframe'); if (iframe.length > 0) { var data_src = iframe.attr('data-src'); if (typeof data_src === 'string') { iframe[0].src = iframe.attr('data-src'); } else { var src = iframe[0].src; iframe[0].src = undefined; iframe[0].src = src; } video.show(); } }, cache_offset : function (modal) { var offset = modal.show().height() + parseInt(modal.css('top'), 10); modal.hide(); return offset; }, off : function () { $(this.scope).off('.fndtn.reveal'); }, reflow : function () {} }; }(Foundation.zj, this, this.document)); capistrano-capistrano-603c346/docs/assets/js/foundation/foundation.section.js000066400000000000000000000316651520217215100274620ustar00rootroot00000000000000/*jslint unparam: true, browser: true, indent: 2 */ ;(function ($, window, document, undefined) { 'use strict'; Foundation.libs.section = { name: 'section', version : '4.2.2', settings : { deep_linking: false, small_breakpoint: 768, one_up: true, section_selector : '[data-section]', region_selector : 'section, .section, [data-section-region]', title_selector : '.title, [data-section-title]', active_region_selector : 'section.active, .section.active, .active[data-section-region]', content_selector : '.content, [data-section-content]', nav_selector : '[data-section="vertical-nav"], [data-section="horizontal-nav"]', callback: function (){} }, init : function (scope, method, options) { var self = this; Foundation.inherit(this, 'throttle data_options position_right offset_right'); if (typeof method === 'object') { $.extend(true, self.settings, method); } if (typeof method !== 'string') { this.set_active_from_hash(); this.events(); return true; } else { return this[method].call(this, options); } }, events : function () { var self = this; $(this.scope) .on('click.fndtn.section', '[data-section] .title, [data-section] [data-section-title]', function (e) { var $this = $(this), section = $this.closest(self.settings.region_selector); if (section.children(self.settings.content_selector).length > 0) { self.toggle_active.call(this, e, self); self.reflow(); } }); $(window) .on('resize.fndtn.section', self.throttle(function () { self.resize.call(this); }, 30)) .on('hashchange', function () { if (!self.settings.toggled){ self.set_active_from_hash(); $(this).trigger('resize'); } }).trigger('resize'); $(document) .on('click.fndtn.section', function (e) { if ($(e.target).closest(self.settings.title_selector).length < 1) { $(self.settings.nav_selector) .children(self.settings.region_selector) .removeClass('active') .attr('style', ''); } }); }, toggle_active : function (e, self) { var $this = $(this), self = Foundation.libs.section, region = $this.closest(self.settings.region_selector), content = $this.siblings(self.settings.content_selector), parent = region.parent(), settings = $.extend({}, self.settings, self.data_options(parent)), prev_active_section = parent .children(self.settings.active_region_selector); self.settings.toggled = true; if (!settings.deep_linking && content.length > 0) { e.preventDefault(); } if (region.hasClass('active')) { // this is causing the style flash. if (self.small(parent) || self.is_vertical_nav(parent) || self.is_horizontal_nav(parent) || self.is_accordion(parent)) { if (prev_active_section[0] !== region[0] || (prev_active_section[0] === region[0] && !settings.one_up)) { region .removeClass('active') .attr('style', ''); } } } else { var prev_active_section = parent .children(self.settings.active_region_selector), title_height = self.outerHeight(region .children(self.settings.title_selector)); if (self.small(parent) || settings.one_up) { if (self.small(parent)) { prev_active_section.attr('style', ''); } else { prev_active_section.attr('style', 'visibility: hidden; padding-top: '+title_height+'px;'); } } if (self.small(parent)) { region.attr('style', ''); } else { region.css('padding-top', title_height); } region.addClass('active'); if (prev_active_section.length > 0) { prev_active_section .removeClass('active') .attr('style', ''); } // Toggle the content display attribute. This is done to // ensure accurate outerWidth measurements that account for // the scrollbar. if (self.is_vertical_tabs(parent)) { content.css('display', 'block'); if (prev_active_section !== null) { prev_active_section .children(self.settings.content_selector) .css('display', 'none'); } } } setTimeout(function () { self.settings.toggled = false; }, 300); settings.callback(); }, resize : function () { var self = Foundation.libs.section, sections = $(self.settings.section_selector); sections.each(function() { var $this = $(this), active_section = $this .children(self.settings.active_region_selector), settings = $.extend({}, self.settings, self.data_options($this)); if (active_section.length > 1) { active_section .not(':first') .removeClass('active') .attr('style', ''); } else if (active_section.length < 1 && !self.is_vertical_nav($this) && !self.is_horizontal_nav($this) && !self.is_accordion($this)) { var first = $this.children(self.settings.region_selector).first(); if (settings.one_up || !self.small($this)) { first.addClass('active'); } if (self.small($this)) { first.attr('style', ''); } else { first.css('padding-top', self.outerHeight(first .children(self.settings.title_selector))); } } if (self.small($this)) { active_section.attr('style', ''); } else { active_section.css('padding-top', self.outerHeight(active_section .children(self.settings.title_selector))); } self.position_titles($this); if ( (self.is_horizontal_nav($this) && !self.small($this)) || self.is_vertical_tabs($this) && !self.small($this)) { self.position_content($this); } else { self.position_content($this, false); } }); }, is_vertical_nav : function (el) { return /vertical-nav/i.test(el.data('section')); }, is_horizontal_nav : function (el) { return /horizontal-nav/i.test(el.data('section')); }, is_accordion : function (el) { return /accordion/i.test(el.data('section')); }, is_horizontal_tabs : function (el) { return /^tabs$/i.test(el.data('section')); }, is_vertical_tabs : function (el) { return /vertical-tabs/i.test(el.data('section')); }, set_active_from_hash : function () { var hash = window.location.hash.substring(1), sections = $('[data-section]'), self = this; sections.each(function () { var section = $(this), settings = $.extend({}, self.settings, self.data_options(section)); if (hash.length > 0 && settings.deep_linking) { var regions = section .children(self.settings.region_selector) .attr('style', '') .removeClass('active'); var hash_regions = regions.map(function () { var content = $(self.settings.content_selector, this), content_slug = content.data('slug'); if (new RegExp(content_slug, 'i').test(hash)) return content; }); var count = hash_regions.length; for (var i = count - 1; i >= 0; i--) { $(hash_regions[i]).parent().addClass('active'); } } }); }, position_titles : function (section, off) { var self = this, titles = section .children(this.settings.region_selector) .map(function () { return $(this).children(self.settings.title_selector); }), previous_width = 0, previous_height = 0, self = this; if (typeof off === 'boolean') { titles.attr('style', ''); } else { titles.each(function () { if (self.is_vertical_tabs(section)) { $(this).css('top', previous_height); previous_height += self.outerHeight($(this)); } else { if (!self.rtl) { $(this).css('left', previous_width); } else { $(this).css('right', previous_width); } previous_width += self.outerWidth($(this)); } }); } }, position_content : function (section, off) { var self = this, regions = section.children(self.settings.region_selector), titles = regions .map(function () { return $(this).children(self.settings.title_selector); }), content = regions .map(function () { return $(this).children(self.settings.content_selector); }); if (typeof off === 'boolean') { content.attr('style', ''); section.attr('style', ''); } else { if (self.is_vertical_tabs(section) && !self.small(section)) { var content_min_height = 0, content_min_width = Number.MAX_VALUE, title_width = null; regions.each(function () { var region = $(this), title = region.children(self.settings.title_selector), content = region.children(self.settings.content_selector), content_width = 0; title_width = self.outerWidth(title); content_width = self.outerWidth(section) - title_width; if (content_width < content_min_width) { content_min_width = content_width; } // Increment the minimum height of the content region // to align with the height of the titles. content_min_height += self.outerHeight(title); // Set all of the inactive tabs to 'display: none' // The CSS sets all of the tabs as 'display: block' // in order to account for scrollbars when measuring the width // of the content regions. if (!$(this).hasClass('active')) { content.css('display', 'none'); } }); regions.each(function () { var content = $(this).children(self.settings.content_selector); content.css('minHeight', content_min_height); // Remove 2 pixels to account for the right-shift in the CSS content.css('maxWidth', content_min_width - 2); }); } else { regions.each(function () { var region = $(this), title = region.children(self.settings.title_selector), content = region.children(self.settings.content_selector); if (!self.rtl) { content .css({left: title.position().left - 1, top: self.outerHeight(title) - 2}); } else { content .css({right: self.position_right(title) + 1, top: self.outerHeight(title) - 2}); } }); // temporary work around for Zepto outerheight calculation issues. if (typeof Zepto === 'function') { section.height(this.outerHeight($(titles[0]))); } else { section.height(this.outerHeight($(titles[0])) - 2); } } } }, position_right : function (el) { var self = this, section = el.closest(this.settings.section_selector), regions = section.children(this.settings.region_selector), section_width = el.closest(this.settings.section_selector).width(), offset = regions .map(function () { return $(this).children(self.settings.title_selector); }).length; return (section_width - el.position().left - el.width() * (el.index() + 1) - offset); }, reflow : function (scope) { var scope = scope || document; $(this.settings.section_selector, scope).trigger('resize'); }, small : function (el) { var settings = $.extend({}, this.settings, this.data_options(el)); if (this.is_horizontal_tabs(el)) { return false; } if (el && this.is_accordion(el)) { return true; } if ($('html').hasClass('lt-ie9')) { return true; } if ($('html').hasClass('ie8compat')) { return true; } return $(this.scope).width() < settings.small_breakpoint; }, off : function () { $(this.scope).off('.fndtn.section'); $(window).off('.fndtn.section'); $(document).off('.fndtn.section') } }; }(Foundation.zj, this, this.document)); capistrano-capistrano-603c346/docs/assets/js/foundation/foundation.tooltips.js000066400000000000000000000160141520217215100276620ustar00rootroot00000000000000/*jslint unparam: true, browser: true, indent: 2 */ ;(function ($, window, document, undefined) { 'use strict'; Foundation.libs.tooltips = { name: 'tooltips', version : '4.2.2', settings : { selector : '.has-tip', additionalInheritableClasses : [], tooltipClass : '.tooltip', appendTo: 'body', 'disable-for-touch': false, tipTemplate : function (selector, content) { return '' + content + ''; } }, cache : {}, init : function (scope, method, options) { Foundation.inherit(this, 'data_options'); var self = this; if (typeof method === 'object') { $.extend(true, this.settings, method); } else if (typeof options !== 'undefined') { $.extend(true, this.settings, options); } if (typeof method !== 'string') { if (Modernizr.touch) { $(this.scope) .on('click.fndtn.tooltip touchstart.fndtn.tooltip touchend.fndtn.tooltip', '[data-tooltip]', function (e) { var settings = $.extend({}, self.settings, self.data_options($(this))); if (!settings['disable-for-touch']) { e.preventDefault(); $(settings.tooltipClass).hide(); self.showOrCreateTip($(this)); } }) .on('click.fndtn.tooltip touchstart.fndtn.tooltip touchend.fndtn.tooltip', this.settings.tooltipClass, function (e) { e.preventDefault(); $(this).fadeOut(150); }); } else { $(this.scope) .on('mouseenter.fndtn.tooltip mouseleave.fndtn.tooltip', '[data-tooltip]', function (e) { var $this = $(this); if (/enter|over/i.test(e.type)) { self.showOrCreateTip($this); } else if (e.type === 'mouseout' || e.type === 'mouseleave') { self.hide($this); } }); } // $(this.scope).data('fndtn-tooltips', true); } else { return this[method].call(this, options); } }, showOrCreateTip : function ($target) { var $tip = this.getTip($target); if ($tip && $tip.length > 0) { return this.show($target); } return this.create($target); }, getTip : function ($target) { var selector = this.selector($target), tip = null; if (selector) { tip = $('span[data-selector="' + selector + '"]' + this.settings.tooltipClass); } return (typeof tip === 'object') ? tip : false; }, selector : function ($target) { var id = $target.attr('id'), dataSelector = $target.attr('data-tooltip') || $target.attr('data-selector'); if ((id && id.length < 1 || !id) && typeof dataSelector != 'string') { dataSelector = 'tooltip' + Math.random().toString(36).substring(7); $target.attr('data-selector', dataSelector); } return (id && id.length > 0) ? id : dataSelector; }, create : function ($target) { var $tip = $(this.settings.tipTemplate(this.selector($target), $('
          ').html($target.attr('title')).html())), classes = this.inheritable_classes($target); $tip.addClass(classes).appendTo(this.settings.appendTo); if (Modernizr.touch) { $tip.append('tap to close '); } $target.removeAttr('title').attr('title',''); this.show($target); }, reposition : function (target, tip, classes) { var width, nub, nubHeight, nubWidth, column, objPos; tip.css('visibility', 'hidden').show(); width = target.data('width'); nub = tip.children('.nub'); nubHeight = this.outerHeight(nub); nubWidth = this.outerHeight(nub); objPos = function (obj, top, right, bottom, left, width) { return obj.css({ 'top' : (top) ? top : 'auto', 'bottom' : (bottom) ? bottom : 'auto', 'left' : (left) ? left : 'auto', 'right' : (right) ? right : 'auto', 'width' : (width) ? width : 'auto' }).end(); }; objPos(tip, (target.offset().top + this.outerHeight(target) + 10), 'auto', 'auto', target.offset().left, width); if ($(window).width() < 767) { objPos(tip, (target.offset().top + this.outerHeight(target) + 10), 'auto', 'auto', 12.5, $(this.scope).width()); tip.addClass('tip-override'); objPos(nub, -nubHeight, 'auto', 'auto', target.offset().left); } else { var left = target.offset().left; if (Foundation.rtl) { left = target.offset().left + target.offset().width - this.outerWidth(tip); } objPos(tip, (target.offset().top + this.outerHeight(target) + 10), 'auto', 'auto', left, width); tip.removeClass('tip-override'); if (classes && classes.indexOf('tip-top') > -1) { objPos(tip, (target.offset().top - this.outerHeight(tip)), 'auto', 'auto', left, width) .removeClass('tip-override'); } else if (classes && classes.indexOf('tip-left') > -1) { objPos(tip, (target.offset().top + (this.outerHeight(target) / 2) - nubHeight*2.5), 'auto', 'auto', (target.offset().left - this.outerWidth(tip) - nubHeight), width) .removeClass('tip-override'); } else if (classes && classes.indexOf('tip-right') > -1) { objPos(tip, (target.offset().top + (this.outerHeight(target) / 2) - nubHeight*2.5), 'auto', 'auto', (target.offset().left + this.outerWidth(target) + nubHeight), width) .removeClass('tip-override'); } } tip.css('visibility', 'visible').hide(); }, inheritable_classes : function (target) { var inheritables = ['tip-top', 'tip-left', 'tip-bottom', 'tip-right', 'noradius'].concat(this.settings.additionalInheritableClasses), classes = target.attr('class'), filtered = classes ? $.map(classes.split(' '), function (el, i) { if ($.inArray(el, inheritables) !== -1) { return el; } }).join(' ') : ''; return $.trim(filtered); }, show : function ($target) { var $tip = this.getTip($target); this.reposition($target, $tip, $target.attr('class')); $tip.fadeIn(150); }, hide : function ($target) { var $tip = this.getTip($target); $tip.fadeOut(150); }, // deprecate reload reload : function () { var $self = $(this); return ($self.data('fndtn-tooltips')) ? $self.foundationTooltips('destroy').foundationTooltips('init') : $self.foundationTooltips('init'); }, off : function () { $(this.scope).off('.fndtn.tooltip'); $(this.settings.tooltipClass).each(function (i) { $('[data-tooltip]').get(i).attr('title', $(this).text()); }).remove(); }, reflow : function () {} }; }(Foundation.zj, this, this.document)); capistrano-capistrano-603c346/docs/assets/js/foundation/foundation.topbar.js000066400000000000000000000226231520217215100272770ustar00rootroot00000000000000/*jslint unparam: true, browser: true, indent: 2 */ ;(function ($, window, document, undefined) { 'use strict'; Foundation.libs.topbar = { name : 'topbar', version : '4.2.2', settings : { index : 0, stickyClass : 'sticky', custom_back_text: true, back_text: 'Back', is_hover: true, scrolltop : true, // jump to top when sticky nav menu toggle is clicked init : false }, init : function (section, method, options) { Foundation.inherit(this, 'data_options'); var self = this; if (typeof method === 'object') { $.extend(true, this.settings, method); } else if (typeof options !== 'undefined') { $.extend(true, this.settings, options); } if (typeof method !== 'string') { $('.top-bar, [data-topbar]').each(function () { $.extend(true, self.settings, self.data_options($(this))); self.settings.$w = $(window); self.settings.$topbar = $(this); self.settings.$section = self.settings.$topbar.find('section'); self.settings.$titlebar = self.settings.$topbar.children('ul').first(); self.settings.$topbar.data('index', 0); var breakpoint = $("
          ").insertAfter(self.settings.$topbar); self.settings.breakPoint = breakpoint.width(); breakpoint.remove(); self.assemble(); if (self.settings.$topbar.parent().hasClass('fixed')) { $('body').css('padding-top', self.outerHeight(self.settings.$topbar)); } }); if (!self.settings.init) { this.events(); } return this.settings.init; } else { // fire method return this[method].call(this, options); } }, events : function () { var self = this; var offst = this.outerHeight($('.top-bar, [data-topbar]')); $(this.scope) .off('.fndtn.topbar') .on('click.fndtn.topbar', '.top-bar .toggle-topbar, [data-topbar] .toggle-topbar', function (e) { var topbar = $(this).closest('.top-bar, [data-topbar]'), section = topbar.find('section, .section'), titlebar = topbar.children('ul').first(); e.preventDefault(); if (self.breakpoint()) { if (!self.rtl) { section.css({left: '0%'}); section.find('>.name').css({left: '100%'}); } else { section.css({right: '0%'}); section.find('>.name').css({right: '100%'}); } section.find('li.moved').removeClass('moved'); topbar.data('index', 0); topbar .toggleClass('expanded') .css('max-height', ''); } if (!topbar.hasClass('expanded')) { if (topbar.hasClass('fixed')) { topbar.parent().addClass('fixed'); topbar.removeClass('fixed'); $('body').css('padding-top',offst); } } else if (topbar.parent().hasClass('fixed')) { topbar.parent().removeClass('fixed'); topbar.addClass('fixed'); $('body').css('padding-top','0'); if (self.settings.scrolltop) { window.scrollTo(0,0); } } }) .on('mouseenter mouseleave', '.top-bar li', function (e) { if (!self.settings.is_hover) return; if (/enter|over/i.test(e.type)) { $(this).addClass('hover'); } else { $(this).removeClass('hover'); } }) .on('click.fndtn.topbar', '.top-bar li.has-dropdown', function (e) { if (self.breakpoint()) return; var li = $(this), target = $(e.target), topbar = li.closest('[data-topbar], .top-bar'), is_hover = topbar.data('topbar'); if (self.settings.is_hover && !Modernizr.touch) return; e.stopImmediatePropagation(); if (target[0].nodeName === 'A' && target.parent().hasClass('has-dropdown')) { e.preventDefault(); } if (li.hasClass('hover')) { li .removeClass('hover') .find('li') .removeClass('hover'); } else { li.addClass('hover'); } }) .on('click.fndtn.topbar', '.top-bar .has-dropdown>a, [data-topbar] .has-dropdown>a', function (e) { if (self.breakpoint()) { e.preventDefault(); var $this = $(this), topbar = $this.closest('.top-bar, [data-topbar]'), section = topbar.find('section, .section'), titlebar = topbar.children('ul').first(), dropdownHeight = $this.next('.dropdown').outerHeight(), $selectedLi = $this.closest('li'); topbar.data('index', topbar.data('index') + 1); $selectedLi.addClass('moved'); if (!self.rtl) { section.css({left: -(100 * topbar.data('index')) + '%'}); section.find('>.name').css({left: 100 * topbar.data('index') + '%'}); } else { section.css({right: -(100 * topbar.data('index')) + '%'}); section.find('>.name').css({right: 100 * topbar.data('index') + '%'}); } topbar.css('max-height', self.height($this.siblings('ul')) + self.outerHeight(titlebar, true)); } }); $(window).on('resize.fndtn.topbar', function () { if (!self.breakpoint()) { $('.top-bar, [data-topbar]') .css('max-height', '') .removeClass('expanded') .find('li') .removeClass('hover'); } }.bind(this)); $('body').on('click.fndtn.topbar', function (e) { var parent = $(e.target).closest('[data-topbar], .top-bar'); if (parent.length > 0) { return; } $('.top-bar li, [data-topbar] li').removeClass('hover'); }); // Go up a level on Click $(this.scope).on('click.fndtn', '.top-bar .has-dropdown .back, [data-topbar] .has-dropdown .back', function (e) { e.preventDefault(); var $this = $(this), topbar = $this.closest('.top-bar, [data-topbar]'), titlebar = topbar.children('ul').first(), section = topbar.find('section, .section'), $movedLi = $this.closest('li.moved'), $previousLevelUl = $movedLi.parent(); topbar.data('index', topbar.data('index') - 1); if (!self.rtl) { section.css({left: -(100 * topbar.data('index')) + '%'}); section.find('>.name').css({left: 100 * topbar.data('index') + '%'}); } else { section.css({right: -(100 * topbar.data('index')) + '%'}); section.find('>.name').css({right: 100 * topbar.data('index') + '%'}); } if (topbar.data('index') === 0) { topbar.css('max-height', ''); } else { topbar.css('max-height', self.height($previousLevelUl) + self.outerHeight(titlebar, true)); } setTimeout(function () { $movedLi.removeClass('moved'); }, 300); }); }, breakpoint : function () { return $(document).width() <= this.settings.breakPoint || $('html').hasClass('lt-ie9'); }, assemble : function () { var self = this; // Pull element out of the DOM for manipulation this.settings.$section.detach(); this.settings.$section.find('.has-dropdown>a').each(function () { var $link = $(this), $dropdown = $link.siblings('.dropdown'), url = $link.attr('href'); if (url && url.length > 1) { var $titleLi = $('
        2. ' + $link.text() +'
        3. '); } else { var $titleLi = $('
        4. '); } // Copy link to subnav if (self.settings.custom_back_text == true) { $titleLi.find('h5>a').html('« ' + self.settings.back_text); } else { $titleLi.find('h5>a').html('« ' + $link.html()); } $dropdown.prepend($titleLi); }); // Put element back in the DOM this.settings.$section.appendTo(this.settings.$topbar); // check for sticky this.sticky(); }, height : function (ul) { var total = 0, self = this; ul.find('> li').each(function () { total += self.outerHeight($(this), true); }); return total; }, sticky : function () { var klass = '.' + this.settings.stickyClass; if ($(klass).length > 0) { var distance = $(klass).length ? $(klass).offset().top: 0, $window = $(window); var offst = this.outerHeight($('.top-bar')); $window.scroll(function() { if ($window.scrollTop() >= (distance)) { $(klass).addClass("fixed"); $('body').css('padding-top',offst); } else if ($window.scrollTop() < distance) { $(klass).removeClass("fixed"); $('body').css('padding-top','0'); } }); } }, off : function () { $(this.scope).off('.fndtn.topbar'); $(window).off('.fndtn.topbar'); }, reflow : function () {} }; }(Foundation.zj, this, this.document)); capistrano-capistrano-603c346/docs/assets/js/jquery-1.7.min.js000066400000000000000000002675041520217215100241120ustar00rootroot00000000000000/*! jQuery v1.7 jquery.com | jquery.org/license */ (function(a,b){function cA(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cx(a){if(!cm[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cn||(cn=c.createElement("iframe"),cn.frameBorder=cn.width=cn.height=0),b.appendChild(cn);if(!co||!cn.createElement)co=(cn.contentWindow||cn.contentDocument).document,co.write((c.compatMode==="CSS1Compat"?"":"")+""),co.close();d=co.createElement(a),co.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cn)}cm[a]=e}return cm[a]}function cw(a,b){var c={};f.each(cs.concat.apply([],cs.slice(0,b)),function(){c[this]=a});return c}function cv(){ct=b}function cu(){setTimeout(cv,0);return ct=f.now()}function cl(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ck(){try{return new a.XMLHttpRequest}catch(b){}}function ce(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bB(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function br(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bi,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bq(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bp(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bp)}function bp(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bo(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bn(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bm(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(){return!0}function M(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z]|[0-9])/ig,x=/^-ms-/,y=function(a,b){return(b+"").toUpperCase()},z=d.userAgent,A,B,C,D=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=Array.prototype.push,G=Array.prototype.slice,H=String.prototype.trim,I=Array.prototype.indexOf,J={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7",length:0,size:function(){return this.length},toArray:function(){return G.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?F.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),B.add(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(G.apply(this,arguments),"slice",G.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:F,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;B.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!B){B=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",C,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",C),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&K()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return a!=null&&m.test(a)&&!isNaN(a)},type:function(a){return a==null?String(a):J[D.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!E.call(a,"constructor")&&!E.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||E.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(x,"ms-").replace(w,y)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
          a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,unknownElems:!!a.getElementsByTagName("nav").length,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",enctype:!!c.createElement("form").enctype,submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.lastChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},m&&f.extend(p,{position:"absolute",left:"-999px",top:"-999px"});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
          ",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
          t
          ",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;f(function(){var a,b,d,e,g,h,i=1,j="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",l="visibility:hidden;border:0;",n="style='"+j+"border:5px solid #000;padding:0;'",p="
          "+""+"
          ";m=c.getElementsByTagName("body")[0];!m||(a=c.createElement("div"),a.style.cssText=l+"width:0;height:0;position:static;top:0;margin-top:"+i+"px",m.insertBefore(a,m.firstChild),o=c.createElement("div"),o.style.cssText=j+l,o.innerHTML=p,a.appendChild(o),b=o.firstChild,d=b.firstChild,g=b.nextSibling.firstChild.firstChild,h={doesNotAddBorder:d.offsetTop!==5,doesAddBorderForTableAndCells:g.offsetTop===5},d.style.position="fixed",d.style.top="20px",h.fixedPosition=d.offsetTop===20||d.offsetTop===15,d.style.position=d.style.top="",b.style.overflow="hidden",b.style.position="relative",h.subtractsBorderForOverflowNotVisible=d.offsetTop===-5,h.doesNotIncludeMarginInBodyOffset=m.offsetTop!==i,m.removeChild(a),o=a=null,f.extend(k,h))}),o.innerHTML="",n.removeChild(o),o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[f.expando]:a[f.expando]&&f.expando,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[f.expando]=n=++f.uuid:n=f.expando),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[f.expando]:f.expando;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)?b=b:b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" "));for(e=0,g=b.length;e-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];if(!arguments.length){if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}return b}e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!a||j===3||j===8||j===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g},removeAttr:function(a,b){var c,d,e,g,h=0;if(a.nodeType===1){d=(b||"").split(p),g=d.length;for(;h=0}})});var z=/\.(.*)$/,A=/^(?:textarea|input|select)$/i,B=/\./g,C=/ /g,D=/[^\w\s.|`]/g,E=/^([^\.]*)?(?:\.(.+))?$/,F=/\bhover(\.\S+)?/,G=/^key/,H=/^(?:mouse|contextmenu)|click/,I=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,J=function(a){var b=I.exec(a);b&& (b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},K=function(a,b){return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||a.id===b[2])&&(!b[3]||b[3].test(a.className))},L=function(a){return f.event.special.hover?a:a.replace(F,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=L(c).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"",(g||!e)&&c.preventDefault();if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,n=null;for(m=e.parentNode;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l=0:t===b&&(t=o[s]=r.quick?K(m,r.quick):f(m).is(s)),t&&q.push(r);q.length&&j.push({elem:m,matches:q})}d.length>e&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),G.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),H.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

          ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
          ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var Y="abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",Z=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,_=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,ba=/<([\w:]+)/,bb=/",""],legend:[1,"
          ","
          "],thead:[1,"","
          "],tr:[2,"","
          "],td:[3,"","
          "],col:[2,"","
          "],area:[1,"",""],_default:[0,"",""]},bk=X(c);bj.optgroup=bj.option,bj.tbody=bj.tfoot=bj.colgroup=bj.caption=bj.thead,bj.th=bj.td,f.support.htmlSerialize||(bj._default=[1,"div
          ","
          "]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after" ,arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Z,""):null;if(typeof a=="string"&&!bd.test(a)&&(f.support.leadingWhitespace||!$.test(a))&&!bj[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(_,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bn(a,d),e=bo(a),g=bo(d);for(h=0;e[h];++h)g[h]&&bn(e[h],g[h])}if(b){bm(a,d);if(c){e=bo(a),g=bo(d);for(h=0;e[h];++h)bm(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!bc.test(k))k=b.createTextNode(k);else{k=k.replace(_,"<$1>");var l=(ba.exec(k)||["",""])[1].toLowerCase(),m=bj[l]||bj._default,n=m[0],o=b.createElement("div");b===c?bk.appendChild(o):X(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=bb.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&$.test(k)&&o.insertBefore(b.createTextNode($.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bt.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bs,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bs.test(g)?g.replace(bs,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bB(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bC=function(a,c){var d,e,g;c=c.replace(bu,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bD=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bv.test(f)&&bw.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bB=bC||bD,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bF=/%20/g,bG=/\[\]$/,bH=/\r?\n/g,bI=/#.*$/,bJ=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bK=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bL=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bM=/^(?:GET|HEAD)$/,bN=/^\/\//,bO=/\?/,bP=/)<[^<]*)*<\/script>/gi,bQ=/^(?:select|textarea)/i,bR=/\s+/,bS=/([?&])_=[^&]*/,bT=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bU=f.fn.load,bV={},bW={},bX,bY,bZ=["*/"]+["*"];try{bX=e.href}catch(b$){bX=c.createElement("a"),bX.href="",bX=bX.href}bY=bT.exec(bX.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bU)return bU.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
          ").append(c.replace(bP,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bQ.test(this.nodeName)||bK.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bH,"\r\n")}}):{name:b.name,value:c.replace(bH,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?cb(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),cb(a,b);return a},ajaxSettings:{url:bX,isLocal:bL.test(bY[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bZ},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:b_(bV),ajaxTransport:b_(bW),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cd(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=ce(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bJ.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bI,"").replace(bN,bY[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bR),d.crossDomain==null&&(r=bT.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bY[1]&&r[2]==bY[2]&&(r[3]||(r[1]==="http:"?80:443))==(bY[3]||(bY[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),ca(bV,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bM.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bO.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bS,"$1_="+x);d.url=y+(y===d.url?(bO.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bZ+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=ca(bW,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){s<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)cc(g,a[g],c,e);return d.join("&").replace(bF,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cf=f.now(),cg=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cf++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cg.test(b.url)||e&&cg.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cg,l),b.url===j&&(e&&(k=k.replace(cg,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ch=a.ActiveXObject?function(){for(var a in cj)cj[a](0,1)}:!1,ci=0,cj;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ck()||cl()}:ck,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ch&&delete cj[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++ci,ch&&(cj||(cj={},f(a).unload(ch)),cj[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cm={},cn,co,cp=/^(?:toggle|show|hide)$/,cq=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cr,cs=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],ct;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cw("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cz.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cz.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cA(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cA(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window);capistrano-capistrano-603c346/docs/assets/js/jquery.cookie.js000066400000000000000000000061041520217215100242600ustar00rootroot00000000000000/*! * jQuery Cookie Plugin v1.4.1 * https://github.com/carhartl/jquery-cookie * * Copyright 2006, 2014 Klaus Hartl * Released under the MIT license */ (function (factory) { if (typeof define === 'function' && define.amd) { // AMD (Register as an anonymous module) define(['jquery'], factory); } else if (typeof exports === 'object') { // Node/CommonJS module.exports = factory(require('jquery')); } else { // Browser globals factory(jQuery); } }(function ($) { var pluses = /\+/g; function encode(s) { return config.raw ? s : encodeURIComponent(s); } function decode(s) { return config.raw ? s : decodeURIComponent(s); } function stringifyCookieValue(value) { return encode(config.json ? JSON.stringify(value) : String(value)); } function parseCookieValue(s) { if (s.indexOf('"') === 0) { // This is a quoted cookie as according to RFC2068, unescape... s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'); } try { // Replace server-side written pluses with spaces. // If we can't decode the cookie, ignore it, it's unusable. // If we can't parse the cookie, ignore it, it's unusable. s = decodeURIComponent(s.replace(pluses, ' ')); return config.json ? JSON.parse(s) : s; } catch(e) {} } function read(s, converter) { var value = config.raw ? s : parseCookieValue(s); return $.isFunction(converter) ? converter(value) : value; } var config = $.cookie = function (key, value, options) { // Write if (arguments.length > 1 && !$.isFunction(value)) { options = $.extend({}, config.defaults, options); if (typeof options.expires === 'number') { var days = options.expires, t = options.expires = new Date(); t.setMilliseconds(t.getMilliseconds() + days * 864e+5); } return (document.cookie = [ encode(key), '=', stringifyCookieValue(value), options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE options.path ? '; path=' + options.path : '', options.domain ? '; domain=' + options.domain : '', options.secure ? '; secure' : '' ].join('')); } // Read var result = key ? undefined : {}, // To prevent the for loop in the first place assign an empty array // in case there are no cookies at all. Also prevents odd result when // calling $.cookie(). cookies = document.cookie ? document.cookie.split('; ') : [], i = 0, l = cookies.length; for (; i < l; i++) { var parts = cookies[i].split('='), name = decode(parts.shift()), cookie = parts.join('='); if (key === name) { // If second argument (value) is a function it's a converter... result = read(cookie, value); break; } // Prevent storing a cookie that we couldn't decode. if (!key && (cookie = read(cookie)) !== undefined) { result[name] = cookie; } } return result; }; config.defaults = {}; $.removeCookie = function (key, options) { // Must not alter options, thus extending a fresh object... $.cookie(key, '', $.extend({}, options, { expires: -1 })); return !$.cookie(key); }; })); capistrano-capistrano-603c346/docs/assets/js/jquery.githubRepoWidget.min.js000066400000000000000000000161011520217215100270430ustar00rootroot00000000000000$(function(){var a=0;$(".github-widget").each(function(){if(a==0)$("head").append('');a++;var b=$(this);var c=b.data("repo");$.ajax({url:"https://api.github.com/repos/"+c,dataType:"jsonp",success:function(a){var c=a.data;var d=new Date(c.pushed_at);var e=d.getMonth()+1+"-"+d.getDate()+"-"+d.getFullYear();var f=$('

          '+c.description+' — Read More

          Latest commit to the master branch on '+e+'

          Download as zip
          ');f.appendTo(b)}})})})capistrano-capistrano-603c346/docs/assets/js/rainbow-custom.min.js000066400000000000000000000670471520217215100252410ustar00rootroot00000000000000/* Rainbow v1.2 rainbowco.de | included languages: c, shell, java, d, coffeescript, generic, scheme, javascript, r, haskell, python, html, smalltalk, csharp, go, php, ruby, lua, css */ var k=!0; window.Rainbow=function(){function r(a){var b,c=a.getAttribute&&a.getAttribute("data-language")||0;if(!c){a=a.attributes;for(b=0;b=f[d][c])delete f[d][c],delete j[d][c];if(a>=c&&ac&&b'+b+""}function t(a,b,c,i){var e=a.exec(c);if(e){++u;!b.name&&"string"==typeof b.matches[0]&&(b.name=b.matches[0],delete b.matches[0]);var l=e[0],g=e.index,v=e[0].length+g,h=function(){function e(){t(a,b,c,i)}u%100>0?e():setTimeout(e,0)};if(D(g,v))h();else{var n=w(b.matches),m=function(a,c,i){if(a>=c.length)i(l);else{var d=e[c[a]];if(d){var g=b.matches[c[a]],f=g.language,h=g.name&&g.matches? g.matches:g,j=function(b,d,g){var f;f=0;var h;for(h=1;h/g,">").replace(/&(?![\w\#]+;)/g, "&"),b,c)}function p(a,b,c){if(b|<=|>=|zero\?|positive\?|negative\?|odd\?|even\?|max|min|\+|\-|\*|\/|abs|quotient|remainder|modulo|gcd|lcm|numerator|denominator|floor|ceiling|truncate|round|rationalize|exp|log|sin|cos|tan|asin|acos|atan|sqrt|expt|make\-rectangular|make\-polar|real\-part|imag\-part|magnitude|angle|exact\->inexact|inexact\->exact|number\->string|string\->number|not|boolean\?|pair\?|cons|car|cdr|set\-car!|set\-cdr!|caar|cadr|cdar|cddr|caaar|caadr|cadar|caddr|cdaar|cdadr|cddar|cdddr|caaaar|caaadr|caadar|caaddr|cadaar|cadadr|caddar|cadddr|cdaaar|cdaadr|cdadar|cdaddr|cddaar|cddadr|cdddar|cddddr|null\?|list\?|list|length|append|reverse|list\-tail|list\-ref|memq|memv|member|assq|assv|assoc|symbol\?|symbol\->string|string\->symbol|char\?|char=\?|char<\?|char>\?|char<=\?|char>=\?|char\-ci=\?|char\-ci<\?|char\-ci>\?|char\-ci<=\?|char\-ci>=\?|char\-alphabetic\?|char\-numeric\?|char\-whitespace\?|char\-upper\-case\?|char\-lower\-case\?|char\->integer|integer\->char|char\-upcase|char\-downcase|string\?|make\-string|string|string\-length|string\-ref|string\-set!|string=\?|string\-ci=\?|string<\?|string>\?|string<=\?|string>=\?|string\-ci<\?|string\-ci>\?|string\-ci<=\?|string\-ci>=\?|substring|string\-append|string\->list|list\->string|string\-copy|string\-fill!|vector\?|make\-vector|vector|vector\-length|vector\-ref|vector\-set!|vector\->list|list\->vector|vector\-fill!|procedure\?|apply|map|for\-each|force|call\-with\-current\-continuation|call\/cc|values|call\-with\-values|dynamic\-wind|eval|scheme\-report\-environment|null\-environment|interaction\-environment|call\-with\-input\-file|call\-with\-output\-file|input\-port\?|output\-port\?|current\-input\-port|current\-output\-port|with\-input\-from\-file|with\-output\-to\-file|open\-input\-file|open\-output\-file|close\-input\-port|close\-output\-port|read|read\-char|peek\-char|eof\-object\?|char\-ready\?|write|display|newline|write\-char|load|transcript\-on|transcript\-off)(?=[\]()\s#])/g}], k);Rainbow.extend("javascript",[{name:"selector",pattern:/(\s|^)\$(?=\.|\()/g},{name:"support",pattern:/\b(window|document)\b/g},{matches:{1:"support.property"},pattern:/\.(length|node(Name|Value))\b/g},{matches:{1:"support.function"},pattern:/(setTimeout|setInterval)(?=\()/g},{matches:{1:"support.method"},pattern:/\.(getAttribute|push|getElementById|getElementsByClassName|log|setTimeout|setInterval)(?=\()/g},{matches:{1:"support.tag.script",2:[{name:"string",pattern:/('|")(.*?)(\1)/g},{name:"entity.tag.script", pattern:/(\w+)/g}],3:"support.tag.script"},pattern:/(<\/?)(script.*?)(>)/g},{name:"string.regexp",matches:{1:"string.regexp.open",2:{name:"constant.regexp.escape",pattern:/\\(.){1}/g},3:"string.regexp.close",4:"string.regexp.modifier"},pattern:/(\/)(?!\*)(.+)(\/)([igm]{0,3})/g},{matches:{1:"storage",3:"entity.function"},pattern:/(var)?(\s|^)(\S*)(?=\s?=\s?function\()/g},{matches:{1:"keyword",2:"entity.function"},pattern:/(new)\s+(.*)(?=\()/g},{name:"entity.function",pattern:/(\w+)(?=:\s{0,}function)/g}]);Rainbow.extend("r",[{matches:{1:{name:"keyword.operator",pattern:/\=|<\-|<-/g},2:{name:"string",matches:{name:"constant.character.escape",pattern:/\\('|"){1}/g}}},pattern:/(\(|\s|\[|\=|:)(('|")([^\\\1]|\\.)*?(\3))/gm},{matches:{1:"constant.language"},pattern:/\b(NULL|NA|TRUE|FALSE|T|F|NaN|Inf|NA_integer_|NA_real_|NA_complex_|NA_character_)\b/g},{matches:{1:"constant.symbol"},pattern:/[^0-9a-zA-Z\._](LETTERS|letters|month\.(abb|name)|pi)/g},{name:"keyword.operator",pattern:/<-|<-|-|==|<=|<=|>>|>=|<|>|&&|&&|&|&|!=|\|\|?|\*|\+|\^|\/|%%|%\/%|\=|%in%|%\*%|%o%|%x%|\$|:|~|\[{1,2}|\]{1,2}/g}, {matches:{1:"storage",3:"entity.function"},pattern:/(\s|^)(.*)(?=\s?=\s?function\s\()/g},{matches:{1:"storage.function"},pattern:/[^a-zA-Z0-9._](function)(?=\s*\()/g},{matches:{1:"namespace",2:"keyword.operator",3:"function.call"},pattern:/([a-zA-Z][a-zA-Z0-9._]+)([:]{2,3})([.a-zA-Z][a-zA-Z0-9._]*(?=\s*\())\b/g},{name:"support.function",pattern:/(^|[^0-9a-zA-Z\._])(array|character|complex|data\.frame|double|integer|list|logical|matrix|numeric|vector)(?=\s*\()/g}]);Rainbow.extend("haskell",[{name:"comment",pattern:/\{\-\-[\s\S(\w+)]+[\-\-][\}$]/gm},{name:"comment",pattern:/\-\-(.*)/g},{matches:{1:"keyword",2:"support.namespace"},pattern:/\b(module)\s(\w+)\s[\(]?(\w+)?[\)?]\swhere/g},{name:"keyword.operator",pattern:/\+|\!|\-|&(gt|lt|amp);|\/\=|\||\@|\:|\.|\+{2}|\:|\*|\=|#|\.{2}|(\\)[a-zA-Z_]/g},{name:"keyword",pattern:/\b(case|class|foreign|hiding|qualified|data|family|default|deriving|do|else|if|import|in|infix|infixl|infixr|instance|let|in|otherwise|module|newtype|of|then|type|where)\b/g}, {name:"keyword",pattern:/[\`][a-zA-Z_']*?[\`]/g},{matches:{1:"keyword",2:"keyword.operator"},pattern:/\b(infix|infixr|infixl)+\s\d+\s(\w+)*/g},{name:"entity.class",pattern:/\b([A-Z][A-Za-z0-9_']*)/g},{name:"meta.preprocessor",matches:{1:[{matches:{1:"keyword.define",2:"entity.name"},pattern:/(\w+)\s(\w+)\b/g},{name:"keyword.define",pattern:/endif/g},{name:"constant.numeric",pattern:/\d+/g},{matches:{1:"keyword.include",2:"string"},pattern:/(include)\s(.*?)$/g}]},pattern:/^\#([\S\s]*?)$/gm}]);Rainbow.extend("python",[{name:"variable.self",pattern:/self/g},{name:"constant.language",pattern:/None|True|False|NotImplemented|\.\.\./g},{name:"support.object",pattern:/object/g},{name:"support.function.python",pattern:/\b(bs|divmod|input|open|staticmethod|all|enumerate|int|ord|str|any|eval|isinstance|pow|sum|basestring|execfile|issubclass|print|super|bin|file|iter|property|tuple|bool|filter|len|range|type|bytearray|float|list|raw_input|unichr|callable|format|locals|reduce|unicode|chr|frozenset|long|reload|vars|classmethod|getattr|map|repr|xrange|cmp|globals|max|reversed|zip|compile|hasattr|memoryview|round|__import__|complex|hash|min|set|apply|delattr|help|next|setattr|buffer|dict|hex|object|slice|coerce|dir|id|oct|sorted|intern)(?=\()/g}, {matches:{1:"keyword"},pattern:/\b(pass|lambda|with|is|not|in|from|elif|raise|del)(?=\(|\b)/g},{matches:{1:"storage.class",2:"entity.name.class",3:"entity.other.inherited-class"},pattern:/(class)\s+(\w+)\((\w+?)\)/g},{matches:{1:"storage.function",2:"support.magic"},pattern:/(def)\s+(__\w+)(?=\()/g},{name:"support.magic",pattern:/__(name)__/g},{matches:{1:"keyword.control",2:"support.exception.type"},pattern:/(except) (\w+):/g},{matches:{1:"storage.function",2:"entity.name.function"},pattern:/(def)\s+(\w+)(?=\()/g}, {name:"entity.name.function.decorator",pattern:/@([\w\.]+)/g},{name:"comment.docstring",pattern:/('{3}|"{3})[\s\S]*?\1/gm}]);Rainbow.extend("html",[{name:"source.php.embedded",matches:{2:{language:"php"}},pattern:/<\?=?(?!xml)(php)?([\s\S]*?)(\?>)/gm},{name:"source.css.embedded",matches:{"0":{language:"css"}},pattern:/<style(.*?)>([\s\S]*?)<\/style>/gm},{name:"source.js.embedded",matches:{"0":{language:"javascript"}},pattern:/<script(?! src)(.*?)>([\s\S]*?)<\/script>/gm},{name:"comment.html",pattern:/<\!--[\S\s]*?-->/g},{matches:{1:"support.tag.open",2:"support.tag.close"},pattern:/(<)|(\/?\??>)/g}, {name:"support.tag",matches:{1:"support.tag",2:"support.tag.special",3:"support.tag-name"},pattern:/(<\??)(\/|\!?)(\w+)/g},{matches:{1:"support.attribute"},pattern:/([a-z-]+)(?=\=)/gi},{matches:{1:"support.operator",2:"string.quote",3:"string.value",4:"string.quote"},pattern:/(=)('|")(.*?)(\2)/g},{matches:{1:"support.operator",2:"support.value"},pattern:/(=)([a-zA-Z\-0-9]*)\b/g},{matches:{1:"support.attribute"},pattern:/\s(\w+)(?=\s|>)(?![\s\S]*<)/g}],k);Rainbow.extend("smalltalk",[{name:"keyword.pseudovariable",pattern:/self|thisContext/g},{name:"keyword.constant",pattern:/false|nil|true/g},{name:"string",pattern:/'([^']|'')*'/g},{name:"string.symbol",pattern:/#\w+|#'([^']|'')*'/g},{name:"string.character",pattern:/\$\w+/g},{name:"comment",pattern:/"([^"]|"")*"/g},{name:"constant.numeric",pattern:/-?\d+(\.\d+)?((r-?|s)[A-Za-z0-9]+|e-?[0-9]+)?/g},{name:"entity.name.class",pattern:/\b[A-Z]\w*/g},{name:"entity.name.function",pattern:/\b[a-z]\w*:?/g}, {name:"entity.name.binary",pattern:/(<|>|&|[=~\|\\\/!@*\-_+])+/g},{name:"operator.delimiter",pattern:/;[\(\)\[\]\{\}]|#\[|#\(^\./g}],k);Rainbow.extend("csharp",[{name:"constant",pattern:/\b(false|null|true)\b/g},{name:"keyword",pattern:/\b(abstract|add|alias|ascending|as|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|descending|double|do|dynamic|else|enum|event|explicit|extern|false|finally|fixed|float|foreach|for|from|get|global|goto|group|if|implicit|int|interface|internal|into|in|is|join|let|lock|long|namespace|new|object|operator|orderby|out|override|params|partial|private|protected|public|readonly|ref|remove|return|sbyte|sealed|select|set|short|sizeof|stackalloc|static|string|struct|switch|this|throw|try|typeof|uint|unchecked|ulong|unsafe|ushort|using|value|var|virtual|void|volatile|where|while|yield)\b/g}, {matches:{1:"keyword",2:{name:"support.class",pattern:/\w+/g}},pattern:/(typeof)\s([^\$].*?)(\)|;)/g},{matches:{1:"keyword.namespace",2:{name:"support.namespace",pattern:/\w+/g}},pattern:/\b(namespace)\s(.*?);/g},{matches:{1:"storage.modifier",2:"storage.class",3:"entity.name.class",4:"storage.modifier.extends",5:"entity.other.inherited-class"},pattern:/\b(abstract|sealed)?\s?(class)\s(\w+)(\sextends\s)?([\w\\]*)?\s?\{?(\n|\})/g},{name:"keyword.static",pattern:/\b(static)\b/g},{matches:{1:"keyword.new", 2:{name:"support.class",pattern:/\w+/g}},pattern:/\b(new)\s([^\$].*?)(?=\)|\(|;|&)/g},{name:"string",pattern:/(")(.*?)\1/g},{name:"integer",pattern:/\b(0x[\da-f]+|\d+)\b/g},{name:"comment",pattern:/\/\*[\s\S]*?\*\/|(\/\/)[\s\S]*?$/gm},{name:"operator",pattern:/(\+\+|\+=|\+|--|-=|-|<<=|<<|<=|=>|>>=|>>|>=|!=|!|~|\^|\|\||&&|&=|&|\?\?|::|:|\*=|\*|\/=|%=|\|=|==|=)/g},{name:"preprocessor",pattern:/(\#if|\#else|\#elif|\#endif|\#define|\#undef|\#warning|\#error|\#line|\#region|\#endregion|\#pragma)[\s\S]*?$/gm}], k);Rainbow.extend("go",[{matches:{1:{name:"keyword.operator",pattern:/\=/g},2:{name:"string",matches:{name:"constant.character.escape",pattern:/\\(`|"){1}/g}}},pattern:/(\(|\s|\[|\=|:)((`|")([^\\\1]|\\.)*?(\3))/gm},{name:"comment",pattern:/\/\*[\s\S]*?\*\/|(\/\/)[\s\S]*?$/gm},{name:"constant.numeric",pattern:/\b(\d+(\.\d+)?(e(\+|\-)?\d+)?(f|d)?|0x[\da-f]+)\b/gi},{matches:{1:"keyword"},pattern:/\b(break|c(ase|onst|ontinue)|d(efault|efer)|else|fallthrough|for|go(to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)(?=\(|\b)/gi}, {name:"constant.language",pattern:/true|false|null|string|byte|rune|u?int(8|16|32|64)?|float(32|64)|complex(64|128)/g},{name:"keyword.operator",pattern:/\+|\!|\-|&(gt|lt|amp);|\||\*|\:?=/g},{matches:{1:"function.call"},pattern:/(\w+?)(?=\()/g},{matches:{1:"storage.function",2:"entity.name.function"},pattern:/(func)\s(.*?)(?=\()/g}]);Rainbow.extend("php",[{name:"support",pattern:/\becho\b/g},{matches:{1:"variable.dollar-sign",2:"variable"},pattern:/(\$)(\w+)\b/g},{name:"constant.language",pattern:/true|false|null/ig},{name:"constant",pattern:/\b[A-Z0-9_]{2,}\b/g},{name:"keyword.dot",pattern:/\./g},{name:"keyword",pattern:/\b(die|end(for(each)?|switch|if)|case|require(_once)?|include(_once)?)(?=\(|\b)/g},{matches:{1:"keyword",2:{name:"support.class",pattern:/\w+/g}},pattern:/(instanceof)\s([^\$].*?)(\)|;)/g},{matches:{1:"support.function"}, pattern:/\b(array(_key_exists|_merge|_keys|_shift)?|isset|count|empty|unset|printf|is_(array|string|numeric|object)|sprintf|each|date|time|substr|pos|str(len|pos|tolower|_replace|totime)?|ord|trim|in_array|implode|end|preg_match|explode|fmod|define|link|list|get_class|serialize|file|sort|mail|dir|idate|log|intval|header|chr|function_exists|dirname|preg_replace|file_exists)(?=\()/g},{name:"variable.language.php-tag",pattern:/(<\?(php)?|\?>)/g},{matches:{1:"keyword.namespace",2:{name:"support.namespace", pattern:/\w+/g}},pattern:/\b(namespace|use)\s(.*?);/g},{matches:{1:"storage.modifier",2:"storage.class",3:"entity.name.class",4:"storage.modifier.extends",5:"entity.other.inherited-class",6:"storage.modifier.extends",7:"entity.other.inherited-class"},pattern:/\b(abstract|final)?\s?(class|interface|trait)\s(\w+)(\sextends\s)?([\w\\]*)?(\simplements\s)?([\w\\]*)?\s?\{?(\n|\})/g},{name:"keyword.static",pattern:/self::|static::/g},{matches:{1:"storage.function",2:"support.magic"},pattern:/(function)\s(__.*?)(?=\()/g}, {matches:{1:"keyword.new",2:{name:"support.class",pattern:/\w+/g}},pattern:/\b(new)\s([^\$].*?)(?=\)|\(|;)/g},{matches:{1:{name:"support.class",pattern:/\w+/g},2:"keyword.static"},pattern:/([\w\\]*?)(::)(?=\b|\$)/g},{matches:{2:{name:"support.class",pattern:/\w+/g}},pattern:/(\(|,\s?)([\w\\]*?)(?=\s\$)/g}]);Rainbow.extend("ruby",[{name:"string",matches:{1:"string.open",2:{name:"string.keyword",pattern:/(\#\{.*?\})/g},3:"string.close"},pattern:/("|`)(.*?[^\\\1])?(\1)/g},{name:"string",pattern:/('|"|`)([^\\\1\n]|\\.)*\1/g},{name:"string",pattern:/%[qQ](?=(\(|\[|\{|<|.)(.*?)(?:'|\)|\]|\}|>|\1))(?:\(\2\)|\[\2\]|\{\2\}|\<\2>|\1\2\1)/g},{matches:{1:"string",2:"string",3:"string"},pattern:/(<<)(\w+).*?$([\s\S]*?^\2)/gm},{matches:{1:"string",2:"string",3:"string"},pattern:/(<<\-)(\w+).*?$([\s\S]*?\2)/gm}, {name:"string.regexp",matches:{1:"string.regexp",2:{name:"string.regexp",pattern:/\\(.){1}/g},3:"string.regexp",4:"string.regexp"},pattern:/(\/)(.*?)(\/)([a-z]*)/g},{name:"string.regexp",matches:{1:"string.regexp",2:{name:"string.regexp",pattern:/\\(.){1}/g},3:"string.regexp",4:"string.regexp"},pattern:/%r(?=(\(|\[|\{|<|.)(.*?)('|\)|\]|\}|>|\1))(?:\(\2\)|\[\2\]|\{\2\}|\<\2>|\1\2\1)([a-z]*)/g},{name:"comment",pattern:/#.*$/gm},{name:"comment",pattern:/^\=begin[\s\S]*?\=end$/gm},{matches:{1:"constant"}, pattern:/(\w+:)[^:]/g},{matches:{1:"constant.symbol"},pattern:/[^:](:(?:\w+|(?=['"](.*?)['"])(?:"\2"|'\2')))/g},{name:"constant.numeric",pattern:/\b(0x[\da-f]+|\d+)\b/g},{name:"support.class",pattern:/\b[A-Z]\w*(?=((\.|::)[A-Za-z]|\[))/g},{name:"constant",pattern:/\b[A-Z]\w*\b/g},{matches:{1:"storage.class",2:"entity.name.class",3:"entity.other.inherited-class"},pattern:/\s*(class)\s+((?:(?:::)?[A-Z]\w*)+)(?:\s+<\s+((?:(?:::)?[A-Z]\w*)+))?/g},{matches:{1:"storage.module",2:"entity.name.class"}, pattern:/\s*(module)\s+((?:(?:::)?[A-Z]\w*)+)/g},{name:"variable.global",pattern:/\$([a-zA-Z_]\w*)\b/g},{name:"variable.class",pattern:/@@([a-zA-Z_]\w*)\b/g},{name:"variable.instance",pattern:/@([a-zA-Z_]\w*)\b/g},{matches:{1:"keyword.control"},pattern:/[^\.]\b(BEGIN|begin|case|class|do|else|elsif|END|end|ensure|for|if|in|module|rescue|then|unless|until|when|while)\b(?![?!])/g},{matches:{1:"keyword.control.pseudo-method"},pattern:/[^\.]\b(alias|alias_method|break|next|redo|retry|return|super|undef|yield)\b(?![?!])|\bdefined\?|\bblock_given\?/g}, {matches:{1:"constant.language"},pattern:/\b(nil|true|false)\b(?![?!])/g},{matches:{1:"variable.language"},pattern:/\b(__(FILE|LINE)__|self)\b(?![?!])/g},{matches:{1:"keyword.special-method"},pattern:/\b(require|gem|initialize|new|loop|include|extend|raise|attr_reader|attr_writer|attr_accessor|attr|catch|throw|private|module_function|public|protected)\b(?![?!])/g},{name:"keyword.operator",pattern:/\s\?\s|=|<<|<<=|%=|&=|\*=|\*\*=|\+=|\-=|\^=|\|{1,2}=|<<|<=>|<(?!<|=)|>(?!<|=|>)|<=|>=|===|==|=~|!=|!~|%|&|\*\*|\*|\+|\-|\/|\||~|>>/g}, {matches:{1:"keyword.operator.logical"},pattern:/[^\.]\b(and|not|or)\b/g},{matches:{1:"storage.function",2:"entity.name.function"},pattern:/(def)\s(.*?)(?=(\s|\())/g}],k);Rainbow.extend("lua",[{matches:{1:{name:"keyword.operator",pattern:/\=/g},2:{name:"string",matches:{name:"constant.character.escape",pattern:/\\('|"){1}/g}}},pattern:/(\(|\s|\[|\=)(('|")([^\\\1]|\\.)*?(\3))/gm},{name:"comment",pattern:/\-{2}\[{2}\-{2}[\s\S]*?\-{2}\]{2}\-{2}|(\-{2})[\s\S]*?$/gm},{name:"constant.numeric",pattern:/\b(\d+(\.\d+)?(e(\+|\-)?\d+)?(f|d)?|0x[\da-f]+)\b/gi},{matches:{1:"keyword"},pattern:/\b((a|e)nd|in|repeat|break|local|return|do|for|then|else(if)?|function|not|if|or|until|while)(?=\(|\b)/gi}, {name:"constant.language",pattern:/true|false|nil/g},{name:"keyword.operator",pattern:/\+|\!|\-|&(gt|lt|amp);|\||\*|\=|#|\.{2}/g},{matches:{1:"storage.function",2:"entity.name.function"},pattern:/(function)\s+(\w+[\:|\.]?\w+?)(?=\()/g},{matches:{1:"support.function"},pattern:/\b(print|require|module|\w+\.\w+)(?=\()/g}],k);Rainbow.extend("css",[{name:"comment",pattern:/\/\*[\s\S]*?\*\//gm},{name:"constant.hex-color",pattern:/#([a-f0-9]{3}|[a-f0-9]{6})(?=;|\s|,|\))/gi},{matches:{1:"constant.numeric",2:"keyword.unit"},pattern:/(\d+)(px|em|cm|s|%)?/g},{name:"string",pattern:/('|")(.*?)\1/g},{name:"support.css-property",matches:{1:"support.vendor-prefix"},pattern:/(-o-|-moz-|-webkit-|-ms-)?[\w-]+(?=\s?:)(?!.*\{)/g},{matches:{1:[{name:"entity.name.sass",pattern:/&/g},{name:"direct-descendant",pattern:/>/g},{name:"entity.name.class", pattern:/\.[\w\-_]+/g},{name:"entity.name.id",pattern:/\#[\w\-_]+/g},{name:"entity.name.pseudo",pattern:/:[\w\-_]+/g},{name:"entity.name.tag",pattern:/\w+/g}]},pattern:/([\w\ ,:\.\#\&\;\-_]+)(?=.*\{)/g},{matches:{2:"support.vendor-prefix",3:"support.css-value"},pattern:/(:|,)\s*(-o-|-moz-|-webkit-|-ms-)?([a-zA-Z-]*)(?=\b)(?!.*\{)/g},{matches:{1:"support.tag.style",2:[{name:"string",pattern:/('|")(.*?)(\1)/g},{name:"entity.tag.style",pattern:/(\w+)/g}],3:"support.tag.style"},pattern:/(<\/?)(style.*?)(>)/g}], k); capistrano-capistrano-603c346/docs/assets/mstile-150x150-min.png000066400000000000000000000073221520217215100242270ustar00rootroot00000000000000PNG  IHDROo gAMA asRGBPLTEGpL9[8Q8Q78Q444<8SQC;i=M*0]9JAI=/8QQQQDP#:a8Q8Q =8S8Q8Q8QQ=8Q8Q8Q8QQE77RQQ0Q;q=:=8QQQQ={IG=)Q=Q tB=====~;iL*f+38Q=Q8PQ=>=7W9N7SP5=Jw8tRNS  ?%%@q$uu-M3>N2Yd]c:KٓȮUnm1T\JEۺ|xv IDATxWKQX0{W *vbnb4X~n}.K Mw]pgwA09:|^9OgU(d/\g:J]J;^WNv6B;{!.O>t'W'Y?Ċ`YϑBRb8$G&|XR%89XAGk2ƏWRe9IRD$e<󀨶vփ0p u5?Kh!ʦ E3Lc?J]iI":-a LQ[) 9OKӥ9pJJlaҕ{Z= ^Ң`..ZaT;0vAu:n՛.@"ΊUa#Qs?h91_a~ Ɇ7h?'H)qE׿%!$<1KoAyDQNR:BY.bL:(1FQGQ×vI PaKQ~A_0h;tVB/7bјA1M@ _ .Kt=Koor ;nh؇ʷkr Oz#qD1K`Wa1_L|YA5)Uooph~/^TMF,X`-v[%uh/A~QF>mTЖn&aU` <-lr. !8sK hDeִo2Oa51z%GL#fXfZKSߗc1`*qb-30 &1d-gm^ܰ\z"t_R45KR/Z;Γ]&|9'*VV]7MtҌ+4Su?*zq:5-7뚫@rNG߹ %6O:{$Fa}r]8(][ܺT> ǻrE<̂pzC#L/^E@ ڔ?mGd [NC9h3y8B@K]>IV \=o7FUzX% ;]-WY緥(Kg3 n hxŹKO4*y< Hp=m)XAh|"i \, :\Ps:ퟠA<>/h8%<4r wC_+_qn*ߥ|R+v.4JM)gd8议MՕ 6u1M: 6 wO]FSNޮTWb;yh[~4KYIo_ Ƴ9?v*zo->7SH V1ƶ\VG?A΅, "){ԡV PeV:al D~ʬHjgбs!*b]Gh5x.O>YRncgzj7p* ˴K^] :NYGNذLXv4!6 @΂Bi (JC{d0HO2C~En=iǺ6/eQOnwVtCiiB~osri][E  z Z&5hdFXGP>ȟg{-7g?YXn dfஅ2ܾ⧨)YW #űVf8G^}|: {rMnpЁmͷ`-i  ) rUntݮTߜ#yJ-廷T-.3{EA4h-wyl@< `Kiӈ Öc'#DfnK r+B/#fe9.N¹o•r5A jD<ʻR^fSpq=Y]`㪖'[bL"~;Rj{}hKB57EE_|)xȑt߱j)AhOrU\~Qz|oI ;8;nc@dÏ S:zy.wEtq;I+(4<^F c,{5 MF ]܍5XRow^(p{ c9ƶ^?+MTvQcOHLÁuAC['V#Kt$3K'1oKۺA5x_ZQS# 齉qjCD.U@M_Zw|L6`$Qn}OpJ%ogLCb׃kkO$x!/7ODͣX40lgXUS:sqdA`Aۇ4(WJD.=v ZV+ $d.ӈIDX[x)xd/?4h&)^5뫾VHJ;~N/7h?hmk{y/\YHs,\~3;i )y}p8Ȣ[OnRwwdvWHPMC`Wqziyc6Wd$"N!_Ys͉)2]j?f 6 o#n9L#HQXHBׂpiY},*dՏL*+%D]\휑u1\klYCA,};4(:N;D@"PouVn3[4 kc0IENDB`capistrano-capistrano-603c346/docs/assets/safari-pinned-tab.svg000066400000000000000000000043111520217215100245220ustar00rootroot00000000000000 Created by potrace 1.11, written by Peter Selinger 2001-2013 capistrano-capistrano-603c346/docs/assets/site.webmanifest000066400000000000000000000006741520217215100237170ustar00rootroot00000000000000{ "name": "Capistrano", "short_name": "Capistrano", "icons": [ { "src": "android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" }, { "src": "android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" } ], "theme_color": "#1c1b39", "background_color": "#1c1b39", "display": "standalone" } capistrano-capistrano-603c346/docs/documentation/000077500000000000000000000000001520217215100220655ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/advanced-features/000077500000000000000000000000001520217215100254465ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/advanced-features/console/000077500000000000000000000000001520217215100271105ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/advanced-features/console/index.markdown000066400000000000000000000022041520217215100317610ustar00rootroot00000000000000--- title: Console layout: default --- **Note:** Here be dragons. The console is very immature, but it's much more cleanly architected than previous incarnations and it'll only get better from here on in. Execute arbitrary remote commands, to use this simply add `require 'capistrano/console'` which will add the necessary tasks to your environment: ```bash $ bundle exec cap staging console ``` Then, after setting up the server connections, this is how that might look: ```bash $ bundle exec cap production console capistrano console - enter command to execute on production production> uptime INFO [94db8027] Running /usr/bin/env uptime on leehambley@example.com:22 DEBUG [94db8027] Command: /usr/bin/env uptime DEBUG [94db8027] 17:11:17 up 50 days, 22:31, 1 user, load average: 0.02, 0.02, 0.05 INFO [94db8027] Finished in 0.435 seconds command successful. production> who INFO [9ce34809] Running /usr/bin/env who on leehambley@example.com:22 DEBUG [9ce34809] Command: /usr/bin/env who DEBUG [9ce34809] leehambley pts/0 2013-06-13 17:11 (port-11262.pppoe.wtnet.de) INFO [9ce34809] Finished in 0.420 seconds command successful. ``` capistrano-capistrano-603c346/docs/documentation/advanced-features/custom-filters/000077500000000000000000000000001520217215100304265ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/advanced-features/custom-filters/index.markdown000066400000000000000000000056511520217215100333100ustar00rootroot00000000000000--- title: Custom Filters layout: default --- Custom filters (specifically, Custom On-Filters) limit the hosts that are being deployed to, in the same way as [Host](/documentation/advanced-features/host-filtering/) and [Role](/documentation/advanced-features/role-filtering/) filters, but the exact method used to filter servers is up to the user of Capistrano. Filters may be added to Capistrano's list of filters by using the `Configuration#add_filter` method. Filters must respond to a `filter` method, which will be given an array of Servers, and should return a subset of that array (the servers which passed the filter). `Configuration#add_filter` may also take a block, in which case the block is expected to be unary. The block will be passed an array of servers, and is expected to return a subset of that array. Either a block or object may be passed to `add_filter`, but not both. ### Example You may have a large group of servers that are partitioned into separate regions that correspond to actual geographic regions. Usually, you deploy to all of them, but there are cases where you want to deploy to a specific region. Capistrano recognizes the concept of a server's *role* and *hostname*, but has no concept of a *region*. In this case, you can construct your own filter that selects servers based on their region. When defining servers, you may provide them with a `region` property, and use that property in your filter. The filter could look like this: `config/deploy.rb` ```ruby class RegionFilter def initialize(regions) @regions = Array(regions) end def filter(servers) servers.select {|server| region = server.fetch(:region) region && @regions.include?(region) } end end ``` You would add servers like this: `config/deploy/production.rb` ```ruby server('123.123.123.123', region: 'north-east') server('12.12.12.12', region: 'south-west') server('4.5.6.7', region: 'mid-west') ``` To tell Capistrano to use this filter, you would use the `Configuration#add_filter` method. In this example, we look at the `REGIONS` environment variable, and take it to be a comma-separated list of regions that we're interested in: `config/deploy.rb` ```ruby if ENV['REGIONS'] regions = ENV['REGIONS'].split(',') filter = RegionFilter.new(regions) Capistrano::Configuration.env.add_filter(filter) end ``` We obtain a list of regions to deploy to from the environment variable, construct a new filter with those regions, and add it to Capistrano's list of filters. Of course, we're not limited to regions. Any time you can classify or partition a list of servers in a way that you only want to deploy to some of them, you can use a custom filter. For another example, you might arbitrarily assign your servers to either an *A* group or a *B* group, and deploy a new version only to the *B* group as a simple variant of A/B Testing. capistrano-capistrano-603c346/docs/documentation/advanced-features/custom-scm/000077500000000000000000000000001520217215100275405ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/advanced-features/custom-scm/index.markdown000066400000000000000000000103351520217215100324150ustar00rootroot00000000000000--- title: Custom SCM layout: default --- Capistrano uses what it calls "SCM plugins" (Source Code Management), to deploy your source code from a central repository. Out of the box, Capistrano has three plugins to handle Git, Subversion, and Mercurial repositories. Most Capistrano users are well-served by these default implementations. To choose an SCM, users add it to their Capfile, like this: ```ruby require "capistrano/scm/git" install_plugin Capistrano::SCM::Git ``` It is also possible to provide a custom SCM plugin, in order to change how Capistrano checks out your application's source code. SCM plugins can be packaged as Ruby gems and distributed to other users. This document is a short guide to writing your own plugin. *It applies to Capistrano 3.7.0 and newer.* ### 1. Write a Ruby class that extends Capistrano::SCM::Plugin Let's say you want to create a "Foo" SCM. You'll need to write a plugin class, like this: ```ruby require "capistrano/scm/plugin" # By convention, Capistrano plugins are placed in the # Capistrano namespace. This is completely optional. module Capistrano class FooPlugin < ::Capistrano::SCM::Plugin def set_defaults # Define any variables needed to configure the plugin. # set_if_empty :myvar, "my-default-value" end end end ``` ### 2. Implement a create_release task When the user runs `cap deploy`, your SCM is responsible for creating the release directory and copying the application source code into it. You need to do this using a task that is registered to run after `deploy:new_release_path`. By convention (not a requirement), this task is called `create_release`. Inside your plugin class, use the `define_tasks` and `register_hooks` methods like this: ```ruby def define_tasks # The namespace can be whatever you want, but its best # to choose a name that matches your plugin name. namespace :foo do task :create_release do # Your code to create the release directory and copy # the source code into it goes here. on release_roles :all do execute :mkdir, "-p", release_path # ... end end end end def register_hooks # Tell Capistrano to run the custom create_release task # during deploy. after "deploy:new_release_path", "foo:create_release" end ``` ### 3. Implement the set_current_revision and set_current_revision_time tasks Similar to how you defined a `create_release`, you should also define a `set_current_revision` task. The purpose of this task is to set a special variable that Capistrano uses to write to the deployment log. ```ruby # Your task should do something like this set :current_revision, "..." # Register this hook to ensure your task runs before "deploy:set_current_revision", "foo:set_current_revision" ``` Ideally you should also define a `set_current_revision_time` task, though this is not required for Capistrano to function. The purpose of this task is to set a special variable which downstream users can use to have a version time that is independent of when the version was actually deployed, which can be useful when using scaling groups. The time should be a unix timestamp. ### 4. Use the plugin To use your plugin, simply `require` the file where your plugin class is defined, and then use `install_plugin`. ```ruby # In Capfile require_relative "path/to/foo_plugin.rb" install_plugin Capistrano::FooPlugin ``` That's it! ### 5. Distribute your plugin as a gem Packaging and distributing Ruby gems is outside the scope of this document. However, there is nothing Capistrano-specific that needs to be done here; just create a standard gem that contains your plugin class. Users can then install your plugin by adding its gem to their Gemfile: ```ruby gem "your-gem-name", :group => :development ``` And then add it the Capfile: ```ruby require "your-gem-name" install_plugin YourPluginClass ``` ### 6. Getting help For more techniques and ideas, check out the implementations of the default Git, Subversion, and Mercurial plugins in the official [Capistrano repository](https://github.com/capistrano/capistrano) on GitHub. All three follow the same patterns described in this document. Otherwise open a [GitHub issue](https://github.com/capistrano/capistrano/issues) with your questions or feedback. Thanks! capistrano-capistrano-603c346/docs/documentation/advanced-features/filtering/000077500000000000000000000000001520217215100274315ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/advanced-features/filtering/index.markdown000066400000000000000000000060311520217215100323040ustar00rootroot00000000000000--- title: Filtering layout: default --- Filtering is the term given to reducing the entire set of servers declared in a stage file to a smaller set. There are three types of filters used in Capistrano (Host, Role and Property) and they take effect in two quite different ways because of the two distinct uses to which the declarations of servers, roles and properties are put in tasks: * To determine _configurations_: typically by using the `roles()`, `release_roles()` and `primary()` methods. Typically these are used outside the scope of the `on()` method. * To _interact_ with remote hosts using the `on()` method An illustration of this would be to create a `/etc/krb5.conf` file containing the list of available KDC's by using the list of servers returned by `roles(:kdc)` and then uploading it to all client machines using `on(roles(:all)) do upload!(file) end` A problem with this arises when _filters_ are used. Filters are designed to limit the actual set of hosts that are used to a subset of those in the overall stage, but how should that apply in the above case? If the filter applies to both the _interaction_ and _configuration_ aspects, any configuration files deployed will not be the same as those on the hosts excluded by the filters. This is almost certainly not what is wanted, the filters should apply only to the _interactions_ ensuring that any configuration files deployed will be identical across the stage. So we define two different categories of filter, the interaction ones which are called _On-Filters_ and the configuration ones which are _Property-Filters_ ### On-Filtering On-filters apply only to the `on()` method that invokes SSH. There are two default types: * [Host Filters](/documentation/advanced-features/host-filtering/), and * [Role Filters](/documentation/advanced-features/role-filtering/) In both the above cases, when filters are specified using comma separated lists, the final filter is the _union_ of all of the components. However when multiple filters are declared the result is the _intersection_. This means that you can filter by both role and host but you will get the _intersection_ of the servers. For example, lets say you filtered by the role `app`, then by the hostnames `server1` and `server2`. Capistrano would first filter the available servers to only those with the role `app`, then filter them to look for servers with the hostname `server1` or `server2`. If only `server2` had the role `app` (`server1` has some other role), then in this situation your task would only run on `server2`. Custom filters may also be added; see [Custom Filters](/documentation/advanced-features/custom-filters/). ### Property-Filtering Property-filters select servers based on the value of their properties alone and are specified by options passed to the `roles()` method (and implicitly in methods like `release_roles()` and `primary()`) An example of that is the 'no_release' property and it's use in the `release_roles()` method. See the [documentation](/documentation/advanced-features/property-filtering/) for details capistrano-capistrano-603c346/docs/documentation/advanced-features/host-filtering/000077500000000000000000000000001520217215100304045ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/advanced-features/host-filtering/index.markdown000066400000000000000000000042671520217215100332700ustar00rootroot00000000000000--- title: Host filtering layout: default --- You may encounter situations where you only want to deploy to a subset of the servers defined in your configuration. For example, a single server or set of servers may be misbehaving, and you want to re-deploy to just these servers without deploying to every server. You can use the *host filter* to restrict Capistrano tasks to only servers that match a given set of hostnames. If the filter matches no servers, no actions will be taken. If you specify a filter, it will match servers that have the listed hostnames, and it will run *all* the roles for each server. In other words, it only affects the servers the task runs on, not what tasks are run on a server. ### Specifying a host filter There are three ways to specify the host filter. #### Environment variable Capistrano will read the host filter from the environment variable `HOSTS` if it is set. You can set it inline: ```bash HOSTS=server1,server2 cap production deploy ``` Specify multiple hosts by separating them with a comma. #### In configuration You can set the host filter inside your deploy configuration. For example, you can set the following inside `config/deploy.rb`: ```ruby set :filter, :hosts => %w{server1 server2} ``` Note that you specify the filter as an array rather than as a comma-separated list of servers when using this method. Note that the keyname `:host` is also supported. #### On the command line In a similar way to using the environment variable, you can set the role filter by specifying it as a command line argument to `cap`: ```bash cap --hosts=server1,server2 production deploy ``` Like the environment variable method, specify multiple servers by separating them with a comma. ### Using Regular Expressions If the host name in a filter doesn't match the set of valid characters for a DNS name (Given by the regular expression `/^[-A-Za-z0-9.]+$/`) then it's assumed to be a regular expression in standard Ruby syntax. For example, if you had three servers named localrubyserver1, localrubyserver2, and amazonrubyserver1, but only wanted to deploy to localrubyserver*, you call Capistrano with a regex: ```bash cap --hosts=^localrubyserver production deploy ``` capistrano-capistrano-603c346/docs/documentation/advanced-features/ignoring/000077500000000000000000000000001520217215100272625ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/advanced-features/ignoring/index.markdown000066400000000000000000000017071520217215100321420ustar00rootroot00000000000000--- title: Ignoring layout: default --- Files committed to version control (i.e. not in .gitignore) can still be ignored when deploying. To ignore these files or directories, simply add them to .gitattributes: ```bash config/deploy/deploy.rb export-ignore config/deploy/ export-ignore ``` These files will be kept in version control but not deployed to the server. *Note:* This feature is probably unnecessary unless the root of your repository is also your web server's docroot. For example, in a Rails application, the docroot is the `public/` folder. Since all of the Capistrano configuration lives above or beside this folder, it cannot be served and is not a security risk. If the docroot is indeed at the base of the repository, consider changing that by moving the code at the repository base to a subdirectory such as public_html instead of using this feature. Note that this feature is very specific to Git and will not work on other SCMs. capistrano-capistrano-603c346/docs/documentation/advanced-features/overriding-capistrano-tasks/000077500000000000000000000000001520217215100331025ustar00rootroot00000000000000index.markdown000066400000000000000000000026661520217215100357100ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/advanced-features/overriding-capistrano-tasks--- title: Overriding Capistrano tasks layout: default --- When re-defining a task in Capistrano v2, the original task was replaced. The Rake DSL on which Capistrano v3 is built is additive however, which means that given the following definitions ```ruby task :foo do puts "foo" end task :foo do puts "bar" end ``` Will print both `foo` and `bar`. But it is also possible to completely clear a task and then re-defining it from scratch. A `Rake::Task` provides the `clear` method for this, which internally performs three separate actions: - `clear_prerequisites` - `clear_actions` - `clear_comments` Clearing the prerequisites (i.e. any dependencies that may have been defined for a task) is probably not what you want, though. Let's say, for example, that you want to re-define the `deploy:revert_release` task, which is defined as follows: ```ruby task :revert_release => :rollback_release_path do # ... end ``` Calling `clear` on this task and then re-defining it results in `rollback_release_path` never being called, thus breaking rollback behavior. Under most circumstances, you will simply want to use `clear_actions`, which removes the specified task's behaviour, but does not alter it's dependencies or comments: ```ruby task :init do puts "init" end task :foo => :init do puts "foo" end Rake::Task["foo"].clear_actions task :foo do puts "bar" end ``` Running the `foo` task will print ```ruby init bar ``` --- capistrano-capistrano-603c346/docs/documentation/advanced-features/properties/000077500000000000000000000000001520217215100276425ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/advanced-features/properties/index.markdown000066400000000000000000000204741520217215100325240ustar00rootroot00000000000000--- title: Properties layout: default --- Server objects in Capistrano essentially consist of a name and a hash: The name is the DNS name (or IP address) and the hash contains the 'Properties' of the server. These properties are of two sorts: ones required by Capistrano (_Capistrano Properties_) and ones available for use by the Application (_Custom Properties_). These share the same namespace (there is only one underlying hash!) so the names of custom properties are restricted. ### Capistrano Properties The Capistrano properties are those used to SSH into the server and those that support the basic _role_ functionality. These are: * `:user` - the name of the SSH user for the server * `:password` - for the SSH user * `:port` - the port number of the SSH daemon on the server * `:roles` - an array of rolenames * `:ssh_options` - a hash of SSH parameters (see below) * `:primary` - a boolean that indicates whether the server should be considered primary or not. The `:user`, `:port` and `:password` may be specified as follows: * As part of the hostname in the form 'user@host:port' without a password, * In the properties `:user`, `:password` and `:port`, and * In the property `:ssh_options` (with the same keys) #### Precedence The SSH related properties are set with the following precedence, beginning with the highest: * Property declarations on the server or role. The last property declaration overrides all the previous server or role declarations * Values specified in the hostname string * Values in the server or role `:ssh_options` property * The stage global variable `:ssh_options` * The SSHKit backend `ssh_options` * The settings in your local `~/.ssh/config` file Note however that defaults taken from these places will _not_ be reflected back into the server properties, so `host.user` will be nil if a lower precedence default is being used. ### Custom Properties When using Capistrano as a general purpose deployment framework (above and beyond it's traditional use for Rails deployments) it becomes important to be able to store additional parameters. You can think of Capistrano as an _MVC_ framework for deployments, where the stage file (representing all the relationships between application components) is the _Model_, the tasks (enabling model changes to be actioned) are the _Controllers_, and the actual physical embodiments (typically configuration files on running servers) are the _Views_. ### Property Access from within Tasks The properties on Capistrano server are accessible programmatically from a Capistrano task. _Capistrano_ properties are available through methods on the host object itself and _Custom_ properties via methods on the `properties` attribute of the host. These methods have the expected names: `user`, `port` and so on. An exception is the `ssh_config` which is available via the `netssh_options` method. The following feature is new in Capistrano 3.3.6 and above. Within the scope of an `on()` block, the host that is yielded is a *copy* of the underlying host, which allows you to temporarily override any of the properties by calling the setter method. An example is: ```ruby on roles(:all) do |host| host.user = 'root' host.password = 'supersecret' execute :yum, 'makecache' end ``` This temporarily sets the SSH user to 'root' (with an appropriate password) without affecting the SSH user defined for the server in the configuration. ### Property setting in Complex Configurations As configurations involve more servers it helps to be able to define a set of properties at the role level, and have those be overridden by a later definition at the server level. This keeps your configuration as DRY as possible. A typical requirement is defining a set of Redis servers which all have the same port parameter and are all slaves except for one which is the master. To allow this properties can be set at both the _Server_ and _Role_ level. The guiding principle is that the properties are _merged_ and that __the last definition wins__. In practice we finesse this slightly depending on the type of the properties value: * _scalar_ values will be overridden * _hash_ values will have their keys merged with duplicate keys taking on the value of the last one. * _array_ values will have subsequent entries appended to the array #### Example of Server and Role Properties The above Redis requirement can be met using the following declarations in the stage file: ```ruby role :redis, %w{ r1.example.com r2.example.com r3.example.com }, redis: { port: 6379, master: false }, server 'r1.example.com', redis: { port: 6380, master: true } ``` #### Conventions for Role Properties This is complicated by the fact that a single machine may serve multiple roles, and in fact a single machine may need to do the same role twice! An example of this might be in a development situation where you want a single machine to be the database server, a primary Redis server and a slave Redis server. To solve this problem we adopt a convention for the use of server properties: * Server properties for a given role should be stored with the keyname equal to the role. The contents of the property can be a scalar, array or hash. * Multiple occurrences of a role on the same server should have the contents be an array, in which the successive elements denote each instance. The following example shows a configuration with multiple Redis and Sentinel roles on the same server: ```ruby server 'dev.local', roles: %w{db web redis sentinel worker}, primary: true, redis: [ { name: 'resque', port: 6379, db: 0, downtime: 10, master: true }, { name: 'resque', port: 6380, db: 0, downtime: 10 } ], sentinel: [ { port: 26379 }, { port: 26380 }, { port: 26381 } ] ``` These properties can be accessed in the ordinary way, but to assist in obtaining them you can use the `role_properties()` function (see below). ## Setting Properties Properties can be set at both the role and server levels. ### Role Properties The declaration of a role takes an array of server names and a trailing hash of properties. By convention the first server in a role declaration is taken to be the primary, but the `:primary` property will not actually be set in such a case. ### Server Properties The declaration of a server takes the name of a server and a trailing hash of properties. One of those properties must be `:role` and have a value which is an array of role names. ### Accessing Properties #### The `roles()` Method The `roles()` method takes one or more role names (or an array of roles) followed by an optional [Property Filter](/documentation/advanced-features/property-filtering)) and returns an array of `Capistrano::Configuration::Server` objects that belong to those roles. These have the following useful attributes: * `hostname` - a String * `properties.keys` - the names of the available properties * `properties` - a hash-like object that stores the properties. It uses Ruby's 'method_missing' to provide a method for each valid key. * `roles` - a Set of role names as symbols The servers retrieved by this method are NOT filtered by any host or role filters. #### The `role_properties()` Method This takes a list of roles (followed by an optional [Property Filter](/documentation/advanced-features/property-filtering)) and returns an array of hashes containing the properties with the keys `:hostname` and `:role` added: ```ruby task :props do rps = role_properties(:redis, :sentinel) rps.each do |props| puts props.inspect end end # Produces... {:name=>"resque", :port=>6379, :db=>0, :downtime=>10, :master=>true, :role=>:redis, :hostname=>"dev.local"} {:name=>"resque", :port=>6380, :db=>0, :downtime=>10, :role=>:redis, :hostname=>"dev.local"} {:port=>26379, :role=>:sentinel, :hostname=>"dev.local"} {:port=>26380, :role=>:sentinel, :hostname=>"dev.local"} {:port=>26381, :role=>:sentinel, :hostname=>"dev.local"} ``` Alternatively you can supply a block and it will yield the hostname, role and properties: ```ruby task :props_block do role_properties(:sentinel) do |hostname, role, props| puts "Host: #{hostname}, Role: #{role}, #{props.inspect}" end end # Produces... Host: dev.local, Role: sentinel, {:port=>26379} Host: dev.local, Role: sentinel, {:port=>26380} Host: dev.local, Role: sentinel, {:port=>26381} ``` Note that unlike `on()` this function doesn't cause any remote execution to occur, it is purely for configuration purposes. capistrano-capistrano-603c346/docs/documentation/advanced-features/property-filtering/000077500000000000000000000000001520217215100313135ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/advanced-features/property-filtering/index.markdown000066400000000000000000000036211520217215100341700ustar00rootroot00000000000000--- title: Property Filtering layout: default --- Options may be passed to the `roles()` method (and implicitly in methods like `release_roles()` and `primary()`) that affect the set of servers returned. These options take the form of a Hash passed as the last parameter. Each of the key/value pairs in the hash are evaluated in the sequence they are declared and if all are true for a specific server then the server will be returned. The keys must always be symbols which have the following meaning: * `:filter`, or `:select`: The value is either a property keyname or a lambda which is called with the server as parameter. The value must return true for the server to be included. * `:exclude`: As above but the value must return false for the server to be included. * Any other symbol is taken as a server property name whose value must equal the given value. A lambda will not be called if one is supplied! ### Examples ```ruby server 'example1.com', roles: %w{web}, active: true server 'example2.com', roles: %w{web} server 'example3.com', roles: %w{app web}, active: true server 'example4.com', roles: %w{app}, primary: true server 'example5.com', roles: %w{db}, no_release: true, active: true task :demo do puts "All active release roles: 1,3" release_roles(:all, filter: :active).each do |r| puts "#{r.hostname}" end puts "All active roles: 1,3,5" roles(:all, active: true).each do |r| puts "#{r.hostname}" end puts "All web and db roles with selected names: 2,3" roles(:web, :db, select: ->(s){ s.hostname =~ /[234]/}).each do |r| puts "#{r.hostname}" end puts "All with no active property: 2,4" roles(:all, active: nil).each do |r| puts "#{r.hostname}" end puts "All except active: 2,4" roles(:all, exclude: :active).each do |r| puts "#{r.hostname}" end puts "All primary: 4" roles(:all, select: :primary).each do |r| puts "#{r.hostname}" end end ``` capistrano-capistrano-603c346/docs/documentation/advanced-features/ptys/000077500000000000000000000000001520217215100264455ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/advanced-features/ptys/index.markdown000066400000000000000000000023131520217215100313170ustar00rootroot00000000000000--- title: PTYs layout: default --- There is a configuration option which asks the backend driver to ask the remote host to assign the connection a *pty*. A *pty* is a pseudo-terminal, which in effect means *tell the backend that this is an __interactive__ session*. This is normally a bad idea. Most of the differences are best explained by [this page](https://github.com/sstephenson/rbenv/wiki/Unix-shell-initialization) from the author of *rbenv*. **When Capistrano makes a connection it is a *non-login*, *non-interactive* shell. This was not an accident!** It's often used as a band aid to cure issues related to RVM and rbenv not loading login and shell initialisation scripts. In these scenarios RVM and rbenv are the tools at fault, or at least they are being used incorrectly. Whilst, especially in the case of language runtimes (Ruby, Node, Python and friends in particular) there is a temptation to run multiple versions in parallel on a single server and to switch between them using environmental variables, this is an anti-pattern, and symptomatic of bad design (e.g. you're testing a second version of Ruby in production because your company lacks the infrastructure to test this in a staging environment). capistrano-capistrano-603c346/docs/documentation/advanced-features/remote-file/000077500000000000000000000000001520217215100276565ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/advanced-features/remote-file/index.markdown000066400000000000000000000014331520217215100325320ustar00rootroot00000000000000--- title: Remote file task layout: default --- **Warning: `remote_file` is deprecated and was removed in Capistrano 3.7.0** The `remote_file` task is allowing the existence of a remote file to be set as a prerequisite. These tasks can in turn depend on local files if required. In this implementation, the fact that we're dealing with a file in the shared path is assumed. As an example, this task can be used to ensure that files to be linked exist before running the check:linked_files task: ```ruby namespace :deploy do namespace :check do task :linked_files => 'config/newrelic.yml' end end remote_file 'config/newrelic.yml' => '/tmp/newrelic.yml', roles: :app file '/tmp/newrelic.yml' do |t| sh "curl -o #{t.name} https://rpm.newrelic.com/accounts/xx/newrelic.yml" end ``` capistrano-capistrano-603c346/docs/documentation/advanced-features/role-filtering/000077500000000000000000000000001520217215100303705ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/advanced-features/role-filtering/index.markdown000066400000000000000000000040761520217215100332520ustar00rootroot00000000000000--- title: Role filtering layout: default --- You may have situations where you only want to deploy to servers matching a single role. For example, you may have changed some aspect of how the web role works, but don't want to trigger a deployment to your database servers. You can use the *role filter* to restrict Capistrano tasks to only servers match a given role or roles. If the filter matches no servers, no actions will be taken. If you specify a filter, it will match any servers that have that role, and it will run _all_ tasks for each of the roles that server has. For example, if you filtered for servers with the `web` role, and a server had both the `web` and `db` role, both the `web` and `db` role tasks would be executed on it. ### Specifying a role filter There are three ways to specify the role filter. #### Environment variable Capistrano will read the role filter from the environment variable `ROLES` if it is set. You can set it inline: ```bash ROLES=app,web cap production deploy ``` Specify multiple roles by separating them with a comma. #### In configuration You can set the role filter inside your deploy configuration. For example, you can set the following inside `config/deploy.rb`: ```ruby set :filter, :roles => %w{app web} ``` Note that you specify the filter as an array rather than as a comma-separated list of roles when using this method. Note that the keyname `:role` is also supported. #### On the command line In a similar way to using the environment variable, you can set the role filter by specifying it as a command line argument to `cap`: ```bash cap --roles=app,web production deploy ``` Like the environment variable method, specify multiple roles by separating them with a comma. ### Using Regular Expressions Since role names are Ruby symbols they can legitimately contain any characters. However to allow multiple of them to be specified on one line we use the comma as a separator. To use a regular expression for a role filter begin and end the string with '/'. Because of the above these regular expressions may not contain a comma. capistrano-capistrano-603c346/docs/documentation/advanced-features/ssh-kit/000077500000000000000000000000001520217215100270305ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/advanced-features/ssh-kit/index.markdown000066400000000000000000000017061520217215100317070ustar00rootroot00000000000000--- title: Remote commands with SSH Kit layout: default --- Capistrano executes commands on remote servers using [**SSHKit**](https://github.com/capistrano/sshkit). An example setting a working directory, user and environment variable: ```ruby on roles(:app), in: :sequence, wait: 5 do within "/opt/sites/example.com" do # commands in this block execute in the # directory: /opt/sites/example.com as :deploy do # commands in this block execute as the "deploy" user. with rails_env: :production do # commands in this block execute with the environment # variable RAILS_ENV=production rake "assets:precompile" runner "S3::Sync.notify" end end end end ``` For more examples, see the EXAMPLES.md file in the [**SSHKit**](https://github.com/capistrano/sshkit) project: [https://github.com/capistrano/sshkit/blob/master/EXAMPLES.md](https://github.com/capistrano/sshkit/blob/master/EXAMPLES.md) capistrano-capistrano-603c346/docs/documentation/advanced-features/validation-of-variables/000077500000000000000000000000001520217215100321505ustar00rootroot00000000000000index.markdown000066400000000000000000000006131520217215100347440ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/advanced-features/validation-of-variables--- layout: default title: Validation of variables --- To validate a variable, each time before it is set, define a validation: ```ruby validate :some_key do |key, value| if value.length < 5 raise Capistrano::ValidationError, "Length of #{key} is too short!" end end ``` Multiple validations can be assigned to a single key. Validations will be executed in the order of registration. capistrano-capistrano-603c346/docs/documentation/faq/000077500000000000000000000000001520217215100226345ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/faq/how-can-i-access-stage-configuration-variables/000077500000000000000000000000001520217215100335715ustar00rootroot00000000000000index.markdown000066400000000000000000000036541520217215100363750ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/faq/how-can-i-access-stage-configuration-variables--- title: How can I access stage configuration variables? layout: default --- Configuration variables are accessed with the fetch method, like so: ```ruby local = fetch(:configuration_variable, _default_value_) ``` This works fine when accessing configuration variables defined within the same file. For example accessing a previously set configuration variable defined in deploy.rb or accessing a set configuration variable in a stage file. The deploy.rb configuration is executed first and then the stage file(s) from config/deploy/*.rb are executed next. This means that the configuration variables set in deploy.rb are available to the stage files, but configuration variables created in a stage file are not available in deploy.rb. To access them they must be lazily loaded in deploy.rb. This works because all configuration variables (from both deploy.rb and the current stage file) have been defined by the time the tasks run and access the variables. For example, let's create a configuration variable in the production and staging files and access the current one from deploy.rb. config/deploy/production.rb ```ruby set :app_domain, "www.my_application.com" ``` config/deploy/staging.rb ```ruby set :app_domain, "stage.application_test.com" ``` These variables are not available in deploy.rb using `fetch(:nginx_port)` or `fetch(:app_domain)` because they are not defined when deploy.rb is executed. They can, however, be lazily loaded using a lambda in deploy.rb like this: config/deploy.rb ```ruby set :nginx_server_name, ->{ fetch(:app_domain) } set :puma_bind, ->{ "unix:/tmp/#{fetch(:app_domain)}.sock" } ``` Now the `:nginx_server_name` and `:puma_bind` variables will be lazily assigned the values set in which ever stage file was used to deploy. If you need to create nested hashes, you might find `do/end` syntax more readable: ```ruby set :database_yml, -> do { production: { host: 'localhost' } } end ``` capistrano-capistrano-603c346/docs/documentation/faq/how-can-i-check-for-existing-remote-file/000077500000000000000000000000001520217215100323135ustar00rootroot00000000000000index.markdown000066400000000000000000000003461520217215100351120ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/faq/how-can-i-check-for-existing-remote-file--- title: How can I check for existing remote file? layout: default --- The `test` method is best used for file checking with bash conditionals ```ruby if test("[ -f /tmp/foo ]") # do stuff end ``` how-can-i-get-capistrano-to-prompt-for-a-password/000077500000000000000000000000001520217215100340565ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/faqindex.markdown000066400000000000000000000006321520217215100367320ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/faq/how-can-i-get-capistrano-to-prompt-for-a-password--- title: How can I get Capistrano to prompt for a password? layout: default --- Password authentication can be done via `ask` in your deploy environment file (e.g.: config/environments/production.rb) ```ruby # Capistrano > 3.2.0 supports echo: false ask(:password, nil, echo: false) server 'server.domain.com', user: 'ssh_user_name', port: 22, password: fetch(:password), roles: %w{web app db} ``` capistrano-capistrano-603c346/docs/documentation/faq/how-can-i-set-capistrano-configuration-paths/000077500000000000000000000000001520217215100333325ustar00rootroot00000000000000index.markdown000066400000000000000000000022541520217215100361310ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/faq/how-can-i-set-capistrano-configuration-paths--- title: How can I set Capistrano configuration paths? layout: default --- Capistrano `config` and `tasks` paths can be explicitly defined, like so: Capfile ```ruby # default deploy_config_path is 'config/deploy.rb' set :deploy_config_path, 'cap/deploy.rb' # default stage_config_path is 'config/deploy' set :stage_config_path, 'cap/stages' # previous variables MUST be set before 'capistrano/setup' require 'capistrano/setup' # default tasks path is `lib/capistrano/tasks/*.rake` # (note that you can also change the file extensions) Dir.glob('cap/tasks/*.rb').each { |r| import r } ``` Here is the corresponding capistrano configuration structure: ```bash ├── Capfile └── cap ├── stages │ ├── production.rb │ └── staging.rb ├── tasks │ └── custom_tasks.rb └── deploy.rb ```

          Be aware that you will have to provide an absolute path, if you want your "deploy_config_path" to be "capistrano/deploy.rb". See this issue for more explanations and how to get an absolute path in Ruby.

          why-does-something-work-in-my-ssh-session-but-not-in-capistrano/000077500000000000000000000000001520217215100367255ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/faqindex.markdown000066400000000000000000000110751520217215100416040ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/faq/why-does-something-work-in-my-ssh-session-but-not-in-capistrano--- title: Why does something work in my SSH session, but not in Capistrano? layout: default --- This is possibly one of the most complicated support questions that can be asked, the only real answer is ***it depends***. It's really a question of which *kind* of shell Capistrano is using, it's a matrix of possibilities concerning `login`, `non-login`, `interactive`, or `non-interactive`. **By default Capistrano always assigns a `non-login`, `non-interactive` shell.** ## Shell Modes Unix shells can be started in one of three modes, an unnamed *basic* mode, which almost never happens, as a `login` shell, or as an `interactive` shell. Depending which mode a shell starts in (and which shell you are using) this will affect which startup (more commonly known as *dot*-files) files, if any are loaded, [here's](#which_startup_files_loaded) more or less the matrix of what is loaded when. ## What about the Capistrano option to assign a `pty`? This option has been hugely misleadingly used, if you ask SSH to provide a `pty` you are effectively telling SSH that *"I'll connect this session to a user terminal"*, thus programs on the receiving end expect that they can prompt for input, and provide coloured output, etc. In short they think they're talking to you over an interactive session, because by assigning a `pty`, Bash has been started in `non-login`, `interactive` mode. Read more about this: * [In the "Bash Startup Files" section of the Bash manual](https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html) * [At Sam Stephenson's excellent *Unix shell initialization* wiki page](https://github.com/sstephenson/rbenv/wiki/Unix-shell-initialization) * [Interactive and non-interactive shells and scripts documentation](https://www.tldp.org/LDP/abs/html/intandnonint.html) ## How does what Capistrano does differ from an SSH session By default Capistrano prefers to start a *non-login, non-interactive shell*, to try and isolate the environment and make sure that things work as expected, regardless of any changes that might happen on the server side. In contrast when you log into a machine with your terminal, into a regular Bash session, the `--login` option to Bash is implied granting you a `login` shell, and because you are in a terminal, ssh asks the ssh server to provide a pty so that you may start an interactive session. Thus you get an `interactive login` shell, the exact opposite of what we need for Capistrano! ## How can I check? I actually had to look this up, most of the time it's common sense, but [stackoverflow to the rescue](https://unix.stackexchange.com/a/26782), let's figure this out! First, we'll try a *real* SSH session, logging in via our terminal, and seeing what happens: ```bash me@localhost $ ssh me@remote me@remote $ [[ $- == *i* ]] && echo 'Interactive' || echo 'Not interactive' Interactive me@remote $ shopt -q login_shell && echo 'Login shell' || echo 'Not login shell' Login shell ``` Contrast that with what happens when we hand the command to run to the SSH command line without logging in first... ```bash me@localhost $ ssh me@remote "[[ $- == *i* ]] && echo 'Interactive' || echo 'Not interactive'" Interactive me@localhost $ ssh me@remote "shopt -q login_shell && echo 'Login shell' || echo 'Not login shell'" Not login shell ``` Here we can see that Bash is still starting in **interactive** mode when we're just running a single command, that's because the terminal we are using is interactive, and SSH inherits that and passes that on to the remote server. When we try the same with Capistrano we'll see yet another set of results; we can have a very simple, Capfile, we don't even need to load the default recipes to test this: ```ruby # Capistrano 3 task :query_interactive do on 'me@remote' do info capture("[[ $- == *i* ]] && echo 'Interactive' || echo 'Not interactive'") end end task :query_login do on 'me@remote' do info capture("shopt -q login_shell && echo 'Login shell' || echo 'Not login shell'") end end ``` Gives us the following: ```bash me@localhost $ cap query_login INFO Not login shell me@localhost $ cap query_interactive INFO Not interactive ``` ## Which shell startup files do get loaded? Best explained with this diagram, yes it's that complicated:
          Bash Startup Files

          Source: http://www.solipsys.co.uk/new/BashInitialisationFiles.html

          capistrano-capistrano-603c346/docs/documentation/getting-started/000077500000000000000000000000001520217215100251725ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/getting-started/authentication-and-authorisation/000077500000000000000000000000001520217215100336405ustar00rootroot00000000000000index.markdown000066400000000000000000000372551520217215100364500ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/getting-started/authentication-and-authorisation--- title: Authentication & Authorisation layout: default --- **Note:** In the documentation we simply recommend creating a single deployment user, and sharing it between team members. If you know why this is a bad idea (or why this may be against regulations in your jurisdiction in some cases), we assume that you know well enough how to use groups, umasking and setgid bits to make this work reliably for unique logins across team members. To create this deploy user we'll assume something like the following has been done: ```bash root@remote $ adduser deploy root@remote $ passwd -l deploy ``` The first line creates a completely standard user, it has a home directory, which we'll need in a moment, and has a shell, so it may log in. This needs to be done **on every server in your environment**. The second line *locks* the user, it changes the user's password to an untypable string, guaranteeing that the user has no password which can be used to log in. ### Authentication There are two places that we need automated, promptless authentication: 1. **From our workstation/notebook/etc to our servers.** We do this with **SSH keys**, passphrase protected, ideally, using a **key agent**. 2. **From our servers to the repository host**. We do this so that our servers can check out our application code from Github, or similar and install it to the servers. This is usually done using **SSH agent forwarding**, HTTP authentication, or with deploy keys. #### 1.1 SSH keys from workstation to servers An SSH key is a mechanism that allows a *public* half one key to be placed on a server, when we want to authenticate with that server, our SSH client uses the **private** part of that key to negotiate with the server, if the keys are correct, we are allowed to login. **Note:** If you are on Windows, you can use Git for Windows to generate ssh keys. To do this, follow this steps: 1. Install [Git for Windows](https://git-scm.com/download/win). 2. Open "Git Bash" and follow next instructions always inside Git Bash prompt. 3. Activate ssh-agent: ```$ eval "$(ssh-agent -s)" ``` **Note:** If you want to use [Putty tool](https://putty.software/) to connect to remote server (from Windows) with ssh keys, then you need to generate ppk file, through puttygen tool. **Hint:** If you have more than one developer in your team, they should all add their public key to the `deploy` user's `authorized_keys` file, that way if someone quits or gets fired, you can remove their key from that file, and the rest of you can keep on shipping! Then we need to create the key. ```bash me@localhost $ ssh-keygen -t rsa -C 'me@my_email_address.com' ``` You'll be prompted for a passphrase, that's fine. Type one and keep it safe. This passphrase ensures that if your computer is stolen, people still need a passphrase to access your keys, in order to access your servers. To avoid having to type this passphrase every time you need to use a key, most operating systems have a concept of a *key agent*. This *key agent* stores SSH keys securely between uses, typically the first time a key is needed in a given time period, the SSH agent will load the key, prompt you for your passphrase and then the key agent will remember the key for a certain amount of time (on OSX it tends to be indefinite, on linux this can vary from 15 minutes upwards.) We can see which keys are loaded in the SSH agent by running `ssh-add -l` ```bash me@localhost $ ssh-add -l 2048 af:ce:7e:c5:93:18:39:ff:54:20:7a:2d:ec:05:7c:a5 /Users/me/.ssh/id_rsa (RSA) ``` If you don't see any keys listed, you can simply run `ssh-add`: ```bash me@localhost $ ssh-add Identity added: /Users/me/.ssh/id_rsa (/Users/me/.ssh/id_rsa) ``` Typically, ssh-add will ask you for the passphrase when you add a key. **Note:** Although it's not mandatory to use an SSH agent (one could simply use an unpassphrased key, and rely on SSH to find the key and exchange it). Using an SSH agent makes things more secure, because we can use a passphrased key without being prompts every time it is used. It **also** allows us to use this same key to access the repository *via* the server without creating an additional identity. At this point with the key loaded into the agent, we need to put the **public** part of the key into a file on each remote server called `/home/users/deploy/.ssh/authorized_keys`, to get the contents of that file, we can ask our local key agent for the public parts of the keys it has loaded: ```bash me@localhost $ ssh-add -L ssh-rsa jccXJ/JRfGxnkh/8iL........dbfCH/9cDiKa0Dw8XGAo01mU/w== /Users/me/.ssh/id_rsa ``` This will be a lot longer when you run it, I snipped the output because it looked bad. This line, as one line, needs to make it to the remote server and be added *to it's own line* of the `deploy` user's `~/.ssh/authorized_keys` file. This file then needs to be changed to permission mode `0600` (owner read/write, group none, other none), in the `~/.ssh` directory which needs the permissions `0700` (owner read/write/execute, group none, other none). If you are on linux there often exists a command [`ssh-copy-id`](https://linux.die.net/man/1/ssh-copy-id) which streamlines this process, otherwise the workflow is something like: ```bash me@localhost $ ssh root@remote root@remote $ su - deploy deploy@remote $ cd ~ deploy@remote $ mkdir .ssh deploy@remote $ echo "ssh-rsa jccXJ/JRfGxnkh/8iL........dbfCH/9cDiKa0Dw8XGAo01mU/w== /Users/me/.ssh/id_rsa" >> .ssh/authorized_keys deploy@remote $ chmod 700 .ssh deploy@remote $ chmod 600 .ssh/authorized_keys ``` **Remember:** This needs to be done on every server you want to use, you can use the same key for each one, but only one key per developer is recommended. *Private* keys are named as such for a reason! If we did all that correctly, we should now be able to do something like this: ```bash me@localhost $ ssh deploy@one-of-my-servers.com 'hostname; uptime' one-of-my-servers.com 19:23:32 up 62 days, 44 min, 1 user, load average: 0.00, 0.01, 0.05 ``` That should happen without having to enter a passphrase for your SSH key, or prompting you for an SSH password (which the deploy user doesn't have anyway). Verify that this works for all of your servers, and put your private key somewhere safe. If you're working with multiple team members, it often pays to collect everyone's public keys, indeed if your team is already using SSH keys to access Github, you can reach any user's SSH keys at the following URL: * `https://github.com/theirusername.keys` This can make getting user's keys onto servers much easier, as you can simply `curl`/`wget` each user's key into the authorized keys file on the server directly from Github. If your server isn't accessible directly and you need to use the SSH ProxyCommand option, you should do ```ruby require 'net/ssh/proxy/command' set :ssh_options, proxy: Net::SSH::Proxy::Command.new('ssh mygateway.com -W %h:%p') # OR server 'internal-hostname', ssh_options: { proxy: Net::SSH::Proxy::Command.new('ssh mygateway.com -W %h:%p'), } ``` #### 1.2 From our servers to the repository host With access from workstations to the servers settled, there is another hop to contend with, which is letting the deploy user get access to the code repository automatically. The options in order of preference: ##### 1.2.1 SSH Agent Forwarding As we've already set up an SSH agent, we can use the *agent forwarding* feature of SSH to make this key agent available to further *hops*. In short, we can use **our own ssh key** to authenticate ourselves from the server to Github. Here's how we can check if that works, first get the URL of the repository: ```bash me@localhost $ git config remote.origin.url git@github.com:capistrano/rails3-bootstrap-devise-cancan.git ``` Here we're listing our private (for testing purposes) fork of the rails3-bootstrap-devise-cancan repository forked from the Rails Examples and Tutorials project. We can try to access the repository via our server by doing the following: ```bash # List SSH keys that are loaded into the agent me@localhost $ ssh-add -l # Make sure they key is loaded if 'ssh-add -l' didn't show anything me@localhost $ ssh-add me@localhost $ ssh -A deploy@one-of-my-servers.com 'git ls-remote git@github.com:capistrano/rails3-bootstrap-devise-cancan.git' ``` We first check that the agent has the keys loaded. If not we simply load it and enter the passphrase when prompted. Finally we use `ls-remote` from Git to list the remote objects, this is the exact same check that Capistrano does internally before attempting to deploy. The `-A` option may, or may not be required on your system, it's worth trying it both ways just to know how your system treats agent forwarding by default. If you get the error "host key verification failed." log in into your server and run as the deploy user the command `ssh git@github.com` to add github.com to the list of known hosts. From the SSH documentation: ```bash -A Enables forwarding of the authentication agent connection. This can also be specified on a per-host basis in a configuration file. Agent forwarding should be enabled with caution. Users with the ability to bypass file permissions on the remote host (for the agent's UNIX-domain socket) can access the local agent through the forwarded connection. An attacker cannot obtain key material from the agent, however they can perform operations on the keys that enable them to authenticate using the identities loaded into the agent. ``` In layman's terms, you shouldn't use SSH agent forwarding to machines where you don't trust the administrators, as they can can override the permissions on the system and use your keys as if they were you. That said, if you can't trust your server administrators, perhaps they shouldn't have access to your servers! ##### 1.2.2 HTTP Authentication In the case of HTTP authentication **be sure to use HTTPS**, otherwise your password will be sent in cleartext over the network, depending what your hosts network infrastructure looks like that might be *very* bad news. Typically when we try and list our remote objects, using the https method from Github, we'll be prompted for a username and password: ##### 1.2.2.1 With a regular username/password ```bash me@localhost $ git ls-remote https://github.com/capistrano/rails3-bootstrap-devise-cancan.git Username for 'https://github.com': myownusername Password for 'https://capistrano@github.com': ``` This challenge response prompt doesn't work well for automating things, so there are two ways to get around this depending on your server's host operating system, the first is to use a `netrc` file, we won't talk about that because the netrc is a global file that doesn't lend itself well to security. The other mechanism, and the reason that its **very** important to always use HTTPS not plain ol' HTTP is to embed the username and password in the URL, note this won't work well if your password has special characters: ```bash me@localhost $ git ls-remote https://capistrano:ourverysecretpassword@github.com/capistrano/rails3-bootstrap-devise-cancan.git 3419812c9f146d9a84b44bcc2c3caef94da54758HEAD 3419812c9f146d9a84b44bcc2c3caef94da54758HEADrefs/heads/master ``` The bigger problem with passwords, whether inlined into the URL, or entered into a `netrc` file, is that the password gives access to **your entire Github Account** not just to one single repository. ##### 1.2.2.2 With an OAuth Personal API Token This mechanism still gives access to **every repository** you can access, but at Github, they recently rolled out a feature called [Personal API Tokens](https://github.com/blog/1509-personal-api-tokens) which allow you to do something like this: ```bash me@localhost $ git ls-remote https://XXXX:@github.com/capistrano/rails3-bootstrap-devise-cancan.git 3419812c9f146d9a84b44bcc2c3caef94da54758HEAD 3419812c9f146d9a84b44bcc2c3caef94da54758HEADrefs/heads/master ``` Where `XXXX` is a personal API token, as such: ![Github Personal API Token Page](/assets/images/github-personal-api-token-page.png) ##### 1.2.3 Deploy Keys Deploy keys, a feature of Github, and some other platforms allow you to generate a **second** set of SSH keys for the connection between Github and the servers themselves. Slightly perversely in this case the public key is uploaded to the repository host, and the private key must be copied to each server that you want to deploy to. Github has a quite excellent guide on this, much of which (unsurprisingly) overlaps with the SSH key instructions above. * [Github Help: Managing Deploy Keys](https://help.github.com/articles/managing-deploy-keys) ### Authorisation The second part of this topic is that our deploy user needs to be authorised to work in the deployment directory, on the server. That means we need to be able to work, ideally without `sudo` (none of the default Capistrano recipes expect `sudo` to be available), or for your custom recipes, you will need to have configured *passwordless* `sudo`. Configuring `sudo` to give some users access to some commands under some circumstances is beyond the scope of this documentation, but sufficed to say something like: ```bash deploy ALL=NOPASSWD:/etc/init.d/mysqld, /etc/init.d/apache2 ``` This example would give the user named `deploy` access to call `sudo /etc/init.d/mysql _________` and the same for the `apache2` control script. **Granting passwordless sudo should not be done lightly.** It can be dangerous. For example if an unprivileged user can *edit* the script that they can run as root, they can easily edit it to do anything they want that is evil. Use this carefully, and ideally architect your systems so that non-privileged users can restart services, or that services restart *themselves* when they notice a change. To configure this hierarchy, ignoring for the moment the passwordless `sudo` access that you may or may not need depending how well your servers are setup: ```bash me@localhost $ ssh root@remote # Capistrano will use /var/www/....... where ... is the value set in # :application, you can override this by setting the ':deploy_to' variable root@remote $ deploy_to=/var/www/rails3-bootstrap-devise-cancan-demo root@remote $ mkdir -p ${deploy_to} root@remote $ chown deploy:deploy ${deploy_to} root@remote $ umask 0002 root@remote $ chmod g+s ${deploy_to} root@remote $ mkdir ${deploy_to}/{releases,shared} root@remote $ chown deploy ${deploy_to}/{releases,shared} ``` **Note:** The `chmod g+s` is a really handy, and little known Unix feature, it means that at the operating system level, without having to pay much attention to the permissions at runtime, all files and directories created inside the `${deploy_to}` directory will inherit the group ownership, that means in this case even though we are root, the files will be created being owned by `root` with the group `deploy`, the `umask 0002` ensures that the files created *during this session* are created with the permissions *owner read/write, group: read/write, other: none*. This means that we'll be able to read these files from Apache, or our web server by running the web server in the `deploy` group namespace. ```bash root@remote # stat -c "%A (%a) %n" ${deploy_to}/ drwx--S--- (2700) /var/www/rails3-bootstrap-devise-cancan-demo root@remote # stat -c "%A (%a) %n" ${deploy_to}/* drwxrwsr-x (2775) /var/www/rails3-bootstrap-devise-cancan-demo/releases drwxrwsr-x (2775) /var/www/rails3-bootstrap-devise-cancan-demo/shared ``` capistrano-capistrano-603c346/docs/documentation/getting-started/before-after/000077500000000000000000000000001520217215100275335ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/getting-started/before-after/index.markdown000066400000000000000000000017371520217215100324160ustar00rootroot00000000000000--- title: Before / After Hooks layout: default --- Where calling on the same task name, executed in order of inclusion ```ruby # call an existing task before :starting, :ensure_user after :finishing, :notify # or define in block namespace :deploy do before :starting, :ensure_user do # end after :finishing, :notify do # end end ``` If it makes sense for your use case (often, that means *generating a file*) the Rake prerequisite mechanism can be used: ```ruby desc "Create Important File" file 'important.txt' do |t| sh "touch #{t.name}" end desc "Upload Important File" task :upload => 'important.txt' do |t| on roles(:all) do upload!(t.prerequisites.first, '/tmp') end end ``` The final way to call out to other tasks is to simply `invoke()` them: ```ruby namespace :example do task :one do on roles(:all) { info "One" } end task :two do invoke "example:one" on roles(:all) { info "Two" } end end ``` This method is widely used. capistrano-capistrano-603c346/docs/documentation/getting-started/cold-start/000077500000000000000000000000001520217215100272465ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/getting-started/cold-start/index.markdown000066400000000000000000000203031520217215100321170ustar00rootroot00000000000000--- title: Cold Start layout: default --- At this point we should have a deploy user on all the servers we intend to deploy to, that user should have permission to write to wherever we plan on deploying to, by default that'll be something like `/var/www/my-application`. We've set up the directory with decent permissions so that we can deploy without breaking things, and that everyone on our team can deploy, too. Let's run through what we've done so far, and how to check it's all working, in the last step of this part of the guide we'll create the production-only shared files. Again, this guide assumes Ruby on Rails, but most of everything we're doing so far is applicable in slightly modified forms to other frameworks and technologies. ### 1. Checking the directory structure on the remote machine: ```bash me@localhost $ ssh deploy@remote 'ls -lR /var/www/my-application' my-application: total 8 drwxrwsr-x 2 deploy deploy 4096 Jun 24 20:55 releases drwxrwsr-x 2 deploy deploy 4096 Jun 24 20:55 shared my-application/releases: total 0 my-application/shared: total 0 ``` This checks in one simple command that the ssh keys you setup are working (you might yet be prompted for the password), and the permissions on the directory can be seen. ### 2. Writing our first *cap task* to formalize this into a check! Now that we know how to check for permissions, and repository access, we'll quickly introduce ourselves to a quick Cap task to check these things on all the machines for us: ```ruby desc "Check that we can access everything" task :check_write_permissions do on roles(:all) do |host| if test("[ -w #{fetch(:deploy_to)} ]") info "#{fetch(:deploy_to)} is writable on #{host}" else error "#{fetch(:deploy_to)} is not writable on #{host}" end end end ``` Running this should give you a pretty decent overview, one line of output for each server. It's also your first introduction to the API of Capistrano for writing your own tasks, namely `desc()`, `task()`, `on()`, `roles()`, `test()`, `info()`, and `error()`. The first two methods, `desc()` and `task()` are actually from Rake, the library that forms the foundation of the Capistrano task system, the other methods are part of our sub-project [**SSHKit**](https://github.com/capistrano/sshkit). We'll dive into those more later, but add those lines to a file in `./lib/capistrano/tasks`, call it something like `access_check.rake`, and run `cap -T` from the top directory and we'll be able to see the task listed: ```bash me@localhost $ bundle exec cap -T # ... lots of other tasks ... cap check_write_permissions # Check that we can access everything # ... lots of other tasks ... ``` Then we simply call it: ```bash me@localhost $ bundle exec cap staging check_write_permissions DEBUG [82c92144] Running /usr/bin/env [ -w /var/www/my-application ] on myserver.com DEBUG [82c92144] Command: [ -w /var/www/my-application ] DEBUG [82c92144] Finished in 0.456 seconds command successful. INFO /var/www/my-application is writable on myserver.com ``` If we've done something wrong, that won't happen and we'll know that we need to jump on the mailing list to get help, into IRC or ask a friend. Depending how you have set your Git authentication credentials up, checking Git can be a bit complicated, so we've shipped a task in the core library that can check your git access, Git isn't particularly scriptable, so one has to wrap Git in a shell script that makes it behave. Capistrano does just this, so to check if the Git access is working, we can simply call: ```bash me@localhost $ cap staging git:check ``` This task is defined in the default Git SCM-strategy and looks a lot like what we wrote above to check the file permissions, however the Git check recipe is a bit more complicated, having to potentially deal with three different authentication schemes, which need to be worked around differently. This task expresses a *dependency* on the `git:git-wrapper` task which is resolved first for us by Capistrano. (This is one of the pieces we inherit from Rake) If this fails we'll see: ```bash me@localhost $ cap staging git:check cap staging git:check DEBUG Uploading /tmp/git-ssh.sh 0% INFO Uploading /tmp/git-ssh.sh 100% INFO [118bd3e4] Running /usr/bin/env chmod +x /tmp/git-ssh.sh on example.com DEBUG [118bd3e4] Command: /usr/bin/env chmod +x /tmp/git-ssh.sh INFO [118bd3e4] Finished in 0.049 seconds command successful. INFO [a996463f] Running /usr/bin/env git ls-remote git@github.com:capistrano/rails3-bootstrap-devise-cancan.git on harrow DEBUG [a996463f] Command: ( GIT_ASKPASS=/bin/echo GIT_SSH=/tmp/git-ssh.sh /usr/bin/env git ls-remote git@github.com:capistrano/rails3-bootstrap-devise-cancan.git ) DEBUG [a996463f] Warning: Permanently added 'github.com,204.232.175.90' (RSA) to the list of known hosts. DEBUG [a996463f] Permission denied (publickey). DEBUG [a996463f] fatal: The remote end hung up unexpectedly cap aborted! git stdout: Nothing written git stderr: Nothing written Tasks: TOP => git:check (See full trace by running task with --trace) ``` This'll typically come out looking more beautiful depending on your terminal colour support, you may well see something like this: ![Capistrano Git Check Colour Example](/assets/images/git-check-example-screenshot.png) To run through that shortly, what did we do: 1. We asked Capistrano to run the command `git:check`. 2. Capistrano recognised that in order to fulfil this request, it had to first execute the task `git:wrapper`, a *prerequisite*. 3. Capistrano executed the `git:wrapper` task, and uploaded the `/tmp/git-ssh.sh` file, and made it executable. This script is actually processed as a template. 4. With the git wrapper in place, we can safely script against Git without it prompting us for input, so we ask git to `ls-remote` on the repository we defined. As this exited with an [unclean status](https://en.wikipedia.org/wiki/Exit_status), Capistrano aborted, and printed out the error messages for us to try and figure out what broke. In this case, we'll be using SSH agent forwarding, we can check if that's working by writing a tiny Cap task, or simply using SSH to do it for us, the choice is yours: ```ruby # lib/capistrano/tasks/agent_forwarding.rake desc "Check if agent forwarding is working" task :forwarding do on roles(:all) do |h| if test("env | grep SSH_AUTH_SOCK") info "Agent forwarding is up to #{h}" else error "Agent forwarding is NOT up to #{h}" end end end ``` That gave the output: ```bash cap staging forwarding DEBUG [f1269276] Running /usr/bin/env env | grep SSH_AUTH_SOCK on example.com DEBUG [f1269276] Command: env | grep SSH_AUTH_SOCK DEBUG [f1269276] SSH_AUTH_SOCK=/tmp/ssh-nQUEmyQ2nS/agent.2546 DEBUG [f1269276] Finished in 0.453 seconds command successful. INFO Agent forwarding is up to example.com ``` If you don't feel like writing a Capistrano task, one could simply do: ```bash me@localhost $ ssh -A example.com 'env | grep SSH_AUTH_SOCK' SSH_AUTH_SOCK=/tmp/ssh-Tb6X8V53tm/agent.2934 ``` If we see the `SSH_AUTH_SOCK` output, that's a pretty good indication that SSH agent forwarding is enabled, and if on your local machine `ssh-add -l` shows you an SSH key, then we're good to go. **Make sure that you're using the `git@...` repository URL** ```bash cap staging git:check DEBUG Uploading /tmp/git-ssh.sh 0% INFO Uploading /tmp/git-ssh.sh 100% INFO [21382716] Running /usr/bin/env chmod +x /tmp/git-ssh.sh on example.com DEBUG [21382716] Command: /usr/bin/env chmod +x /tmp/git-ssh.sh INFO [21382716] Finished in 0.047 seconds command successful. INFO [f40edfbb] Running /usr/bin/env git ls-remote git@github.com:capistrano/rails3-bootstrap-devise-cancan.git on example.com DEBUG [f40edfbb] Command: ( GIT_ASKPASS=/bin/echo GIT_SSH=/tmp/git-ssh.sh /usr/bin/env git ls-remote git@github.com:capistrano/rails3-bootstrap-devise-cancan.git ) DEBUG [f40edfbb] 3419812c9f146d9a84b44bcc2c3caef94da54758 HEAD DEBUG [f40edfbb] 3419812c9f146d9a84b44bcc2c3caef94da54758 refs/heads/master INFO [f40edfbb] Finished in 3.319 seconds command successful. ``` ![Capistrano Git Check Colour Example](/assets/images/successful-git-check-example-screenshot.png) *Note:* If you get an error like `scp: /tmp/git-ssh.sh: Permission denied`, you may need to set the `:tmp_dir` param. capistrano-capistrano-603c346/docs/documentation/getting-started/configuration/000077500000000000000000000000001520217215100300415ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/getting-started/configuration/index.markdown000066400000000000000000000141441520217215100327200ustar00rootroot00000000000000--- title: Configuration layout: default --- ## Location Configuration variables can be either global or specific to your stage. * global * `config/deploy.rb` * stage specific * `config/deploy/.rb` ## Access Each variable can be set to a specific value: ```ruby set :application, 'MyLittleApplication' # use a lambda to delay evaluation set :special_thing, -> { "SomeThing_#{fetch :other_config}" } ``` A value can be retrieved from the configuration at any time: ```ruby fetch :application # => "MyLittleApplication" fetch(:special_thing, 'some_default_value') # will return the value if set, or the second argument as default value ``` **New in Capistrano 3.5:** for a variable that holds an Array, easily add values to it using `append`. This comes in especially handy for `:linked_dirs` and `:linked_files` (see Variables reference below). ```ruby append :linked_dirs, ".bundle", "tmp" ``` The inverse is also available: `remove` will strive to drop an entry from an array. This comes in handy if you have a shared configuration which sets an array but a specific config doesn't need one of the elements. ```ruby remove :linked_dirs, ".bundle", "tmp" ``` ## Variables The following variables are settable: * `:application` * The name of the application. * `:deploy_to` * **default:** `-> { "/var/www/#{fetch(:application)}" }` * The path on the remote server where the application should be deployed. * If application contains whitespace or such this path might be invalid. See Structure for the exact directories used. * `:repo_url` * URL to the repository. * Must be a valid URL for the used SCM. * Example: `set :repo_url, 'git@example.com:me/my_repo.git'` for a git repo located in /home/git/me * Hint #1: to access a repo on a machine using a non-standard ssh port: `set :repo_url, 'ssh://git@example.com:30000/~/me/my_repo.git'` * Hint #2: when using :svn and branches, declare the repo_url like this: `set :repo_url, -> { "svn://myhost/myrepo/#{fetch(:branch)}" }` * Warning: if you move your repository to a new URL when using an SCM other than Git and change this variable, already deployed remote servers won't reflect this change automatically, you have to manually re-configure the repository on the remote servers (in path determined by `:repo_path`) or delete it (`rm -rf repo` in the default setup) and let Capistrano recreate it on the next deploy using the updated URL. * `:branch` * **default:** `'master'` * The branch name to be deployed from SCM. * `:svn_username` * When using :svn, provides the username for authentication. * `:svn_password` * When using :svn, provides the password for authentication. * `:svn_revision` * **New in version 3.5** * When using :svn, set the specific revision number you want to deploy. * `:repo_path` * **default:** `-> { "#{fetch(:deploy_to)}/repo" }` * The path on the remote server where the repository should be placed. * This does not normally need to be set * `:repo_tree` * **default:** None. The whole repository is normally deployed. * The subtree of the repository to deploy. * Currently only implemented for Git and Hg. * `:linked_files` * **default:** `[]` * Listed files will be symlinked from the shared folder of the application into each release directory during deployment. * Can be used for persistent configuration files like `database.yml`. See Structure for the exact directories. * `:linked_dirs` * **default:** `[]` * Listed directories will be symlinked into the release directory during deployment. * Can be used for persistent directories like uploads or other data. See Structure for the exact directories. * `:default_env` * **default:** `{}` * Default shell environment used during command execution. * Can be used to set or manipulate specific environment variables (e.g. `$PATH` and such). * `:keep_releases` * **default:** `5` * The last `n` releases are kept for possible rollbacks. * The cleanup task detects outdated release folders and removes them if needed. * `:tmp_dir` * **default:** `'/tmp'` * Temporary directory used during deployments to store data. * If you have a shared web host, this setting may need to be set (e.g. /home/user/tmp/capistrano). * `:local_user` * **default:** `-> { ENV["USER"] || ENV["LOGNAME"] || ENV["USERNAME"] }` * Username of the local machine used to update the revision log. * `:pty` * **default:** `false` * Used in SSHKit. * `:log_level` * **default:** `:debug` * Used in SSHKit. * Other available options are :info, :warn and :error. * `:format` * **default:** `:airbrussh` * Used in SSHKit. * Other available options are :dot and :pretty. * The default formatter :airbrussh will print the output even when :log_level is :warn or :error, while :dot and :pretty will use the defined :log_level. * `:shared_directory` * **default:** `shared` * Name for shared directory, containing files and directories symlinked into the release directory during deployment. * `:releases_directory` * **default:** `releases` * Name for releases directory, target location for releases. * `:current_directory` * **default:** `current` * Name for `current` link pointing to the newest successful deployment's release folder. * `:git_max_concurrent_connections` * **default:** `10` * Number of concurrent connections to Git repository - useful when your Git server limits the number of simultaneous connections while using SSH (like Gitlab CE). * `:git_wait_interval` * **default:** `0` * Number of seconds to wait after you reach the limit of concurrent connections to Git repository server and disconnect afterwards to initialize new connections. This prevents from being cut out of SSH server when you use `fail2ban` or similar software for limiting connections to server. * `:git_verify_commit` * **default:** `false` * Whether to check if a valid signature exists on the Git commit to be deployed. Capistrano plugins can provide their own configuration variables. Please refer to the plugin documentation for the specifics. Plugins are allowed to add or manipulate default values as well as already user-defined values after the plugin is loaded. capistrano-capistrano-603c346/docs/documentation/getting-started/flow/000077500000000000000000000000001520217215100261415ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/getting-started/flow/index.markdown000066400000000000000000000051051520217215100310150ustar00rootroot00000000000000--- title: Flow layout: default --- Capistrano v3 provides a default **deploy flow** and a **rollback flow**: ### Deploy flow When you run `cap production deploy`, it invokes the following tasks in sequence: ```ruby deploy:starting - start a deployment, make sure everything is ready deploy:started - started hook (for custom tasks) deploy:updating - update server(s) with a new release deploy:updated - updated hook deploy:publishing - publish the new release deploy:published - published hook deploy:finishing - finish the deployment, clean up everything deploy:finished - finished hook ``` Notice there are several hook tasks e.g. `:started`, `:updated` for you to hook up custom tasks into the flow using `after()` and `before()`. ### Rollback flow When you run `cap production deploy:rollback`, it invokes the following tasks in sequence: ```ruby deploy:starting deploy:started deploy:reverting - revert server(s) to previous release deploy:reverted - reverted hook deploy:publishing deploy:published deploy:finishing_rollback - finish the rollback, clean up everything deploy:finished ``` As you can see, rollback flow shares many tasks with deploy flow. But note that, rollback flow runs its own `:finishing_rollback` task because its cleanup process is usually different from deploy flow. ### Flow examples Assume you require the following files in `Capfile`, ```ruby # Capfile require 'capistrano/setup' require 'capistrano/deploy' require 'capistrano/bundler' require 'capistrano/rails/assets' require 'capistrano/rails/migrations' ``` When you run `cap production deploy`, it runs these tasks: ```ruby deploy deploy:starting [before] deploy:ensure_stage deploy:set_shared_assets deploy:check deploy:started deploy:updating git:create_release deploy:symlink:shared deploy:updated [before] deploy:bundle [after] deploy:migrate deploy:compile_assets deploy:normalize_assets deploy:publishing deploy:symlink:release deploy:published deploy:finishing deploy:cleanup deploy:finished deploy:log_revision ``` For `cap production deploy:rollback`, it runs these tasks: ```ruby deploy deploy:starting [before] deploy:ensure_stage deploy:set_shared_assets deploy:check deploy:started deploy:reverting deploy:revert_release deploy:reverted [after] deploy:rollback_assets deploy:publishing deploy:symlink:release deploy:published deploy:finishing_rollback deploy:cleanup_rollback deploy:finished deploy:log_revision ``` capistrano-capistrano-603c346/docs/documentation/getting-started/installation/000077500000000000000000000000001520217215100276735ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/getting-started/installation/index.markdown000066400000000000000000000072301520217215100325500ustar00rootroot00000000000000--- title: Installation layout: default --- Capistrano is bundled as a Ruby Gem. **It requires Ruby 2.0 or newer.** Capistrano can be installed as a standalone Gem, or bundled into your application.

          It is recommended to fix the version number when using Capistrano, and is therefore recommended to use an appropriate bundler.

          ### General Usage The following command will install the latest released capistrano `v3` revision: ```bash $ gem install capistrano ``` Or grab the bleeding edge head from: ```bash $ git clone https://github.com/capistrano/capistrano.git $ cd capistrano $ gem build *.gemspec $ gem install *.gem ``` ### Usage in a Rails project Add the following lines to the Gemfile: ```ruby group :development do gem "capistrano", "~> 3.10", require: false gem "capistrano-rails", "~> 1.3", require: false end ``` The `capistrano-rails` gem includes extras specifically designed for Ruby on Rails, specifically: * Asset Pipeline Support * Database Migration Support The documentation for these components can be found in [their][capistrano-rails-asset-pipeline-readme], [respective][capistrano-rails-gem-bundler-readme], [READMEs][capistrano-rails-database-migrations-readme]. However for the most part, to get the best, and most sensible results, simply `require` in Capfile, after the `require 'capistrano/deploy'` line: ```ruby require 'capistrano/rails' ``` ##### SSH Capistrano deploys using SSH. Thus, you must be able to SSH (ideally with keys and ssh-agent) from the deployment system to the destination system for Capistrano to work. You can test this using a ssh client, e.g. `ssh myuser@destinationserver`. If you cannot connect at all, you may need to set up the SSH server or resolve firewall/network issues. Look for a tutorial (here are suggestions for [Ubuntu](https://help.ubuntu.com/community/SSH) and [RedHat/CentOS](https://www.cyberciti.biz/faq/centos-ssh/)). If a password is requested when you log in, you may need to set up SSH keys. GitHub has a [good tutorial](https://help.github.com/articles/generating-ssh-keys/) on creating these (follow steps 1 through 3). You will need to add your public key to `~/.ssh/authorized_keys` on the destination server as the deployment user (append on a new line). More information on SSH and login is available via the [Authentication and Authorisation](https://capistranorb.com/documentation/getting-started/authentication-and-authorisation/) section of the guide. If you are still struggling to get login working, try the [Capistrano SSH Doctor](https://github.com/capistrano-plugins/capistrano-ssh-doctor) plugin. ##### Help! I was using Capistrano `v2.x` and I didn't want to upgrade! If you are using Capistrano `v2.x.x` and have also installed Capistrano `v3` by mistake, then you can lock your Gem version for Capistrano at something like: ```ruby gem 'capistrano', '~> 2.15' # Or whatever patch release you are using ``` This is the [pessimistic operator][rubygems-pessimistic-operator] which installs the closest matching version, at the time of writing this would install `2.15.4`, and any other point-release in the `2.15.x` family without the risk of accidentally upgrading to `v3`. [rubygems]: http://rubygems.org/ [rubygems-pessimistic-operator]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint [capistrano-rails-asset-pipeline-readme]: https://github.com/capistrano/rails/blob/master/README.md [capistrano-rails-database-migrations-readme]: https://github.com/capistrano/rails/blob/master/README.md [capistrano-rails-gem-bundler-readme]: https://github.com/capistrano/bundler/blob/master/README.md capistrano-capistrano-603c346/docs/documentation/getting-started/local-tasks/000077500000000000000000000000001520217215100274075ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/getting-started/local-tasks/index.markdown000066400000000000000000000012231520217215100322600ustar00rootroot00000000000000--- title: Local Tasks layout: default --- Local tasks can be run by replacing `on` with `run_locally`: ```ruby desc 'Notify service of deployment' task :notify do run_locally do with rails_env: :development do rake 'service:notify' end end end ``` Of course, you can always just use standard ruby syntax to run things locally: ```ruby desc 'Notify service of deployment' task :notify do %x(RAILS_ENV=development bundle exec rake "service:notify") end ``` Alternatively you could use the rake syntax: ```ruby desc "Notify service of deployment" task :notify do sh 'RAILS_ENV=development bundle exec rake "service:notify"' end ``` capistrano-capistrano-603c346/docs/documentation/getting-started/preparing-your-application/000077500000000000000000000000001520217215100324565ustar00rootroot00000000000000index.markdown000066400000000000000000000170761520217215100352650ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/getting-started/preparing-your-application--- title: Preparing Your Application layout: default ---

          This will focus on preparing a Rails application, but most ideas expressed here have parallels in Python, or PHP applications

          ### 1. Commit your application to some externally available source control hosting provider. If you are not doing so already, you should host your code somewhere with a provider such as GitHub, BitBucket, Codeplane, or repositoryhosting.com. Capistrano currently supports Git, Mercurial, and SVN out of the box. There might be 3rd party plugins adding support for various other systems. ### 2. Move secrets out of the repository.

          If you've accidentally committed state secrets to the repository, you might want to take special steps to erase them from the repository history for all time.

          Ideally one should remove `config/database.yml` to something like `config/database.yml.example`. You and your team should copy the example file into place on their development machines, under Capistrano. This leaves the `database.yml` filename unused so that we can symlink the production database configuration into place at deploy time. The original `database.yml` should be added to the `.gitignore` (or your SCM's parallel concept of ignored files) ```bash $ cp config/database.yml{,.example} $ echo config/database.yml >> .gitignore ``` This should be done for any other secret files, we'll create the production version of the file when we deploy, and symlink it into place. ### 3. Initialize Capistrano in your application. ```bash $ cd my-project $ cap install ``` This will create a bunch of files, the important ones are: ```bash ├── Capfile ├── config │   ├── deploy │   │   ├── production.rb │   │   └── staging.rb │   └── deploy.rb └── lib └── capistrano └── tasks ``` Your new Capfile will automatically include any tasks from any `*.rake` files in `lib/capistrano/tasks`. ### 4. Configure your server addresses in the generated files. We'll just work with the staging environment here, so you can pretend that `config/deploy/production.rb` doesn't exist, for the most part that's your business. Capistrano breaks down common tasks into a notion of *roles*, that is, taking a typical Rails application that we have roughly speaking three roles, `web`, `app`, and `db`. The three roles can be confusing, as the boundary of web and app servers is a bit blurry if, for example, using [Passenger](https://www.phusionpassenger.com/) with Apache, which in effect embeds your app server in the web server (embeds Passenger in the Apache process itself). Confusingly, Passenger can also be used in modes where this isn't true, so we'll ignore that for the time being. If you know the difference (i.e you are using nginx as your web server, and puma/unicorn, or similar for your app server, that should be fine), then we can assume that they're the same, which is pretty common. The example file generated will look something like this: ```ruby set :stage, :staging # Simple Role Syntax # ================== # Supports bulk-adding hosts to roles, the primary # server in each group is considered to be the first # unless any hosts have the primary property set. role :app, %w{example.com} role :web, %w{example.com} role :db, %w{example.com} # Extended Server Syntax # ====================== # This can be used to drop a more detailed server # definition into the server list. The second argument # is something that quacks like a hash and can be used # to set extended properties on the server. server 'example.com', roles: %w{web app}, my_property: :my_value # set :rails_env, :staging ``` Servers can be defined in two ways, implicitly using the simple `role` syntax and explicitly using the extended `server` syntax. Both result in one or more servers for each role being defined. The `app` and `db` roles are just placeholders, if you are using the `capistrano/rails-*` addons (more on that later) then they have a meaning, but if you are deploying something simpler, feel free to delete them if they're meaningless to you. Both types can specify optional _properties_ to be associated with a server or role. These properties include Capistrano-required ones such as the SSH options (username, port, keys etc.) and also arbitrary custom properties. They are there in case people want to build the server list more comprehensively from something like the *EC2* command line tools, and want to use the extended properties for something that makes sense in their environment. The following shows defining two servers: one where we set the username, and another where we set the port. These host strings are parsed and expanded out in to the equivalent of the server line after the comment: ```ruby # using simple syntax role :web, %w{hello@world.com example.com:1234} # using extended syntax (which is equivalent) server 'world.com', roles: [:web], user: 'hello' server 'example.com', roles: [:web], port: 1234 ```

          You can define a server or role using both syntaxes and the properties will be merged. See the Properties Documentation for details

          If you define servers with either the simple or the extended syntax and explicitly specify a user or a port number, the last definition will win. This is identical behaviour to scalar custom properties. In older versions of Capistrano, multiple servers were created and the merging was ill-defined.

          ### 5. Set the shared information in `deploy.rb`. The `deploy.rb` is a place where the configuration common to each environment can be specified, normally the *repository URL* and the *user as whom to deploy* are specified here. The generated sample file starts with the following, and is followed by a few self-documenting, commented-out configuration options, feel free to play with them a little: ```ruby set :application, 'my_app_name' set :repo_url, 'git@example.com:me/my_repo.git' ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp } ``` Here we'd set the name of the application, ideally in a way that's safe for filenames on your target operating system. Second we set the repository URL, and this *MUST* be somewhere that the server we are deploying to can reach. Here's how this might look in a typical example: note that we'll cover authentication in the next chapter, but for now we'll assume this repository is open source, taking an example application from the [Rails Examples and Tutorials](https://railsapps.github.io/) site. There we'll find maintained a handful of typical Rails apps with typical dependencies. The Rails application they host, which uses Devise (for authentication) and Cancan (for authorisation) along side Twitter Bootstrap for assets has been forked to the Capistrano repository, but you can find the (unchanged) original [here](https://github.com/RailsApps/rails3-bootstrap-devise-cancan). ```ruby set :application, 'rails3-bootstrap-devise-cancan-demo' set :repo_url, 'https://github.com/capistrano/rails3-bootstrap-devise-cancan' set :branch, 'master' ``` I've simplified the `:branch` variable to simply be a `set` variable, and not a question prompt, as this repository only has a master branch. ## Roundup **At this point Capistrano knows where to find our servers, and where to find our code.** We've not covered how we authorise our servers to check out our code (there are three pretty good ways of doing that with Git), nor have we determined how to authorise Capistrano on our servers yet. capistrano-capistrano-603c346/docs/documentation/getting-started/rollbacks/000077500000000000000000000000001520217215100271465ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/getting-started/rollbacks/index.markdown000066400000000000000000000065431520217215100320310ustar00rootroot00000000000000--- title: Rollbacks layout: default --- In the majority of failed deployment situations, it probably makes more sense to revert the bad code and redeploy, rather than running deploy:rollback. Capistrano provides basic rollback support, but as each application and system handles rollbacks differently, it is up to the individual to test and validate that rollback behaves correctly for their use case. For example, capistrano-rails will run special tasks on rollback to fix the assets, but does nothing special with database migrations. Correctly rolling back a release is a complex process that depends on the specifics of your application and the Capistrano plugins you've assembled. *Be proactive and test your rollback procedure before trying it for the first time in a time of crisis.* When a deployment is run, Capistrano executes one task at a time on all servers and waits for that task to be done before moving on to the next one. If a task fails on a server, Capistrano exits without waiting for further tasks. In a multiple server situation, when a task fails on one server by exiting with a non-0 exit code, Capistrano closes the SSH connections to any still in-progress servers and their tasks exit. If the error occurs during a deployment task which is prior to the final cutover, for example during creation of symlinks, the process will simply stop and the previously deployed application will continue to run. However if the failing deployment task is after `deploy:symlink:release`, during which the `current` symlink is moved to the newly deployed code, this may result in an inconsistent state which may be solved by executing `cap [stage] deploy:rollback`. Rollback can also be a solution for issues with failed deployments due to buggy code or other reasons. Per https://capistranorb.com/documentation/getting-started/flow/, the standard deployment and rollback processes are nearly identical. The difference is that in a deploy, the `deploy:updating` and `deploy:updated` tasks are executed, while in a rollback, the `deploy:reverting` and `deploy:reverted` (a hook task) tasks are run. Also, instead of `deploy:finishing`, `deploy:finishing_rollback` is run, as cleanup can sometimes be different. ### `deploy:reverting` This starts by setting the release_path to the last known good release path. It does this by obtaining a list of folders in the releases folder and if there are at least two, sets the second to last release as the release_path. It also sets the `rollback_timestamp` to this same release which it uses for the log entry. Once this has been set, the remaining standard deployment tasks flip the symlink accordingly. ### `deploy:finishing_rollback` To finish the rollback, Capistrano creates a tarball of the failed release in the deploy path, and then deletes the release folder. ### `deploy:failed` In a situation where `cap [stage] deploy` fails, the `deploy:failed` hook is invoked. You can add custom rollback tasks to this hook: ```ruby after 'deploy:failed', :send_for_help do # end ``` This is different from a specifically invoked rollback, and is application specific. *For reasons stated above, it can be dangerous to use this hook without careful testing.* ### `deploy:rollback ROLLBACK_RELEASE=release` Rollback to a specific release using the `ROLLBACK_RELEASE` environment variable. e.g. `cap staging deploy:rollback ROLLBACK_RELEASE=20160614133327` capistrano-capistrano-603c346/docs/documentation/getting-started/structure/000077500000000000000000000000001520217215100272325ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/getting-started/structure/index.markdown000066400000000000000000000040361520217215100321100ustar00rootroot00000000000000--- title: Structure layout: default --- Capistrano uses a strictly defined directory hierarchy on each remote server to organise the source code and other deployment-related data. The root path of this structure can be defined with the configuration variable `:deploy_to`. Assuming your `config/deploy.rb` contains this: ```ruby set :deploy_to, '/var/www/my_app_name' ``` Then inspecting the directories inside `/var/www/my_app_name` looks like this: ```bash ├── current -> /var/www/my_app_name/releases/20150120114500/ ├── releases │   ├── 20150080072500 │   ├── 20150090083000 │   ├── 20150100093500 │   ├── 20150110104000 │   └── 20150120114500 ├── repo │ └── ├── revisions.log └── shared └── ``` * `current` is a symlink pointing to the latest release. This symlink is updated at the end of a successful deployment. If the deployment fails in any step the `current` symlink still points to the old release. * `releases` holds all deployments in a timestamped folder. These folders are the target of the `current` symlink. * `repo` holds the version control system configured. In case of a git repository the content will be a raw git repository (e.g. objects, refs, etc.). * `revisions.log` is used to log every deploy or rollback. Each entry is timestamped and the executing user (`:local_user`, defaulting to the local username) is listed. Depending on your VCS data like branch names or revision numbers are listed as well. * `shared` contains the `linked_files` and `linked_dirs` which are symlinked into each release. This data persists across deployments and releases. It should be used for things like database configuration files and static and persistent user storage handed over from one release to the next. The application is completely contained within the path of `:deploy_to`. If you plan on deploying multiple applications to the same server, simply choose a different `:deploy_to` path. capistrano-capistrano-603c346/docs/documentation/getting-started/tasks/000077500000000000000000000000001520217215100263175ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/getting-started/tasks/index.markdown000066400000000000000000000024751520217215100312020ustar00rootroot00000000000000--- title: Tasks layout: default --- ```ruby server 'example.com', roles: [:web, :app] server 'example.org', roles: [:db, :workers] desc "Report Uptimes" task :uptime do on roles(:all) do |host| execute :any_command, "with args", :here, "and here" info "Host #{host} (#{host.roles.to_a.join(', ')}):\t#{capture(:uptime)}" end end ``` **Note**: **tl;dr**: `execute(:bundle, :install)` and `execute('bundle install')` don't behave identically! `execute()` has a subtle behaviour. When calling `within './directory' { execute(:bundle, :install) }` for example, the first argument to `execute()` is a *Stringish* with ***no whitespace***. This allows the command to pass through the [SSHKit::CommandMap](https://github.com/capistrano/sshkit#the-command-map) which enables a number of powerful features. When the first argument to `execute()` contains whitespace, for example `within './directory' { execute('bundle install') }` (or when using a heredoc), neither Capistrano, nor SSHKit can reliably predict how it should be shell escaped, and thus cannot perform any context, or command mapping, that means that the `within(){}` (as well as `with()`, `as()`, etc) have no effect. There have been a few attempts to resolve this, but we don't consider it a bug although we acknowledge that it might be a little counter intuitive. capistrano-capistrano-603c346/docs/documentation/getting-started/user-input/000077500000000000000000000000001520217215100273055ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/getting-started/user-input/index.markdown000066400000000000000000000031241520217215100321600ustar00rootroot00000000000000--- title: User Input layout: default --- User input can be required in a task or during configuration: ```ruby # used in a configuration ask(:database_name, "default_database_name") # used in a task desc "Ask about breakfast" task :breakfast do ask(:breakfast, "pancakes") on roles(:all) do |h| execute "echo \"$(whoami) wants #{fetch(:breakfast)} for breakfast!\"" end end ``` When using `ask` to get user input, you can pass `echo: false` to prevent the input from being displayed. This option should be used to ask the user for passwords and other sensitive data during a deploy run. ```ruby ask(:database_password, 'default_password', echo: false) ``` The symbol passed as a parameter will be printed as text for the user and the input will be saved to this variable: ```ruby ask(:database_encoding, 'UTF-8') # Please enter :database_encoding (UTF-8): fetch(:database_encoding) # => contains the user input (or the default) # once the above line got executed ``` You can use `ask` to set a server- or role-specific configuration variable. ```ruby ask(:password, nil) server 'example.com', user: 'ssh_user_name', port: 22, password: fetch(:password), roles: %w{web app db} ``` You can also show your own message by using `prompt` option: ```ruby ask(:breakfast, "pancakes", prompt: "What's for breakfast?") ``` **Important!** `ask` will not prompt the user immediately. The question is deferred until the first time `fetch` is used to obtain the setting. That means you can `ask` for many variables, but only the variables used by your task(s) will actually prompt the user for input. capistrano-capistrano-603c346/docs/documentation/getting-started/version-locking/000077500000000000000000000000001520217215100303035ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/getting-started/version-locking/index.markdown000066400000000000000000000036261520217215100331650ustar00rootroot00000000000000--- title: Version Locking layout: default --- Capistrano will, by default, include a `lock` command at the top of `deploy.rb`. This checks that the version of Capistrano running the configuration is the same as was intended to run it. The reasoning for this is that, in a pre-Bundler world, or when Bundler is not being used, Capistrano could behave in an unexpected and unclear manner with an incompatible configuration. Even today, it is easy to run Capistrano without `bundle exec` or a binstub (`bin/cap`, obtained through `bundle binstub capistrano`), resulting in unexpected behavior. The syntax for the lock is the same as that used by Bundler in a Gemfile (see the Implementation section below). The simplest form is: `lock '3.9.0'`. This locks the configuration to the exact version given. The most useful form uses the pessimistic operator: `~> 3.9.0`. This allows the version of the last segment to be increased, and all prior segments are locked. For example, if you used `lock '~> 3.9.2'`, version `3.9.3` would be allowed, but `3.9.1`, `3.10.0`, and `4.0.0` would not. Generally, you will want to lock to the `major.minor` revision. This means that the major version cannot increase, but the minor version can, which is consistent with semantic versioning (which Capistrano follows, [loosely](https://github.com/capistrano/capistrano/pull/1894/files)). You can also use `>`, `<`, `<=`, `>=`, and `=` before the version, as in `lock '>= 3.9.0'`. These are useful if you want to lock to a specific set of rules. For more complex usage, you can combine operators. For example, you can write `lock ['>= 3.9.0', '< 3.9.10']`, which would allow everything from 3.9.0 to 3.9.9, but not 3.9.10 or greater. ## Implementation The code reuses RubyGems core [version comparison logic](https://ruby-doc.org/stdlib-2.4.2/libdoc/rubygems/rdoc/Gem/Dependency.html#method-i-3D-7E). So anything you can do in RubyGems, you can do here. capistrano-capistrano-603c346/docs/documentation/harrow/000077500000000000000000000000001520217215100233675ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/harrow/index.markdown000066400000000000000000000037441520217215100262520ustar00rootroot00000000000000--- title: What is Harrow? layout: default --- ### Harrow is a web-based platform for continuous integration and deployment built by the Capistrano team. There are many continuous integration tools in the world already, Harrow is ours. It is designed to "feel" familiar to Capistrano users. ![Harrow, web-based Capistrano](/assets/images/capistrano-logo-harrow-logo-c-primary-darker-w640.png) Although Harrow is designed to work well for Capistrano-style use-cases, it is by no means limited to only being used for Capistrano, or even for deployment. Some of the features which make Harrow ideal for automating tools such as Capistrano: * A discrete concept of scripts and environments, allowing reuse of scripts in different settings using different configurations * A pure JSON-HAL API allowing integrations and tools * Powerful triggers and notifications allowing the construction of pipelines starting with git changes Harrow, much like Capistrano can also be used to: * To automate common tasks in software teams * To drive infrastructure provisioning tools such as *chef-solo*, *Ansible* or similar Again, like Capistrano, Harrow is also *very* scriptable, and can be integrated with any other software to form part of a larger tool. #### How To Use Harrow 1. Sign up for a Harrow [account](https://www.app.harrow.io/#/a/signin) 2. Connect your Git repository using our setup wizard 3. Choose "Capistrano" as the project template #### What does it cost, and how does that affect Capistrano Harrow has very reasonable [pricing](https://harrow.io/pricing/). As a comparison with other continuous integration tools, some of our customers have cut their monthly outgoing by a factor of 5 or more. For individual users, it's free to use forever. To work with collaborators in your projects, paid plans start at just $29/mo. Capistrano is unaffected by Harrow. Capistrano will remain liberally licensed (currently MIT) and will include discrete hooks offering Harrow to users without being intrusive. capistrano-capistrano-603c346/docs/documentation/overview/000077500000000000000000000000001520217215100237335ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/overview/what-is-capistrano/000077500000000000000000000000001520217215100274505ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/overview/what-is-capistrano/index.markdown000066400000000000000000000053531520217215100323310ustar00rootroot00000000000000--- title: What is Capistrano? layout: default --- ### Capistrano is a remote server automation tool. It supports the scripting and execution of arbitrary tasks, and includes a set of sane-default deployment workflows. Capistrano can be used to: * Reliably deploy web application to any number of machines simultaneously, in sequence or as a rolling set * To automate audits of any number of machines (checking login logs, enumerating uptimes, and/or applying security patches) * To script arbitrary workflows over SSH * To automate common tasks in software teams. * To drive infrastructure provisioning tools such as *chef-solo*, *Ansible* or similar. Capistrano is also *very* scriptable, and can be integrated with any other Ruby software to form part of a larger tool. #### What does it look like? ![Capistrano 3.5 / Airbrussh formatter screenshot](/assets/images/airbrussh-screenshot.png) #### What else is in the box? There's lots of cool stuff in the Capistrano toy box: * Interchangeable output formatters (progress, pretty, html, etc) * Easy to add support for other source control management software. * A rudimentary multi-console for running Capistrano interactively. * Host and Role filters for partial deploys, or partial-cluster maintenance. * Recipes for the Rails asset pipelines, and database migrations. * Support for complex environments. * A sane, expressive API: ```ruby desc "Show off the API" task :ditty do on roles(:all) do |host| # Capture output from the remote host, and re-use it # we can reflect on the `host` object passed to the block # and use the `info` logger method to benefit from the # output formatter that is selected. uptime = capture('uptime') if host.roles.include?(:web) info "Your webserver #{host} has uptime: #{uptime}" end end on roles(:app) do # We can set environmental variables for the duration of a block # and move the process into a directory, executing arbitrary tasks # such as letting Rails do some heavy lifting. with({:rails_env => :production}) do within('/var/www/my/rails/app') do execute :rails, :runner, 'MyModel.something' end end end on roles(:db) do # We can even switch users, provided we have support on the remote # server for switching to that user without being prompted for a # passphrase. as 'postgres' do widgets = capture "echo 'SELECT * FROM widgets;' | psql my_database" if widgets.to_i < 50 warn "There are fewer than 50 widgets in the database on #{host}!" end end end on roles(:all) do # We can even use `test` the way the Unix gods intended if test("[ -d /some/directory ]") info "Phew, it's ok, the directory exists!" end end end ``` capistrano-capistrano-603c346/docs/documentation/plugins/000077500000000000000000000000001520217215100235465ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/plugins/index.markdown000066400000000000000000000016071520217215100264250ustar00rootroot00000000000000--- title: Official Plugins layout: default --- This is the list of official Capistrano Plugins. capistrano-capistrano-603c346/docs/documentation/tasks/000077500000000000000000000000001520217215100232125ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/tasks/intro/000077500000000000000000000000001520217215100243455ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/tasks/intro/index.markdown000066400000000000000000000010411520217215100272140ustar00rootroot00000000000000--- title: Task Cookbook layout: default --- These pages document common custom tasks for specific use cases. It is hoped that these will be copied and modified for your use case, and also provide a basis for understanding how to extend Capistrano for your own usage. You can also look in most Capistrano repositories (including core) for rake tasks to see further example of how it works. Feel free to contribute more via a Pull Request. ### Pages * [Rails related tasks](/documentation/tasks/rails/) capistrano-capistrano-603c346/docs/documentation/tasks/rails/000077500000000000000000000000001520217215100243245ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/tasks/rails/index.markdown000066400000000000000000000026151520217215100272030ustar00rootroot00000000000000--- title: Custom Rails Tasks layout: default --- Many of these tasks probably require [Capistrano::Rails](https://github.com/capistrano/rails). ### Run arbitrary rake tasks from environment variables From [Capistrano/Rails PR #209](https://github.com/capistrano/rails/pull/209) ```ruby namespace :deploy do desc 'Runs any rake task, cap deploy:rake task=db:rollback' task rake: [:set_rails_env] do on release_roles([:db]) do within release_path do with rails_env: fetch(:rails_env) do execute :rake, ENV['task'] end end end end end ``` Passes in the rake task to be run via an environment variable. Also a simple example of running a rake task on the server. ```bash bundle exec cap production deploy:rake task=db:seed ``` ### Conditional migrations Arising from [Capistrano/Rails issue #199](https://github.com/capistrano/rails/issues/199) A frequent issue on deploy are slow migrations which involve downtime. In this case, you often want to run the migrations conditionally, where the main deploy doesn't run them, but you can do so manually at a better point. To do so, you could put the following in your `Capfile`: ```ruby require 'capistrano/rails/migrations' if ENV['RUN_MIGRATIONS'] ``` Now the migrations do not run by default, but they will run with the following command: ```bash RUN_MIGRATIONS=1 bundle exec cap production deploy:migrate ``` capistrano-capistrano-603c346/docs/documentation/third-party-plugins/000077500000000000000000000000001520217215100260135ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/third-party-plugins/index.markdown000066400000000000000000000044301520217215100306670ustar00rootroot00000000000000--- title: 3rd Party Plugins layout: default --- Here are some Capistrano plugins you might find useful. This list is neither complete nor audited in any way. You can help us expanding this list by sending us a pull request on GitHub.
          capistrano-capistrano-603c346/docs/documentation/upgrading/000077500000000000000000000000001520217215100240455ustar00rootroot00000000000000capistrano-capistrano-603c346/docs/documentation/upgrading/index.markdown000066400000000000000000000105231520217215100267210ustar00rootroot00000000000000--- title: "Upgrading from v2.x.x" layout: default --- 1. Update your Gemfile: `gem 'capistrano', '~> 3.0', require: false, group: :development` If you deploy Rails, you will also need `capistrano-rails` and `capistrano-bundler` gems (Rails and Bundler integrations were moved out from Capistrano 3). ```ruby group :development do gem 'capistrano-rails', '~> 1.1', require: false gem 'capistrano-bundler', '~> 1.1', require: false end ``` You can add idiomatic support for your preferred ruby version manager: rvm, rbenv, chruby. ```ruby group :development do gem 'capistrano-rvm', '~> 0.1', require: false gem 'capistrano-rbenv', '~> 2.0', require: false gem 'capistrano-chruby', github: 'capistrano/chruby', require: false end ``` 2. We recommend to capify the project from scratch and move definitions from old to new configs then. ```bash mkdir old_cap mv Capfile old_cap mv config/deploy.rb old_cap mv config/deploy/ old_cap # --> only for multistage setups ``` It's time to capify: ```bash cap install ``` 3. Capistrano 3 is multistage by default, so you will have `config/deploy/production.rb` and `config/deploy/staging.rb` right after capifying. If you need only one stage, remove these files and declare stage (for example `production`) and servers in `config/deploy.rb`. 4. Update `config/deploy/production.rb` and `config/deploy/staging.rb` to have relevant data there. You may also want to add more stages from old configs (`old_cap/deploy/`). 5. If you had a gateway server set doing `set :gateway, "www.capify.org"` you should upgrade to ```ruby require 'net/ssh/proxy/command' set :ssh_options, proxy: Net::SSH::Proxy::Command.new('ssh mygateway.com -W %h:%p') ``` Or the per-server `ssh_options` equivalent. 6. Now you need to refactor your old `deploy.rb` (also `Capfile`, but in most of cases developers didn't change it in Capistrano 2.x). Move parameters (like `set :deploy_to, "/home/deploy/#{application}"` or `set :keep_releases, 4`) to `config/deploy.rb` and tasks to `Capfile`. *Important: `repository` option was renamed to `repo_url`; `default_environment` option was renamed to `default_env`.* Notice that some parameters are not necessary anymore: `use_sudo`, `normalize_asset_timestamps`. 7. If you didn't use `deploy_to` before and deployed to `/u/apps/your_app_name`, you need one more change. Now default deploy path is `/var/www/app_name` and your config will be broken after upgrade. Just declare custom `deploy_to` option: ```ruby set :deploy_to, "/u/apps/#{fetch(:application)}" ``` But in advance, `/u/apps` is not the best place to store apps and we advice you to change it later. 8. Keep editing Capfile and uncomment addons you need, such as rbenv/rvm, bundler or rails. ```ruby require 'capistrano/rails' require 'capistrano/bundler' require 'capistrano/rbenv' ``` 9. Yay! Try to deploy with your new config set. If you discover any missing info in this upgrade guide, you're welcome to contribute to it. # General recommendations #### Use DSL instead of writing ENV variables Instead of: ```ruby run <<-CMD.compact cd -- #{latest_release} && RAILS_ENV=#{rails_env.to_s.shellescape} #{asset_env} #{rake} assets:precompile CMD ``` It's better to use: ```ruby on roles :all do within fetch(:latest_release_directory) do with rails_env: fetch(:rails_env) do execute :rake, 'assets:precompile' end end end ``` Note: 'within' blocks are required to be wrapped in an 'on' block for the dsl to recognize it You may only have one 'with' block per call. If you need more than one env set, use the syntax in the 'with' block arg like this (pass it a map): ```ruby on roles :all do within fetch(:latest_release_directory) do with rails_env: fetch(:rails_env), rails_relative_url_root: '/home' do execute :rake, 'assets:precompile', env: {rails_env: fetch(:rails_env), rails_relative_url_root: ''} end end end ``` # Notable differences between 2.x and 3 #### Cleanup Capistrano 3 now runs the `deploy:cleanup` task as part of the standard deploy workflow and keeps 5 releases by default. Previously this was left for you to add manually, if required. To change the number of releases kept set the `keep_releases` configuration variable: ```ruby set :keep_releases, 10 ``` #### POSIX Shell Capistrano 3 expects a POSIX shell like Bash or Sh. Shells like tcsh, csh, and such may work, but probably will not. capistrano-capistrano-603c346/docs/index.markdown000066400000000000000000000013271520217215100220720ustar00rootroot00000000000000--- layout: default title: A remote server automation and deployment tool written in Ruby. --- ### A Simple Task ```ruby role :demo, %w{example.com example.org example.net} task :uptime do on roles(:demo), in: :parallel do |host| uptime = capture(:uptime) puts "#{host.hostname} reports: #{uptime}" end end ``` Capistrano extends the *Rake* DSL with methods specific to running commands `on()` servers. ### For Any Language Capistrano is written in Ruby, but it can easily be used to deploy any language. If your language or framework has special deployment requirements, Capistrano can easily be extended to support them. ### Source Code
          capistrano-capistrano-603c346/features/000077500000000000000000000000001520217215100201025ustar00rootroot00000000000000capistrano-capistrano-603c346/features/configuration.feature000066400000000000000000000020071520217215100243250ustar00rootroot00000000000000Feature: The path to the configuration can be changed, removing the need to follow Ruby/Rails conventions Background: Given a test app with the default configuration And servers with the roles app and web Scenario: Deploying with configuration in default location When I run "cap test" Then the task is successful Scenario: Deploying with configuration in a custom location But the configuration is in a custom location When I run "cap test" Then the task is successful Scenario: Show install task with configuration in default location When I run "cap -T" Then the task is successful And contains "install" in the output Scenario: Hide install task with configuration in a custom location And config stage file has line "desc 'Special Task'" And config stage file has line "task :special_stage_task" But the configuration is in a custom location When I run "cap -T" Then the task is successful And doesn't contain "special_stage_task" in the output capistrano-capistrano-603c346/features/deploy.feature000066400000000000000000000064671520217215100227700ustar00rootroot00000000000000Feature: Deploy Background: Given a test app with the default configuration And servers with the roles app and web Scenario: Creating the repo When I run cap "git:check" Then the task is successful And git wrapper permissions are 0700 Scenario: Creating the directory structure When I run cap "deploy:check:directories" Then the shared path is created And the releases path is created Scenario: Creating linked directories When I run cap "deploy:check:linked_dirs" Then directories in :linked_dirs are created in shared Scenario: Creating linked directories for linked files When I run cap "deploy:check:make_linked_dirs" Then directories referenced in :linked_files are created in shared Scenario: Checking linked files - missing file Given a linked file "missing_file.txt" But file "missing_file.txt" does not exist in shared path When I run cap "deploy:check:linked_files" Then the task fails Scenario: Checking linked files - file exists Given a linked file "existing_file.txt" And file "existing_file.txt" exists in shared path When I run cap "deploy:check:linked_files" Then the task is successful Scenario: Creating a release Given I run cap "deploy:check:directories" When I run cap "git:create_release" as part of a release Then the repo is cloned And the release is created Scenario: REVISION and REVISION_TIME files are present When I make 1 deployment Then the REVISION file is created in the release Then the REVISION_TIME file is created in the release Scenario: Symlink linked files When I run cap "deploy:symlink:linked_files deploy:symlink:release" as part of a release Then file symlinks are created in the new release Scenario: Symlink linked dirs When I run cap "deploy:symlink:linked_dirs" as part of a release Then directory symlinks are created in the new release Scenario: Publishing When I run cap "deploy:symlink:release" Then the current directory will be a symlink to the release Scenario: Cleanup Given config stage file has line "set :keep_releases, 3" And 5 valid existing releases And an invalid release named "new" When I run cap "deploy:cleanup" Then 3 valid releases are kept And the invalid "new" release is ignored Scenario: Cleanup after many failed releases doesn't remove last good release Given config stage file has line "set :keep_releases, 2" And I make 2 deployments And an invalid release named "77777777777777" And an invalid release named "88888888888888" And an invalid release named "99999999999999" When I run cap "deploy:cleanup" Then 3 valid releases are kept And the current directory will be a symlink to the release Scenario: Cleanup when there are more releases than arguments can handle Given config stage file has line "set :keep_releases, 3" And 5000 valid existing releases When I run cap "deploy:cleanup" Then 3 valid releases are kept Scenario: Rolling Back Given I make 2 deployments When I run cap "deploy:rollback" Then the current symlink points to the previous release Scenario: Rolling Back to a specific release Given I make 3 deployments When I rollback to a specific release Then the current symlink points to that specific release capistrano-capistrano-603c346/features/deploy_failure.feature000066400000000000000000000010011520217215100244520ustar00rootroot00000000000000Feature: Deploy failure Background: Given a test app with the default configuration And a custom task that will simulate a failure And a custom task to run in the event of a failure And servers with the roles app and web Scenario: Triggering the custom task When I run cap "deploy:starting" But an error is raised Then the failure task will not run Scenario: Triggering the custom task When I run cap "deploy" But an error is raised Then the failure task will run capistrano-capistrano-603c346/features/doctor.feature000066400000000000000000000004621520217215100227530ustar00rootroot00000000000000Feature: Doctor Background: Given a test app with the default configuration Scenario: Running the doctor task When I run cap "doctor" Then the task is successful And contains "Environment" in the output And contains "Gems" in the output And contains "Variables" in the output capistrano-capistrano-603c346/features/installation.feature000066400000000000000000000011701520217215100241570ustar00rootroot00000000000000Feature: Installation Background: Given a test app without any configuration Scenario: The "install" task documentation can be viewed When I run "cap -T" Then the task is successful And contains "cap install" in the output Scenario: With default stages When I run "cap install" Then the deploy.rb file is created And the default stage files are created And the tasks folder is created Scenario: With specified stages When I run "cap install STAGES=qa,production" Then the deploy.rb file is created And the specified stage files are created And the tasks folder is created capistrano-capistrano-603c346/features/sshconnect.feature000066400000000000000000000006021520217215100236240ustar00rootroot00000000000000Feature: SSH Connection Background: Given a test app with the default configuration And servers with the roles app and web And a task which executes as root Scenario: Switching from default user to root and back again When I run cap "am_i_root" Then the task is successful And the output matches "I am uid=0\(root\)" followed by "I am uid=\d+\(deployer\)" capistrano-capistrano-603c346/features/stage_failure.feature000066400000000000000000000003171520217215100242720ustar00rootroot00000000000000Feature: Stage failure Background: Given a test app with the default configuration And a stage file named deploy.rb Scenario: Running a task When I run cap "doctor" Then the task fails capistrano-capistrano-603c346/features/step_definitions/000077500000000000000000000000001520217215100234505ustar00rootroot00000000000000capistrano-capistrano-603c346/features/step_definitions/assertions.rb000066400000000000000000000117021520217215100261700ustar00rootroot00000000000000require "shellwords" Then(/^references in the remote repo are listed$/) do expect(@output).to include("refs/heads/master") end Then(/^git wrapper permissions are 0700$/) do permissions_test = %Q([ $(stat -c "%a" #{TestApp.git_wrapper_path_glob}) == "700" ]) expect { run_remote_ssh_command(permissions_test) }.not_to raise_error end Then(/^the shared path is created$/) do run_remote_ssh_command(test_dir_exists(TestApp.shared_path)) end Then(/^the releases path is created$/) do run_remote_ssh_command(test_dir_exists(TestApp.releases_path)) end Then(/^(\d+) valid releases are kept/) do |num| test = %Q([ $(ls -g #{TestApp.releases_path} | grep -E '[0-9]{14}' | wc -l) == "#{num}" ]) expect { run_remote_ssh_command(test) }.not_to raise_error end Then(/^the invalid (.+) release is ignored$/) do |filename| test = "ls -g #{TestApp.releases_path} | grep #{filename}" expect { run_remote_ssh_command(test) }.not_to raise_error end Then(/^directories in :linked_dirs are created in shared$/) do TestApp.linked_dirs.each do |dir| run_remote_ssh_command(test_dir_exists(TestApp.shared_path.join(dir))) end end Then(/^directories referenced in :linked_files are created in shared$/) do dirs = TestApp.linked_files.map { |path| TestApp.shared_path.join(path).dirname } dirs.each do |dir| run_remote_ssh_command(test_dir_exists(dir)) end end Then(/^the repo is cloned$/) do run_remote_ssh_command(test_dir_exists(TestApp.repo_path)) end Then(/^the release is created$/) do stdout, _stderr = run_remote_ssh_command("ls #{TestApp.releases_path}") expect(stdout.strip).to match(/\A#{Time.now.utc.strftime("%Y%m%d")}\d{6}\Z/) end Then(/^the REVISION file is created in the release$/) do stdout, _stderr = run_remote_ssh_command("cat #{@release_paths[0]}/REVISION") expect(stdout.strip).to match(/\h{40}/) end Then(/^the REVISION_TIME file is created in the release$/) do stdout, _stderr = run_remote_ssh_command("cat #{@release_paths[0]}/REVISION_TIME") expect(stdout.strip).to match(/\d{10}/) end Then(/^file symlinks are created in the new release$/) do TestApp.linked_files.each do |file| run_remote_ssh_command(test_symlink_exists(TestApp.current_path.join(file))) end end Then(/^directory symlinks are created in the new release$/) do pending TestApp.linked_dirs.each do |dir| run_remote_ssh_command(test_symlink_exists(TestApp.release_path.join(dir))) end end Then(/^the current directory will be a symlink to the release$/) do run_remote_ssh_command(exists?("e", TestApp.current_path)) end Then(/^the deploy\.rb file is created$/) do file = TestApp.test_app_path.join("config/deploy.rb") expect(File.exist?(file)).to be true end Then(/^the default stage files are created$/) do staging = TestApp.test_app_path.join("config/deploy/staging.rb") production = TestApp.test_app_path.join("config/deploy/production.rb") expect(File.exist?(staging)).to be true expect(File.exist?(production)).to be true end Then(/^the tasks folder is created$/) do path = TestApp.test_app_path.join("lib/capistrano/tasks") expect(Dir.exist?(path)).to be true end Then(/^the specified stage files are created$/) do qa = TestApp.test_app_path.join("config/deploy/qa.rb") production = TestApp.test_app_path.join("config/deploy/production.rb") expect(File.exist?(qa)).to be true expect(File.exist?(production)).to be true end Then(/^it creates the file with the remote_task prerequisite$/) do TestApp.linked_files.each do |file| run_remote_ssh_command(test_file_exists(TestApp.shared_path.join(file))) end end Then(/^it will not recreate the file$/) do # end Then(/^the task is successful$/) do expect(@success).to be true end Then(/^the task fails$/) do expect(@success).to be_falsey end Then(/^the failure task will run$/) do failed = TestApp.shared_path.join("failed") run_remote_ssh_command(test_file_exists(failed)) end Then(/^the failure task will not run$/) do failed = TestApp.shared_path.join("failed") expect { run_remote_ssh_command(test_file_exists(failed)) } .to raise_error(RemoteSSHHelpers::RemoteSSHCommandError) end When(/^an error is raised$/) do error = TestApp.shared_path.join("fail") run_remote_ssh_command(test_file_exists(error)) end Then(/contains "([^"]*)" in the output/) do |expected| expect(@output).to include(expected) end Then(/the output matches "([^"]*)" followed by "([^"]*)"/) do |expected, followedby| expect(@output).to match(/#{expected}.*#{followedby}/m) end Then(/doesn't contain "([^"]*)" in the output/) do |expected| expect(@output).not_to include(expected) end Then(/the current symlink points to the previous release/) do previous_release_path = @release_paths[-2] run_remote_ssh_command(symlinked?(TestApp.current_path, previous_release_path)) end Then(/^the current symlink points to that specific release$/) do specific_release_path = TestApp.releases_path.join(@rollback_release) run_remote_ssh_command(symlinked?(TestApp.current_path, specific_release_path)) end capistrano-capistrano-603c346/features/step_definitions/cap_commands.rb000066400000000000000000000011321520217215100264160ustar00rootroot00000000000000When(/^I run cap "(.*?)"$/) do |task| @success, @output = TestApp.cap(task) end When(/^I run cap "(.*?)" within the "(.*?)" directory$/) do |task, directory| @success, @output = TestApp.cap(task, directory) end When(/^I run cap "(.*?)" as part of a release$/) do |task| TestApp.cap("deploy:new_release_path #{task}") end When(/^I run "(.*?)"$/) do |command| @success, @output = TestApp.run(command) end When(/^I rollback to a specific release$/) do @rollback_release = @release_paths.first.split("/").last step %Q{I run cap "deploy:rollback ROLLBACK_RELEASE=#{@rollback_release}"} end capistrano-capistrano-603c346/features/step_definitions/setup.rb000066400000000000000000000052101520217215100251330ustar00rootroot00000000000000Given(/^a test app with the default configuration$/) do TestApp.install end Given(/^a test app without any configuration$/) do TestApp.create_test_app end Given(/^servers with the roles app and web$/) do start_ssh_server wait_for_ssh_server end Given(/^a linked file "(.*?)"$/) do |file| # ignoring other linked files TestApp.append_to_deploy_file("set :linked_files, ['#{file}']") end Given(/^file "(.*?)" exists in shared path$/) do |file| file_shared_path = TestApp.shared_path.join(file) run_remote_ssh_command("mkdir -p #{file_shared_path.dirname}") run_remote_ssh_command("touch #{file_shared_path}") end Given(/^all linked files exists in shared path$/) do TestApp.linked_files.each do |linked_file| step %Q{file "#{linked_file}" exists in shared path} end end Given(/^file "(.*?)" does not exist in shared path$/) do |file| file_shared_path = TestApp.shared_path.join(file) run_remote_ssh_command("mkdir -p #{TestApp.shared_path}") run_remote_ssh_command("touch #{file_shared_path} && rm #{file_shared_path}") end Given(/^a custom task to generate a file$/) do TestApp.copy_task_to_test_app("spec/support/tasks/database.rake") end Given(/^a task which executes as root$/) do TestApp.copy_task_to_test_app("spec/support/tasks/root.rake") end Given(/config stage file has line "(.*?)"/) do |line| TestApp.append_to_deploy_file(line) end Given(/^the configuration is in a custom location$/) do TestApp.move_configuration_to_custom_location("app") end Given(/^a custom task that will simulate a failure$/) do safely_remove_file(TestApp.shared_path.join("failed")) TestApp.copy_task_to_test_app("spec/support/tasks/fail.rake") end Given(/^a custom task to run in the event of a failure$/) do safely_remove_file(TestApp.shared_path.join("failed")) TestApp.copy_task_to_test_app("spec/support/tasks/failed.rake") end Given(/^a stage file named (.+)$/) do |filename| TestApp.write_local_stage_file(filename) end Given(/^I make (\d+) deployments?$/) do |count| step "all linked files exists in shared path" @release_paths = (1..count.to_i).map do TestApp.cap("deploy") stdout, _stderr = run_remote_ssh_command("readlink #{TestApp.current_path}") stdout.strip end end Given(/^(\d+) valid existing releases$/) do |num| a_day = 86_400 # in seconds (1...num).each_slice(100) do |num_batch| dirs = num_batch.map do |i| offset = -(a_day * i) TestApp.release_path(TestApp.timestamp(offset)) end run_remote_ssh_command("mkdir -p #{dirs.join(' ')}") end end Given(/^an invalid release named "(.+)"$/) do |filename| run_remote_ssh_command("mkdir -p #{TestApp.release_path(filename)}") end capistrano-capistrano-603c346/features/subdirectory.feature000066400000000000000000000005051520217215100241750ustar00rootroot00000000000000Feature: cap can be run from a subdirectory, and will still find the Capfile Background: Given a test app with the default configuration And servers with the roles app and web Scenario: Running cap from a subdirectory When I run cap "git:check" within the "config" directory Then the task is successful capistrano-capistrano-603c346/features/support/000077500000000000000000000000001520217215100216165ustar00rootroot00000000000000capistrano-capistrano-603c346/features/support/docker_gateway.rb000066400000000000000000000022701520217215100251340ustar00rootroot00000000000000# Ensure Docker container is completely stopped when Ruby exits. at_exit do DockerGateway.new.stop end # Manages the Docker-based SSH server that is declared in docker-compose.yml. class DockerGateway def initialize(log_proc=$stderr.method(:puts)) @log_proc = log_proc end def start run_compose_command("up -d") end def stop run_compose_command("down") end def run_shell_command(command) run_compose_command("exec ssh_server /bin/bash -c #{command.shellescape}") end private def run_compose_command(command) log "[docker compose] #{command}" stdout, stderr, status = Open3.popen3("docker compose #{command}") do |stdin, stdout, stderr, wait_threads| stdin << "" stdin.close out = Thread.new { read_lines(stdout, &$stdout.method(:puts)) } err = Thread.new { stderr.read } [out.value, err.value.to_s, wait_threads.value] end (stdout + stderr).each_line { |line| log "[docker compose] #{line}" } [stdout, stderr, status] end def read_lines(io) buffer = + "" while (line = io.gets) buffer << line yield line end buffer end def log(message) @log_proc.call(message) end end capistrano-capistrano-603c346/features/support/env.rb000066400000000000000000000000571520217215100227350ustar00rootroot00000000000000require_relative "../../spec/support/test_app" capistrano-capistrano-603c346/features/support/remote_command_helpers.rb000066400000000000000000000010331520217215100266530ustar00rootroot00000000000000module RemoteCommandHelpers def test_dir_exists(path) exists?("d", path) end def test_symlink_exists(path) exists?("L", path) end def test_file_exists(path) exists?("f", path) end def exists?(type, path) %Q{[[ -#{type} "#{path}" ]]} end def symlinked?(symlink_path, target_path) "[ #{symlink_path} -ef #{target_path} ]" end def safely_remove_file(_path) run_remote_ssh_command("rm #{test_file}") rescue RemoteSSHHelpers::RemoteSSHCommandError end end World(RemoteCommandHelpers) capistrano-capistrano-603c346/features/support/remote_ssh_helpers.rb000066400000000000000000000013551520217215100260410ustar00rootroot00000000000000require "open3" require "socket" require_relative "docker_gateway" module RemoteSSHHelpers extend self class RemoteSSHCommandError < RuntimeError; end def start_ssh_server docker_gateway.start end def wait_for_ssh_server(retries=3) Socket.tcp("localhost", 2022, connect_timeout: 1).close rescue Errno::ECONNREFUSED, Errno::ETIMEDOUT retries -= 1 sleep(2) && retry if retries.positive? raise end def run_remote_ssh_command(command) stdout, stderr, status = docker_gateway.run_shell_command(command) return [stdout, stderr] if status.success? raise RemoteSSHCommandError, status end def docker_gateway @docker_gateway ||= DockerGateway.new(method(:log)) end end World(RemoteSSHHelpers) capistrano-capistrano-603c346/gemfiles/000077500000000000000000000000001520217215100200575ustar00rootroot00000000000000capistrano-capistrano-603c346/gemfiles/legacy.gemfile000066400000000000000000000002301520217215100226500ustar00rootroot00000000000000source "https://rubygems.org" # Specify your gem's dependencies in capistrano.gemspec gemspec path: ".." gem "mocha", "~> 2.8" gem "rspec", "~> 3.13" capistrano-capistrano-603c346/lib/000077500000000000000000000000001520217215100170325ustar00rootroot00000000000000capistrano-capistrano-603c346/lib/Capfile000066400000000000000000000001101520217215100203100ustar00rootroot00000000000000#!/usr/bin/env cap include Capistrano::DSL require "capistrano/install" capistrano-capistrano-603c346/lib/capistrano.rb000066400000000000000000000000001520217215100215100ustar00rootroot00000000000000capistrano-capistrano-603c346/lib/capistrano/000077500000000000000000000000001520217215100211755ustar00rootroot00000000000000capistrano-capistrano-603c346/lib/capistrano/all.rb000066400000000000000000000005401520217215100222710ustar00rootroot00000000000000require "rake" require "sshkit" require "io/console" Rake.application.options.trace = true require "capistrano/version" require "capistrano/version_validator" require "capistrano/i18n" require "capistrano/dsl" require "capistrano/application" require "capistrano/configuration" require "capistrano/configuration/scm_resolver" module Capistrano end capistrano-capistrano-603c346/lib/capistrano/application.rb000066400000000000000000000100201520217215100240160ustar00rootroot00000000000000module Capistrano class Application < Rake::Application def initialize super @rakefiles = %w{capfile Capfile capfile.rb Capfile.rb} end def name "cap" end def run Rake.application = self super end def sort_options(options) not_applicable_to_capistrano = %w(quiet silent verbose) options.reject! do |(switch, *)| switch =~ /--#{Regexp.union(not_applicable_to_capistrano)}/ end super.push(version, dry_run, roles, hostfilter, print_config_variables) end def handle_options options.rakelib = ["rakelib"] options.trace_output = $stderr OptionParser.new do |opts| opts.banner = "See full documentation at http://capistranorb.com/." opts.separator "" opts.separator "Install capistrano in a project:" opts.separator " bundle exec cap install [STAGES=qa,staging,production,...]" opts.separator "" opts.separator "Show available tasks:" opts.separator " bundle exec cap -T" opts.separator "" opts.separator "Invoke (or simulate invoking) a task:" opts.separator " bundle exec cap [--dry-run] STAGE TASK" opts.separator "" opts.separator "Advanced options:" opts.on_tail("-h", "--help", "-H", "Display this help message.") do puts opts exit end standard_rake_options.each { |args| opts.on(*args) } opts.environment("RAKEOPT") end.parse! end def top_level_tasks if tasks_without_stage_dependency.include?(@top_level_tasks.first) @top_level_tasks else @top_level_tasks.unshift(ensure_stage.to_s) end end def display_error_message(ex) unless options.backtrace Rake.application.options.suppress_backtrace_pattern = backtrace_pattern if backtrace_pattern trace "(Backtrace restricted to imported tasks)" end super end def exit_because_of_exception(ex) if respond_to?(:deploying?) && deploying? exit_deploy_because_of_exception(ex) else super end end # allows the `cap install` task to load without a capfile def find_rakefile_location if (location = super).nil? [capfile, Dir.pwd] else location end end private def backtrace_pattern loc = Rake.application.find_rakefile_location return unless loc whitelist = (@imported.dup << loc[0]).map { |f| File.absolute_path(f, loc[1]) } /^(?!#{whitelist.map { |p| Regexp.quote(p) }.join('|')})/ end def load_imports if options.show_tasks && Rake::Task.task_defined?("load:defaults") invoke "load:defaults" set(:stage, "") Dir[deploy_config_path].each { |f| add_import f } end super end def capfile File.expand_path(File.join(File.dirname(__FILE__), "..", "Capfile")) end def version ["--version", "-V", "Display the program version.", lambda do |_value| puts "Capistrano Version: #{Capistrano::VERSION} (Rake Version: #{Rake::VERSION})" exit end] end def dry_run ["--dry-run", "-n", "Do a dry run without executing actions", lambda do |_value| Configuration.env.set(:sshkit_backend, SSHKit::Backend::Printer) end] end def roles ["--roles ROLES", "-r", "Run SSH commands only on hosts matching these roles", lambda do |value| Configuration.env.add_cmdline_filter(:role, value) end] end def hostfilter ["--hosts HOSTS", "-z", "Run SSH commands only on matching hosts", lambda do |value| Configuration.env.add_cmdline_filter(:host, value) end] end def print_config_variables ["--print-config-variables", "-p", "Display the defined config variables before starting the deployment tasks.", lambda do |_value| Configuration.env.set(:print_config_variables, true) end] end end end capistrano-capistrano-603c346/lib/capistrano/configuration.rb000066400000000000000000000114661520217215100244010ustar00rootroot00000000000000require_relative "configuration/filter" require_relative "configuration/question" require_relative "configuration/plugin_installer" require_relative "configuration/server" require_relative "configuration/servers" require_relative "configuration/validated_variables" require_relative "configuration/variables" module Capistrano class ValidationError < RuntimeError; end class Configuration def self.env @env ||= new end def self.reset! @env = new end extend Forwardable attr_reader :variables def_delegators :variables, :set, :fetch, :fetch_for, :delete, :keys, :validate def initialize(values={}) @variables = ValidatedVariables.new(Variables.new(values)) end def ask(key, default=nil, options={}) question = Question.new(key, default, options) set(key, question) end def set_if_empty(key, value=nil, &block) set(key, value, &block) unless keys.include?(key) end def append(key, *values) set(key, Array(fetch(key)).concat(values)) end def remove(key, *values) set(key, Array(fetch(key)) - values) end def any?(key) value = fetch(key) if value && value.respond_to?(:any?) begin return value.any? rescue ArgumentError # Gracefully ignore values whose `any?` method doesn't accept 0 args end end !value.nil? end def is_question?(key) value = fetch_for(key, nil) !value.nil? && value.is_a?(Question) end def role(name, hosts, options={}) if name == :all raise ArgumentError, "#{name} reserved name for role. Please choose another name" end servers.add_role(name, hosts, options) end def server(name, properties={}) servers.add_host(name, properties) end def roles_for(names) servers.roles_for(names) end def role_properties_for(names, &block) servers.role_properties_for(names, &block) end def primary(role) servers.fetch_primary(role) end def backend @backend ||= SSHKit end attr_writer :backend def configure_backend backend.configure do |sshkit| configure_sshkit_output(sshkit) sshkit.output_verbosity = fetch(:log_level) sshkit.default_env = fetch(:default_env) sshkit.backend = fetch(:sshkit_backend, SSHKit::Backend::Netssh) sshkit.backend.configure do |backend| backend.pty = fetch(:pty) backend.connection_timeout = fetch(:connection_timeout) backend.ssh_options = (backend.ssh_options || {}).merge(fetch(:ssh_options, {})) end end end def configure_scm Capistrano::Configuration::SCMResolver.new.resolve end def timestamp @timestamp ||= Time.now.utc end def add_filter(filter=nil, &block) if block raise ArgumentError, "Both a block and an object were given" if filter filter = Object.new def filter.filter(servers) block.call(servers) end elsif !filter.respond_to? :filter raise TypeError, "Provided custom filter <#{filter.inspect}> does " \ "not have a public 'filter' method" end @custom_filters ||= [] @custom_filters << filter end def setup_filters @filters = cmdline_filters @filters += @custom_filters if @custom_filters @filters << Filter.new(:role, ENV["ROLES"]) if ENV["ROLES"] @filters << Filter.new(:host, ENV["HOSTS"]) if ENV["HOSTS"] fh = fetch_for(:filter, {}) || {} @filters << Filter.new(:host, fh[:hosts]) if fh[:hosts] @filters << Filter.new(:role, fh[:roles]) if fh[:roles] @filters << Filter.new(:host, fh[:host]) if fh[:host] @filters << Filter.new(:role, fh[:role]) if fh[:role] end def add_cmdline_filter(type, values) cmdline_filters << Filter.new(type, values) end def filter(list) setup_filters if @filters.nil? @filters.reduce(list) { |l, f| f.filter l } end def dry_run? fetch(:sshkit_backend) == SSHKit::Backend::Printer end def install_plugin(plugin, load_hooks: true, load_immediately: false) installer.install(plugin, load_hooks: load_hooks, load_immediately: load_immediately) end def scm_plugin_installed? installer.scm_installed? end def servers @servers ||= Servers.new end private def cmdline_filters @cmdline_filters ||= [] end def installer @installer ||= PluginInstaller.new end def configure_sshkit_output(sshkit) format_args = [fetch(:format)] format_args.push(fetch(:format_options)) if any?(:format_options) sshkit.use_format(*format_args) end end end capistrano-capistrano-603c346/lib/capistrano/configuration/000077500000000000000000000000001520217215100240445ustar00rootroot00000000000000capistrano-capistrano-603c346/lib/capistrano/configuration/empty_filter.rb000066400000000000000000000002001520217215100270640ustar00rootroot00000000000000module Capistrano class Configuration class EmptyFilter def filter(_servers) [] end end end end capistrano-capistrano-603c346/lib/capistrano/configuration/filter.rb000066400000000000000000000015411520217215100256570ustar00rootroot00000000000000require "capistrano/configuration" require "capistrano/configuration/empty_filter" require "capistrano/configuration/host_filter" require "capistrano/configuration/null_filter" require "capistrano/configuration/role_filter" module Capistrano class Configuration class Filter def initialize(type, values=nil) raise "Invalid filter type #{type}" unless %i(host role).include? type av = Array(values) @strategy = if av.empty? then EmptyFilter.new elsif av.include?(:all) || av.include?("all") then NullFilter.new elsif type == :host then HostFilter.new(values) elsif type == :role then RoleFilter.new(values) else NullFilter.new end end def filter(servers) @strategy.filter servers end end end end capistrano-capistrano-603c346/lib/capistrano/configuration/host_filter.rb000066400000000000000000000012671520217215100267210ustar00rootroot00000000000000module Capistrano class Configuration class HostFilter def initialize(values) av = Array(values).dup av = av.flat_map { |v| v.is_a?(String) && v =~ /^(?[-A-Za-z0-9.]+)(,\g)*$/ ? v.split(",") : v } @rex = regex_matcher(av) end def filter(servers) Array(servers).select { |s| @rex.match s.to_s } end private def regex_matcher(values) values.map! do |v| case v when Regexp then v else vs = v.to_s vs =~ /^[-A-Za-z0-9.]+$/ ? /^#{Regexp.quote(vs)}$/ : Regexp.new(vs) end end Regexp.union values end end end end capistrano-capistrano-603c346/lib/capistrano/configuration/null_filter.rb000066400000000000000000000002031520217215100267030ustar00rootroot00000000000000module Capistrano class Configuration class NullFilter def filter(servers) servers end end end end capistrano-capistrano-603c346/lib/capistrano/configuration/plugin_installer.rb000066400000000000000000000031141520217215100277430ustar00rootroot00000000000000# Encapsulates the logic for installing plugins into Capistrano. Plugins must # simply conform to a basic API; the PluginInstaller takes care of invoking the # API at appropriate times. # # This class is not used directly; instead it is typically accessed via the # `install_plugin` method of the Capistrano DSL. # module Capistrano class Configuration class PluginInstaller # "Installs" a Plugin into Capistrano by loading its tasks, hooks, and # defaults at the appropriate time. The hooks in particular can be # skipped, if you want full control over when and how the plugin's tasks # are executed. Simply pass `load_hooks:false` to opt out. # # The plugin class or instance may be provided. These are equivalent: # # install(Capistrano::SCM::Git) # install(Capistrano::SCM::Git.new) # # Note that the :load_immediately flag is for internal use only and will # be removed in an upcoming release. # def install(plugin, load_hooks: true, load_immediately: false) plugin = plugin.is_a?(Class) ? plugin.new : plugin plugin.define_tasks plugin.register_hooks if load_hooks @scm_installed ||= provides_scm?(plugin) if load_immediately plugin.set_defaults else Rake::Task.define_task("load:defaults") do plugin.set_defaults end end end def scm_installed? @scm_installed end private def provides_scm?(plugin) plugin.respond_to?(:scm?) && plugin.scm? end end end end capistrano-capistrano-603c346/lib/capistrano/configuration/question.rb000066400000000000000000000030661520217215100262450ustar00rootroot00000000000000module Capistrano class Configuration class Question def initialize(key, default, options={}) @key = key @default = default @options = options end def call ask_question value_or_default end private attr_reader :key, :default, :options def ask_question $stdout.print question $stdout.flush end def value_or_default if response.empty? default else response end end def response return @response if defined? @response @response = (gets || "").chomp end def gets return unless stdin.tty? if echo? stdin.gets else stdin.noecho(&:gets).tap { $stdout.print "\n" } end rescue Errno::EIO # when stdio gets closed return end def question if prompt && default.nil? I18n.t(:question_prompt, key: prompt, scope: :capistrano) elsif prompt I18n.t(:question_prompt_default, key: prompt, default_value: default, scope: :capistrano) elsif default.nil? I18n.t(:question, key: key, scope: :capistrano) else I18n.t(:question_default, key: key, default_value: default, scope: :capistrano) end end def echo? (options || {}).fetch(:echo, true) end def stdin (options || {}).fetch(:stdin, $stdin) end def prompt (options || {}).fetch(:prompt, nil) end end end end capistrano-capistrano-603c346/lib/capistrano/configuration/role_filter.rb000066400000000000000000000012531520217215100267000ustar00rootroot00000000000000module Capistrano class Configuration class RoleFilter def initialize(values) av = Array(values).dup av = av.flat_map { |v| v.is_a?(String) ? v.split(",") : v } @rex = regex_matcher(av) end def filter(servers) Array(servers).select { |s| s.is_a?(String) ? false : s.roles.any? { |r| @rex.match r } } end private def regex_matcher(values) values.map! do |v| case v when Regexp then v else vs = v.to_s vs =~ %r{^/(.+)/$} ? Regexp.new($1) : /^#{Regexp.quote(vs)}$/ end end Regexp.union values end end end end capistrano-capistrano-603c346/lib/capistrano/configuration/scm_resolver.rb000066400000000000000000000111671520217215100271020ustar00rootroot00000000000000module Capistrano class Configuration # In earlier versions of Capistrano, users would specify the desired SCM # implementation using `set :scm, :git`, for example. Capistrano would then # load the matching .rb file based on this variable. # # Now we expect users to explicitly `require` and call `new` on the desired # SCM implementation in their Capfile. The `set` technique is deprecated. # # This SCMResolver class takes care of managing the transition from the old # to new system. It maintains the legacy behavior, but prints deprecation # warnings when it is used. # # To maintain backwards compatibility, the resolver will load the Git SCM by # if default it determines that no SCM has been explicitly specified or # loaded. To force no SCM to be used at all, use `set :scm, nil`. This hack # won't be necessary once backwards compatibility is removed in a future # version. # # TODO: Remove this class entirely in Capistrano 4.0. # class SCMResolver DEFAULT_GIT = :"default-git" include Capistrano::DSL def resolve return if scm_name.nil? set(:scm, :git) if using_default_scm? print_deprecation_warnings_if_applicable # Note that `scm_plugin_installed?` comes from Capistrano::DSL if scm_plugin_installed? delete(:scm) return end if built_in_scm_name? load_built_in_scm else # Compatibility with existing 3.x third-party SCMs register_legacy_scm_hooks load_legacy_scm_by_name end end private def using_default_scm? return @using_default_scm if defined? @using_default_scm @using_default_scm = (fetch(:scm) == DEFAULT_GIT) end def scm_name fetch(:scm) end def load_built_in_scm require "capistrano/scm/#{scm_name}" scm_class = Object.const_get(built_in_scm_plugin_class_name) # We use :load_immediately because we are initializing the SCM plugin # late in the load process and therefore can't use the standard # load:defaults technique. install_plugin(scm_class, load_immediately: true) end def load_legacy_scm_by_name load("capistrano/#{scm_name}.rb") end def third_party_scm_name? !built_in_scm_name? end def built_in_scm_name? %w(git hg svn).include?(scm_name.to_s.downcase) end def built_in_scm_plugin_class_name "Capistrano::SCM::#{scm_name.to_s.capitalize}" end # rubocop:disable Style/GuardClause def register_legacy_scm_hooks if Rake::Task.task_defined?("deploy:new_release_path") after "deploy:new_release_path", "#{scm_name}:create_release" end if Rake::Task.task_defined?("deploy:check") before "deploy:check", "#{scm_name}:check" end if Rake::Task.task_defined?("deploy:set_current_revision") before "deploy:set_current_revision", "#{scm_name}:set_current_revision" end end # rubocop:enable Style/GuardClause def print_deprecation_warnings_if_applicable if using_default_scm? warn_add_git_to_capfile unless scm_plugin_installed? elsif built_in_scm_name? warn_set_scm_is_deprecated elsif third_party_scm_name? warn_third_party_scm_must_be_upgraded end end def warn_set_scm_is_deprecated $stderr.puts(<<-MESSAGE) [Deprecation Notice] `set :scm, #{scm_name.inspect}` is deprecated. To ensure your project is compatible with future versions of Capistrano, remove the :scm setting and instead add these lines to your Capfile after `require "capistrano/deploy"`: require "capistrano/scm/#{scm_name}" install_plugin #{built_in_scm_plugin_class_name} MESSAGE end def warn_add_git_to_capfile $stderr.puts(<<-MESSAGE) [Deprecation Notice] Future versions of Capistrano will not load the Git SCM plugin by default. To silence this deprecation warning, add the following to your Capfile after `require "capistrano/deploy"`: require "capistrano/scm/git" install_plugin Capistrano::SCM::Git MESSAGE end def warn_third_party_scm_must_be_upgraded $stderr.puts(<<-MESSAGE) [Deprecation Notice] `set :scm, #{scm_name.inspect}` is deprecated. To ensure this custom SCM will work with future versions of Capistrano, please upgrade it to a version that uses the new SCM plugin mechanism documented here: http://capistranorb.com/documentation/advanced-features/custom-scm MESSAGE end end end end capistrano-capistrano-603c346/lib/capistrano/configuration/server.rb000066400000000000000000000054151520217215100257040ustar00rootroot00000000000000require "set" module Capistrano class Configuration class Server < SSHKit::Host extend Forwardable def_delegators :properties, :roles, :fetch, :set def self.[](host) host.is_a?(Server) ? host : new(host) end def add_roles(roles) Array(roles).each { |role| add_role(role) } self end alias roles= add_roles def add_role(role) roles.add role.to_sym self end def has_role?(role) roles.include? role.to_sym end def select?(options) options.each do |k, v| callable = v.respond_to?(:call) ? v : ->(server) { server.fetch(v) } result = \ case k when :filter, :select callable.call(self) when :exclude !callable.call(self) else fetch(k) == v end return false unless result end true end def primary self if fetch(:primary) end def with(properties) properties.each { |key, value| add_property(key, value) } self end def properties @properties ||= Properties.new end def netssh_options @netssh_options ||= super.merge(fetch(:ssh_options) || {}) end def roles_array roles.to_a end def matches?(other) # This matching logic must stay in sync with `Servers#add_host`. hostname == other.hostname && port == other.port end private def add_property(key, value) if respond_to?("#{key}=") send("#{key}=", value) else set(key, value) end end class Properties def initialize @properties = {} end def set(key, value) pval = @properties[key] if pval.is_a?(Hash) && value.is_a?(Hash) pval.merge!(value) elsif pval.is_a?(Set) && value.is_a?(Set) pval.merge(value) elsif pval.is_a?(Array) && value.is_a?(Array) pval.concat value else @properties[key] = value end end def fetch(key) @properties[key] end def respond_to_missing?(method, _include_all=false) @properties.key?(method) || super end def roles @roles ||= Set.new end def keys @properties.keys end def method_missing(key, value=nil) if value set(lvalue(key), value) else fetch(key) end end def to_h @properties end private def lvalue(key) key.to_s.chomp("=").to_sym end end end end end capistrano-capistrano-603c346/lib/capistrano/configuration/servers.rb000066400000000000000000000042261520217215100260660ustar00rootroot00000000000000require "set" require "capistrano/configuration" require "capistrano/configuration/filter" module Capistrano class Configuration class Servers include Enumerable def add_host(host, properties={}) new_host = Server[host] new_host.port = properties[:port] if properties.key?(:port) # This matching logic must stay in sync with `Server#matches?`. key = ServerKey.new(new_host.hostname, new_host.port) existing = servers_by_key[key] if existing existing.user = new_host.user if new_host.user existing.with(properties) else servers_by_key[key] = new_host.with(properties) end end # rubocop:disable Security/MarshalLoad def add_role(role, hosts, options={}) options_deepcopy = Marshal.dump(options.merge(roles: role)) Array(hosts).each { |host| add_host(host, Marshal.load(options_deepcopy)) } end # rubocop:enable Security/MarshalLoad def roles_for(names) options = extract_options(names) s = Filter.new(:role, names).filter(servers_by_key.values) s.select { |server| server.select?(options) } end def role_properties_for(rolenames) roles = rolenames.to_set rps = Set.new unless block_given? roles_for(rolenames).each do |host| host.roles.intersection(roles).each do |role| [host.properties.fetch(role)].flatten(1).each do |props| if block_given? yield host, role, props else rps << (props || {}).merge(role: role, hostname: host.hostname) end end end end block_given? ? nil : rps end def fetch_primary(role) hosts = roles_for([role]) hosts.find(&:primary) || hosts.first end def each servers_by_key.values.each { |server| yield server } end private ServerKey = Struct.new(:hostname, :port) def servers_by_key @servers_by_key ||= {} end def extract_options(array) array.last.is_a?(::Hash) ? array.pop : {} end end end end capistrano-capistrano-603c346/lib/capistrano/configuration/validated_variables.rb000066400000000000000000000067061520217215100303670ustar00rootroot00000000000000require "capistrano/proc_helpers" require "delegate" module Capistrano class Configuration # Decorates a Variables object to additionally perform an optional set of # user-supplied validation rules. Each rule for a given key is invoked # immediately whenever `set` is called with a value for that key. # # If `set` is called with a callable value or a block, validation is not # performed immediately. Instead, the validation rules are invoked the first # time `fetch` is used to access the value. # # A rule is simply a block that accepts two arguments: key and value. It is # up to the rule to raise an exception when it deems the value is invalid # (or just print a warning). # # Rules can be registered using the DSL like this: # # validate(:my_key) do |key, value| # # rule goes here # end # class ValidatedVariables < SimpleDelegator include Capistrano::ProcHelpers def initialize(variables) super(variables) @validators = {} end # Decorate Variables#set to add validation behavior. def set(key, value=nil, &block) assert_value_or_block_not_both(value, block) # Skip validation behavior if no validators are registered for this key return super unless validators.key?(key) value_to_evaluate = block || value if callable_without_parameters?(value_to_evaluate) super(key, assert_valid_later(key, value_to_evaluate), &nil) else assert_valid_now(key, value_to_evaluate) super end end # Register a validation rule for the given key. def validate(key, &validator) vs = (validators[key] || []) vs << validator validators[key] = vs end private attr_reader :validators # Given a callable that provides a value, wrap the callable with another # object that responds to `call`. This new object will perform validation # and then return the original callable's value. # # If the callable is a `Question`, the object returned by this method will # also be a `Question` (a `ValidatedQuestion`, to be precise). This # ensures that `is_a?(Question)` remains true even after the validation # wrapper is applied. This is needed so that `Configuration#is_question?` # works as expected. # def assert_valid_later(key, callable) validation_callback = proc do value = callable.call assert_valid_now(key, value) value end if callable.is_a?(Question) ValidatedQuestion.new(validation_callback) else validation_callback end end # Runs all validation rules registered for the given key against the # user-supplied value for that variable. If no validator raises an # exception, the value is assumed to be valid. def assert_valid_now(key, value) validators[key].each do |validator| validator.call(key, value) end end def assert_value_or_block_not_both(value, block) return if value.nil? || block.nil? raise Capistrano::ValidationError, "Value and block both passed to Configuration#set" end class ValidatedQuestion < Question def initialize(validator) @validator = validator end def call @validator.call end end end end end capistrano-capistrano-603c346/lib/capistrano/configuration/variables.rb000066400000000000000000000055401520217215100263450ustar00rootroot00000000000000require "capistrano/proc_helpers" module Capistrano class Configuration # Holds the variables assigned at Capistrano runtime via `set` and retrieved # with `fetch`. Does internal bookkeeping to help identify user mistakes # like spelling errors or unused variables that may lead to unexpected # behavior. class Variables CAPISTRANO_LOCATION = File.expand_path("../..", __FILE__).freeze IGNORED_LOCATIONS = [ "#{CAPISTRANO_LOCATION}/configuration/variables.rb:", "#{CAPISTRANO_LOCATION}/configuration.rb:", "#{CAPISTRANO_LOCATION}/dsl/env.rb:", "/dsl.rb:", "/forwardable.rb:" ].freeze private_constant :CAPISTRANO_LOCATION, :IGNORED_LOCATIONS include Capistrano::ProcHelpers def initialize(values={}) @trusted_keys = [] @fetched_keys = [] @locations = {} @values = values @trusted = true end def untrusted! @trusted = false yield ensure @trusted = true end def set(key, value=nil, &block) @trusted_keys << key if trusted? && !@trusted_keys.include?(key) remember_location(key) values[key] = block || value trace_set(key) values[key] end def fetch(key, default=nil, &block) fetched_keys << key unless fetched_keys.include?(key) peek(key, default, &block) end # Internal use only. def peek(key, default=nil, &block) value = fetch_for(key, default, &block) while callable_without_parameters?(value) value = (values[key] = value.call) end value end def fetch_for(key, default, &block) block ? values.fetch(key, &block) : values.fetch(key, default) end def delete(key) values.delete(key) end def trusted_keys @trusted_keys.dup end def untrusted_keys keys - @trusted_keys end def keys values.keys end # Keys that have been set, but which have never been fetched. def unused_keys keys - fetched_keys end # Returns an array of source file location(s) where the given key was # assigned (i.e. where `set` was called). If the key was never assigned, # returns `nil`. def source_locations(key) locations[key] end private attr_reader :locations, :values, :fetched_keys def trusted? @trusted end def remember_location(key) location = caller.find do |line| IGNORED_LOCATIONS.none? { |i| line.include?(i) } end (locations[key] ||= []) << location end def trace_set(key) return unless fetch(:print_config_variables, false) puts "Config variable set: #{key.inspect} => #{values[key].inspect}" end end end end capistrano-capistrano-603c346/lib/capistrano/console.rb000066400000000000000000000000711520217215100231620ustar00rootroot00000000000000load File.expand_path("../tasks/console.rake", __FILE__) capistrano-capistrano-603c346/lib/capistrano/defaults.rb000066400000000000000000000023231520217215100233310ustar00rootroot00000000000000validate :application do |_key, value| changed_value = value.gsub(/[^A-Z0-9\.\-]/i, "_") if value != changed_value warn %Q(The :application value "#{value}" is invalid!) warn "Use only letters, numbers, hyphens, dots, and underscores. For example:" warn " set :application, '#{changed_value}'" raise Capistrano::ValidationError end end %i(git_strategy hg_strategy svn_strategy).each do |strategy| validate(strategy) do |key, _value| warn( "[Deprecation Warning] #{key} is deprecated and will be removed in "\ "Capistrano 3.7.0.\n"\ "https://github.com/capistrano/capistrano/blob/master/UPGRADING-3.7.md" ) end end # We use a special :_default_git value so that SCMResolver can tell whether the # default has been replaced by the user via `set`. set_if_empty :scm, Capistrano::Configuration::SCMResolver::DEFAULT_GIT set_if_empty :branch, "master" set_if_empty :deploy_to, -> { "/var/www/#{fetch(:application)}" } set_if_empty :tmp_dir, "/tmp" set_if_empty :default_env, {} set_if_empty :keep_releases, 5 set_if_empty :format, :airbrussh set_if_empty :log_level, :debug set_if_empty :pty, false set_if_empty :local_user, -> { ENV["USER"] || ENV["LOGNAME"] || ENV["USERNAME"] } capistrano-capistrano-603c346/lib/capistrano/deploy.rb000066400000000000000000000001301520217215100230100ustar00rootroot00000000000000require "capistrano/framework" load File.expand_path("../tasks/deploy.rake", __FILE__) capistrano-capistrano-603c346/lib/capistrano/doctor.rb000066400000000000000000000003501520217215100230120ustar00rootroot00000000000000require "capistrano/doctor/environment_doctor" require "capistrano/doctor/gems_doctor" require "capistrano/doctor/variables_doctor" require "capistrano/doctor/servers_doctor" load File.expand_path("../tasks/doctor.rake", __FILE__) capistrano-capistrano-603c346/lib/capistrano/doctor/000077500000000000000000000000001520217215100224675ustar00rootroot00000000000000capistrano-capistrano-603c346/lib/capistrano/doctor/environment_doctor.rb000066400000000000000000000007401520217215100267330ustar00rootroot00000000000000require "capistrano/doctor/output_helpers" module Capistrano module Doctor class EnvironmentDoctor include Capistrano::Doctor::OutputHelpers def call title("Environment") puts <<-OUT.gsub(/^\s+/, "") Ruby #{RUBY_DESCRIPTION} Rubygems #{Gem::VERSION} Bundler #{defined?(Bundler::VERSION) ? Bundler::VERSION : 'N/A'} Command #{$PROGRAM_NAME} #{ARGV.join(' ')} OUT end end end end capistrano-capistrano-603c346/lib/capistrano/doctor/gems_doctor.rb000066400000000000000000000022511520217215100253210ustar00rootroot00000000000000require "capistrano/doctor/output_helpers" module Capistrano module Doctor # Prints table of all Capistrano-related gems and their version numbers. If # there is a newer version of a gem available, call attention to it. class GemsDoctor include Capistrano::Doctor::OutputHelpers def call title("Gems") table(all_gem_names) do |gem, row| row.yellow if update_available?(gem) row << gem row << installed_gem_version(gem) row << "(update available)" if update_available?(gem) end end private def installed_gem_version(gem_name) Gem.loaded_specs[gem_name].version end def update_available?(gem_name) latest = Gem.latest_version_for(gem_name) return false if latest.nil? latest > installed_gem_version(gem_name) end def all_gem_names core_gem_names + plugin_gem_names end def core_gem_names %w(capistrano airbrussh rake sshkit net-ssh) & Gem.loaded_specs.keys end def plugin_gem_names (Gem.loaded_specs.keys - ["capistrano"]).grep(/capistrano/).sort end end end end capistrano-capistrano-603c346/lib/capistrano/doctor/output_helpers.rb000066400000000000000000000043321520217215100261000ustar00rootroot00000000000000module Capistrano module Doctor # Helper methods for pretty-printing doctor output to stdout. All output # (other than `title`) is indented by four spaces to facilitate copying and # pasting this output into e.g. GitHub or Stack Overflow to achieve code # formatting. module OutputHelpers class Row attr_reader :color attr_reader :values def initialize @values = [] end def <<(value) values << value end def yellow @color = :yellow end end # Prints a table for a given array of records. For each record, the block # is yielded two arguments: the record and a Row object. To print values # for that record, add values using `row << "some value"`. A row can # optionally be highlighted in yellow using `row.yellow`. def table(records, &block) return if records.empty? rows = collect_rows(records, &block) col_widths = calculate_column_widths(rows) rows.each do |row| line = row.values.each_with_index.map do |value, col| value.to_s.ljust(col_widths[col]) end.join(" ").rstrip line = color.colorize(line, row.color) if row.color puts line end end # Prints a title in blue with surrounding newlines. def title(text) # Use $stdout directly to bypass the indentation that our `puts` does. $stdout.puts(color.colorize("\n#{text}\n", :blue)) end # Prints text in yellow. def warning(text) puts color.colorize(text, :yellow) end # Override `Kernel#puts` to prepend four spaces to each line. def puts(string=nil) $stdout.puts(string.to_s.gsub(/^/, " ")) end private def collect_rows(records) records.map do |rec| Row.new.tap { |row| yield(rec, row) } end end def calculate_column_widths(rows) num_columns = rows.map { |row| row.values.length }.max Array.new(num_columns) do |col| rows.map { |row| row.values[col].to_s.length }.max end end def color @color ||= SSHKit::Color.new($stdout) end end end end capistrano-capistrano-603c346/lib/capistrano/doctor/servers_doctor.rb000066400000000000000000000047131520217215100260640ustar00rootroot00000000000000require "capistrano/doctor/output_helpers" module Capistrano module Doctor class ServersDoctor include Capistrano::Doctor::OutputHelpers def initialize(env=Capistrano::Configuration.env) @servers = env.servers.to_a end def call title("Servers (#{servers.size})") rwc = RoleWhitespaceChecker.new(servers) table(servers) do |server, row| sd = ServerDecorator.new(server) row << sd.uri_form row << sd.roles row << sd.properties row.yellow if rwc.any_has_whitespace?(server.roles) end if rwc.whitespace_roles.any? warning "\nWhitespace detected in role(s) #{rwc.whitespace_roles_decorated}. " \ "This might be a result of a mistyped \"%w()\" array literal." end puts end private attr_reader :servers class RoleWhitespaceChecker attr_reader :whitespace_roles, :servers def initialize(servers) @servers = servers @whitespace_roles = find_whitespace_roles end def any_has_whitespace?(roles) roles.any? { |role| include_whitespace?(role) } end def include_whitespace?(role) role =~ /\s/ end def whitespace_roles_decorated whitespace_roles.map(&:inspect).join(", ") end private def find_whitespace_roles servers.map(&:roles).flat_map(&:to_a).uniq .select { |role| include_whitespace?(role) } end end class ServerDecorator def initialize(server) @server = server end def uri_form [ server.user, server.user && "@", server.hostname, server.port && ":", server.port ].compact.join end def roles server.roles.to_a.inspect end def properties return "" unless server.properties.keys.any? pretty_inspect(server.properties.to_h) end private attr_reader :server # Hashes with proper padding def pretty_inspect(element) return element.inspect unless element.is_a?(Hash) pairs_string = element.keys.map do |key| [pretty_inspect(key), pretty_inspect(element.fetch(key))].join(" => ") end.join(", ") "{ #{pairs_string} }" end end end end end capistrano-capistrano-603c346/lib/capistrano/doctor/variables_doctor.rb000066400000000000000000000036121520217215100263400ustar00rootroot00000000000000require "capistrano/doctor/output_helpers" module Capistrano module Doctor # Prints a table of all Capistrano variables and their current values. If # there are unrecognized variables, print warnings for them. class VariablesDoctor # These are keys that are recognized by Capistrano, but do not have values # set by default. WHITELIST = %i( application current_directory linked_dirs linked_files releases_directory repo_url repo_tree shared_directory ).freeze private_constant :WHITELIST include Capistrano::Doctor::OutputHelpers def initialize(env=Capistrano::Configuration.env) @env = env end def call title("Variables") values = inspect_all_values table(variables.keys.sort_by(&:to_s)) do |key, row| row.yellow if suspicious_keys.include?(key) row << key.inspect row << values[key] end puts if suspicious_keys.any? suspicious_keys.sort_by(&:to_s).each do |key| warning("#{key.inspect} is not a recognized Capistrano setting "\ "(#{location(key)})") end end private attr_reader :env def variables env.variables end def inspect_all_values variables.keys.each_with_object({}) do |key, inspected| inspected[key] = if env.is_question?(key) "" else variables.peek(key).inspect end end end def suspicious_keys (variables.untrusted_keys & variables.unused_keys) - WHITELIST end def location(key) loc = variables.source_locations(key).first loc && loc.sub(/^#{Regexp.quote(Dir.pwd)}/, "").sub(/:in.*/, "") end end end end capistrano-capistrano-603c346/lib/capistrano/dotfile.rb000066400000000000000000000001261520217215100231470ustar00rootroot00000000000000dotfile = Pathname.new(File.join(Dir.home, ".capfile")) load dotfile if dotfile.file? capistrano-capistrano-603c346/lib/capistrano/dsl.rb000066400000000000000000000062221520217215100223060ustar00rootroot00000000000000require "capistrano/dsl/task_enhancements" require "capistrano/dsl/paths" require "capistrano/dsl/stages" require "capistrano/dsl/env" require "capistrano/configuration/filter" module Capistrano module DSL include TaskEnhancements include Env include Paths include Stages def invoke(task_name, *args) task = Rake::Task[task_name] # NOTE: We access instance variable since the accessor was only added recently. Once Capistrano depends on rake 11+, we can revert the following line if task && task.instance_variable_get(:@already_invoked) file, line, = caller.first.split(":") colors = SSHKit::Color.new($stderr) $stderr.puts colors.colorize("Skipping task `#{task_name}'.", :yellow) $stderr.puts "Capistrano tasks may only be invoked once. Since task `#{task}' was previously invoked, invoke(\"#{task_name}\") at #{file}:#{line} will be skipped." $stderr.puts "If you really meant to run this task again, use invoke!(\"#{task_name}\")" $stderr.puts colors.colorize("THIS BEHAVIOR MAY CHANGE IN A FUTURE VERSION OF CAPISTRANO. Please join the conversation here if this affects you.", :red) $stderr.puts colors.colorize("https://github.com/capistrano/capistrano/issues/1686", :red) end task.invoke(*args) end def invoke!(task_name, *args) task = Rake::Task[task_name] task.reenable task.invoke(*args) end def t(key, options={}) I18n.t(key, **options.merge(scope: :capistrano)) end def scm fetch(:scm) end def sudo(*args) execute :sudo, *args end def revision_log_message fetch(:revision_log_message, t(:revision_log_message, branch: fetch(:branch), user: local_user, sha: fetch(:current_revision), release: fetch(:release_timestamp))) end def rollback_log_message t(:rollback_log_message, user: local_user, release: fetch(:rollback_timestamp)) end def local_user fetch(:local_user) end def lock(locked_version) VersionValidator.new(locked_version).verify end # rubocop:disable Security/MarshalLoad def on(hosts, options={}, &block) subset_copy = Marshal.dump(Configuration.env.filter(hosts)) SSHKit::Coordinator.new(Marshal.load(subset_copy)).each(options, &block) end # rubocop:enable Security/MarshalLoad def run_locally(&block) SSHKit::Backend::Local.new(&block).run end # Catch common beginner mistake and give a helpful error message on stderr def execute(*) file, line, = caller.first.split(":") colors = SSHKit::Color.new($stderr) $stderr.puts colors.colorize("Warning: `execute' should be wrapped in an `on' scope in #{file}:#{line}.", :red) $stderr.puts $stderr.puts " task :example do" $stderr.puts colors.colorize(" on roles(:app) do", :yellow) $stderr.puts " execute 'whoami'" $stderr.puts colors.colorize(" end", :yellow) $stderr.puts " end" $stderr.puts raise NoMethodError, "undefined method `execute' for main:Object" end end end extend Capistrano::DSL capistrano-capistrano-603c346/lib/capistrano/dsl/000077500000000000000000000000001520217215100217575ustar00rootroot00000000000000capistrano-capistrano-603c346/lib/capistrano/dsl/env.rb000066400000000000000000000020151520217215100230720ustar00rootroot00000000000000require "forwardable" module Capistrano module DSL module Env extend Forwardable def_delegators :env, :configure_backend, :fetch, :set, :set_if_empty, :delete, :ask, :role, :server, :primary, :validate, :append, :remove, :dry_run?, :install_plugin, :any?, :is_question?, :configure_scm, :scm_plugin_installed? def roles(*names) env.roles_for(names.flatten) end def role_properties(*names, &block) env.role_properties_for(names, &block) end def release_roles(*names) if names.last.is_a? Hash names.last[:exclude] = :no_release else names << { exclude: :no_release } end roles(*names) end def env Configuration.env end def release_timestamp env.timestamp.strftime("%Y%m%d%H%M%S") end def asset_timestamp env.timestamp.strftime("%Y%m%d%H%M.%S") end end end end capistrano-capistrano-603c346/lib/capistrano/dsl/paths.rb000066400000000000000000000035641520217215100234330ustar00rootroot00000000000000require "pathname" module Capistrano module DSL module Paths def deploy_to fetch(:deploy_to) end def deploy_path Pathname.new(deploy_to) end def current_path deploy_path.join(fetch(:current_directory, "current")) end def releases_path deploy_path.join(fetch(:releases_directory, "releases")) end def release_path fetch(:release_path) { current_path } end def set_release_path(timestamp=now) set(:release_timestamp, timestamp) set(:release_path, releases_path.join(timestamp)) end def stage_config_path Pathname.new fetch(:stage_config_path, "config/deploy") end def deploy_config_path Pathname.new fetch(:deploy_config_path, "config/deploy.rb") end def repo_url fetch(:repo_url) end def repo_path Pathname.new(fetch(:repo_path, ->() { deploy_path.join("repo") })) end def shared_path deploy_path.join(fetch(:shared_directory, "shared")) end def revision_log deploy_path.join("revisions.log") end def now env.timestamp.strftime("%Y%m%d%H%M%S") end def asset_timestamp env.timestamp.strftime("%Y%m%d%H%M.%S") end def linked_dirs(parent) paths = fetch(:linked_dirs) join_paths(parent, paths) end def linked_files(parent) paths = fetch(:linked_files) join_paths(parent, paths) end def linked_file_dirs(parent) map_dirnames(linked_files(parent)) end def linked_dir_parents(parent) map_dirnames(linked_dirs(parent)) end def join_paths(parent, paths) paths.map { |path| parent.join(path) } end def map_dirnames(paths) paths.map(&:dirname).uniq end end end end capistrano-capistrano-603c346/lib/capistrano/dsl/stages.rb000066400000000000000000000013321520217215100235710ustar00rootroot00000000000000module Capistrano module DSL module Stages RESERVED_NAMES = %w(deploy doctor install).freeze private_constant :RESERVED_NAMES def stages names = Dir[stage_definitions].map { |f| File.basename(f, ".rb") } assert_valid_stage_names(names) names end def stage_definitions stage_config_path.join("*.rb") end def stage_set? !!fetch(:stage, false) end private def assert_valid_stage_names(names) invalid = names.find { |n| RESERVED_NAMES.include?(n) } return if invalid.nil? raise t("error.invalid_stage_name", name: invalid, path: stage_config_path.join("#{invalid}.rb")) end end end end capistrano-capistrano-603c346/lib/capistrano/dsl/task_enhancements.rb000066400000000000000000000030601520217215100257750ustar00rootroot00000000000000require "capistrano/upload_task" module Capistrano module TaskEnhancements def before(task, prerequisite, *args, &block) prerequisite = Rake::Task.define_task(prerequisite, *args, &block) if block_given? Rake::Task[task].enhance [prerequisite] end def after(task, post_task, *args, &block) Rake::Task.define_task(post_task, *args, &block) if block_given? task = Rake::Task[task] task.enhance do post = Rake.application.lookup(post_task, task.scope) raise ArgumentError, "Task #{post_task.inspect} not found" unless post post.invoke end end def define_remote_file_task(task, target_roles) Capistrano::UploadTask.define_task(task) do |t| prerequisite_file = t.prerequisites.first file = shared_path.join(t.name) on roles(target_roles) do unless test "[ -f #{file.to_s.shellescape} ]" info "Uploading #{prerequisite_file} to #{file}" upload! File.open(prerequisite_file), file end end end end def ensure_stage Rake::Task.define_task(:ensure_stage) do unless stage_set? puts t(:stage_not_set) exit 1 end end end def tasks_without_stage_dependency stages + default_tasks end def default_tasks %w{install} end def exit_deploy_because_of_exception(ex) warn t(:deploy_failed, ex: ex.message) invoke "deploy:failed" exit(false) end def deploying? fetch(:deploying, false) end end end capistrano-capistrano-603c346/lib/capistrano/framework.rb000066400000000000000000000001301520217215100235110ustar00rootroot00000000000000load File.expand_path("../tasks/framework.rake", __FILE__) require "capistrano/install" capistrano-capistrano-603c346/lib/capistrano/i18n.rb000066400000000000000000000040251520217215100223020ustar00rootroot00000000000000require "i18n" en = { starting: "Starting", capified: "Capified", start: "Start", update: "Update", finalize: "Finalise", finishing: "Finishing", finished: "Finished", stage_not_set: "Stage not set, please call something such as `cap production deploy`, where production is a stage you have defined.", written_file: "create %{file}", question: "Please enter %{key}: ", question_default: "Please enter %{key} (%{default_value}): ", question_prompt: "%{key}: ", question_prompt_default: "%{key} (%{default_value}): ", keeping_releases: "Keeping %{keep_releases} of %{releases} deployed releases on %{host}", skip_cleanup: "Skipping cleanup of invalid releases on %{host}; unexpected foldername found (should be timestamp)", wont_delete_current_release: "Current release was marked for being removed but it's going to be skipped on %{host}", no_current_release: "There is no current release present on %{host}", no_old_releases: "No old releases (keeping newest %{keep_releases}) on %{host}", linked_file_does_not_exist: "linked file %{file} does not exist on %{host}", cannot_rollback: "There are no older releases to rollback to", cannot_found_rollback_release: "Cannot rollback because release %{release} does not exist", mirror_exists: "The repository mirror is at %{at}", revision_log_message: "Branch %{branch} (at %{sha}) deployed as release %{release} by %{user}", rollback_log_message: "%{user} rolled back to release %{release}", deploy_failed: "The deploy has failed with an error: %{ex}", console: { welcome: "capistrano console - enter command to execute on %{stage}", bye: "bye" }, error: { invalid_stage_name: '"%{name}" is a reserved word and cannot be used as a stage. Rename "%{path}" to something else.', user: { does_not_exist: "User %{user} does not exists", cannot_switch: "Cannot switch to user %{user}" } } } I18n.backend.store_translations(:en, capistrano: en) if I18n.respond_to?(:enforce_available_locales=) I18n.enforce_available_locales = true end capistrano-capistrano-603c346/lib/capistrano/immutable_task.rb000066400000000000000000000017041520217215100245250ustar00rootroot00000000000000module Capistrano # This module extends a Rake::Task to freeze it to prevent it from being # enhanced. This is used to prevent users from enhancing a task at the wrong # point of Capistrano's boot process, which can happen if a Capistrano plugin # is loaded in deploy.rb by mistake (instead of in the Capfile). # # Usage: # # task = Rake.application["load:defaults"] # task.invoke # task.extend(Capistrano::ImmutableTask) # prevent further modifications # module ImmutableTask def self.extended(task) task.freeze end def enhance(*args, &block) $stderr.puts <<-MESSAGE ERROR: #{name} has already been invoked and can no longer be modified. Check that you haven't loaded a Capistrano plugin in deploy.rb or a stage (e.g. deploy/production.rb) by mistake. Plugins must be loaded in the Capfile to initialize properly. MESSAGE # This will raise a frozen object error super(*args, &block) end end end capistrano-capistrano-603c346/lib/capistrano/install.rb000066400000000000000000000001171520217215100231670ustar00rootroot00000000000000load File.expand_path(File.join(File.dirname(__FILE__), "tasks/install.rake")) capistrano-capistrano-603c346/lib/capistrano/plugin.rb000066400000000000000000000055551520217215100230320ustar00rootroot00000000000000require "capistrano/all" require "rake/tasklib" # IMPORTANT: The Capistrano::Plugin system is not yet considered a stable, # public API, and is subject to change without notice. Eventually it will be # officially documented and supported, but for now, use it at your own risk. # # Base class for Capistrano plugins. Makes building a Capistrano plugin as easy # as writing a `Capistrano::Plugin` subclass and overriding any or all of its # three template methods: # # * set_defaults # * register_hooks # * define_tasks # # Within the plugin you can use any methods of the Rake or Capistrano DSLs, like # `fetch`, `invoke`, etc. In cases when you need to use SSHKit's backend outside # of an `on` block, use the `backend` convenience method. E.g. `backend.test`, # `backend.execute`, or `backend.capture`. # # Package up and distribute your plugin class as a gem and you're good to go! # # To use a plugin, all a user has to do is install it in the Capfile, like this: # # # Capfile # require "capistrano/superfancy" # install_plugin Capistrano::Superfancy # # Or, to install the plugin without its hooks: # # # Capfile # require "capistrano/superfancy" # install_plugin Capistrano::Superfancy, load_hooks: false # class Capistrano::Plugin < Rake::TaskLib include Capistrano::DSL # Implemented by subclasses to provide default values for settings needed by # this plugin. Typically done using the `set_if_empty` Capistrano DSL method. # # Example: # # def set_defaults # set_if_empty :my_plugin_option, true # end # def set_defaults; end # Implemented by subclasses to hook into Capistrano's deployment flow using # using the `before` and `after` DSL methods. Note that `register_hooks` will # not be called if the user has opted-out of hooks when installing the plugin. # # Example: # # def register_hooks # after "deploy:updated", "my_plugin:do_something" # end # def register_hooks; end # Implemented by subclasses to define Rake tasks. Typically a plugin will call # `eval_rakefile` to load Rake tasks from a separate .rake file. # # Example: # # def define_tasks # eval_rakefile File.expand_path("../tasks.rake", __FILE__) # end # # For simple tasks, you can define them inline. No need for a separate file. # # def define_tasks # desc "Do something fantastic." # task "my_plugin:fantastic" do # ... # end # end # def define_tasks; end private # Read and eval a .rake file in such a way that `self` within the .rake file # refers to this plugin instance. This gives the tasks in the file access to # helper methods defined by the plugin. def eval_rakefile(path) contents = IO.read(path) instance_eval(contents, path, 1) end # Convenience to access the current SSHKit backend outside of an `on` block. def backend SSHKit::Backend.current end end capistrano-capistrano-603c346/lib/capistrano/proc_helpers.rb000066400000000000000000000007011520217215100242050ustar00rootroot00000000000000module Capistrano module ProcHelpers module_function # Tests whether the given object appears to respond to `call` with # zero parameters. In Capistrano, such a proc is used to represent a # "deferred value". That is, a value that is resolved by invoking `call` at # the time it is first needed. def callable_without_parameters?(x) x.respond_to?(:call) && (!x.respond_to?(:arity) || x.arity.zero?) end end end capistrano-capistrano-603c346/lib/capistrano/scm.rb000066400000000000000000000053721520217215100223130ustar00rootroot00000000000000module Capistrano # Base class for SCM strategy providers. # # @abstract # # @attr_reader [Rake] context # # @author Hartog de Mik # class SCM attr_reader :context # Provide a wrapper for the SCM that loads a strategy for the user. # # @param [Rake] context The context in which the strategy should run # @param [Module] strategy A module to include into the SCM instance. The # module should provide the abstract methods of Capistrano::SCM # def initialize(context, strategy) @context = context singleton = class << self; self; end singleton.send(:include, strategy) end # Call test in context def test!(*args) context.test(*args) end # The repository URL according to the context def repo_url context.repo_url end # The repository path according to the context def repo_path context.repo_path end # The release path according to the context def release_path context.release_path end # Fetch a var from the context # @param [Symbol] variable The variable to fetch # @param [Object] default The default value if not found # def fetch(*args) context.fetch(*args) end # @abstract # # Your implementation should check the existence of a cache repository on # the deployment target # # @return [Boolean] # def test raise NotImplementedError, "Your SCM strategy module should provide a #test method" end # @abstract # # Your implementation should check if the specified remote-repository is # available. # # @return [Boolean] # def check raise NotImplementedError, "Your SCM strategy module should provide a #check method" end # @abstract # # Create a (new) clone of the remote-repository on the deployment target # # @return void # def clone raise NotImplementedError, "Your SCM strategy module should provide a #clone method" end # @abstract # # Update the clone on the deployment target # # @return void # def update raise NotImplementedError, "Your SCM strategy module should provide a #update method" end # @abstract # # Copy the contents of the cache-repository onto the release path # # @return void # def release raise NotImplementedError, "Your SCM strategy module should provide a #release method" end # @abstract # # Identify the SHA of the commit that will be deployed. This will most likely involve SshKit's capture method. # # @return void # def fetch_revision raise NotImplementedError, "Your SCM strategy module should provide a #fetch_revision method" end end end capistrano-capistrano-603c346/lib/capistrano/scm/000077500000000000000000000000001520217215100217575ustar00rootroot00000000000000capistrano-capistrano-603c346/lib/capistrano/scm/git.rb000066400000000000000000000057721520217215100231020ustar00rootroot00000000000000require "capistrano/scm/plugin" require "cgi" require "securerandom" require "shellwords" require "stringio" require "uri" class Capistrano::SCM::Git < Capistrano::SCM::Plugin def set_defaults set_if_empty :git_shallow_clone, false set_if_empty :git_wrapper_path, lambda { # Use a unique name that won't collide with other deployments, and # that cannot be guessed by other processes that have access to /tmp. "#{fetch(:tmp_dir)}/git-ssh-#{SecureRandom.hex(10)}.sh" } set_if_empty :git_environmental_variables, lambda { { git_askpass: "/bin/echo", git_ssh: fetch(:git_wrapper_path) } } set_if_empty :git_max_concurrent_connections, 10 set_if_empty :git_wait_interval, 0 end def register_hooks after "deploy:new_release_path", "git:create_release" before "deploy:check", "git:check" before "deploy:set_current_revision", "git:set_current_revision" before "deploy:set_current_revision_time", "git:set_current_revision_time" end def define_tasks eval_rakefile File.expand_path("../tasks/git.rake", __FILE__) end def repo_mirror_exists? backend.test " [ -f #{repo_path}/HEAD ] " end def check_repo_is_reachable git :'ls-remote', git_repo_url, "HEAD" end def clone_repo if (depth = fetch(:git_shallow_clone)) git :clone, "--mirror", "--depth", depth, "--no-single-branch", git_repo_url, repo_path.to_s else git :clone, "--mirror", git_repo_url, repo_path.to_s end end def update_mirror # Update the origin URL if necessary. git :remote, "set-url", "origin", git_repo_url # Note: Requires git version 1.9 or greater if (depth = fetch(:git_shallow_clone)) git :fetch, "--depth", depth, "origin", fetch(:branch) else git :remote, :update, "--prune" end end def verify_commit git :"verify-commit", fetch_revision end def archive_to_release_path if (tree = fetch(:repo_tree)) tree = tree.slice %r#^/?(.*?)/?$#, 1 components = tree.split("/").size git :archive, fetch(:branch), tree, "| #{SSHKit.config.command_map[:tar]} -x --strip-components #{components} -f - -C", release_path else git :archive, fetch(:branch), "| #{SSHKit.config.command_map[:tar]} -x -f - -C", release_path end end def fetch_revision backend.capture(:git, "rev-list --max-count=1 #{fetch(:branch)}") end def fetch_revision_time backend.capture(:git, "--no-pager log -1 --pretty=format:\"%ct\" #{fetch(:branch)}") end def git(*args) args.unshift :git backend.execute(*args) end def git_repo_url if fetch(:git_http_username) && fetch(:git_http_password) URI.parse(repo_url).tap do |repo_uri| repo_uri.user = fetch(:git_http_username) repo_uri.password = CGI.escape(fetch(:git_http_password)) end.to_s elsif fetch(:git_http_username) URI.parse(repo_url).tap do |repo_uri| repo_uri.user = fetch(:git_http_username) end.to_s else repo_url end end end capistrano-capistrano-603c346/lib/capistrano/scm/hg.rb000066400000000000000000000025431520217215100227060ustar00rootroot00000000000000require "capistrano/scm/plugin" require "securerandom" class Capistrano::SCM::Hg < Capistrano::SCM::Plugin def register_hooks after "deploy:new_release_path", "hg:create_release" before "deploy:check", "hg:check" before "deploy:set_current_revision", "hg:set_current_revision" end def define_tasks eval_rakefile File.expand_path("../tasks/hg.rake", __FILE__) end def hg(*args) args.unshift(:hg) backend.execute(*args) end def repo_mirror_exists? backend.test " [ -d #{repo_path}/.hg ] " end def check_repo_is_reachable hg "id", repo_url end def clone_repo hg "clone", "--noupdate", repo_url, repo_path.to_s end def update_mirror hg "pull" end def archive_to_release_path if (tree = fetch(:repo_tree)) tree = tree.slice %r#^/?(.*?)/?$#, 1 components = tree.split("/").size temp_tar = "#{fetch(:tmp_dir)}/#{SecureRandom.hex(10)}.tar" hg "archive -p . -I", tree, "--rev", fetch(:branch), temp_tar backend.execute :mkdir, "-p", release_path backend.execute :tar, "-x --strip-components #{components} -f", temp_tar, "-C", release_path backend.execute :rm, temp_tar else hg "archive", release_path, "--rev", fetch(:branch) end end def fetch_revision backend.capture(:hg, "log --rev #{fetch(:branch)} --template \"{node}\n\"") end end capistrano-capistrano-603c346/lib/capistrano/scm/plugin.rb000066400000000000000000000006471520217215100236110ustar00rootroot00000000000000require "capistrano/plugin" require "capistrano/scm" # Base class for all built-in and third-party SCM plugins. Notice that this # class doesn't really do anything other than provide an `scm?` predicate. This # tells Capistrano that the plugin provides SCM functionality. All other plugin # features are inherited from Capistrano::Plugin. # class Capistrano::SCM::Plugin < Capistrano::Plugin def scm? true end end capistrano-capistrano-603c346/lib/capistrano/scm/svn.rb000066400000000000000000000031041520217215100231100ustar00rootroot00000000000000require "capistrano/scm/plugin" class Capistrano::SCM::Svn < Capistrano::SCM::Plugin def register_hooks after "deploy:new_release_path", "svn:create_release" before "deploy:check", "svn:check" before "deploy:set_current_revision", "svn:set_current_revision" end def define_tasks eval_rakefile File.expand_path("../tasks/svn.rake", __FILE__) end def svn(*args) args.unshift(:svn) args.push "--username #{fetch(:svn_username)}" if fetch(:svn_username) args.push "--password #{fetch(:svn_password)}" if fetch(:svn_password) args.push "--revision #{fetch(:svn_revision)}" if fetch(:svn_revision) backend.execute(*args) end def repo_mirror_exists? backend.test " [ -d #{repo_path}/.svn ] " end def check_repo_is_reachable svn_username = fetch(:svn_username) ? "--username #{fetch(:svn_username)}" : "" svn_password = fetch(:svn_password) ? "--password #{fetch(:svn_password)}" : "" backend.test :svn, :info, repo_url, svn_username, svn_password end def clone_repo svn :checkout, repo_url, repo_path.to_s end def update_mirror # Switch the repository URL if necessary. repo_mirror_url = fetch_repo_mirror_url svn :switch, repo_url unless repo_mirror_url == repo_url svn :update end def archive_to_release_path svn :export, "--force", ".", release_path end def fetch_revision backend.capture(:svnversion, repo_path.to_s) end def fetch_repo_mirror_url backend.capture(:svn, :info, repo_path.to_s).each_line do |line| return $1 if /\AURL: (.*)\n\z/ =~ line end end end capistrano-capistrano-603c346/lib/capistrano/scm/tasks/000077500000000000000000000000001520217215100231045ustar00rootroot00000000000000capistrano-capistrano-603c346/lib/capistrano/scm/tasks/git.rake000066400000000000000000000060711520217215100245370ustar00rootroot00000000000000# This trick lets us access the Git plugin within `on` blocks. git_plugin = self namespace :git do desc "Upload the git wrapper script, this script guarantees that we can script git without getting an interactive prompt" task :wrapper do on release_roles(:all), in: :groups, limit: fetch(:git_max_concurrent_connections), wait: fetch(:git_wait_interval) do execute :mkdir, "-p", File.dirname(fetch(:git_wrapper_path)).shellescape upload! StringIO.new("#!/bin/sh -e\nexec /usr/bin/env ssh -o PasswordAuthentication=no -o StrictHostKeyChecking=no \"$@\"\n"), fetch(:git_wrapper_path) execute :chmod, "700", fetch(:git_wrapper_path).shellescape end end desc "Check that the repository is reachable" task check: :'git:wrapper' do fetch(:branch) on release_roles(:all), in: :groups, limit: fetch(:git_max_concurrent_connections), wait: fetch(:git_wait_interval) do with fetch(:git_environmental_variables) do git_plugin.check_repo_is_reachable end end end desc "Clone the repo to the cache" task clone: :'git:wrapper' do on release_roles(:all), in: :groups, limit: fetch(:git_max_concurrent_connections), wait: fetch(:git_wait_interval) do if git_plugin.repo_mirror_exists? info t(:mirror_exists, at: repo_path) else within deploy_path do with fetch(:git_environmental_variables) do git_plugin.clone_repo end end end end end desc "Update the repo mirror to reflect the origin state" task update: :'git:clone' do on release_roles(:all), in: :groups, limit: fetch(:git_max_concurrent_connections), wait: fetch(:git_wait_interval) do within repo_path do with fetch(:git_environmental_variables) do git_plugin.update_mirror git_plugin.verify_commit if fetch(:git_verify_commit) end end end end desc "Copy repo to releases" task create_release: :'git:update' do on release_roles(:all), in: :groups, limit: fetch(:git_max_concurrent_connections), wait: fetch(:git_wait_interval) do with fetch(:git_environmental_variables) do within repo_path do execute :mkdir, "-p", release_path git_plugin.archive_to_release_path end end end end desc "Determine the revision that will be deployed" task :set_current_revision do on release_roles(:all), in: :groups, limit: fetch(:git_max_concurrent_connections), wait: fetch(:git_wait_interval) do within repo_path do with fetch(:git_environmental_variables) do set :current_revision, git_plugin.fetch_revision end end end end desc "Determine the unix timestamp that the revision that will be deployed was created" task :set_current_revision_time do on release_roles(:all), in: :groups, limit: fetch(:git_max_concurrent_connections), wait: fetch(:git_wait_interval) do within repo_path do with fetch(:git_environmental_variables) do set :current_revision_time, git_plugin.fetch_revision_time end end end end end capistrano-capistrano-603c346/lib/capistrano/scm/tasks/hg.rake000066400000000000000000000022261520217215100243500ustar00rootroot00000000000000# TODO: this is nearly identical to git.rake. DRY up? # This trick lets us access the Hg plugin within `on` blocks. hg_plugin = self namespace :hg do desc "Check that the repo is reachable" task :check do on release_roles :all do hg_plugin.check_repo_is_reachable end end desc "Clone the repo to the cache" task :clone do on release_roles :all do if hg_plugin.repo_mirror_exists? info t(:mirror_exists, at: repo_path) else within deploy_path do hg_plugin.clone_repo end end end end desc "Pull changes from the remote repo" task update: :'hg:clone' do on release_roles :all do within repo_path do hg_plugin.update_mirror end end end desc "Copy repo to releases" task create_release: :'hg:update' do on release_roles :all do within repo_path do hg_plugin.archive_to_release_path end end end desc "Determine the revision that will be deployed" task :set_current_revision do on release_roles :all do within repo_path do set :current_revision, hg_plugin.fetch_revision end end end end capistrano-capistrano-603c346/lib/capistrano/scm/tasks/svn.rake000066400000000000000000000022411520217215100245550ustar00rootroot00000000000000# TODO: this is nearly identical to git.rake. DRY up? # This trick lets us access the Svn plugin within `on` blocks. svn_plugin = self namespace :svn do desc "Check that the repo is reachable" task :check do on release_roles :all do svn_plugin.check_repo_is_reachable end end desc "Clone the repo to the cache" task :clone do on release_roles :all do if svn_plugin.repo_mirror_exists? info t(:mirror_exists, at: repo_path) else within deploy_path do svn_plugin.clone_repo end end end end desc "Pull changes from the remote repo" task update: :'svn:clone' do on release_roles :all do within repo_path do svn_plugin.update_mirror end end end desc "Copy repo to releases" task create_release: :'svn:update' do on release_roles :all do within repo_path do svn_plugin.archive_to_release_path end end end desc "Determine the revision that will be deployed" task :set_current_revision do on release_roles :all do within repo_path do set :current_revision, svn_plugin.fetch_revision end end end end capistrano-capistrano-603c346/lib/capistrano/setup.rb000066400000000000000000000016671520217215100226740ustar00rootroot00000000000000require "capistrano/doctor" require "capistrano/immutable_task" include Capistrano::DSL namespace :load do task :defaults do load "capistrano/defaults.rb" end end require "airbrussh/capistrano" # We don't need to show the "using Airbrussh" banner announcement since # Airbrussh is now the built-in formatter. Also enable command output by # default; hiding the output might be confusing to users new to Capistrano. Airbrussh.configure do |airbrussh| airbrussh.banner = false airbrussh.command_output = true end stages.each do |stage| Rake::Task.define_task(stage) do set(:stage, stage.to_sym) invoke "load:defaults" Rake.application["load:defaults"].extend(Capistrano::ImmutableTask) env.variables.untrusted! do load deploy_config_path load stage_config_path.join("#{stage}.rb") end configure_scm I18n.locale = fetch(:locale, :en) configure_backend end end require "capistrano/dotfile" capistrano-capistrano-603c346/lib/capistrano/tasks/000077500000000000000000000000001520217215100223225ustar00rootroot00000000000000capistrano-capistrano-603c346/lib/capistrano/tasks/console.rake000066400000000000000000000007461520217215100246370ustar00rootroot00000000000000desc "Execute remote commands" task :console do stage = fetch(:stage) puts I18n.t("console.welcome", scope: :capistrano, stage: stage) loop do print "#{stage}> " command = (input = $stdin.gets) ? input.chomp : "exit" next if command.empty? if %w{quit exit q}.include? command puts t("console.bye") break else begin on roles :all do execute command end rescue => e puts e end end end end capistrano-capistrano-603c346/lib/capistrano/tasks/deploy.rake000066400000000000000000000201231520217215100244600ustar00rootroot00000000000000namespace :deploy do task :starting do invoke "deploy:print_config_variables" if fetch(:print_config_variables, false) invoke "deploy:check" invoke "deploy:set_previous_revision" invoke "deploy:set_previous_revision_time" end task :print_config_variables do puts puts "------- Printing current config variables -------" env.keys.each do |config_variable_key| if is_question?(config_variable_key) puts "#{config_variable_key.inspect} => Question (awaits user input on next fetch(#{config_variable_key.inspect}))" else puts "#{config_variable_key.inspect} => #{fetch(config_variable_key).inspect}" end end puts puts "------- Printing current config variables of SSHKit mechanism -------" puts env.backend.config.inspect # puts env.backend.config.backend.config.ssh_options.inspect # puts env.backend.config.command_map.defaults.inspect puts end task updating: :new_release_path do invoke "deploy:set_current_revision" invoke "deploy:set_current_revision_time" invoke "deploy:symlink:shared" end task :reverting do invoke "deploy:revert_release" end task :publishing do invoke "deploy:symlink:release" end task :finishing do invoke "deploy:cleanup" end task :finishing_rollback do invoke "deploy:cleanup_rollback" end task :finished do invoke "deploy:log_revision" end desc "Check required files and directories exist" task :check do invoke "deploy:check:directories" invoke "deploy:check:linked_dirs" invoke "deploy:check:make_linked_dirs" invoke "deploy:check:linked_files" end namespace :check do desc "Check shared and release directories exist" task :directories do on release_roles :all do execute :mkdir, "-p", shared_path, releases_path end end desc "Check directories to be linked exist in shared" task :linked_dirs do next unless any? :linked_dirs on release_roles :all do execute :mkdir, "-p", linked_dirs(shared_path) end end desc "Check directories of files to be linked exist in shared" task :make_linked_dirs do next unless any? :linked_files on release_roles :all do |_host| execute :mkdir, "-p", linked_file_dirs(shared_path) end end desc "Check files to be linked exist in shared" task :linked_files do next unless any? :linked_files on release_roles :all do |host| linked_files(shared_path).each do |file| unless test "[ -f #{file} ]" error t(:linked_file_does_not_exist, file: file, host: host) exit 1 end end end end end namespace :symlink do desc "Symlink release to current" task :release do on release_roles :all do tmp_current_path = release_path.parent.join(current_path.basename) execute :ln, "-s", release_path, tmp_current_path execute :mv, tmp_current_path, current_path.parent end end desc "Symlink files and directories from shared to release" task :shared do invoke "deploy:symlink:linked_files" invoke "deploy:symlink:linked_dirs" end desc "Symlink linked directories" task :linked_dirs do next unless any? :linked_dirs on release_roles :all do execute :mkdir, "-p", linked_dir_parents(release_path) fetch(:linked_dirs).each do |dir| target = release_path.join(dir) source = shared_path.join(dir) next if test "[ -L #{target} ]" execute :rm, "-rf", target if test "[ -d #{target} ]" execute :ln, "-s", source, target end end end desc "Symlink linked files" task :linked_files do next unless any? :linked_files on release_roles :all do execute :mkdir, "-p", linked_file_dirs(release_path) fetch(:linked_files).each do |file| target = release_path.join(file) source = shared_path.join(file) next if test "[ -L #{target} ]" execute :rm, target if test "[ -f #{target} ]" execute :ln, "-s", source, target end end end end desc "Clean up old releases" task :cleanup do on release_roles :all do |host| releases = capture(:ls, "-x", releases_path).split valid, invalid = releases.partition { |e| /^\d{14}$/ =~ e } warn t(:skip_cleanup, host: host.to_s) if invalid.any? if valid.count >= fetch(:keep_releases) info t(:keeping_releases, host: host.to_s, keep_releases: fetch(:keep_releases), releases: valid.count) directories = (valid - valid.last(fetch(:keep_releases))).map do |release| releases_path.join(release).to_s end if test("[ -d #{current_path} ]") current_release = capture(:readlink, current_path).to_s if directories.include?(current_release) warn t(:wont_delete_current_release, host: host.to_s) directories.delete(current_release) end else debug t(:no_current_release, host: host.to_s) end if directories.any? directories.each_slice(100) do |directories_batch| execute :rm, "-rf", *directories_batch end else info t(:no_old_releases, host: host.to_s, keep_releases: fetch(:keep_releases)) end end end end desc "Remove and archive rolled-back release." task :cleanup_rollback do on release_roles(:all) do last_release = capture(:ls, "-xt", releases_path).split.first last_release_path = releases_path.join(last_release) if test "[ `readlink #{current_path}` != #{last_release_path} ]" execute :tar, "-czf", deploy_path.join("rolled-back-release-#{last_release}.tar.gz"), last_release_path execute :rm, "-rf", last_release_path else debug "Last release is the current release, skip cleanup_rollback." end end end desc "Log details of the deploy" task :log_revision do on release_roles(:all) do within releases_path do execute :echo, %Q{"#{revision_log_message}" >> #{revision_log}} end end end desc "Revert to previous release timestamp" task revert_release: :rollback_release_path do on release_roles(:all) do set(:revision_log_message, rollback_log_message) end end task :new_release_path do set_release_path end task :rollback_release_path do on release_roles(:all) do releases = capture(:ls, "-xt", releases_path).split if releases.count < 2 error t(:cannot_rollback) exit 1 end rollback_release = ENV["ROLLBACK_RELEASE"] index = rollback_release.nil? ? 1 : releases.index(rollback_release) if index.nil? error t(:cannot_found_rollback_release, release: rollback_release) exit 1 end last_release = releases[index] set_release_path(last_release) set(:rollback_timestamp, last_release) end end desc "Place a REVISION file with the current revision SHA in the current release path" task :set_current_revision do on release_roles(:all) do within release_path do execute :echo, "\"#{fetch(:current_revision)}\" > REVISION" end end end task :set_previous_revision do on release_roles(:all) do target = release_path.join("REVISION") if test "[ -f #{target} ]" set(:previous_revision, capture(:cat, target, "2>/dev/null")) end end end desc "Place a REVISION_TIME file with the current revision commit time in the current release path" task :set_current_revision_time do on release_roles(:all) do within release_path do if fetch(:current_revision_time) execute :echo, "\"#{fetch(:current_revision_time)}\" > REVISION_TIME" end end end end task :set_previous_revision_time do on release_roles(:all) do target = release_path.join("REVISION_TIME") if test "[ -f #{target} ]" set(:previous_revision_time, capture(:cat, target, "2>/dev/null")) end end end task :restart task :failed end capistrano-capistrano-603c346/lib/capistrano/tasks/doctor.rake000066400000000000000000000012431520217215100244600ustar00rootroot00000000000000desc "Display a Capistrano troubleshooting report (all doctor: tasks)" task doctor: ["doctor:environment", "doctor:gems", "doctor:variables", "doctor:servers"] namespace :doctor do desc "Display Ruby environment details" task :environment do Capistrano::Doctor::EnvironmentDoctor.new.call end desc "Display Capistrano gem versions" task :gems do Capistrano::Doctor::GemsDoctor.new.call end desc "Display the values of all Capistrano variables" task :variables do Capistrano::Doctor::VariablesDoctor.new.call end desc "Display the effective servers configuration" task :servers do Capistrano::Doctor::ServersDoctor.new.call end end capistrano-capistrano-603c346/lib/capistrano/tasks/framework.rake000066400000000000000000000022541520217215100251660ustar00rootroot00000000000000namespace :deploy do desc "Start a deployment, make sure server(s) ready." task :starting do end desc "Started" task :started do end desc "Update server(s) by setting up a new release." task :updating do end desc "Updated" task :updated do end desc "Revert server(s) to previous release." task :reverting do end desc "Reverted" task :reverted do end desc "Publish the release." task :publishing do end desc "Published" task :published do end desc "Finish the deployment, clean up server(s)." task :finishing do end desc "Finish the rollback, clean up server(s)." task :finishing_rollback do end desc "Finished" task :finished do end desc "Rollback to previous release." task :rollback do %w{ starting started reverting reverted publishing published finishing_rollback finished }.each do |task| invoke "deploy:#{task}" end end end desc "Deploy a new release." task :deploy do set(:deploying, true) %w{ starting started updating updated publishing published finishing finished }.each do |task| invoke "deploy:#{task}" end end task default: :deploy capistrano-capistrano-603c346/lib/capistrano/tasks/install.rake000066400000000000000000000024231520217215100246350ustar00rootroot00000000000000require "erb" require "pathname" desc "Install Capistrano, cap install STAGES=staging,production" task :install do envs = ENV["STAGES"] || "staging,production" tasks_dir = Pathname.new("lib/capistrano/tasks") config_dir = Pathname.new("config") deploy_dir = config_dir.join("deploy") deploy_rb = File.expand_path("../../templates/deploy.rb.erb", __FILE__) stage_rb = File.expand_path("../../templates/stage.rb.erb", __FILE__) capfile = File.expand_path("../../templates/Capfile", __FILE__) mkdir_p deploy_dir entries = [{ template: deploy_rb, file: config_dir.join("deploy.rb") }] entries += envs.split(",").map { |stage| { template: stage_rb, file: deploy_dir.join("#{stage}.rb") } } entries.each do |entry| if File.exist?(entry[:file]) warn "[skip] #{entry[:file]} already exists" else File.open(entry[:file], "w+") do |f| f.write(ERB.new(File.read(entry[:template])).result(binding)) puts I18n.t(:written_file, scope: :capistrano, file: entry[:file]) end end end mkdir_p tasks_dir if File.exist?("Capfile") warn "[skip] Capfile already exists" else FileUtils.cp(capfile, "Capfile") puts I18n.t(:written_file, scope: :capistrano, file: "Capfile") end puts I18n.t :capified, scope: :capistrano end capistrano-capistrano-603c346/lib/capistrano/templates/000077500000000000000000000000001520217215100231735ustar00rootroot00000000000000capistrano-capistrano-603c346/lib/capistrano/templates/Capfile000066400000000000000000000021161520217215100244610ustar00rootroot00000000000000# Load DSL and set up stages require "capistrano/setup" # Include default deployment tasks require "capistrano/deploy" # Load the SCM plugin appropriate to your project: # # require "capistrano/scm/hg" # install_plugin Capistrano::SCM::Hg # or # require "capistrano/scm/svn" # install_plugin Capistrano::SCM::Svn # or require "capistrano/scm/git" install_plugin Capistrano::SCM::Git # Include tasks from other gems included in your Gemfile # # For documentation on these, see for example: # # https://github.com/capistrano/rvm # https://github.com/capistrano/rbenv # https://github.com/capistrano/chruby # https://github.com/capistrano/bundler # https://github.com/capistrano/rails # https://github.com/capistrano/passenger # # require "capistrano/rvm" # require "capistrano/rbenv" # require "capistrano/chruby" # require "capistrano/bundler" # require "capistrano/rails/assets" # require "capistrano/rails/migrations" # require "capistrano/passenger" # Load custom tasks from `lib/capistrano/tasks` if you have any defined Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r } capistrano-capistrano-603c346/lib/capistrano/templates/deploy.rb.erb000066400000000000000000000024651520217215100255720ustar00rootroot00000000000000# config valid for current version and patch releases of Capistrano lock "~> <%= Capistrano::VERSION %>" set :application, "my_app_name" set :repo_url, "git@example.com:me/my_repo.git" # Default branch is :master # ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp # Default deploy_to directory is /var/www/my_app_name # set :deploy_to, "/var/www/my_app_name" # Default value for :format is :airbrussh. # set :format, :airbrussh # You can configure the Airbrussh format using :format_options. # These are the defaults. # set :format_options, command_output: true, log_file: "log/capistrano.log", color: :auto, truncate: :auto # Default value for :pty is false # set :pty, true # Default value for :linked_files is [] # append :linked_files, "config/database.yml", 'config/master.key' # Default value for linked_dirs is [] # append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/system", "vendor", "storage" # Default value for default_env is {} # set :default_env, { path: "/opt/ruby/bin:$PATH" } # Default value for local_user is ENV['USER'] # set :local_user, -> { `git config user.name`.chomp } # Default value for keep_releases is 5 # set :keep_releases, 5 # Uncomment the following to require manually verifying the host key before first deploy. # set :ssh_options, verify_host_key: :secure capistrano-capistrano-603c346/lib/capistrano/templates/stage.rb.erb000066400000000000000000000040501520217215100253710ustar00rootroot00000000000000# server-based syntax # ====================== # Defines a single server with a list of roles and multiple properties. # You can define all roles on a single server, or split them: # server "example.com", user: "deploy", roles: %w{app db web}, my_property: :my_value # server "example.com", user: "deploy", roles: %w{app web}, other_property: :other_value # server "db.example.com", user: "deploy", roles: %w{db} # role-based syntax # ================== # Defines a role with one or multiple servers. The primary server in each # group is considered to be the first unless any hosts have the primary # property set. Specify the username and a domain or IP for the server. # Don't use `:all`, it's a meta role. # role :app, %w{deploy@example.com}, my_property: :my_value # role :web, %w{user1@primary.com user2@additional.com}, other_property: :other_value # role :db, %w{deploy@example.com} # Configuration # ============= # You can set any configuration variable like in config/deploy.rb # These variables are then only loaded and set in this stage. # For available Capistrano configuration variables see the documentation page. # http://capistranorb.com/documentation/getting-started/configuration/ # Feel free to add new variables to customise your setup. # Custom SSH Options # ================== # You may pass any option but keep in mind that net/ssh understands a # limited set of options, consult the Net::SSH documentation. # http://net-ssh.github.io/net-ssh/classes/Net/SSH.html#method-c-start # # Global options # -------------- # set :ssh_options, { # keys: %w(/home/user_name/.ssh/id_rsa), # forward_agent: false, # auth_methods: %w(password) # } # # The server-based syntax can be used to override options: # ------------------------------------ # server "example.com", # user: "user_name", # roles: %w{web app}, # ssh_options: { # user: "user_name", # overrides user setting above # keys: %w(/home/user_name/.ssh/id_rsa), # forward_agent: false, # auth_methods: %w(publickey password) # # password: "please use keys" # } capistrano-capistrano-603c346/lib/capistrano/upload_task.rb000066400000000000000000000003021520217215100240230ustar00rootroot00000000000000require "rake/file_creation_task" module Capistrano class UploadTask < Rake::FileCreationTask def needed? true # always needed because we can't check remote hosts end end end capistrano-capistrano-603c346/lib/capistrano/version.rb000066400000000000000000000000621520217215100232050ustar00rootroot00000000000000module Capistrano VERSION = "3.20.1".freeze end capistrano-capistrano-603c346/lib/capistrano/version_validator.rb000066400000000000000000000010201520217215100252450ustar00rootroot00000000000000module Capistrano class VersionValidator def initialize(version) @version = version end def verify return self if match? raise "Capfile locked at #{version}, but #{current_version} is loaded" end private attr_reader :version def match? available =~ requested end def current_version VERSION end def available Gem::Dependency.new("cap", version) end def requested Gem::Dependency.new("cap", current_version) end end end capistrano-capistrano-603c346/spec/000077500000000000000000000000001520217215100172165ustar00rootroot00000000000000capistrano-capistrano-603c346/spec/integration/000077500000000000000000000000001520217215100215415ustar00rootroot00000000000000capistrano-capistrano-603c346/spec/integration/dsl_spec.rb000066400000000000000000000506671520217215100237000ustar00rootroot00000000000000require "spec_helper" describe Capistrano::DSL do let(:dsl) { Class.new.extend Capistrano::DSL } before do Capistrano::Configuration.reset! end describe "setting and fetching hosts" do describe "when defining a host using the `server` syntax" do before do dsl.server "example1.com", roles: %w{web}, active: true dsl.server "example2.com", roles: %w{web} dsl.server "example3.com", roles: %w{app web}, active: true dsl.server "example4.com", roles: %w{app}, primary: true dsl.server "example5.com", roles: %w{db}, no_release: true, active: true end describe "fetching all servers" do subject { dsl.roles(:all) } it "returns all servers" do expect(subject.map(&:hostname)).to eq %w{example1.com example2.com example3.com example4.com example5.com} end end describe "fetching all release servers" do context "with no additional options" do subject { dsl.release_roles(:all) } it "returns all release servers" do expect(subject.map(&:hostname)).to eq %w{example1.com example2.com example3.com example4.com} end end context "with property filter options" do subject { dsl.release_roles(:all, filter: :active) } it "returns all release servers that match the property filter" do expect(subject.map(&:hostname)).to eq %w{example1.com example3.com} end end end describe "fetching servers by multiple roles" do it "does not confuse the last role with options" do expect(dsl.roles(:app, :web).count).to eq 4 expect(dsl.roles(:app, :web, filter: :active).count).to eq 2 end end describe "fetching servers by role" do subject { dsl.roles(:app) } it "returns the servers" do expect(subject.map(&:hostname)).to eq %w{example3.com example4.com} end end describe "fetching servers by an array of roles" do subject { dsl.roles([:app]) } it "returns the servers" do expect(subject.map(&:hostname)).to eq %w{example3.com example4.com} end end describe "fetching filtered servers by role" do subject { dsl.roles(:app, filter: :active) } it "returns the servers" do expect(subject.map(&:hostname)).to eq %w{example3.com} end end describe "fetching selected servers by role" do subject { dsl.roles(:app, select: :active) } it "returns the servers" do expect(subject.map(&:hostname)).to eq %w{example3.com} end end describe "fetching the primary server by role" do context "when inferring primary status based on order" do subject { dsl.primary(:web) } it "returns the servers" do expect(subject.hostname).to eq "example1.com" end end context "when the attribute `primary` is explicitly set" do subject { dsl.primary(:app) } it "returns the servers" do expect(subject.hostname).to eq "example4.com" end end end describe "setting an internal host filter" do subject { dsl.roles(:app) } it "is ignored" do dsl.set :filter, host: "example3.com" expect(subject.map(&:hostname)).to eq(["example3.com", "example4.com"]) end end describe "setting an internal role filter" do subject { dsl.roles(:app) } it "ignores it" do dsl.set :filter, role: :web expect(subject.map(&:hostname)).to eq(["example3.com", "example4.com"]) end end describe "setting an internal host and role filter" do subject { dsl.roles(:app) } it "ignores it" do dsl.set :filter, role: :web, host: "example1.com" expect(subject.map(&:hostname)).to eq(["example3.com", "example4.com"]) end end describe "setting an internal regexp host filter" do subject { dsl.roles(:all) } it "is ignored" do dsl.set :filter, host: /1/ expect(subject.map(&:hostname)).to eq(%w{example1.com example2.com example3.com example4.com example5.com}) end end describe "setting an internal hosts filter" do subject { dsl.roles(:app) } it "is ignored" do dsl.set :filter, hosts: "example3.com" expect(subject.map(&:hostname)).to eq(["example3.com", "example4.com"]) end end describe "setting an internal roles filter" do subject { dsl.roles(:app) } it "ignores it" do dsl.set :filter, roles: :web expect(subject.map(&:hostname)).to eq(["example3.com", "example4.com"]) end end describe "setting an internal hosts and roles filter" do subject { dsl.roles(:app) } it "ignores it" do dsl.set :filter, roles: :web, hosts: "example1.com" expect(subject.map(&:hostname)).to eq(["example3.com", "example4.com"]) end end describe "setting an internal regexp hosts filter" do subject { dsl.roles(:all) } it "is ignored" do dsl.set :filter, hosts: /1/ expect(subject.map(&:hostname)).to eq(%w{example1.com example2.com example3.com example4.com example5.com}) end end end describe "when defining role with reserved name" do it "fails with ArgumentError" do expect do dsl.role :all, %w{example1.com} end.to raise_error(ArgumentError, "all reserved name for role. Please choose another name") end end describe "when defining hosts using the `role` syntax" do before do dsl.role :web, %w{example1.com example2.com example3.com} dsl.role :web, %w{example1.com}, active: true dsl.role :app, %w{example3.com example4.com} dsl.role :app, %w{example3.com}, active: true dsl.role :app, %w{example4.com}, primary: true dsl.role :db, %w{example5.com}, no_release: true end describe "fetching all servers" do subject { dsl.roles(:all) } it "returns all servers" do expect(subject.map(&:hostname)).to eq %w{example1.com example2.com example3.com example4.com example5.com} end end describe "fetching all release servers" do context "with no additional options" do subject { dsl.release_roles(:all) } it "returns all release servers" do expect(subject.map(&:hostname)).to eq %w{example1.com example2.com example3.com example4.com} end end context "with filter options" do subject { dsl.release_roles(:all, filter: :active) } it "returns all release servers that match the filter" do expect(subject.map(&:hostname)).to eq %w{example1.com example3.com} end end end describe "fetching servers by role" do subject { dsl.roles(:app) } it "returns the servers" do expect(subject.map(&:hostname)).to eq %w{example3.com example4.com} end end describe "fetching servers by an array of roles" do subject { dsl.roles([:app]) } it "returns the servers" do expect(subject.map(&:hostname)).to eq %w{example3.com example4.com} end end describe "fetching filtered servers by role" do subject { dsl.roles(:app, filter: :active) } it "returns the servers" do expect(subject.map(&:hostname)).to eq %w{example3.com} end end describe "fetching selected servers by role" do subject { dsl.roles(:app, select: :active) } it "returns the servers" do expect(subject.map(&:hostname)).to eq %w{example3.com} end end describe "fetching the primary server by role" do context "when inferring primary status based on order" do subject { dsl.primary(:web) } it "returns the servers" do expect(subject.hostname).to eq "example1.com" end end context "when the attribute `primary` is explicitly set" do subject { dsl.primary(:app) } it "returns the servers" do expect(subject.hostname).to eq "example4.com" end end end end describe "when defining a host using a combination of the `server` and `role` syntax" do before do dsl.server "db@example1.com:1234", roles: %w{db}, active: true dsl.server "root@example1.com:1234", roles: %w{web}, active: true dsl.server "example1.com:5678", roles: %w{web}, active: true dsl.role :app, %w{deployer@example1.com:1234} dsl.role :app, %w{example1.com:5678} end describe "fetching all servers" do it "creates one server per hostname, ignoring user combinations" do expect(dsl.roles(:all).size).to eq(2) end end describe "fetching servers for a role" do it "roles defined using the `server` syntax are included" do as = dsl.roles(:web).map { |server| "#{server.user}@#{server.hostname}:#{server.port}" } expect(as.size).to eq(2) expect(as[0]).to eq("deployer@example1.com:1234") expect(as[1]).to eq("@example1.com:5678") end it "roles defined using the `role` syntax are included" do as = dsl.roles(:app).map { |server| "#{server.user}@#{server.hostname}:#{server.port}" } expect(as.size).to eq(2) expect(as[0]).to eq("deployer@example1.com:1234") expect(as[1]).to eq("@example1.com:5678") end end end describe "when setting user and port" do subject { dsl.roles(:all).map { |server| "#{server.user}@#{server.hostname}:#{server.port}" }.first } describe "using the :user property" do it "takes precedence over in the host string" do dsl.server "db@example1.com:1234", roles: %w{db}, active: true, user: "brian" expect(subject).to eq("brian@example1.com:1234") end end describe "using the :port property" do it "takes precedence over in the host string" do dsl.server "db@example1.com:9090", roles: %w{db}, active: true, port: 1234 expect(subject).to eq("db@example1.com:1234") end end end end describe "setting and fetching variables" do before do dsl.set :scm, :git end context "without a default" do context "when the variables is defined" do it "returns the variable" do expect(dsl.fetch(:scm)).to eq :git end end context "when the variables is undefined" do it "returns nil" do expect(dsl.fetch(:source_control)).to be_nil end end end context "with a default" do context "when the variables is defined" do it "returns the variable" do expect(dsl.fetch(:scm, :svn)).to eq :git end end context "when the variables is undefined" do it "returns the default" do expect(dsl.fetch(:source_control, :svn)).to eq :svn end end end context "with a block" do context "when the variables is defined" do it "returns the variable" do expect(dsl.fetch(:scm) { :svn }).to eq :git end end context "when the variables is undefined" do it "calls the block" do expect(dsl.fetch(:source_control) { :svn }).to eq :svn end end end end describe "asking for a variable" do let(:stdin) { stub(tty?: true) } before do dsl.ask(:scm, :svn, stdin: stdin) $stdout.stubs(:print) end context "variable is provided" do before do stdin.expects(:gets).returns("git") end it "sets the input as the variable" do expect(dsl.fetch(:scm)).to eq "git" end end context "variable is not provided" do before do stdin.expects(:gets).returns("") end it "sets the variable as the default" do expect(dsl.fetch(:scm)).to eq :svn end end end describe "checking for presence" do subject { dsl.any? :linked_files } before do dsl.set(:linked_files, linked_files) end context "variable is an non-empty array" do let(:linked_files) { %w{1} } it { expect(subject).to be_truthy } end context "variable is an empty array" do let(:linked_files) { [] } it { expect(subject).to be_falsey } end context "variable exists, is not an array" do let(:linked_files) { stub } it { expect(subject).to be_truthy } end context "variable is nil" do let(:linked_files) { nil } it { expect(subject).to be_falsey } end end describe "configuration SSHKit" do let(:config) { SSHKit.config } let(:backend) { SSHKit.config.backend.config } let(:default_env) { { rails_env: :production } } before do dsl.set(:format, :dot) dsl.set(:log_level, :debug) dsl.set(:default_env, default_env) dsl.set(:pty, true) dsl.set(:connection_timeout, 10) dsl.set(:ssh_options, keys: %w(/home/user/.ssh/id_rsa), forward_agent: false, auth_methods: %w(publickey password)) dsl.configure_backend end it "sets the output" do expect(config.output).to be_a SSHKit::Formatter::Dot end it "sets the output verbosity" do expect(config.output_verbosity).to eq 0 end it "sets the default env" do expect(config.default_env).to eq default_env end it "sets the backend pty" do expect(backend.pty).to be_truthy end it "sets the backend connection timeout" do expect(backend.connection_timeout).to eq 10 end it "sets the backend ssh_options" do expect(backend.ssh_options[:keys]).to eq %w(/home/user/.ssh/id_rsa) expect(backend.ssh_options[:forward_agent]).to eq false expect(backend.ssh_options[:auth_methods]).to eq %w(publickey password) end end describe "on()" do describe "when passed server objects" do before do dsl.server "example1.com", roles: %w{web}, active: true dsl.server "example2.com", roles: %w{web} dsl.server "example3.com", roles: %w{app web}, active: true dsl.server "example4.com", roles: %w{app}, primary: true dsl.server "example5.com", roles: %w{db}, no_release: true @coordinator = mock("coordinator") @coordinator.expects(:each).returns(nil) ENV.delete "ROLES" ENV.delete "HOSTS" end it "filters by role from the :filter variable" do hosts = dsl.roles(:web) all = dsl.roles(:all) SSHKit::Coordinator.expects(:new).with(hosts).returns(@coordinator) dsl.set :filter, role: "web" dsl.on(all) end it "filters by host and role from the :filter variable" do all = dsl.roles(:all) SSHKit::Coordinator.expects(:new).with([]).returns(@coordinator) dsl.set :filter, role: "db", host: "example3.com" dsl.on(all) end it "filters by roles from the :filter variable" do hosts = dsl.roles(:web) all = dsl.roles(:all) SSHKit::Coordinator.expects(:new).with(hosts).returns(@coordinator) dsl.set :filter, roles: "web" dsl.on(all) end it "filters by hosts and roles from the :filter variable" do all = dsl.roles(:all) SSHKit::Coordinator.expects(:new).with([]).returns(@coordinator) dsl.set :filter, roles: "db", hosts: "example3.com" dsl.on(all) end it "filters from ENV[ROLES]" do hosts = dsl.roles(:db) all = dsl.roles(:all) SSHKit::Coordinator.expects(:new).with(hosts).returns(@coordinator) ENV["ROLES"] = "db" dsl.on(all) end it "filters from ENV[HOSTS]" do hosts = dsl.roles(:db) all = dsl.roles(:all) SSHKit::Coordinator.expects(:new).with(hosts).returns(@coordinator) ENV["HOSTS"] = "example5.com" dsl.on(all) end it "filters by ENV[HOSTS] && ENV[ROLES]" do all = dsl.roles(:all) SSHKit::Coordinator.expects(:new).with([]).returns(@coordinator) ENV["HOSTS"] = "example5.com" ENV["ROLES"] = "web" dsl.on(all) end end describe "when passed server literal names" do before do ENV.delete "ROLES" ENV.delete "HOSTS" @coordinator = mock("coordinator") @coordinator.expects(:each).returns(nil) end it "selects nothing when a role filter is present" do dsl.set :filter, role: "web" SSHKit::Coordinator.expects(:new).with([]).returns(@coordinator) dsl.on("my.server") end it "selects using the string when a host filter is present" do dsl.set :filter, host: "server.local" SSHKit::Coordinator.expects(:new).with(["server.local"]).returns(@coordinator) dsl.on("server.local") end it "doesn't select when a host filter is present that doesn't match" do dsl.set :filter, host: "ruby.local" SSHKit::Coordinator.expects(:new).with([]).returns(@coordinator) dsl.on("server.local") end it "selects nothing when a roles filter is present" do dsl.set :filter, roles: "web" SSHKit::Coordinator.expects(:new).with([]).returns(@coordinator) dsl.on("my.server") end it "selects using the string when a hosts filter is present" do dsl.set :filter, hosts: "server.local" SSHKit::Coordinator.expects(:new).with(["server.local"]).returns(@coordinator) dsl.on("server.local") end it "doesn't select when a hosts filter is present that doesn't match" do dsl.set :filter, hosts: "ruby.local" SSHKit::Coordinator.expects(:new).with([]).returns(@coordinator) dsl.on("server.local") end end end describe "role_properties()" do before do dsl.role :redis, %w[example1.com example2.com], redis: { port: 6379, type: :slave } dsl.server "example1.com", roles: %w{web}, active: true, web: { port: 80 } dsl.server "example2.com", roles: %w{web redis}, web: { port: 81 }, redis: { type: :master } dsl.server "example3.com", roles: %w{app}, primary: true end it "retrieves properties for a single role as a set" do rps = dsl.role_properties(:app) expect(rps).to eq(Set[{ hostname: "example3.com", role: :app }]) end it "retrieves properties for multiple roles as a set" do rps = dsl.role_properties(:app, :web) expect(rps).to eq(Set[{ hostname: "example3.com", role: :app }, { hostname: "example1.com", role: :web, port: 80 }, { hostname: "example2.com", role: :web, port: 81 }]) end it "yields the properties for a single role" do recipient = mock("recipient") recipient.expects(:doit).with("example1.com", :redis, { port: 6379, type: :slave }) recipient.expects(:doit).with("example2.com", :redis, { port: 6379, type: :master }) dsl.role_properties(:redis) do |host, role, props| recipient.doit(host, role, props) end end it "yields the properties for multiple roles" do recipient = mock("recipient") recipient.expects(:doit).with("example1.com", :redis, { port: 6379, type: :slave }) recipient.expects(:doit).with("example2.com", :redis, { port: 6379, type: :master }) recipient.expects(:doit).with("example3.com", :app, nil) dsl.role_properties(:redis, :app) do |host, role, props| recipient.doit(host, role, props) end end it "yields the merged properties for multiple roles" do recipient = mock("recipient") recipient.expects(:doit).with("example1.com", :redis, { port: 6379, type: :slave }) recipient.expects(:doit).with("example2.com", :redis, { port: 6379, type: :master }) recipient.expects(:doit).with("example1.com", :web, { port: 80 }) recipient.expects(:doit).with("example2.com", :web, { port: 81 }) dsl.role_properties(:redis, :web) do |host, role, props| recipient.doit(host, role, props) end end it "honours a property filter before yielding" do recipient = mock("recipient") recipient.expects(:doit).with("example1.com", :redis, { port: 6379, type: :slave }) recipient.expects(:doit).with("example1.com", :web, { port: 80 }) dsl.role_properties(:redis, :web, select: :active) do |host, role, props| recipient.doit(host, role, props) end end end end capistrano-capistrano-603c346/spec/integration_spec_helper.rb000066400000000000000000000001351520217215100244360ustar00rootroot00000000000000require "spec_helper" require "support/test_app" require "support/matchers" include TestApp capistrano-capistrano-603c346/spec/lib/000077500000000000000000000000001520217215100177645ustar00rootroot00000000000000capistrano-capistrano-603c346/spec/lib/capistrano/000077500000000000000000000000001520217215100221275ustar00rootroot00000000000000capistrano-capistrano-603c346/spec/lib/capistrano/application_spec.rb000066400000000000000000000035541520217215100260000ustar00rootroot00000000000000require "spec_helper" describe Capistrano::Application do it "provides a --trace option which enables SSHKit/NetSSH trace output" it "provides a --format option which enables the choice of output formatting" it "displays documentation URL as help banner", capture_io: true do flags "--help", "-h" expect($stdout.string.each_line.first).to match(/capistranorb.com/) end %w(quiet silent verbose).each do |switch| it "doesn't include --#{switch} in help", capture_io: true do flags "--help", "-h" expect($stdout.string).not_to match(/--#{switch}/) end end it "overrides the rake method, but still prints the rake version", capture_io: true do flags "--version", "-V" out = $stdout.string expect(out).to match(/\bCapistrano Version\b/) expect(out).to match(/\b#{Capistrano::VERSION}\b/) expect(out).to match(/\bRake Version\b/) expect(out).to match(/\b#{Rake::VERSION}\b/) end it "overrides the rake method, and sets the sshkit_backend to SSHKit::Backend::Printer", capture_io: true do flags "--dry-run", "-n" sshkit_backend = Capistrano::Configuration.fetch(:sshkit_backend) expect(sshkit_backend).to eq(SSHKit::Backend::Printer) end it "enables printing all config variables on command line parameter", capture_io: true do begin flags "--print-config-variables", "-p" expect(Capistrano::Configuration.fetch(:print_config_variables)).to be true ensure Capistrano::Configuration.reset! end end def flags(*sets) sets.each do |set| ARGV.clear @exit = catch(:system_exit) { command_line(*set) } end yield(subject.options) if block_given? end def command_line(*options) options.each { |opt| ARGV << opt } subject.define_singleton_method(:exit) do |*_args| throw(:system_exit, :exit) end subject.run subject.options end end capistrano-capistrano-603c346/spec/lib/capistrano/configuration/000077500000000000000000000000001520217215100247765ustar00rootroot00000000000000capistrano-capistrano-603c346/spec/lib/capistrano/configuration/empty_filter_spec.rb000066400000000000000000000005341520217215100310420ustar00rootroot00000000000000require "spec_helper" module Capistrano class Configuration describe EmptyFilter do subject(:empty_filter) { EmptyFilter.new } describe "#filter" do let(:servers) { mock("servers") } it "returns an empty array" do expect(empty_filter.filter(servers)).to eq([]) end end end end end capistrano-capistrano-603c346/spec/lib/capistrano/configuration/filter_spec.rb000066400000000000000000000066621520217215100276340ustar00rootroot00000000000000require "spec_helper" module Capistrano class Configuration describe Filter do let(:available) do [ Server.new("server1").add_roles(%i(web db)), Server.new("server2").add_role(:web), Server.new("server3").add_role(:redis), Server.new("server4").add_role(:db), Server.new("server5").add_role(:stageweb) ] end describe "#new" do it "won't create an invalid type of filter" do expect do Filter.new(:zarg) end.to raise_error RuntimeError end context "with type :host" do context "and no values" do it "creates an EmptyFilter strategy" do expect(Filter.new(:host).instance_variable_get(:@strategy)).to be_a(EmptyFilter) end end context "and :all" do it "creates an NullFilter strategy" do expect(Filter.new(:host, :all).instance_variable_get(:@strategy)).to be_a(NullFilter) end end context "and [:all]" do it "creates an NullFilter strategy" do expect(Filter.new(:host, [:all]).instance_variable_get(:@strategy)).to be_a(NullFilter) end end context "and [:all]" do it "creates an NullFilter strategy" do expect(Filter.new(:host, "all").instance_variable_get(:@strategy)).to be_a(NullFilter) end end end context "with type :role" do context "and no values" do it "creates an EmptyFilter strategy" do expect(Filter.new(:role).instance_variable_get(:@strategy)).to be_a(EmptyFilter) end end context "and :all" do it "creates an NullFilter strategy" do expect(Filter.new(:role, :all).instance_variable_get(:@strategy)).to be_a(NullFilter) end end context "and [:all]" do it "creates an NullFilter strategy" do expect(Filter.new(:role, [:all]).instance_variable_get(:@strategy)).to be_a(NullFilter) end end context "and [:all]" do it "creates an NullFilter strategy" do expect(Filter.new(:role, "all").instance_variable_get(:@strategy)).to be_a(NullFilter) end end end end describe "#filter" do let(:strategy) { filter.instance_variable_get(:@strategy) } let(:results) { mock("result") } shared_examples "it calls #filter on its strategy" do it "calls #filter on its strategy" do strategy.expects(:filter).with(available).returns(results) expect(filter.filter(available)).to eq(results) end end context "for an empty filter" do let(:filter) { Filter.new(:role) } it_behaves_like "it calls #filter on its strategy" end context "for a null filter" do let(:filter) { Filter.new(:role, :all) } it_behaves_like "it calls #filter on its strategy" end context "for a role filter" do let(:filter) { Filter.new(:role, "web") } it_behaves_like "it calls #filter on its strategy" end context "for a host filter" do let(:filter) { Filter.new(:host, "server1") } it_behaves_like "it calls #filter on its strategy" end end end end end capistrano-capistrano-603c346/spec/lib/capistrano/configuration/host_filter_spec.rb000066400000000000000000000043341520217215100306630ustar00rootroot00000000000000require "spec_helper" module Capistrano class Configuration describe HostFilter do subject(:host_filter) { HostFilter.new(values) } let(:available) do [Server.new("server1"), Server.new("server2"), Server.new("server3"), Server.new("server4"), Server.new("server10")] end shared_examples "it filters hosts correctly" do |expected| it "filters correctly" do set = host_filter.filter(available) expect(set.map(&:hostname)).to eq(expected) end end describe "#filter" do context "with a string" do let(:values) { "server1" } it_behaves_like "it filters hosts correctly", %w{server1} context "and a single server" do let(:available) { Server.new("server1") } it_behaves_like "it filters hosts correctly", %w{server1} end end context "with a comma separated string" do let(:values) { "server1,server10" } it_behaves_like "it filters hosts correctly", %w{server1 server10} end context "with an array of strings" do let(:values) { %w{server1 server3} } it_behaves_like "it filters hosts correctly", %w{server1 server3} end context "with mixed splittable and unsplittable strings" do let(:values) { %w{server1 server2,server3} } it_behaves_like "it filters hosts correctly", %w{server1 server2 server3} end context "with a regexp" do let(:values) { "server[13]$" } it_behaves_like "it filters hosts correctly", %w{server1 server3} end context "with a regexp with line boundaries" do let(:values) { "^server" } it_behaves_like "it filters hosts correctly", %w{server1 server2 server3 server4 server10} end context "with a regexp with a comma" do let(:values) { 'server\d{1,3}$' } it_behaves_like "it filters hosts correctly", %w{server1 server2 server3 server4 server10} end context "without number" do let(:values) { "server" } it_behaves_like "it filters hosts correctly", %w{} end end end end end capistrano-capistrano-603c346/spec/lib/capistrano/configuration/null_filter_spec.rb000066400000000000000000000005611520217215100306560ustar00rootroot00000000000000require "spec_helper" module Capistrano class Configuration describe NullFilter do subject(:null_filter) { NullFilter.new } describe "#filter" do let(:servers) { mock("servers") } it "returns the servers passed in as arguments" do expect(null_filter.filter(servers)).to eq(servers) end end end end end capistrano-capistrano-603c346/spec/lib/capistrano/configuration/plugin_installer_spec.rb000066400000000000000000000047141520217215100317160ustar00rootroot00000000000000require "spec_helper" require "capistrano/plugin" require "capistrano/scm/plugin" module Capistrano class Configuration class ExamplePlugin < Capistrano::Plugin def set_defaults set_if_empty :example_variable, "foo" end def define_tasks task :example task :example_prerequisite end def register_hooks before :example, :example_prerequisite end end class ExampleSCMPlugin < Capistrano::SCM::Plugin end describe PluginInstaller do include Capistrano::DSL let(:installer) { PluginInstaller.new } let(:options) { {} } let(:plugin) { ExamplePlugin.new } before do installer.install(plugin, **options) end after do Rake::Task.clear Capistrano::Configuration.reset! end context "installing plugin" do it "defines tasks" do expect(Rake::Task[:example]).to_not be_nil expect(Rake::Task[:example_prerequisite]).to_not be_nil end it "registers hooks" do task = Rake::Task[:example] expect(task.prerequisites).to eq([:example_prerequisite]) end it "sets defaults when load:defaults is invoked", capture_io: true do expect(fetch(:example_variable)).to be_nil invoke "load:defaults" expect(fetch(:example_variable)).to eq("foo") end it "doesn't say an SCM is installed" do expect(installer.scm_installed?).to be_falsey end end context "installing plugin class" do let(:plugin) { ExamplePlugin } it "defines tasks" do expect(Rake::Task[:example]).to_not be_nil expect(Rake::Task[:example_prerequisite]).to_not be_nil end end context "installing plugin without hooks" do let(:options) { { load_hooks: false } } it "doesn't register hooks" do task = Rake::Task[:example] expect(task.prerequisites).to be_empty end end context "installing plugin and loading immediately" do let(:options) { { load_immediately: true } } it "sets defaults immediately" do expect(fetch(:example_variable)).to eq("foo") end end context "installing an SCM plugin" do let(:plugin) { ExampleSCMPlugin } it "says an SCM is installed" do expect(installer.scm_installed?).to be_truthy end end end end end capistrano-capistrano-603c346/spec/lib/capistrano/configuration/question_spec.rb000066400000000000000000000060111520217215100302020ustar00rootroot00000000000000require "spec_helper" module Capistrano class Configuration describe Question do let(:question) { Question.new(key, default, stdin: stdin) } let(:question_without_echo) { Question.new(key, default, echo: false, stdin: stdin) } let(:question_without_default) { Question.new(key, nil, stdin: stdin) } let(:question_prompt) { Question.new(key, default, stdin: stdin, prompt: "Your favorite branch") } let(:question_prompt_without_default) { Question.new(key, nil, stdin: stdin, prompt: "Your favorite branch") } let(:default) { :default } let(:key) { :branch } let(:stdin) { stub(tty?: true) } describe ".new" do it "takes a key, default, options" do question end end describe "#call" do context "value is entered" do let(:branch) { "branch" } it "returns the echoed value" do $stdout.expects(:print).with("Please enter branch (default): ") stdin.expects(:gets).returns(branch) stdin.expects(:noecho).never expect(question.call).to eq(branch) end it "returns the value but does not echo it" do $stdout.expects(:print).with("Please enter branch (default): ") stdin.expects(:noecho).returns(branch) $stdout.expects(:print).with("\n") expect(question_without_echo.call).to eq(branch) end it "returns the value but has no default between parenthesis" do $stdout.expects(:print).with("Please enter branch: ") stdin.expects(:gets).returns(branch) stdin.expects(:noecho).never expect(question_without_default.call).to eq(branch) end it "uses prompt and returns the value" do $stdout.expects(:print).with("Your favorite branch (default): ") stdin.expects(:gets).returns(branch) stdin.expects(:noecho).never expect(question_prompt.call).to eq(branch) end it "uses prompt and returns the value but has no default between parenthesis" do $stdout.expects(:print).with("Your favorite branch: ") stdin.expects(:gets).returns(branch) stdin.expects(:noecho).never expect(question_prompt_without_default.call).to eq(branch) end end context "value is not entered" do let(:branch) { default } before do $stdout.expects(:print).with("Please enter branch (default): ") stdin.expects(:gets).returns("") end it "returns the default as the value" do expect(question.call).to eq(branch) end end context "tty unavailable", capture_io: true do before do stdin.expects(:gets).never stdin.expects(:tty?).returns(false) end it "returns the default as the value" do expect(question.call).to eq(default) end end end end end end capistrano-capistrano-603c346/spec/lib/capistrano/configuration/role_filter_spec.rb000066400000000000000000000050071520217215100306450ustar00rootroot00000000000000require "spec_helper" module Capistrano class Configuration describe RoleFilter do subject(:role_filter) { RoleFilter.new(values) } let(:available) do [ Server.new("server1").add_roles(%i(web db)), Server.new("server2").add_role(:web), Server.new("server3").add_role(:redis), Server.new("server4").add_role(:db), Server.new("server5").add_role(:stageweb), Server.new("server6").add_role(:"db.new") ] end shared_examples "it filters roles correctly" do |expected_size, expected| it "filters correctly" do set = role_filter.filter(available) expect(set.size).to eq(expected_size) expect(set.map(&:hostname)).to eq(expected) end end describe "#filter" do context "with a single role string" do let(:values) { "web" } it_behaves_like "it filters roles correctly", 2, %w{server1 server2} end context "with a single role" do let(:values) { [:web] } it_behaves_like "it filters roles correctly", 2, %w{server1 server2} end context "with multiple roles in a string" do let(:values) { "web,db" } it_behaves_like "it filters roles correctly", 3, %w{server1 server2 server4} end context "with multiple roles" do let(:values) { %i(web db) } it_behaves_like "it filters roles correctly", 3, %w{server1 server2 server4} end context "with a regex" do let(:values) { /red/ } it_behaves_like "it filters roles correctly", 1, %w{server3} end context "with a regex string" do let(:values) { "/red|web/" } it_behaves_like "it filters roles correctly", 4, %w{server1 server2 server3 server5} end context "with both a string and regex" do let(:values) { "db,/red/" } it_behaves_like "it filters roles correctly", 3, %w{server1 server3 server4} end context "with a dot wildcard" do let(:values) { "db.*" } it_behaves_like "it filters roles correctly", 0, %w{} end context "with a dot" do let(:values) { "db.new" } it_behaves_like "it filters roles correctly", 1, %w{server6} end context "with a dot wildcard regex" do let(:values) { "/db.*/" } it_behaves_like "it filters roles correctly", 3, %w{server1 server4 server6} end end end end end capistrano-capistrano-603c346/spec/lib/capistrano/configuration/scm_resolver_spec.rb000066400000000000000000000026421520217215100310440ustar00rootroot00000000000000require "spec_helper" require "capistrano/scm" module Capistrano class Configuration describe SCMResolver do include Capistrano::DSL let(:resolver) { SCMResolver.new } before do Rake::Task.define_task("deploy:check") Rake::Task.define_task("deploy:new_release_path") Rake::Task.define_task("deploy:set_current_revision") Rake::Task.define_task("deploy:set_current_revision_time") set :scm, SCMResolver::DEFAULT_GIT end after do Rake::Task.clear Capistrano::Configuration.reset! end context "default scm, no plugin installed" do it "emits a warning" do expect { resolver.resolve }.to output(/will not load the git scm/i).to_stderr end it "activates the git scm", capture_io: true do resolver.resolve expect(Rake::Task["git:wrapper"]).not_to be_nil end it "sets :scm to :git", capture_io: true do resolver.resolve expect(fetch(:scm)).to eq(:git) end end context "default scm, git plugin installed" do before do install_plugin Capistrano::SCM::Git end it "emits no warning" do expect { resolver.resolve }.not_to output.to_stderr end it "deletes :scm" do resolver.resolve expect(fetch(:scm)).to be_nil end end end end end capistrano-capistrano-603c346/spec/lib/capistrano/configuration/server_spec.rb000066400000000000000000000213731520217215100276510ustar00rootroot00000000000000require "spec_helper" module Capistrano class Configuration describe Server do let(:server) { Server.new("root@hostname:1234") } describe "adding a role" do subject { server.add_role(:test) } it "adds the role" do expect { subject }.to change { server.roles.size }.from(0).to(1) end end describe "adding roles" do subject { server.add_roles(%i(things stuff)) } it "adds the roles" do expect { subject }.to change { server.roles.size }.from(0).to(2) end end describe "checking roles" do subject { server.has_role?(:test) } before do server.add_role(:test) end it "adds the role" do expect(subject).to be_truthy end end describe "comparing identity" do subject { server.hostname == Server[hostname].hostname } context "with the same user, hostname and port" do let(:hostname) { "root@hostname:1234" } it { expect(subject).to be_truthy } end context "with a different user" do let(:hostname) { "deployer@hostname:1234" } it { expect(subject).to be_truthy } end context "with a different port" do let(:hostname) { "root@hostname:5678" } it { expect(subject).to be_truthy } end context "with a different hostname" do let(:hostname) { "root@otherserver:1234" } it { expect(subject).to be_falsey } end end describe "identifying as primary" do subject { server.primary } context "server is primary" do before do server.set(:primary, true) end it "returns self" do expect(subject).to eq server end end context "server is not primary" do it "is falesy" do expect(subject).to be_falsey end end end describe "assigning properties" do before do server.with(properties) end context "properties contains roles" do let(:properties) { { roles: [:clouds] } } it "adds the roles" do expect(server.roles.first).to eq :clouds end end context "properties contains user" do let(:properties) { { user: "tomc" } } it "sets the user" do expect(server.user).to eq "tomc" end it "sets the netssh_options user" do expect(server.netssh_options[:user]).to eq "tomc" end end context "properties contains port" do let(:properties) { { port: 2222 } } it "sets the port" do expect(server.port).to eq 2222 end end context "properties contains key" do let(:properties) { { key: "/key" } } it "adds the key" do expect(server.keys).to include "/key" end end context "properties contains password" do let(:properties) { { password: "supersecret" } } it "adds the key" do expect(server.password).to eq "supersecret" end end context "new properties" do let(:properties) { { webscales: 5 } } it "adds the properties" do expect(server.properties.webscales).to eq 5 end end context "existing properties" do let(:properties) { { webscales: 6 } } it "keeps the existing properties" do expect(server.properties.webscales).to eq 6 server.properties.webscales = 5 expect(server.properties.webscales).to eq 5 end end end describe "#include?" do let(:options) { {} } subject { server.select?(options) } before do server.properties.active = true end context "options are empty" do it { expect(subject).to be_truthy } end context "value is a symbol" do context "value matches server property" do context "with :filter" do let(:options) { { filter: :active } } it { expect(subject).to be_truthy } end context "with :select" do let(:options) { { select: :active } } it { expect(subject).to be_truthy } end context "with :exclude" do let(:options) { { exclude: :active } } it { expect(subject).to be_falsey } end end context "value does not match server properly" do context "with :active true" do let(:options) { { active: true } } it { expect(subject).to be_truthy } end context "with :active false" do let(:options) { { active: false } } it { expect(subject).to be_falsey } end end context "value does not match server properly" do context "with :filter" do let(:options) { { filter: :inactive } } it { expect(subject).to be_falsey } end context "with :select" do let(:options) { { select: :inactive } } it { expect(subject).to be_falsey } end context "with :exclude" do let(:options) { { exclude: :inactive } } it { expect(subject).to be_truthy } end end end context "key is a property" do context "with :active true" do let(:options) { { active: true } } it { expect(subject).to be_truthy } end context "with :active false" do let(:options) { { active: false } } it { expect(subject).to be_falsey } end end context "value is a proc" do context "value matches server property" do context "with :filter" do let(:options) { { filter: ->(s) { s.properties.active } } } it { expect(subject).to be_truthy } end context "with :select" do let(:options) { { select: ->(s) { s.properties.active } } } it { expect(subject).to be_truthy } end context "with :exclude" do let(:options) { { exclude: ->(s) { s.properties.active } } } it { expect(subject).to be_falsey } end end context "value does not match server properly" do context "with :filter" do let(:options) { { filter: ->(s) { s.properties.inactive } } } it { expect(subject).to be_falsey } end context "with :select" do let(:options) { { select: ->(s) { s.properties.inactive } } } it { expect(subject).to be_falsey } end context "with :exclude" do let(:options) { { exclude: ->(s) { s.properties.inactive } } } it { expect(subject).to be_truthy } end end end end describe "assign ssh_options" do let(:server) { Server.new("user_name@hostname") } context "defaults" do it "forward agent" do expect(server.netssh_options[:forward_agent]).to eq true end it "contains user" do expect(server.netssh_options[:user]).to eq "user_name" end end context "custom" do let(:properties) do { ssh_options: { user: "another_user", keys: %w(/home/another_user/.ssh/id_rsa), forward_agent: false, auth_methods: %w(publickey password) } } end before do server.with(properties) end it "not forward agent" do expect(server.netssh_options[:forward_agent]).to eq false end it "contains correct user" do expect(server.netssh_options[:user]).to eq "another_user" end it "does not affect server user in host" do expect(server.user).to eq "user_name" end it "contains keys" do expect(server.netssh_options[:keys]).to eq %w(/home/another_user/.ssh/id_rsa) end it "contains auth_methods" do expect(server.netssh_options[:auth_methods]).to eq %w(publickey password) end end end describe ".[]" do it "creates a server if its argument is not already a server" do expect(Server["hostname:1234"]).to be_a Server end it "returns its argument if it is already a server" do expect(Server[server]).to be server end end end end end capistrano-capistrano-603c346/spec/lib/capistrano/configuration/servers_spec.rb000066400000000000000000000302221520217215100300250ustar00rootroot00000000000000require "spec_helper" module Capistrano class Configuration describe Servers do let(:servers) { Servers.new } describe "adding a role" do it "adds two new server instances" do expect { servers.add_role(:app, %w{1 2}) } .to change { servers.count }.from(0).to(2) end it "handles de-duplification within roles" do servers.add_role(:app, %w{1}) servers.add_role(:app, %w{1}) expect(servers.count).to eq 1 end it "handles de-duplification within roles with users" do servers.add_role(:app, %w{1}, user: "nick") servers.add_role(:app, %w{1}, user: "fred") expect(servers.count).to eq 1 end it "accepts instances of server objects" do servers.add_role(:app, [Capistrano::Configuration::Server.new("example.net"), "example.com"]) expect(servers.roles_for([:app]).length).to eq 2 end it "accepts non-enumerable types" do servers.add_role(:app, "1") expect(servers.roles_for([:app]).count).to eq 1 end it "creates distinct server properties" do servers.add_role(:db, %w{1 2}, db: { port: 1234 }) servers.add_host("1", db: { master: true }) expect(servers.count).to eq(2) expect(servers.roles_for([:db]).count).to eq 2 expect(servers.find { |s| s.hostname == "1" }.properties.db).to eq(port: 1234, master: true) expect(servers.find { |s| s.hostname == "2" }.properties.db).to eq(port: 1234) end end describe "adding a role to an existing server" do before do servers.add_role(:web, %w{1 2}) servers.add_role(:app, %w{1 2}) end it "adds new roles to existing servers" do expect(servers.count).to eq 2 end end describe "collecting server roles" do let(:app) { Set.new([:app]) } let(:web_app) { Set.new(%i(web app)) } let(:web) { Set.new([:web]) } before do servers.add_role(:app, %w{1 2 3}) servers.add_role(:web, %w{2 3 4}) end it "returns an array of the roles" do expect(servers.roles_for([:app]).collect(&:roles)).to eq [app, web_app, web_app] expect(servers.roles_for([:web]).collect(&:roles)).to eq [web_app, web_app, web] end end describe "finding the primary server" do after do Configuration.reset! end it "takes the first server if none have the primary property" do servers.add_role(:app, %w{1 2}) expect(servers.fetch_primary(:app).hostname).to eq("1") end it "takes the first server with the primary have the primary flag" do servers.add_role(:app, %w{1 2}) servers.add_host("2", primary: true) expect(servers.fetch_primary(:app).hostname).to eq("2") end it "ignores any on_filters" do Configuration.env.set :filter, host: "1" servers.add_role(:app, %w{1 2}) servers.add_host("2", primary: true) expect(servers.fetch_primary(:app).hostname).to eq("2") end end describe "fetching servers" do before do servers.add_role(:app, %w{1 2}) servers.add_role(:web, %w{2 3}) end it "returns the correct app servers" do expect(servers.roles_for([:app]).map(&:hostname)).to eq %w{1 2} end it "returns the correct web servers" do expect(servers.roles_for([:web]).map(&:hostname)).to eq %w{2 3} end it "returns the correct app and web servers" do expect(servers.roles_for(%i(app web)).map(&:hostname)).to eq %w{1 2 3} end it "returns all servers" do expect(servers.roles_for([:all]).map(&:hostname)).to eq %w{1 2 3} end end describe "adding a server" do before do servers.add_host("1", roles: [:app, "web"], test: :value) end it "can create a server with properties" do expect(servers.roles_for([:app]).first.hostname).to eq "1" expect(servers.roles_for([:web]).first.hostname).to eq "1" expect(servers.roles_for([:all]).first.properties.test).to eq :value expect(servers.roles_for([:all]).first.properties.keys).to eq [:test] end it "can accept multiple servers with the same hostname but different ports or users" do servers.add_host("1", roles: [:app, "web"], test: :value, port: 12) expect(servers.count).to eq(2) servers.add_host("1", roles: [:app, "web"], test: :value, port: 34) servers.add_host("1", roles: [:app, "web"], test: :value, user: "root") servers.add_host("1", roles: [:app, "web"], test: :value, user: "deployer") servers.add_host("1", roles: [:app, "web"], test: :value, user: "root", port: 34) servers.add_host("1", roles: [:app, "web"], test: :value, user: "deployer", port: 34) servers.add_host("1", roles: [:app, "web"], test: :value, user: "deployer", port: 56) expect(servers.count).to eq(4) end describe "with a :user property" do it "sets the server ssh username" do servers.add_host("1", roles: [:app, "web"], user: "nick") expect(servers.count).to eq(1) expect(servers.roles_for([:all]).first.user).to eq "nick" end it "overwrites the value of a user specified in the hostname" do servers.add_host("brian@1", roles: [:app, "web"], user: "nick") expect(servers.count).to eq(1) expect(servers.roles_for([:all]).first.user).to eq "nick" end end it "overwrites the value of a previously defined scalar property" do servers.add_host("1", roles: [:app, "web"], test: :volatile) expect(servers.count).to eq(1) expect(servers.roles_for([:all]).first.properties.test).to eq :volatile end it "merges previously defined hash properties" do servers.add_host("1", roles: [:b], db: { port: 1234 }) servers.add_host("1", roles: [:b], db: { master: true }) expect(servers.count).to eq(1) expect(servers.roles_for([:b]).first.properties.db).to eq(port: 1234, master: true) end it "concatenates previously defined array properties" do servers.add_host("1", roles: [:b], steps: [1, 3, 5]) servers.add_host("1", roles: [:b], steps: [1, 9]) expect(servers.count).to eq(1) expect(servers.roles_for([:b]).first.properties.steps).to eq([1, 3, 5, 1, 9]) end it "merges previously defined set properties" do servers.add_host("1", roles: [:b], endpoints: Set[123, 333]) servers.add_host("1", roles: [:b], endpoints: Set[222, 333]) expect(servers.count).to eq(1) expect(servers.roles_for([:b]).first.properties.endpoints).to eq(Set[123, 222, 333]) end it "adds array property value only ones for a new host" do servers.add_host("2", roles: [:array_test], array_property: [1, 2]) expect(servers.roles_for([:array_test]).first.properties.array_property).to eq [1, 2] end it "updates roles when custom user defined" do servers.add_host("1", roles: ["foo"], user: "custom") servers.add_host("1", roles: ["bar"], user: "custom") expect(servers.roles_for([:foo]).first.hostname).to eq "1" expect(servers.roles_for([:bar]).first.hostname).to eq "1" end it "updates roles when custom port defined" do servers.add_host("1", roles: ["foo"], port: 1234) servers.add_host("1", roles: ["bar"], port: 1234) expect(servers.roles_for([:foo]).first.hostname).to eq "1" expect(servers.roles_for([:bar]).first.hostname).to eq "1" end end describe "selecting roles" do before do servers.add_host("1", roles: :app, active: true) servers.add_host("2", roles: :app) end it "is empty if the filter would remove all matching hosts" do expect(servers.roles_for([:app, select: :inactive])).to be_empty end it "can filter hosts by properties on the host object using symbol as shorthand" do expect(servers.roles_for([:app, filter: :active]).length).to eq 1 end it "can select hosts by properties on the host object using symbol as shorthand" do expect(servers.roles_for([:app, select: :active]).length).to eq 1 end it "can filter hosts by properties on the host using a regular proc" do expect(servers.roles_for([:app, filter: ->(h) { h.properties.active }]).length).to eq 1 end it "can select hosts by properties on the host using a regular proc" do expect(servers.roles_for([:app, select: ->(h) { h.properties.active }]).length).to eq 1 end it "is empty if the regular proc filter would remove all matching hosts" do expect(servers.roles_for([:app, select: ->(h) { h.properties.inactive }])).to be_empty end end describe "excluding by property" do before do servers.add_host("1", roles: :app, active: true) servers.add_host("2", roles: :app, active: true, no_release: true) end it "is empty if the filter would remove all matching hosts" do hosts = servers.roles_for([:app, exclude: :active]) expect(hosts.map(&:hostname)).to be_empty end it "returns the servers without the attributes specified" do hosts = servers.roles_for([:app, exclude: :no_release]) expect(hosts.map(&:hostname)).to eq %w{1} end it "can exclude hosts by properties on the host using a regular proc" do hosts = servers.roles_for([:app, exclude: ->(h) { h.properties.no_release }]) expect(hosts.map(&:hostname)).to eq %w{1} end it "is empty if the regular proc filter would remove all matching hosts" do hosts = servers.roles_for([:app, exclude: ->(h) { h.properties.active }]) expect(hosts.map(&:hostname)).to be_empty end end describe "filtering roles internally" do before do servers.add_host("1", roles: :app, active: true) servers.add_host("2", roles: :app) servers.add_host("3", roles: :web) servers.add_host("4", roles: :web) servers.add_host("5", roles: :db) end subject { servers.roles_for(roles).map(&:hostname) } context "with the ROLES environment variable set" do before do ENV.stubs(:[]).with("ROLES").returns("web,db") ENV.stubs(:[]).with("HOSTS").returns(nil) end context "when selecting all roles" do let(:roles) { [:all] } it "ignores it" do expect(subject).to eq %w{1 2 3 4 5} end end context "when selecting specific roles" do let(:roles) { %i(app web) } it "ignores it" do expect(subject).to eq %w{1 2 3 4} end end context "when selecting roles not included in ROLE" do let(:roles) { [:app] } it "ignores it" do expect(subject).to eq %w{1 2} end end end context "with the HOSTS environment variable set" do before do ENV.stubs(:[]).with("ROLES").returns(nil) ENV.stubs(:[]).with("HOSTS").returns("3,5") end context "when selecting all roles" do let(:roles) { [:all] } it "ignores it" do expect(subject).to eq %w{1 2 3 4 5} end end context "when selecting specific roles" do let(:roles) { %i(app web) } it "ignores it" do expect(subject).to eq %w{1 2 3 4} end end context "when selecting no roles" do let(:roles) { [] } it "ignores it" do expect(subject).to be_empty end end end end end end end capistrano-capistrano-603c346/spec/lib/capistrano/configuration_spec.rb000066400000000000000000000236121520217215100263410ustar00rootroot00000000000000require "spec_helper" module Capistrano describe Configuration do let(:config) { Configuration.new } let(:servers) { stub } describe ".new" do it "accepts initial hash" do configuration = described_class.new(custom: "value") expect(configuration.fetch(:custom)).to eq("value") end end describe ".env" do it "is a global accessor to a single instance" do Configuration.env.set(:test, true) expect(Configuration.env.fetch(:test)).to be_truthy end end describe ".reset!" do it "blows away the existing `env` and creates a new one" do old_env = Configuration.env Configuration.reset! expect(Configuration.env).not_to be old_env end end describe "roles" do context "adding a role" do subject { config.role(:app, %w{server1 server2}) } before do Configuration::Servers.expects(:new).returns(servers) servers.expects(:add_role).with(:app, %w{server1 server2}, {}) end it "adds the role" do expect(subject) end end end describe "setting and fetching" do subject { config.fetch(:key, :default) } context "set" do it "sets by value" do config.set(:key, :value) expect(subject).to eq :value end it "sets by block" do config.set(:key) { :value } expect(subject).to eq :value end it "raises an exception when given both a value and block" do expect { config.set(:key, :value) { :value } }.to raise_error(Capistrano::ValidationError) end end context "set_if_empty" do it "sets by value when none is present" do config.set_if_empty(:key, :value) expect(subject).to eq :value end it "sets by block when none is present" do config.set_if_empty(:key) { :value } expect(subject).to eq :value end it "does not overwrite existing values" do config.set(:key, :value) config.set_if_empty(:key, :update) config.set_if_empty(:key) { :update } expect(subject).to eq :value end end context "value is not set" do it "returns the default value" do expect(subject).to eq :default end end context "value is a proc" do subject { config.fetch(:key, proc { :proc }) } it "calls the proc" do expect(subject).to eq :proc end end context "value is a lambda" do subject { config.fetch(:key, -> { :lambda }) } it "calls the lambda" do expect(subject).to eq :lambda end end context "value inside proc inside a proc" do subject { config.fetch(:key, proc { proc { "some value" } }) } it "calls all procs and lambdas" do expect(subject).to eq "some value" end end context "value inside lambda inside a lambda" do subject { config.fetch(:key, -> { -> { "some value" } }) } it "calls all procs and lambdas" do expect(subject).to eq "some value" end end context "value inside lambda inside a proc" do subject { config.fetch(:key, proc { -> { "some value" } }) } it "calls all procs and lambdas" do expect(subject).to eq "some value" end end context "value inside proc inside a lambda" do subject { config.fetch(:key, -> { proc { "some value" } }) } it "calls all procs and lambdas" do expect(subject).to eq "some value" end end context "lambda with parameters" do subject { config.fetch(:key, ->(c) { c }).call(42) } it "is returned as a lambda" do expect(subject).to eq 42 end end context "block is passed to fetch" do subject { config.fetch(:key, :default) { raise "we need this!" } } it "returns the block value" do expect { subject }.to raise_error(RuntimeError) end end context "validations" do before do config.validate :key do |_, value| raise Capistrano::ValidationError unless value.length > 3 end end it "validates string without error" do config.set(:key, "longer_value") end it "validates block without error" do config.set(:key) { "longer_value" } expect(config.fetch(:key)).to eq "longer_value" end it "validates lambda without error" do config.set :key, -> { "longer_value" } expect(config.fetch(:key)).to eq "longer_value" end it "raises an exception on invalid string" do expect { config.set(:key, "sho") }.to raise_error(Capistrano::ValidationError) end it "raises an exception on invalid string provided by block" do config.set(:key) { "sho" } expect { config.fetch(:key) }.to raise_error(Capistrano::ValidationError) end it "raises an exception on invalid string provided by lambda" do config.set :key, -> { "sho" } expect { config.fetch(:key) }.to raise_error(Capistrano::ValidationError) end end context "appending" do subject { config.append(:linked_dirs, "vendor/bundle", "tmp") } it "returns appended value" do expect(subject).to eq ["vendor/bundle", "tmp"] end context "on non-array variable" do before { config.set(:linked_dirs, "string") } subject { config.append(:linked_dirs, "vendor/bundle") } it "returns appended value" do expect(subject).to eq ["string", "vendor/bundle"] end end end context "removing" do before :each do config.set(:linked_dirs, ["vendor/bundle", "tmp"]) end subject { config.remove(:linked_dirs, "vendor/bundle") } it "returns without removed value" do expect(subject).to eq ["tmp"] end context "on non-array variable" do before { config.set(:linked_dirs, "string") } context "when removing same value" do subject { config.remove(:linked_dirs, "string") } it "returns without removed value" do expect(subject).to eq [] end end context "when removing different value" do subject { config.remove(:linked_dirs, "othervalue") } it "returns without removed value" do expect(subject).to eq ["string"] end end end end end describe "keys" do subject { config.keys } before do config.set(:key1, :value1) config.set(:key2, :value2) end it "returns all set keys" do expect(subject).to match_array %i(key1 key2) end end describe "deleting" do before do config.set(:key, :value) end it "deletes the value" do config.delete(:key) expect(config.fetch(:key)).to be_nil end end describe "asking" do let(:question) { stub } let(:options) { {} } before do Configuration::Question.expects(:new).with(:branch, :default, options) .returns(question) end it "prompts for the value when fetching" do config.ask(:branch, :default, options) expect(config.fetch(:branch)).to eq question end end describe "setting the backend" do it "by default, is SSHKit" do expect(config.backend).to eq SSHKit end it "can be set to another class" do config.backend = :test expect(config.backend).to eq :test end describe "ssh_options for Netssh" do it "merges them with the :ssh_options variable" do config.set :format, :pretty config.set :log_level, :debug config.set :ssh_options, user: "albert" SSHKit::Backend::Netssh.configure { |ssh| ssh.ssh_options = { password: "einstein" } } config.configure_backend expect( config.backend.config.backend.config.ssh_options ).to include(user: "albert", password: "einstein") end end end describe "dry_run?" do it "returns false when using default backend" do expect(config.dry_run?).to eq(false) end it "returns true when using printer backend" do config.set :sshkit_backend, SSHKit::Backend::Printer expect(config.dry_run?).to eq(true) end end describe "custom filtering" do it "accepts a custom filter object" do filter = Object.new def filter.filter(servers) servers end config.add_filter(filter) end it "accepts a custom filter as a block" do config.add_filter { |servers| servers } end it "raises an error if passed a block and an object" do filter = Object.new def filter.filter(servers) servers end expect { config.add_filter(filter) { |servers| servers } }.to raise_error(ArgumentError) end it "raises an error if the filter lacks a filter method" do filter = Object.new expect { config.add_filter(filter) }.to raise_error(TypeError) end it "calls the filter method of a custom filter" do ENV.delete "ROLES" ENV.delete "HOSTS" servers = Configuration::Servers.new servers.add_host("test1") servers.add_host("test2") servers.add_host("test3") filtered_servers = servers.take(2) filter = mock("custom filter") filter.expects(:filter) .with { |subset| subset.is_a? Configuration::Servers } .returns(filtered_servers) config.add_filter(filter) expect(config.filter(servers)).to eq(filtered_servers) end end end end capistrano-capistrano-603c346/spec/lib/capistrano/doctor/000077500000000000000000000000001520217215100234215ustar00rootroot00000000000000capistrano-capistrano-603c346/spec/lib/capistrano/doctor/environment_doctor_spec.rb000066400000000000000000000023131520217215100306750ustar00rootroot00000000000000require "spec_helper" require "capistrano/doctor/environment_doctor" module Capistrano module Doctor describe EnvironmentDoctor do let(:doc) { EnvironmentDoctor.new } it "prints using 4-space indentation" do expect { doc.call }.to output(/^ {4}/).to_stdout end it "prints the Ruby version" do expect { doc.call }.to\ output(/#{Regexp.quote(RUBY_DESCRIPTION)}/).to_stdout end it "prints the Rubygems version" do expect { doc.call }.to output(/#{Regexp.quote(Gem::VERSION)}/).to_stdout end describe "Rake" do before do load File.expand_path("../../../../../lib/capistrano/doctor.rb", __FILE__) end after do Rake::Task.clear end it "has an doctor:environment task that calls EnvironmentDoctor", capture_io: true do EnvironmentDoctor.any_instance.expects(:call) Rake::Task["doctor:environment"].invoke end it "has a doctor task that depends on doctor:environment" do expect(Rake::Task["doctor"].prerequisites).to \ include("doctor:environment") end end end end end capistrano-capistrano-603c346/spec/lib/capistrano/doctor/gems_doctor_spec.rb000066400000000000000000000036501520217215100272710ustar00rootroot00000000000000require "spec_helper" require "capistrano/doctor/gems_doctor" require "airbrussh/version" require "sshkit/version" require "net/ssh/version" module Capistrano module Doctor describe GemsDoctor do let(:doc) { GemsDoctor.new } it "prints using 4-space indentation" do expect { doc.call }.to output(/^ {4}/).to_stdout end it "prints the Capistrano version" do expect { doc.call }.to\ output(/capistrano\s+#{Regexp.quote(Capistrano::VERSION)}/).to_stdout end it "prints the Rake version" do expect { doc.call }.to\ output(/rake\s+#{Regexp.quote(Rake::VERSION)}/).to_stdout end it "prints the SSHKit version" do expect { doc.call }.to\ output(/sshkit\s+#{Regexp.quote(SSHKit::VERSION)}/).to_stdout end it "prints the Airbrussh version" do expect { doc.call }.to\ output(/airbrussh\s+#{Regexp.quote(Airbrussh::VERSION)}/).to_stdout end it "prints the net-ssh version" do expect { doc.call }.to\ output(/net-ssh\s+#{Regexp.quote(Net::SSH::Version::STRING)}/).to_stdout end it "warns that new version is available" do Gem.stubs(:latest_version_for).returns(Gem::Version.new("99.0.0")) expect { doc.call }.to output(/\(update available\)/).to_stdout end describe "Rake" do before do load File.expand_path("../../../../../lib/capistrano/doctor.rb", __FILE__) end after do Rake::Task.clear end it "has an doctor:gems task that calls GemsDoctor", capture_io: true do GemsDoctor.any_instance.expects(:call) Rake::Task["doctor:gems"].invoke end it "has a doctor task that depends on doctor:gems" do expect(Rake::Task["doctor"].prerequisites).to include("doctor:gems") end end end end end capistrano-capistrano-603c346/spec/lib/capistrano/doctor/output_helpers_spec.rb000066400000000000000000000025261520217215100300470ustar00rootroot00000000000000require "spec_helper" require "capistrano/doctor/output_helpers" module Capistrano module Doctor describe OutputHelpers do include OutputHelpers # Force color for the purpose of these tests before { ENV.stubs(:[]).with("SSHKIT_COLOR").returns("1") } it "prints titles in blue with newlines and without indentation" do expect { title("Hello!") }.to\ output("\e[0;34;49m\nHello!\n\e[0m\n").to_stdout end it "prints warnings in yellow with 4-space indentation" do expect { warning("Yikes!") }.to\ output(" \e[0;33;49mYikes!\e[0m\n").to_stdout end it "overrides puts to indent 4 spaces per line" do expect { puts("one\ntwo") }.to output(" one\n two\n").to_stdout end it "formats tables with indent, aligned columns and per-row color" do data = [ ["one", ".", "1"], ["two", "..", "2"], ["three", "...", "3"] ] block = proc do |record, row| row.yellow if record.first == "two" row << record[0] row << record[1] row << record[2] end expected_output = <<-OUT one . 1 \e[0;33;49mtwo .. 2\e[0m three ... 3 OUT expect { table(data, &block) }.to output(expected_output).to_stdout end end end end capistrano-capistrano-603c346/spec/lib/capistrano/doctor/servers_doctor_spec.rb000066400000000000000000000051051520217215100300240ustar00rootroot00000000000000require "spec_helper" require "capistrano/doctor/servers_doctor" module Capistrano module Doctor describe ServersDoctor do include Capistrano::DSL let(:doc) { ServersDoctor.new } before { Capistrano::Configuration.reset! } after { Capistrano::Configuration.reset! } it "prints using 4-space indentation" do expect { doc.call }.to output(/^ {4}/).to_stdout end it "prints the number of defined servers" do role :app, %w(example.com) server "www@example.com:22" expect { doc.call }.to output(/Servers \(2\)/).to_stdout end describe "prints the server's details" do it "including username" do server "www@example.com" expect { doc.call }.to output(/www@example.com/).to_stdout end it "including port" do server "www@example.com:22" expect { doc.call }.to output(/www@example.com:22/).to_stdout end it "including roles" do role :app, %w(example.com) expect { doc.call }.to output(/example.com\s+\[:app\]/).to_stdout end it "including empty roles" do server "example.com" expect { doc.call }.to output(/example.com\s+\[\]/).to_stdout end it "including properties" do server "example.com", roles: %w(app db), primary: true expect { doc.call }.to \ output(/example.com\s+\[:app, :db\]\s+\{ :primary => true \}/).to_stdout end it "including misleading role name alert" do server "example.com", roles: ["web app db"] warning_msg = 'Whitespace detected in role(s) :"web app db". ' \ 'This might be a result of a mistyped "%w()" array literal' expect { doc.call }.to output(/#{Regexp.escape(warning_msg)}/).to_stdout end end it "doesn't fail for no servers" do expect { doc.call }.to output("\nServers (0)\n \n").to_stdout end describe "Rake" do before do load File.expand_path("../../../../../lib/capistrano/doctor.rb", __FILE__) end after do Rake::Task.clear end it "has an doctor:servers task that calls ServersDoctor", capture_io: true do ServersDoctor.any_instance.expects(:call) Rake::Task["doctor:servers"].invoke end it "has a doctor task that depends on doctor:servers" do expect(Rake::Task["doctor"].prerequisites).to \ include("doctor:servers") end end end end end capistrano-capistrano-603c346/spec/lib/capistrano/doctor/variables_doctor_spec.rb000066400000000000000000000054011520217215100303020ustar00rootroot00000000000000require "spec_helper" require "capistrano/doctor/variables_doctor" module Capistrano module Doctor describe VariablesDoctor do include Capistrano::DSL let(:doc) { VariablesDoctor.new } before do set :branch, "master" set :pty, false env.variables.untrusted! do set :application, "my_app" set :repo_tree, "public" set :repo_url, ".git" set :copy_strategy, :scp set :custom_setting, "hello" set "string_setting", "hello" ask :secret end fetch :custom_setting end after { Capistrano::Configuration.reset! } it "prints using 4-space indentation" do expect { doc.call }.to output(/^ {4}/).to_stdout end it "prints variable names and values" do expect { doc.call }.to output(/:branch\s+"master"$/).to_stdout expect { doc.call }.to output(/:pty\s+false$/).to_stdout expect { doc.call }.to output(/:application\s+"my_app"$/).to_stdout expect { doc.call }.to output(/:repo_url\s+".git"$/).to_stdout expect { doc.call }.to output(/:repo_tree\s+"public"$/).to_stdout expect { doc.call }.to output(/:copy_strategy\s+:scp$/).to_stdout expect { doc.call }.to output(/:custom_setting\s+"hello"$/).to_stdout expect { doc.call }.to output(/"string_setting"\s+"hello"$/).to_stdout end it "prints unanswered question variable as " do expect { doc.call }.to output(/:secret\s+$/).to_stdout end it "prints warning for unrecognized variable" do expect { doc.call }.to \ output(/:copy_strategy is not a recognized Capistrano setting/)\ .to_stdout end it "does not print warning for unrecognized variable that is fetched" do expect { doc.call }.not_to \ output(/:custom_setting is not a recognized Capistrano setting/)\ .to_stdout end it "does not print warning for whitelisted variable" do expect { doc.call }.not_to \ output(/:repo_tree is not a recognized Capistrano setting/)\ .to_stdout end describe "Rake" do before do load File.expand_path("../../../../../lib/capistrano/doctor.rb", __FILE__) end after do Rake::Task.clear end it "has an doctor:variables task that calls VariablesDoctor", capture_io: true do VariablesDoctor.any_instance.expects(:call) Rake::Task["doctor:variables"].invoke end it "has a doctor task that depends on doctor:variables" do expect(Rake::Task["doctor"].prerequisites).to \ include("doctor:variables") end end end end end capistrano-capistrano-603c346/spec/lib/capistrano/dsl/000077500000000000000000000000001520217215100227115ustar00rootroot00000000000000capistrano-capistrano-603c346/spec/lib/capistrano/dsl/paths_spec.rb000066400000000000000000000130201520217215100253630ustar00rootroot00000000000000require "spec_helper" describe Capistrano::DSL::Paths do let(:dsl) { Class.new.extend Capistrano::DSL } let(:parent) { Pathname.new("/var/shared") } let(:paths) { Class.new.extend Capistrano::DSL::Paths } let(:linked_dirs) { %w{log public/system} } let(:linked_files) { %w{config/database.yml log/my.log log/access.log} } before do dsl.set(:deploy_to, "/var/www") end describe "#linked_dirs" do subject { paths.linked_dirs(parent) } before do paths.expects(:fetch).with(:linked_dirs).returns(linked_dirs) end it "returns the full pathnames" do expect(subject).to eq [ Pathname.new("/var/shared/log"), Pathname.new("/var/shared/public/system") ] end end describe "#linked_files" do subject { paths.linked_files(parent) } before do paths.expects(:fetch).with(:linked_files).returns(linked_files) end it "returns the full pathnames" do expect(subject).to eq [ Pathname.new("/var/shared/config/database.yml"), Pathname.new("/var/shared/log/my.log"), Pathname.new("/var/shared/log/access.log") ] end end describe "#linked_file_dirs" do subject { paths.linked_file_dirs(parent) } before do paths.expects(:fetch).with(:linked_files).returns(linked_files) end it "returns the full paths names of the parent dirs" do expect(subject).to eq [ Pathname.new("/var/shared/config"), Pathname.new("/var/shared/log") ] end end describe "#linked_dir_parents" do subject { paths.linked_dir_parents(parent) } before do paths.expects(:fetch).with(:linked_dirs).returns(linked_dirs) end it "returns the full paths names of the parent dirs" do expect(subject).to eq [ Pathname.new("/var/shared"), Pathname.new("/var/shared/public") ] end end describe "#release path" do subject { dsl.release_path } context "where no release path has been set" do before do dsl.delete(:release_path) end it "returns the `current_path` value" do expect(subject.to_s).to eq "/var/www/current" end end context "where the release path has been set" do before do dsl.set(:release_path, "/var/www/release_path") end it "returns the set `release_path` value" do expect(subject.to_s).to eq "/var/www/release_path" end end end describe "#set_release_path" do let(:now) { Time.parse("Oct 21 16:29:00 2015") } subject { dsl.release_path } context "without a timestamp" do before do dsl.env.expects(:timestamp).returns(now) dsl.set_release_path end it "returns the release path with the current env timestamp" do expect(subject.to_s).to eq "/var/www/releases/20151021162900" end end context "with a timestamp" do before do dsl.set_release_path("timestamp") end it "returns the release path with the timestamp" do expect(subject.to_s).to eq "/var/www/releases/timestamp" end end end describe "#releases_path" do subject { paths.releases_path } context "with custom releases directory" do before do paths.expects(:fetch).with(:releases_directory, "releases").returns("test123") paths.expects(:fetch).with(:deploy_to).returns("/var/www") end it "returns the releases path with the custom directory" do expect(subject.to_s).to eq "/var/www/test123" end end end describe "#shared_path" do subject { paths.shared_path } context "with custom shared directory" do before do paths.expects(:fetch).with(:shared_directory, "shared").returns("test123") paths.expects(:fetch).with(:deploy_to).returns("/var/www") end it "returns the shared path with the custom directory" do expect(subject.to_s).to eq "/var/www/test123" end end end describe "#deploy_config_path" do subject { dsl.deploy_config_path.to_s } context "when not specified" do before do dsl.delete(:deploy_config_path) end it 'returns "config/deploy.rb"' do expect(subject).to eq "config/deploy.rb" end end context "when the variable :deploy_config_path is set" do before do dsl.set(:deploy_config_path, "my/custom/path.rb") end it "returns the custom path" do expect(subject).to eq "my/custom/path.rb" end end end describe "#stage_config_path" do subject { dsl.stage_config_path.to_s } context "when not specified" do before do dsl.delete(:stage_config_path) end it 'returns "config/deploy"' do expect(subject).to eq "config/deploy" end end context "when the variable :stage_config_path is set" do before do dsl.set(:stage_config_path, "my/custom/path") end it "returns the custom path" do expect(subject).to eq "my/custom/path" end end end describe "#repo_path" do subject { dsl.repo_path.to_s } context "when not specified" do before do dsl.delete(:repo_path) end it 'returns the default #{deploy_to}/repo' do dsl.set(:deploy_to, "/var/www") expect(subject).to eq "/var/www/repo" end end context "when the variable :repo_path is set" do before do dsl.set(:repo_path, "my/custom/path") end it "returns the custom path" do expect(subject).to eq "my/custom/path" end end end end capistrano-capistrano-603c346/spec/lib/capistrano/dsl/task_enhancements_spec.rb000066400000000000000000000061571520217215100277530ustar00rootroot00000000000000require "spec_helper" module Capistrano class DummyTaskEnhancements include TaskEnhancements end describe TaskEnhancements do let(:task_enhancements) { DummyTaskEnhancements.new } describe "ordering" do after do task.clear before_task.clear after_task.clear Rake::Task.clear end let(:order) { [] } let!(:task) do Rake::Task.define_task("task", [:order]) do |_t, args| args["order"].push "task" end end let!(:before_task) do Rake::Task.define_task("before_task") do order.push "before_task" end end let!(:after_task) do Rake::Task.define_task("after_task") do order.push "after_task" end end it "invokes in proper order if define after than before", capture_io: true do task_enhancements.after("task", "after_task") task_enhancements.before("task", "before_task") Rake::Task["task"].invoke order expect(order).to eq(%w(before_task task after_task)) end it "invokes in proper order if define before than after", capture_io: true do task_enhancements.before("task", "before_task") task_enhancements.after("task", "after_task") Rake::Task["task"].invoke order expect(order).to eq(%w(before_task task after_task)) end it "invokes in proper order when referring to as-yet undefined tasks", capture_io: true do task_enhancements.after("task", "not_loaded_task") Rake::Task.define_task("not_loaded_task") do order.push "not_loaded_task" end Rake::Task["task"].invoke order expect(order).to eq(%w(task not_loaded_task)) end it "invokes in proper order and with arguments and block", capture_io: true do task_enhancements.after("task", "after_task_custom", :order) do |_t, _args| order.push "after_task" end task_enhancements.before("task", "before_task_custom", :order) do |_t, _args| order.push "before_task" end Rake::Task["task"].invoke(order) expect(order).to eq(%w(before_task task after_task)) end it "invokes using the correct namespace when defined within a namespace", capture_io: true do Rake.application.in_namespace("namespace") do Rake::Task.define_task("task") do |t| order.push(t.name) end task_enhancements.before("task", "before_task", :order) do |t| order.push(t.name) end task_enhancements.after("task", "after_task", :order) do |t| order.push(t.name) end end Rake::Task["namespace:task"].invoke expect(order).to eq( ["namespace:before_task", "namespace:task", "namespace:after_task"] ) end it "raises a sensible error if the task isn't found", capture_io: true do task_enhancements.after("task", "non_existent_task") expect { Rake::Task["task"].invoke order }.to raise_error(ArgumentError, 'Task "non_existent_task" not found') end end end end capistrano-capistrano-603c346/spec/lib/capistrano/dsl_spec.rb000066400000000000000000000055251520217215100242570ustar00rootroot00000000000000require "spec_helper" module Capistrano class DummyDSL include DSL end # see also - spec/integration/dsl_spec.rb describe DSL do let(:dsl) { DummyDSL.new } describe "#t" do before do I18n.expects(:t).with(:phrase, count: 2, scope: :capistrano) end it "delegates to I18n" do dsl.t(:phrase, count: 2) end end describe "#stage_set?" do subject { dsl.stage_set? } context "stage is set" do before do dsl.set(:stage, :sandbox) end it { expect(subject).to be_truthy } end context "stage is not set" do before do dsl.set(:stage, nil) end it { expect(subject).to be_falsey } end end describe "#sudo" do before do dsl.expects(:execute).with(:sudo, :my, :command) end it "prepends sudo, delegates to execute" do dsl.sudo(:my, :command) end end describe "#execute" do context "use outside of on scope" do after do task.clear Rake::Task.clear end let(:task) do Rake::Task.define_task("execute_outside_scope") do dsl.execute "whoami" end end it "prints helpful message to stderr", capture_io: true do expect do expect do task.invoke end.to output(/^.*Warning: `execute' should be wrapped in an `on' scope/).to_stderr end.to raise_error(NoMethodError) end end end describe "#invoke" do context "reinvoking" do it "will not re-enable invoking task", capture_io: true do counter = 0 Rake::Task.define_task("A") do counter += 1 end expect do dsl.invoke("A") dsl.invoke("A") end.to change { counter }.by(1) end it "will print a message on stderr", capture_io: true do Rake::Task.define_task("B") expect do dsl.invoke("B") dsl.invoke("B") end.to output(/If you really meant to run this task again, use invoke!/).to_stderr end end end describe "#invoke!" do context "reinvoking" do it "will re-enable invoking task", capture_io: true do counter = 0 Rake::Task.define_task("C") do counter += 1 end expect do dsl.invoke!("C") dsl.invoke!("C") end.to change { counter }.by(2) end it "will not print a message on stderr", capture_io: true do Rake::Task.define_task("D") expect do dsl.invoke!("D") dsl.invoke!("D") end.to_not output(/If you really meant to run this task again, use invoke!/).to_stderr end end end end end capistrano-capistrano-603c346/spec/lib/capistrano/immutable_task_spec.rb000066400000000000000000000014451520217215100264730ustar00rootroot00000000000000require "spec_helper" require "rake" require "capistrano/immutable_task" module Capistrano describe ImmutableTask do after do # Ensure that any tasks we create in these tests don't pollute other tests Rake::Task.clear end it "prints warning and raises when task is enhanced" do extend(Rake::DSL) load_defaults = Rake::Task.define_task("load:defaults") load_defaults.extend(Capistrano::ImmutableTask) $stderr.expects(:puts).with do |message| message =~ /^ERROR: load:defaults has already been invoked/ end expect do namespace :load do task :defaults do # Never reached since load_defaults is frozen and can't be enhanced end end end.to raise_error(/frozen/i) end end end capistrano-capistrano-603c346/spec/lib/capistrano/plugin_spec.rb000066400000000000000000000042611520217215100247670ustar00rootroot00000000000000require "spec_helper" require "capistrano/plugin" module Capistrano describe Plugin do include Rake::DSL include Capistrano::DSL class DummyPlugin < Capistrano::Plugin def define_tasks task :hello do end end def register_hooks before "deploy:published", "hello" end end class ExternalTasksPlugin < Capistrano::Plugin def define_tasks eval_rakefile( File.expand_path("../../../support/tasks/plugin.rake", __FILE__) ) end # Called from plugin.rake to demonstrate that helper methods work def hello set :plugin_result, "hello" end end before do # Define an example task to allow testing hooks task "deploy:published" end after do # Clean up any tasks or variables we created during the tests Rake::Task.clear Capistrano::Configuration.reset! end it "defines tasks when constructed" do install_plugin(DummyPlugin) expect(Rake::Task["hello"]).not_to be_nil end it "registers hooks when constructed" do install_plugin(DummyPlugin) expect(Rake::Task["deploy:published"].prerequisites).to include("hello") end it "skips registering hooks if load_hooks: false" do install_plugin(DummyPlugin, load_hooks: false) expect(Rake::Task["deploy:published"].prerequisites).to be_empty end it "doesn't call set_defaults immediately" do dummy = DummyPlugin.new install_plugin(dummy) dummy.expects(:set_defaults).never end it "calls set_defaults during load:defaults", capture_io: true do dummy = DummyPlugin.new dummy.expects(:set_defaults).once install_plugin(dummy) Rake::Task["load:defaults"].invoke end it "is able to load tasks from a .rake file", capture_io: true do install_plugin(ExternalTasksPlugin) Rake::Task["plugin_test"].invoke expect(fetch(:plugin_result)).to eq("hello") end it "exposes the SSHKit backend to subclasses" do SSHKit::Backend.expects(:current).returns(:backend) plugin = DummyPlugin.new expect(plugin.send(:backend)).to eq(:backend) end end end capistrano-capistrano-603c346/spec/lib/capistrano/scm/000077500000000000000000000000001520217215100227115ustar00rootroot00000000000000capistrano-capistrano-603c346/spec/lib/capistrano/scm/git_spec.rb000066400000000000000000000144141520217215100250370ustar00rootroot00000000000000require "spec_helper" require "capistrano/scm/git" module Capistrano describe SCM::Git do subject { Capistrano::SCM::Git.new } # This allows us to easily use `set`, `fetch`, etc. in the examples. let(:env) { Capistrano::Configuration.env } # Stub the SSHKit backend so we can set up expectations without the plugin # actually executing any commands. let(:backend) { stub } before { SSHKit::Backend.stubs(:current).returns(backend) } # Mimic the deploy flow tasks so that the plugin can register its hooks. before do Rake::Task.define_task("deploy:new_release_path") Rake::Task.define_task("deploy:check") Rake::Task.define_task("deploy:set_current_revision") Rake::Task.define_task("deploy:set_current_revision_time") end # Clean up any tasks or variables that the plugin defined. after do Rake::Task.clear Capistrano::Configuration.reset! end describe "#set_defaults" do it "makes git_wrapper_path using a random hex value" do env.set(:tmp_dir, "/tmp") subject.set_defaults expect(env.fetch(:git_wrapper_path)).to match(%r{/tmp/git-ssh-\h{20}\.sh}) end it "makes git_max_concurrent_connections" do subject.set_defaults expect(env.fetch(:git_max_concurrent_connections)).to eq(10) env.set(:git_max_concurrent_connections, 7) expect(env.fetch(:git_max_concurrent_connections)).to eq(7) end it "makes git_wait_interval" do subject.set_defaults expect(env.fetch(:git_wait_interval)).to eq(0) env.set(:git_wait_interval, 5) expect(env.fetch(:git_wait_interval)).to eq(5) end end describe "#git" do it "should call execute git in the context, with arguments" do backend.expects(:execute).with(:git, :init) subject.git(:init) end end describe "#repo_mirror_exists?" do it "should call test for repo HEAD" do env.set(:repo_path, "/path/to/repo") backend.expects(:test).with " [ -f /path/to/repo/HEAD ] " subject.repo_mirror_exists? end end describe "#check_repo_is_reachable" do it "should test the repo url" do env.set(:repo_url, "url") backend.expects(:execute).with(:git, :'ls-remote', "url", "HEAD").returns(true) subject.check_repo_is_reachable end end describe "#clone_repo" do it "should run git clone" do env.set(:repo_url, "url") env.set(:repo_path, "path") backend.expects(:execute).with(:git, :clone, "--mirror", "url", "path") subject.clone_repo end it "should run git clone in shallow mode" do env.set(:git_shallow_clone, "1") env.set(:repo_url, "url") env.set(:repo_path, "path") backend.expects(:execute).with(:git, :clone, "--mirror", "--depth", "1", "--no-single-branch", "url", "path") subject.clone_repo end context "with username and password specified" do before do env.set(:git_http_username, "hello") env.set(:git_http_password, "topsecret") env.set(:repo_url, "https://example.com/repo.git") env.set(:repo_path, "path") end it "should include the credentials in the url" do backend.expects(:execute).with(:git, :clone, "--mirror", "https://hello:topsecret@example.com/repo.git", "path") subject.clone_repo end end end describe "#update_mirror" do it "should run git update" do env.set(:repo_url, "url") backend.expects(:execute).with(:git, :remote, "set-url", "origin", "url") backend.expects(:execute).with(:git, :remote, :update, "--prune") subject.update_mirror end it "should run git update in shallow mode" do env.set(:git_shallow_clone, "1") env.set(:branch, "branch") env.set(:repo_url, "url") backend.expects(:execute).with(:git, :remote, "set-url", "origin", "url") backend.expects(:execute).with(:git, :fetch, "--depth", "1", "origin", "branch") subject.update_mirror end end describe "#archive_to_release_path" do it "should run git archive without a subtree" do env.set(:branch, "branch") env.set(:release_path, "path") backend.expects(:execute).with(:git, :archive, "branch", "| /usr/bin/env tar -x -f - -C", "path") subject.archive_to_release_path end it "should run git archive with a subtree" do env.set(:repo_tree, "tree") env.set(:branch, "branch") env.set(:release_path, "path") backend.expects(:execute).with(:git, :archive, "branch", "tree", "| /usr/bin/env tar -x --strip-components 1 -f - -C", "path") subject.archive_to_release_path end it "should run tar with an overridden name" do env.set(:branch, "branch") env.set(:release_path, "path") SSHKit.config.command_map.expects(:[]).with(:tar).returns("/usr/bin/env gtar") backend.expects(:execute).with(:git, :archive, "branch", "| /usr/bin/env gtar -x -f - -C", "path") subject.archive_to_release_path end end describe "#fetch_revision" do it "should capture git rev-list" do env.set(:branch, "branch") backend.expects(:capture).with(:git, "rev-list --max-count=1 branch").returns("81cec13b777ff46348693d327fc8e7832f79bf43") revision = subject.fetch_revision expect(revision).to eq("81cec13b777ff46348693d327fc8e7832f79bf43") end end describe "#fetch_revision_time" do it "should capture git log without a pager" do env.set(:branch, "branch") backend.expects(:capture).with(:git, "--no-pager log -1 --pretty=format:\"%ct\" branch").returns("1715828406") revision_time = subject.fetch_revision_time expect(revision_time).to eq("1715828406") end end describe "#verify_commit" do it "should run git verify-commit" do env.set(:branch, "branch") backend.expects(:capture).with(:git, "rev-list --max-count=1 branch").returns("81cec13b777ff46348693d327fc8e7832f79bf43") backend.expects(:execute).with(:git, :"verify-commit", "81cec13b777ff46348693d327fc8e7832f79bf43") subject.verify_commit end end end end capistrano-capistrano-603c346/spec/lib/capistrano/scm/hg_spec.rb000066400000000000000000000062661520217215100246600ustar00rootroot00000000000000require "spec_helper" require "capistrano/scm/hg" module Capistrano describe SCM::Hg do subject { Capistrano::SCM::Hg.new } # This allows us to easily use `set`, `fetch`, etc. in the examples. let(:env) { Capistrano::Configuration.env } # Stub the SSHKit backend so we can set up expectations without the plugin # actually executing any commands. let(:backend) { stub } before { SSHKit::Backend.stubs(:current).returns(backend) } # Mimic the deploy flow tasks so that the plugin can register its hooks. before do Rake::Task.define_task("deploy:new_release_path") Rake::Task.define_task("deploy:check") Rake::Task.define_task("deploy:set_current_revision") end # Clean up any tasks or variables that the plugin defined. after do Rake::Task.clear Capistrano::Configuration.reset! end describe "#hg" do it "should call execute hg in the context, with arguments" do backend.expects(:execute).with(:hg, :init) subject.hg(:init) end end describe "#repo_mirror_exists?" do it "should call test for repo HEAD" do env.set(:repo_path, "/path/to/repo") backend.expects(:test).with " [ -d /path/to/repo/.hg ] " subject.repo_mirror_exists? end end describe "#check_repo_is_reachable" do it "should test the repo url" do env.set(:repo_url, :url) backend.expects(:execute).with(:hg, "id", :url) subject.check_repo_is_reachable end end describe "#clone_repo" do it "should run hg clone" do env.set(:repo_url, :url) env.set(:repo_path, "path") backend.expects(:execute).with(:hg, "clone", "--noupdate", :url, "path") subject.clone_repo end end describe "#update_mirror" do it "should run hg update" do backend.expects(:execute).with(:hg, "pull") subject.update_mirror end end describe "#archive_to_release_path" do it "should run hg archive without a subtree" do env.set(:branch, :branch) env.set(:release_path, "path") backend.expects(:execute).with(:hg, "archive", "path", "--rev", :branch) subject.archive_to_release_path end it "should run hg archive with a subtree" do env.set(:repo_tree, "tree") env.set(:branch, :branch) env.set(:release_path, "path") env.set(:tmp_dir, "/tmp") SecureRandom.stubs(:hex).with(10).returns("random") backend.expects(:execute).with(:hg, "archive -p . -I", "tree", "--rev", :branch, "/tmp/random.tar") backend.expects(:execute).with(:mkdir, "-p", "path") backend.expects(:execute).with(:tar, "-x --strip-components 1 -f", "/tmp/random.tar", "-C", "path") backend.expects(:execute).with(:rm, "/tmp/random.tar") subject.archive_to_release_path end end describe "#fetch_revision" do it "should capture hg log" do env.set(:branch, :branch) backend.expects(:capture).with(:hg, "log --rev branch --template \"{node}\n\"").returns("01abcde") revision = subject.fetch_revision expect(revision).to eq("01abcde") end end end end capistrano-capistrano-603c346/spec/lib/capistrano/scm/svn_spec.rb000066400000000000000000000106461520217215100250650ustar00rootroot00000000000000require "spec_helper" require "capistrano/scm/svn" module Capistrano describe SCM::Svn do subject { Capistrano::SCM::Svn.new } # This allows us to easily use `set`, `fetch`, etc. in the examples. let(:env) { Capistrano::Configuration.env } # Stub the SSHKit backend so we can set up expectations without the plugin # actually executing any commands. let(:backend) { stub } before { SSHKit::Backend.stubs(:current).returns(backend) } # Mimic the deploy flow tasks so that the plugin can register its hooks. before do Rake::Task.define_task("deploy:new_release_path") Rake::Task.define_task("deploy:check") Rake::Task.define_task("deploy:set_current_revision") end # Clean up any tasks or variables that the plugin defined. after do Rake::Task.clear Capistrano::Configuration.reset! end describe "#svn" do it "should call execute svn in the context, with arguments" do env.set(:svn_username, "someuser") env.set(:svn_password, "somepassword") backend.expects(:execute).with(:svn, :init, "--username someuser", "--password somepassword") subject.svn(:init) end end describe "#repo_mirror_exists?" do it "should call test for repo HEAD" do env.set(:repo_path, "/path/to/repo") backend.expects(:test).with " [ -d /path/to/repo/.svn ] " subject.repo_mirror_exists? end end describe "#check_repo_is_reachable" do it "should test the repo url" do env.set(:repo_url, :url) env.set(:svn_username, "someuser") env.set(:svn_password, "somepassword") backend.expects(:test).with(:svn, :info, :url, "--username someuser", "--password somepassword").returns(true) subject.check_repo_is_reachable end end describe "#clone_repo" do it "should run svn checkout" do env.set(:repo_url, :url) env.set(:repo_path, "path") env.set(:svn_username, "someuser") env.set(:svn_password, "somepassword") backend.expects(:execute).with(:svn, :checkout, :url, "path", "--username someuser", "--password somepassword") subject.clone_repo end end describe "#update_mirror" do it "should run svn update" do env.set(:repo_url, "url") env.set(:repo_path, "path") backend.expects(:capture).with(:svn, :info, "path").returns("URL: url\n") env.set(:svn_username, "someuser") env.set(:svn_password, "somepassword") backend.expects(:execute).with(:svn, :update, "--username someuser", "--password somepassword") subject.update_mirror end context "for specific revision" do it "should run svn update" do env.set(:repo_url, "url") env.set(:repo_path, "path") backend.expects(:capture).with(:svn, :info, "path").returns("URL: url\n") env.set(:svn_username, "someuser") env.set(:svn_password, "somepassword") env.set(:svn_revision, "12345") backend.expects(:execute).with(:svn, :update, "--username someuser", "--password somepassword", "--revision 12345") subject.update_mirror end end it "should run svn switch if repo_url is changed" do env.set(:repo_url, "url") env.set(:repo_path, "path") backend.expects(:capture).with(:svn, :info, "path").returns("URL: old_url\n") env.set(:svn_username, "someuser") env.set(:svn_password, "somepassword") backend.expects(:execute).with(:svn, :switch, "url", "--username someuser", "--password somepassword") backend.expects(:execute).with(:svn, :update, "--username someuser", "--password somepassword") subject.update_mirror end end describe "#archive_to_release_path" do it "should run svn export" do env.set(:release_path, "path") env.set(:svn_username, "someuser") env.set(:svn_password, "somepassword") backend.expects(:execute).with(:svn, :export, "--force", ".", "path", "--username someuser", "--password somepassword") subject.archive_to_release_path end end describe "#fetch_revision" do it "should capture svn version" do env.set(:repo_path, "path") backend.expects(:capture).with(:svnversion, "path").returns("12345") revision = subject.fetch_revision expect(revision).to eq("12345") end end end end capistrano-capistrano-603c346/spec/lib/capistrano/scm_spec.rb000066400000000000000000000045511520217215100242550ustar00rootroot00000000000000require "spec_helper" require "capistrano/scm" module RaiseNotImplementedMacro def raise_not_implemented_on(method) it "should raise NotImplemented on #{method}" do expect do subject.send(method) end.to raise_error(NotImplementedError) end end end RSpec.configure do include RaiseNotImplementedMacro end module DummyStrategy def test test!("you dummy!") end end module BlindStrategy; end module Capistrano describe SCM do let(:context) { mock } describe "#initialize" do subject { Capistrano::SCM.new(context, DummyStrategy) } it "should load the provided strategy" do context.expects(:test).with("you dummy!") subject.test end end describe "Convenience methods" do subject { Capistrano::SCM.new(context, BlindStrategy) } describe "#test!" do it "should return call test on the context" do context.expects(:test).with(:x) subject.test!(:x) end end describe "#repo_url" do it "should return the repo url according to the context" do context.expects(:repo_url).returns(:url) expect(subject.repo_url).to eq(:url) end end describe "#repo_path" do it "should return the repo path according to the context" do context.expects(:repo_path).returns(:path) expect(subject.repo_path).to eq(:path) end end describe "#release_path" do it "should return the release path according to the context" do context.expects(:release_path).returns("/path/to/nowhere") expect(subject.release_path).to eq("/path/to/nowhere") end end describe "#fetch" do it "should call fetch on the context" do context.expects(:fetch) subject.fetch(:branch) end end end describe "With a 'blind' strategy" do subject { Capistrano::SCM.new(context, BlindStrategy) } describe "#test" do raise_not_implemented_on(:test) end describe "#check" do raise_not_implemented_on(:check) end describe "#clone" do raise_not_implemented_on(:clone) end describe "#update" do raise_not_implemented_on(:update) end describe "#release" do raise_not_implemented_on(:release) end end end end capistrano-capistrano-603c346/spec/lib/capistrano/upload_task_spec.rb000066400000000000000000000010711520217215100257730ustar00rootroot00000000000000require "spec_helper" describe Capistrano::UploadTask do let(:app) { Rake.application = Rake::Application.new } subject(:upload_task) { described_class.define_task("path/file.yml") } it { is_expected.to be_a(Rake::FileCreationTask) } it { is_expected.to be_needed } context "inside namespace" do let(:normal_task) { Rake::Task.define_task("path/other_file.yml") } around { |ex| app.in_namespace("namespace", &ex) } it { expect(upload_task.name).to eq("path/file.yml") } it { expect(upload_task.scope.path).to eq("namespace") } end end capistrano-capistrano-603c346/spec/lib/capistrano/version_validator_spec.rb000066400000000000000000000054721520217215100272300ustar00rootroot00000000000000require "spec_helper" module Capistrano describe VersionValidator do let(:validator) { VersionValidator.new(version) } let(:version) { stub } describe "#new" do it "takes a version" do expect(validator) end end describe "#verify" do let(:current_version) { "3.0.1" } subject { validator.verify } before do validator.stubs(:current_version).returns(current_version) end context "with exact version" do context "valid" do let(:version) { "3.0.1" } it { expect(subject).to be_truthy } end context "invalid - lower" do let(:version) { "3.0.0" } it "fails" do expect { subject }.to raise_error(RuntimeError) end end context "invalid - higher" do let(:version) { "3.0.2" } it "fails" do expect { subject }.to raise_error(RuntimeError) end end end context "with optimistic versioning" do context "valid" do let(:version) { ">= 3.0.0" } it { expect(subject).to be_truthy } end context "invalid - lower" do let(:version) { "<= 2.0.0" } it "fails" do expect { subject }.to raise_error(RuntimeError) end end end context "with pessimistic versioning" do context "2 decimal places" do context "valid" do let(:version) { "~> 3.0.0" } it { expect(subject).to be_truthy } end context "invalid" do let(:version) { "~> 3.1.0" } it "fails" do expect { subject }.to raise_error(RuntimeError) end end end context "1 decimal place" do let(:current_version) { "3.5.0" } context "valid" do let(:version) { "~> 3.1" } it { expect(subject).to be_truthy } end context "invalid" do let(:version) { "~> 3.6" } it "fails" do expect { subject }.to raise_error(RuntimeError) end end end context "with multiple versions" do let(:current_version) { "3.5.9" } context "valid" do let(:version) { [">= 3.5.0", "< 3.5.10"] } it { is_expected.to be_truthy } end context "invalid" do let(:version) { [">= 3.5.0", "< 3.5.8"] } it "fails" do expect { subject }.to raise_error(RuntimeError) end end context "invalid" do let(:version) { ["> 3.5.9", "< 3.5.13"] } it "fails" do expect { subject }.to raise_error(RuntimeError) end end end end end end end capistrano-capistrano-603c346/spec/lib/capistrano_spec.rb000066400000000000000000000001571520217215100234710ustar00rootroot00000000000000require "spec_helper" module Capistrano describe Application do let(:app) { Application.new } end end capistrano-capistrano-603c346/spec/spec_helper.rb000066400000000000000000000014701520217215100220360ustar00rootroot00000000000000$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib")) $LOAD_PATH.unshift(File.dirname(__FILE__)) require "capistrano/all" require "rspec" require "mocha/api" require "time" # Requires supporting files with custom matchers and macros, etc, # in ./support/ and its subdirectories. Dir['#{File.dirname(__FILE__)}/support/**/*.rb'].each { |f| require f } RSpec.configure do |config| config.raise_errors_for_deprecations! config.mock_framework = :mocha config.order = "random" config.around(:example, capture_io: true) do |example| begin Rake.application.options.trace_output = StringIO.new $stdout = StringIO.new $stderr = StringIO.new example.run ensure Rake.application.options.trace_output = STDERR $stdout = STDOUT $stderr = STDERR end end end capistrano-capistrano-603c346/spec/support/000077500000000000000000000000001520217215100207325ustar00rootroot00000000000000capistrano-capistrano-603c346/spec/support/matchers.rb000066400000000000000000000001721520217215100230650ustar00rootroot00000000000000RSpec::Matchers.define :be_a_symlink_to do |expected| match do |actual| File.identical?(expected, actual) end end capistrano-capistrano-603c346/spec/support/tasks/000077500000000000000000000000001520217215100220575ustar00rootroot00000000000000capistrano-capistrano-603c346/spec/support/tasks/database.rake000066400000000000000000000003501520217215100244650ustar00rootroot00000000000000namespace :deploy do namespace :check do task linked_files: "config/database.yml" end end remote_file "config/database.yml" => "/tmp/database.yml", :roles => :all file "/tmp/database.yml" do |t| sh "touch #{t.name}" end capistrano-capistrano-603c346/spec/support/tasks/fail.rake000066400000000000000000000002741520217215100236410ustar00rootroot00000000000000set :fail, proc { raise } before "deploy:starting", :fail do on roles :all do execute :mkdir, "-p", shared_path execute :touch, shared_path.join("fail") end fetch(:fail) end capistrano-capistrano-603c346/spec/support/tasks/failed.rake000066400000000000000000000001651520217215100241510ustar00rootroot00000000000000after "deploy:failed", :custom_failed do on roles :all do execute :touch, shared_path.join("failed") end end capistrano-capistrano-603c346/spec/support/tasks/plugin.rake000066400000000000000000000002151520217215100242170ustar00rootroot00000000000000# This rake file is used by plugin_spec.rb. task :plugin_test do # Example of invoking a helper method provided by the plugin hello end capistrano-capistrano-603c346/spec/support/tasks/root.rake000066400000000000000000000003371520217215100237110ustar00rootroot00000000000000task :am_i_root do on roles(:all) do |host| host.user = "root" ident = capture :id, "-a" info "I am #{ident}" end on roles(:all) do |_host| ident = capture :id, "-a" info "I am #{ident}" end end capistrano-capistrano-603c346/spec/support/test_app.rb000066400000000000000000000103561520217215100231030ustar00rootroot00000000000000require "English" require "fileutils" require "pathname" require "open3" module TestApp extend self def install install_test_app_with(default_config) end def default_config <<-CONFIG set :deploy_to, '#{deploy_to}' set :repo_url, 'https://github.com/capistrano/capistrano.git' set :branch, 'master' set :ssh_options, { keys: '#{File.expand_path('../../.docker/ssh_key_rsa', __dir__)}', auth_methods: ['publickey'] } server 'deployer@localhost:2022', roles: %w{web app} set :linked_files, #{linked_files} set :linked_dirs, #{linked_dirs} set :format_options, log_file: nil set :local_user, #{current_user.inspect} CONFIG end def linked_files %w{config/database.yml} end def linked_file shared_path.join(linked_files.first) end def linked_dirs %w{bin log public/system} end def create_test_app FileUtils.rm_rf(test_app_path) FileUtils.mkdir(test_app_path) File.write(gemfile, <<-GEMFILE.gsub(/^\s+/, "")) source "https://rubygems.org" gem "capistrano", path: #{path_to_cap.to_s.inspect} gem "ed25519", ">= 1.2", "< 2.0" gem "bcrypt_pbkdf", ">= 1.0", "< 2.0" GEMFILE Dir.chdir(test_app_path) do run "bundle" end end def install_test_app_with(config) create_test_app Dir.chdir(test_app_path) do run "cap install STAGES=#{stage}" end write_local_deploy_file(config) end def write_local_deploy_file(config) File.open(test_stage_path, "w") do |file| file.write config end end def write_local_stage_file(filename, config=nil) File.open(test_app_path.join("config/deploy/#{filename}"), "w") do |file| file.write(config) if config end end def append_to_deploy_file(config) File.open(test_stage_path, "a") do |file| file.write config + "\n" end end def prepend_to_capfile(config) current_capfile = File.read(capfile) File.open(capfile, "w") do |file| file.write config file.write current_capfile end end def create_shared_directory(path) FileUtils.mkdir_p(shared_path.join(path)) end def create_shared_file(path) File.open(shared_path.join(path), "w") end def cap(task, subdirectory=nil) run "cap #{stage} #{task} --trace", subdirectory end def run(command, subdirectory=nil) command = "bundle exec #{command}" unless command =~ /^bundle\b/ dir = subdirectory ? test_app_path.join(subdirectory) : test_app_path output, status = Dir.chdir(dir) do with_clean_bundler_env { Open3.capture2e(command) } end [status.success?, output] end def stage "test" end def test_stage_path test_app_path.join("config/deploy/test.rb") end def test_app_path Pathname.new("/tmp/test_app") end def deploy_to Pathname.new("/home/deployer/var/www/deploy") end def shared_path deploy_to.join("shared") end def current_path deploy_to.join("current") end def releases_path deploy_to.join("releases") end def release_path(t=timestamp) releases_path.join(t) end def timestamp(offset=0) (Time.now.utc + offset).strftime("%Y%m%d%H%M%S") end def repo_path deploy_to.join("repo") end def path_to_cap File.expand_path(".") end def gemfile test_app_path.join("Gemfile") end def capfile test_app_path.join("Capfile") end def current_user "(GitHub Web Flow) via ShipIt" end def task_dir test_app_path.join("lib/capistrano/tasks") end def copy_task_to_test_app(source) FileUtils.cp(source, task_dir) end def config_path test_app_path.join("config") end def move_configuration_to_custom_location(location) prepend_to_capfile( <<-CONFIG set :stage_config_path, "app/config/deploy" set :deploy_config_path, "app/config/deploy.rb" CONFIG ) location = test_app_path.join(location) FileUtils.mkdir_p(location) FileUtils.mv(config_path, location) end def git_wrapper_path_glob "/tmp/git-ssh-*.sh" end def with_clean_bundler_env(&block) return yield unless defined?(Bundler) if Bundler.respond_to?(:with_unbundled_env) Bundler.with_unbundled_env(&block) else Bundler.with_clean_env(&block) end end end